2004-10-20 23:06:45 +02:00
< ? php
2024-07-02 01:46:40 +02:00
/* Copyright ( C ) 2002 - 2005 Rodolphe Quiedeville < rodolphe @ quiedeville . org >
* Copyright ( C ) 2005 - 2020 Laurent Destailleur < eldy @ users . sourceforge . net >
* Copyright ( C ) 2005 - 2010 Regis Houssin < regis . houssin @ inodbox . com >
* Copyright ( C ) 2013 Florian Henry < florian . henry @ open - concept . pro >
* Copyright ( C ) 2014 - 2017 Marcos García < marcosgdf @ gmail . com >
* Copyright ( C ) 2017 Ferran Marcet < fmarcet @ 2 byte . es >
* Copyright ( C ) 2019 Juanjo Menent < jmenent @ 2 byte . es >
* Copyright ( C ) 2022 Charlene Benke < charlene @ patas - monkey . com >
* Copyright ( C ) 2023 Gauthier VERDOL < gauthier . verdol @ atm - consulting . fr >
* Copyright ( C ) 2024 Frédéric France < frederic . france @ free . fr >
2025-02-03 11:24:16 +01:00
* Copyright ( C ) 2024 - 2025 MDW < mdeweerd @ users . noreply . github . com >
2024-08-23 14:58:50 +02:00
* Copyright ( C ) 2024 William Mead < william . mead @ manchenumerique . fr >
2002-05-11 20:53:13 +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
2013-01-16 15:36:08 +01:00
* the Free Software Foundation ; either version 3 of the License , or
2002-05-11 20:53:13 +02:00
* ( 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 />.
2002-05-11 20:53:13 +02:00
*/
2005-08-14 03:38:12 +02:00
/**
2011-11-02 22:41:34 +01:00
* \file htdocs / projet / class / project . class . php
* \ingroup projet
2012-09-15 15:33:00 +02:00
* \brief File of class to manage projects
2009-01-15 00:36:51 +01:00
*/
2019-11-13 19:35:39 +01:00
require_once DOL_DOCUMENT_ROOT . '/core/class/commonobject.class.php' ;
2007-05-28 13:30:44 +02:00
2005-08-14 03:38:12 +02:00
/**
2012-09-15 15:33:00 +02:00
* Class to manage projects
2009-01-15 00:36:51 +01:00
*/
2007-05-28 13:30:44 +02:00
class Project extends CommonObject
2006-06-23 21:40:28 +02:00
{
2020-05-19 22:06:17 +02:00
/**
2018-08-23 18:52:47 +02:00
* @ var string ID to identify managed object
*/
2018-08-29 15:37:35 +02:00
public $element = 'project' ;
2020-05-19 22:06:17 +02:00
/**
2018-08-22 19:56:24 +02:00
* @ var string Name of table without prefix where object is stored
*/
2018-08-29 15:37:35 +02:00
public $table_element = 'projet' ;
2020-05-19 22:06:17 +02:00
/**
2020-12-05 23:53:55 +01:00
* @ var string Name of subtable line
2018-09-02 11:08:41 +02:00
*/
public $table_element_line = 'projet_task' ;
2018-09-01 15:27:55 +02:00
2020-05-19 22:06:17 +02:00
/**
2020-12-05 23:53:55 +01:00
* @ var string Name of field date
2019-11-28 23:02:14 +01:00
*/
public $table_element_date ;
2020-05-19 22:06:17 +02:00
/**
2020-12-05 23:53:55 +01:00
* @ var string Field with ID of parent key if this field has a parent
2018-09-01 15:27:55 +02:00
*/
public $fk_element = 'fk_projet' ;
2020-05-19 22:06:17 +02:00
/**
* @ var string String with name of icon for myobject . Must be the part after the 'object_' into object_myobject . png
*/
2020-05-20 20:10:48 +02:00
public $picto = 'project' ;
2017-06-07 16:44:04 +02:00
2020-05-19 22:06:17 +02:00
/**
* { @ inheritdoc }
*/
protected $table_ref_field = 'ref' ;
2014-12-25 21:47:39 +01:00
2023-10-20 14:33:39 +02:00
/**
* @ var int parent project
*/
public $fk_project ;
2020-05-19 22:06:17 +02:00
/**
2018-08-31 19:26:08 +02:00
* @ var string description
*/
public $description ;
2015-04-23 23:21:06 +02:00
/**
* @ var string
*/
2020-05-19 22:06:17 +02:00
public $title ;
2019-07-19 13:22:54 +02:00
2022-06-22 13:50:54 +02:00
/**
2022-10-21 13:19:21 +02:00
* @ var int Date start
2024-09-23 00:37:30 +02:00
* @ deprecated Use $date_start
2022-06-22 13:50:54 +02:00
*/
public $dateo ;
/**
2024-11-19 15:40:37 +01:00
* @ var null | int | string Field with Date start
2022-06-22 13:50:54 +02:00
*/
2020-05-19 22:06:17 +02:00
public $date_start ;
2022-06-22 13:50:54 +02:00
/**
2022-10-21 13:19:21 +02:00
* @ var int Date end
2024-09-23 00:37:30 +02:00
* @ deprecated Use $date_end
2022-06-22 13:50:54 +02:00
*/
public $datee ;
/**
2024-11-19 15:40:37 +01:00
* @ var null | int | string Field with Date end
2022-06-22 13:50:54 +02:00
*/
2020-05-19 22:06:17 +02:00
public $date_end ;
2022-06-22 13:50:54 +02:00
2022-10-21 13:19:21 +02:00
/**
* @ var int Date start event
*/
public $date_start_event ;
/**
* @ var int Date end event
*/
public $date_end_event ;
/**
* @ var string Location
*/
public $location ;
2022-06-22 13:50:54 +02:00
/**
* @ var int Date close
*/
2020-05-19 22:06:17 +02:00
public $date_close ;
2016-08-29 10:32:00 +02:00
2024-09-23 00:37:30 +02:00
/**
* @ var int Id of thirdparty
*/
2020-05-19 22:06:17 +02:00
public $socid ; // To store id of thirdparty
2024-07-02 01:46:40 +02:00
/**
* @ var string thirdparty name
*/
2020-05-19 22:06:17 +02:00
public $thirdparty_name ; // To store name of thirdparty (defined only in some cases)
2016-08-29 10:32:00 +02:00
2024-09-23 00:37:30 +02:00
/**
* @ var int Id of project creator . Not defined if shared project .
*/
public $user_author_id ;
2019-11-14 19:06:14 +01:00
2020-05-19 22:06:17 +02:00
/**
* @ var int user close id
*/
public $fk_user_close ;
2019-11-14 19:06:14 +01:00
2024-09-23 00:37:30 +02:00
/**
* @ var int < 0 , 1 > Tell if this is a public or private project
*/
public $public ;
2021-03-23 21:04:38 +01:00
/**
2024-03-19 12:48:36 +01:00
* @ var float | string budget Amount ( May need price2num )
2021-03-23 21:04:38 +01:00
*/
2020-05-19 22:06:17 +02:00
public $budget_amount ;
2021-03-23 21:04:38 +01:00
/**
2021-04-02 21:49:21 +02:00
* @ var integer Can use projects to follow opportunities
*/
public $usage_opportunity ;
/**
* @ var integer Can follow tasks on project and enter time spent on it
*/
public $usage_task ;
/**
* @ var integer Use to bill task spend time
2021-03-23 21:04:38 +01:00
*/
2020-05-19 22:06:17 +02:00
public $usage_bill_time ; // Is the time spent on project must be invoiced or not
2015-02-16 10:40:09 +01:00
2021-03-23 21:04:38 +01:00
/**
2025-02-03 11:24:16 +01:00
* @ var integer Event organization : Use Event Organization
*/
2021-03-23 21:04:38 +01:00
public $usage_organize_event ;
/**
2021-04-02 21:49:21 +02:00
* @ var integer Event organization : Allow unknown people to suggest new conferences
2021-03-23 21:04:38 +01:00
*/
public $accept_conference_suggestions ;
/**
2021-04-02 21:49:21 +02:00
* @ var integer Event organization : Allow unknown people to suggest new booth
2021-03-23 21:04:38 +01:00
*/
public $accept_booth_suggestions ;
/**
2024-03-19 12:48:36 +01:00
* @ var float | string Event organization : registration price ( may need price2num )
2021-03-23 21:04:38 +01:00
*/
public $price_registration ;
/**
2024-03-19 12:48:36 +01:00
* @ var float | string Event organization : booth price ( may need price2num )
2021-03-23 21:04:38 +01:00
*/
public $price_booth ;
2022-05-04 01:53:45 +02:00
/**
2024-07-02 01:46:40 +02:00
* @ var int | '' Max attendees ( may be empty / need cast to int )
2022-05-04 01:53:45 +02:00
*/
public $max_attendees ;
2024-07-02 01:46:40 +02:00
/**
* @ var int status
2024-09-23 00:37:30 +02:00
* @ deprecated Use $status
2024-07-02 01:46:40 +02:00
*/
2020-05-19 22:06:17 +02:00
public $statut ; // 0=draft, 1=opened, 2=closed
2022-05-16 13:05:17 +02:00
2024-07-02 01:46:40 +02:00
/**
* @ var int opportunity status
*/
2020-05-19 22:06:17 +02:00
public $opp_status ; // opportunity status, into table llx_c_lead_status
2024-07-02 01:46:40 +02:00
/**
* @ var string opportunity code
*/
2023-02-21 00:54:00 +01:00
public $opp_status_code ;
2024-07-02 01:46:40 +02:00
/**
* @ var int opportunity status
*/
2022-05-16 13:05:17 +02:00
public $fk_opp_status ; // opportunity status, into table llx_c_lead_status
2024-07-02 01:46:40 +02:00
/**
* @ var float | '' opportunity amount
*/
2023-02-21 00:54:00 +01:00
public $opp_amount ; // opportunity amount
2024-07-02 01:46:40 +02:00
/**
* @ var float | '' opportunity percent
*/
2019-11-13 19:35:39 +01:00
public $opp_percent ; // opportunity probability
2024-07-02 01:46:40 +02:00
/**
* @ var float | '' opportunity weighted amount
*/
2023-02-21 00:54:00 +01:00
public $opp_weighted_amount ; // opportunity weighted amount
2015-06-29 16:57:32 +02:00
2024-07-02 01:46:40 +02:00
/**
* @ var string email msgid
*/
2020-08-21 01:11:22 +02:00
public $email_msgid ;
2024-09-23 00:37:30 +02:00
/**
* @ var array < int , int > Used to store workload details of a projet ( array [ day ])
*/
public $weekWorkLoad ;
/**
* @ var array < int , array < int , int >> Used to store workload details of a projet ( array [ day ][ taskid ])
*/
2020-05-19 22:06:17 +02:00
public $weekWorkLoadPerTask ; // Used to store workload details of tasks of a projet
2015-03-18 11:04:50 +01:00
2023-09-26 09:57:55 +02:00
/**
2024-09-23 00:37:30 +02:00
* @ var array < string , int > Used to store workload details of a projet
2023-09-26 09:57:55 +02:00
*/
public $monthWorkLoad ;
/**
2024-09-23 00:37:30 +02:00
* @ var array < string , array < int , int >> Used to store workload details of tasks of a projet ( array [ weeknbr ][ task_id ])
2023-09-26 09:57:55 +02:00
*/
public $monthWorkLoadPerTask ;
2015-04-23 23:21:06 +02:00
/**
* @ var int Creation date
2024-09-23 00:37:30 +02:00
* @ deprecated Use $date_c
2015-04-23 23:21:06 +02:00
*/
public $datec ;
2018-09-02 11:08:41 +02:00
2015-04-23 23:21:06 +02:00
/**
* @ var int Creation date
*/
public $date_c ;
2018-09-02 11:08:41 +02:00
2015-04-23 23:21:06 +02:00
/**
* @ var int Modification date
2024-09-23 00:37:30 +02:00
* @ deprecated Use $date_m
2015-04-23 23:21:06 +02:00
*/
public $datem ;
2018-09-02 11:08:41 +02:00
2015-04-23 23:21:06 +02:00
/**
* @ var int Modification date
*/
public $date_m ;
2023-09-26 09:58:51 +02:00
/**
* @ var string Ip address
*/
public $ip ;
2016-11-19 16:08:27 +01:00
/**
* @ var Task []
*/
public $lines ;
2017-06-07 16:44:04 +02:00
2020-09-29 10:00:14 +02:00
/**
2024-05-29 23:23:20 +02:00
* 'type' field format :
* 'integer' , 'integer:ObjectClass:PathToClass[:AddCreateButtonOrNot[:Filter[:Sortfield]]]' ,
* 'select' ( list of values are in 'options' . for integer list of values are in 'arrayofkeyval' ),
* 'sellist:TableName:LabelFieldName[:KeyFieldName[:KeyFieldParent[:Filter[:CategoryIdType[:CategoryIdList[:SortField]]]]]]' ,
* 'chkbxlst:...' ,
* 'varchar(x)' ,
* 'text' , 'text:none' , 'html' ,
* 'double(24,8)' , 'real' , 'price' , 'stock' ,
* 'date' , 'datetime' , 'timestamp' , 'duration' ,
* 'boolean' , 'checkbox' , 'radio' , 'array' ,
* 'mail' , 'phone' , 'url' , 'password' , 'ip'
* Note : Filter must be a Dolibarr Universal Filter syntax string . Example : " (t.ref:like:'SO-%') or (t.date_creation:<:'20160101') or (t.status:!=:0) or (t.nature:is:NULL) "
2020-09-29 10:00:14 +02:00
* 'label' the translation key .
2024-05-29 23:23:20 +02:00
* 'alias' the alias used into some old hard coded SQL requests
* 'picto' is code of a picto to show before value in forms
* 'enabled' is a condition when the field must be managed ( Example : 1 or 'getDolGlobalInt("MY_SETUP_PARAM")' or 'isModEnabled("multicurrency")' ... )
2020-09-29 10:00:14 +02:00
* 'position' is the sort order of field .
* 'notnull' is set to 1 if not null in database . Set to - 1 if we must set data to null if empty ( '' or 0 ) .
* 'visible' says if field is visible in list ( Examples : 0 = Not visible , 1 = Visible on list and create / update / view forms , 2 = Visible on list only , 3 = Visible on create / update / view form only ( not list ), 4 = Visible on list and update / view form only ( not create ) . 5 = Visible on list and view only ( not create / not update ) . Using a negative value means field is not shown by default on list but can be selected for viewing )
* 'noteditable' says if field is not editable ( 1 or 0 )
2024-05-29 23:23:20 +02:00
* 'alwayseditable' says if field can be modified also when status is not draft ( '1' or '0' )
2020-09-29 10:00:14 +02:00
* 'default' is a default value for creation ( can still be overwrote by the Setup of Default Values if field is editable in creation form ) . Note : If default is set to '(PROV)' and field is 'ref' , the default value will be set to '(PROVid)' where id is rowid when a new record is created .
* 'index' if we want an index in database .
2024-01-12 17:55:52 +01:00
* 'foreignkey' => 'tablename.field' if the field is a foreign key ( it is recommended to name the field fk_ ... ) .
2020-09-29 10:00:14 +02:00
* 'searchall' is 1 if we want to search in this field when making a search from the quick search button .
2024-05-29 23:23:20 +02:00
* 'isameasure' must be set to 1 or 2 if field can be used for measure . Field type must be summable like integer or double ( 24 , 8 ) . Use 1 in most cases , or 2 if you don ' t want to see the column total into list ( for example for percentage )
* 'css' and 'cssview' and 'csslist' is the CSS style to use on field . 'css' is used in creation and update . 'cssview' is used in view mode . 'csslist' is used for columns in lists . For example : 'css' => 'minwidth300 maxwidth500 widthcentpercentminusx' , 'cssview' => 'wordbreak' , 'csslist' => 'tdoverflowmax200'
* 'help' and 'helplist' is a 'TranslationString' to use to show a tooltip on field . You can also use 'TranslationString:keyfortooltiponlick' for a tooltip on click .
2020-09-29 10:00:14 +02:00
* 'showoncombobox' if value of the field must be visible into the label of the combobox that list record
* 'disabled' is 1 if we want to have the field locked by a 'disabled' attribute . In most cases , this is never set into the definition of $fields into class , but is set dynamically by some part of code .
2024-05-29 23:23:20 +02:00
* 'arrayofkeyval' to set a list of values if type is a list of predefined values . For example : array ( " 0 " => " Draft " , " 1 " => " Active " , " -1 " => " Cancel " ) . Note that type can be 'integer' or 'varchar'
* 'autofocusoncreate' to have field having the focus on a create form . Only 1 field should have this property set to 1.
2020-09-29 10:00:14 +02:00
* 'comment' is not used . You can store here any text of your choice . It is not used by application .
2024-05-29 23:23:20 +02:00
* 'validate' is 1 if you need to validate the field with $this -> validateField () . Need MAIN_ACTIVATE_VALIDATION_RESULT .
* 'copytoclipboard' is 1 or 2 to allow to add a picto to copy value into clipboard ( 1 = picto after label , 2 = picto after value )
2020-09-29 10:00:14 +02:00
*
* Note : To have value dynamic , you can set value to 0 in definition and edit the value on the fly into the constructor .
*/
// BEGIN MODULEBUILDER PROPERTIES
/**
2025-02-05 00:40:06 +01:00
* @ var array < string , array { type : string , label : string , enabled : int < 0 , 2 >| string , position : int , notnull ? : int , visible : int <- 6 , 6 >| string , alwayseditable ? : int < 0 , 1 > , noteditable ? : int < 0 , 1 > , default ? : string , index ? : int , foreignkey ? : string , searchall ? : int < 0 , 1 > , isameasure ? : int < 0 , 1 > , css ? : string , csslist ? : string , help ? : string , showoncombobox ? : int < 0 , 4 > , disabled ? : int < 0 , 1 > , arrayofkeyval ? : array < int | string , string > , autofocusoncreate ? : int < 0 , 1 > , comment ? : string , copytoclipboard ? : int < 1 , 2 > , validate ? : int < 0 , 1 > , showonheader ? : int < 0 , 1 > } > Array with all fields and their property . Do not use it as a static var . It may be modified by constructor .
2020-09-29 10:00:14 +02:00
*/
2020-10-07 15:01:28 +02:00
public $fields = array (
2024-03-09 16:32:02 +01:00
'rowid' => array ( 'type' => 'integer' , 'label' => 'ID' , 'enabled' => 1 , 'visible' => - 1 , 'notnull' => 1 , 'position' => 10 ),
'fk_project' => array ( 'type' => 'integer' , 'label' => 'Parent' , 'enabled' => 1 , 'visible' => 1 , 'notnull' => 0 , 'position' => 12 ),
'ref' => array ( 'type' => 'varchar(50)' , 'label' => 'Ref' , 'enabled' => 1 , 'visible' => 1 , 'showoncombobox' => 1 , 'position' => 15 , 'searchall' => 1 ),
'title' => array ( 'type' => 'varchar(255)' , 'label' => 'ProjectLabel' , 'enabled' => 1 , 'visible' => 1 , 'notnull' => 1 , 'position' => 17 , 'showoncombobox' => 2 , 'searchall' => 1 ),
2024-03-15 00:40:29 +01:00
'entity' => array ( 'type' => 'integer' , 'label' => 'Entity' , 'default' => '1' , 'enabled' => 1 , 'visible' => 3 , 'notnull' => 1 , 'position' => 19 ),
2024-03-09 16:32:02 +01:00
'fk_soc' => array ( 'type' => 'integer' , 'label' => 'Thirdparty' , 'enabled' => 1 , 'visible' => 0 , 'position' => 20 ),
2024-05-07 19:59:20 +02:00
'dateo' => array ( 'type' => 'date' , 'label' => 'DateStart' , 'enabled' => 1 , 'visible' => - 1 , 'position' => 30 ),
2024-03-09 16:32:02 +01:00
'datee' => array ( 'type' => 'date' , 'label' => 'DateEnd' , 'enabled' => 1 , 'visible' => 1 , 'position' => 35 ),
'description' => array ( 'type' => 'text' , 'label' => 'Description' , 'enabled' => 1 , 'visible' => 3 , 'position' => 55 , 'searchall' => 1 ),
2024-05-07 19:59:20 +02:00
'public' => array ( 'type' => 'integer' , 'label' => 'Visibility' , 'enabled' => 1 , 'visible' => - 1 , 'position' => 65 ),
2024-06-03 22:43:09 +02:00
'fk_opp_status' => array ( 'type' => 'integer:CLeadStatus:core/class/cleadstatus.class.php' , 'label' => 'OpportunityStatusShort' , 'enabled' => 'getDolGlobalString("PROJECT_USE_OPPORTUNITIES")' , 'visible' => 1 , 'position' => 75 ),
2024-03-09 16:32:02 +01:00
'opp_percent' => array ( 'type' => 'double(5,2)' , 'label' => 'OpportunityProbabilityShort' , 'enabled' => 'getDolGlobalString("PROJECT_USE_OPPORTUNITIES")' , 'visible' => 1 , 'position' => 80 ),
'note_private' => array ( 'type' => 'html' , 'label' => 'NotePrivate' , 'enabled' => 1 , 'visible' => 0 , 'position' => 85 , 'searchall' => 1 ),
'note_public' => array ( 'type' => 'html' , 'label' => 'NotePublic' , 'enabled' => 1 , 'visible' => 0 , 'position' => 90 , 'searchall' => 1 ),
'model_pdf' => array ( 'type' => 'varchar(255)' , 'label' => 'ModelPdf' , 'enabled' => 1 , 'visible' => 0 , 'position' => 95 ),
'date_close' => array ( 'type' => 'datetime' , 'label' => 'DateClosing' , 'enabled' => 1 , 'visible' => 0 , 'position' => 105 ),
'fk_user_close' => array ( 'type' => 'integer' , 'label' => 'UserClosing' , 'enabled' => 1 , 'visible' => 0 , 'position' => 110 ),
'opp_amount' => array ( 'type' => 'double(24,8)' , 'label' => 'OpportunityAmountShort' , 'enabled' => 1 , 'visible' => 'getDolGlobalString("PROJECT_USE_OPPORTUNITIES")' , 'position' => 115 ),
'budget_amount' => array ( 'type' => 'double(24,8)' , 'label' => 'Budget' , 'enabled' => 1 , 'visible' => - 1 , 'position' => 119 ),
'usage_opportunity' => array ( 'type' => 'integer' , 'label' => 'UsageOpportunity' , 'enabled' => 1 , 'visible' => - 1 , 'position' => 130 ),
'usage_task' => array ( 'type' => 'integer' , 'label' => 'UsageTasks' , 'enabled' => 1 , 'visible' => - 1 , 'position' => 135 ),
'usage_bill_time' => array ( 'type' => 'integer' , 'label' => 'UsageBillTimeShort' , 'enabled' => 1 , 'visible' => - 1 , 'position' => 140 ),
'usage_organize_event' => array ( 'type' => 'integer' , 'label' => 'UsageOrganizeEvent' , 'enabled' => 1 , 'visible' => - 1 , 'position' => 145 ),
2022-10-21 13:19:21 +02:00
// Properties for event organization
2024-03-09 16:32:02 +01:00
'date_start_event' => array ( 'type' => 'date' , 'label' => 'DateStartEvent' , 'enabled' => " isModEnabled('eventorganization') " , 'visible' => 1 , 'position' => 200 ),
'date_end_event' => array ( 'type' => 'date' , 'label' => 'DateEndEvent' , 'enabled' => " isModEnabled('eventorganization') " , 'visible' => 1 , 'position' => 201 ),
2024-12-05 00:06:24 +01:00
'location' => array ( 'type' => 'text' , 'label' => 'Location' , 'enabled' => 1 , 'visible' => 3 , 'position' => 202 , 'searchall' => 1 ),
2024-03-09 16:32:02 +01:00
'accept_conference_suggestions' => array ( 'type' => 'integer' , 'label' => 'AllowUnknownPeopleSuggestConf' , 'enabled' => 1 , 'visible' => - 1 , 'position' => 210 ),
'accept_booth_suggestions' => array ( 'type' => 'integer' , 'label' => 'AllowUnknownPeopleSuggestBooth' , 'enabled' => 1 , 'visible' => - 1 , 'position' => 211 ),
'price_registration' => array ( 'type' => 'double(24,8)' , 'label' => 'PriceOfRegistration' , 'enabled' => 1 , 'visible' => - 1 , 'position' => 212 ),
'price_booth' => array ( 'type' => 'double(24,8)' , 'label' => 'PriceOfBooth' , 'enabled' => 1 , 'visible' => - 1 , 'position' => 215 ),
'max_attendees' => array ( 'type' => 'integer' , 'label' => 'MaxNbOfAttendees' , 'enabled' => 1 , 'visible' => - 1 , 'position' => 215 ),
2022-10-21 13:19:21 +02:00
// Generic
2024-03-09 16:32:02 +01:00
'datec' => array ( 'type' => 'datetime' , 'label' => 'DateCreationShort' , 'enabled' => 1 , 'visible' => - 2 , 'position' => 400 ),
'tms' => array ( 'type' => 'timestamp' , 'label' => 'DateModificationShort' , 'enabled' => 1 , 'visible' => - 2 , 'notnull' => 1 , 'position' => 405 ),
'fk_user_creat' => array ( 'type' => 'integer' , 'label' => 'UserCreation' , 'enabled' => 1 , 'visible' => 0 , 'notnull' => 1 , 'position' => 410 ),
'fk_user_modif' => array ( 'type' => 'integer' , 'label' => 'UserModification' , 'enabled' => 1 , 'visible' => 0 , 'position' => 415 ),
'import_key' => array ( 'type' => 'varchar(14)' , 'label' => 'ImportId' , 'enabled' => 1 , 'visible' => - 1 , 'position' => 420 ),
'email_msgid' => array ( 'type' => 'varchar(255)' , 'label' => 'EmailMsgID' , 'enabled' => 1 , 'visible' => - 1 , 'position' => 450 , 'help' => 'EmailMsgIDWhenSourceisEmail' , 'csslist' => 'tdoverflowmax125' ),
2024-05-29 23:23:20 +02:00
'fk_statut' => array ( 'type' => 'smallint(6)' , 'label' => 'Status' , 'alias' => 'status' , 'enabled' => 1 , 'visible' => 1 , 'notnull' => 1 , 'position' => 500 , 'arrayofkeyval' => array ( 0 => 'Draft' , 1 => 'Validated' , 2 => 'Closed' )),
2020-09-29 10:00:14 +02:00
);
// END MODULEBUILDER PROPERTIES
2017-06-08 12:21:41 +02:00
/**
* Draft status
*/
const STATUS_DRAFT = 0 ;
2018-09-02 11:08:41 +02:00
2017-06-08 12:21:41 +02:00
/**
* Open / Validated status
*/
const STATUS_VALIDATED = 1 ;
2018-09-02 11:08:41 +02:00
2017-06-08 12:21:41 +02:00
/**
* Closed status
*/
const STATUS_CLOSED = 2 ;
2024-02-16 13:32:40 +01:00
2020-05-19 22:06:17 +02:00
/**
* Constructor
*
* @ param DoliDB $db Database handler
*/
public function __construct ( $db )
{
2021-02-15 12:18:08 +01:00
global $conf ;
2020-05-19 22:06:17 +02:00
$this -> db = $db ;
2024-05-05 00:34:19 +02:00
$this -> ismultientitymanaged = 1 ;
$this -> isextrafieldmanaged = 1 ;
2023-11-24 10:10:24 +01:00
$this -> labelStatusShort = array ( 0 => 'Draft' , 1 => 'Opened' , 2 => 'Closed' );
$this -> labelStatus = array ( 0 => 'Draft' , 1 => 'Opened' , 2 => 'Closed' );
2020-09-30 14:57:36 +02:00
2020-09-30 14:54:24 +02:00
global $conf ;
2023-11-27 11:56:32 +01:00
if ( ! getDolGlobalString ( 'MAIN_SHOW_TECHNICAL_ID' )) {
2021-02-26 18:49:22 +01:00
$this -> fields [ 'rowid' ][ 'visible' ] = 0 ;
}
2020-09-30 14:54:24 +02:00
2023-11-27 11:56:32 +01:00
if ( ! getDolGlobalString ( 'PROJECT_USE_OPPORTUNITIES' )) {
2020-09-30 14:54:24 +02:00
$this -> fields [ 'fk_opp_status' ][ 'enabled' ] = 0 ;
$this -> fields [ 'opp_percent' ][ 'enabled' ] = 0 ;
$this -> fields [ 'opp_amount' ][ 'enabled' ] = 0 ;
$this -> fields [ 'usage_opportunity' ][ 'enabled' ] = 0 ;
}
2023-11-27 11:56:32 +01:00
if ( getDolGlobalString ( 'PROJECT_HIDE_TASKS' )) {
2020-09-30 14:54:24 +02:00
$this -> fields [ 'usage_bill_time' ][ 'visible' ] = 0 ;
$this -> fields [ 'usage_task' ][ 'visible' ] = 0 ;
}
2020-12-17 22:52:42 +01:00
2021-02-15 12:18:08 +01:00
if ( empty ( $conf -> eventorganization -> enabled )) {
2020-12-17 22:52:42 +01:00
$this -> fields [ 'usage_organize_event' ][ 'visible' ] = 0 ;
2021-02-22 21:00:54 +01:00
$this -> fields [ 'accept_conference_suggestions' ][ 'enabled' ] = 0 ;
$this -> fields [ 'accept_booth_suggestions' ][ 'enabled' ] = 0 ;
2021-02-21 12:32:16 +01:00
$this -> fields [ 'price_registration' ][ 'enabled' ] = 0 ;
$this -> fields [ 'price_booth' ][ 'enabled' ] = 0 ;
2022-09-15 01:02:49 +02:00
$this -> fields [ 'max_attendees' ][ 'enabled' ] = 0 ;
2020-12-17 22:52:42 +01:00
}
2020-05-19 22:06:17 +02:00
}
/**
* Create a project into database
*
* @ param User $user User making creation
* @ param int $notrigger Disable triggers
2023-12-06 15:46:39 +01:00
* @ return int Return integer < 0 if KO , id of created project if OK
2020-05-19 22:06:17 +02:00
*/
public function create ( $user , $notrigger = 0 )
{
$error = 0 ;
$ret = 0 ;
2016-08-29 10:32:00 +02:00
2020-05-19 22:06:17 +02:00
$now = dol_now ();
2018-02-01 19:15:50 +01:00
2020-05-19 22:06:17 +02:00
// Clean parameters
$this -> note_private = dol_substr ( $this -> note_private , 0 , 65535 );
$this -> note_public = dol_substr ( $this -> note_public , 0 , 65535 );
// Check parameters
2021-02-26 18:49:22 +01:00
if ( ! trim ( $this -> ref )) {
2020-05-19 22:06:17 +02:00
$this -> error = 'ErrorFieldsRequired' ;
dol_syslog ( get_class ( $this ) . " ::create error -1 ref null " , LOG_ERR );
return - 1 ;
2015-02-16 10:40:09 +01:00
}
2023-11-27 11:56:32 +01:00
if ( getDolGlobalString ( 'PROJECT_THIRDPARTY_REQUIRED' ) && ! ( $this -> socid > 0 )) {
2020-05-19 22:06:17 +02:00
$this -> error = 'ErrorFieldsRequired' ;
dol_syslog ( get_class ( $this ) . " ::create error -1 thirdparty not defined and option PROJECT_THIRDPARTY_REQUIRED is set " , LOG_ERR );
return - 1 ;
2017-01-29 13:36:33 +01:00
}
2015-06-03 21:01:50 +02:00
2020-05-19 22:06:17 +02:00
// Create project
$this -> db -> begin ();
$sql = " INSERT INTO " . MAIN_DB_PREFIX . " projet ( " ;
$sql .= " ref " ;
2023-10-20 14:33:39 +02:00
$sql .= " , fk_project " ;
2020-05-19 22:06:17 +02:00
$sql .= " , title " ;
$sql .= " , description " ;
$sql .= " , fk_soc " ;
$sql .= " , fk_user_creat " ;
$sql .= " , fk_statut " ;
$sql .= " , fk_opp_status " ;
$sql .= " , opp_percent " ;
$sql .= " , public " ;
$sql .= " , datec " ;
$sql .= " , dateo " ;
$sql .= " , datee " ;
$sql .= " , opp_amount " ;
$sql .= " , budget_amount " ;
$sql .= " , usage_opportunity " ;
$sql .= " , usage_task " ;
$sql .= " , usage_bill_time " ;
$sql .= " , usage_organize_event " ;
2021-02-22 21:00:54 +01:00
$sql .= " , accept_conference_suggestions " ;
$sql .= " , accept_booth_suggestions " ;
2021-02-21 12:32:16 +01:00
$sql .= " , price_registration " ;
$sql .= " , price_booth " ;
2022-05-04 01:53:45 +02:00
$sql .= " , max_attendees " ;
2022-10-21 13:19:21 +02:00
$sql .= " , date_start_event " ;
$sql .= " , date_end_event " ;
$sql .= " , location " ;
2020-08-21 01:11:22 +02:00
$sql .= " , email_msgid " ;
2020-05-19 22:06:17 +02:00
$sql .= " , note_private " ;
$sql .= " , note_public " ;
$sql .= " , entity " ;
2022-11-23 17:32:32 +01:00
$sql .= " , ip " ;
2020-05-19 22:06:17 +02:00
$sql .= " ) VALUES ( " ;
$sql .= " ' " . $this -> db -> escape ( $this -> ref ) . " ' " ;
2023-10-20 14:33:39 +02:00
$sql .= " , " . ( $this -> fk_project ? (( int ) $this -> fk_project ) : " null " );
2020-05-19 22:06:17 +02:00
$sql .= " , ' " . $this -> db -> escape ( $this -> title ) . " ' " ;
$sql .= " , ' " . $this -> db -> escape ( $this -> description ) . " ' " ;
$sql .= " , " . ( $this -> socid > 0 ? $this -> socid : " null " );
2021-09-03 21:25:17 +02:00
$sql .= " , " . (( int ) $user -> id );
2024-07-02 01:46:40 +02:00
$sql .= " , " . ( is_numeric ( $this -> status ) ? (( int ) $this -> status ) : '0' );
2021-09-03 21:25:17 +02:00
$sql .= " , " . (( is_numeric ( $this -> opp_status ) && $this -> opp_status > 0 ) ? (( int ) $this -> opp_status ) : 'NULL' );
$sql .= " , " . ( is_numeric ( $this -> opp_percent ) ? (( int ) $this -> opp_percent ) : 'NULL' );
2020-05-19 22:06:17 +02:00
$sql .= " , " . ( $this -> public ? 1 : 0 );
$sql .= " , ' " . $this -> db -> idate ( $now ) . " ' " ;
$sql .= " , " . ( $this -> date_start != '' ? " ' " . $this -> db -> idate ( $this -> date_start ) . " ' " : 'null' );
$sql .= " , " . ( $this -> date_end != '' ? " ' " . $this -> db -> idate ( $this -> date_end ) . " ' " : 'null' );
$sql .= " , " . ( strcmp ( $this -> opp_amount , '' ) ? price2num ( $this -> opp_amount ) : 'null' );
2024-03-19 12:48:36 +01:00
$sql .= " , " . ( strcmp (( string ) $this -> budget_amount , '' ) ? price2num ( $this -> budget_amount ) : 'null' );
2020-05-19 22:06:17 +02:00
$sql .= " , " . ( $this -> usage_opportunity ? 1 : 0 );
$sql .= " , " . ( $this -> usage_task ? 1 : 0 );
$sql .= " , " . ( $this -> usage_bill_time ? 1 : 0 );
$sql .= " , " . ( $this -> usage_organize_event ? 1 : 0 );
2021-02-22 21:00:54 +01:00
$sql .= " , " . ( $this -> accept_conference_suggestions ? 1 : 0 );
$sql .= " , " . ( $this -> accept_booth_suggestions ? 1 : 0 );
2024-03-19 12:48:36 +01:00
$sql .= " , " . ( strcmp (( string ) $this -> price_registration , '' ) ? price2num ( $this -> price_registration ) : 'null' );
$sql .= " , " . ( strcmp (( string ) $this -> price_booth , '' ) ? price2num ( $this -> price_booth ) : 'null' );
$sql .= " , " . ( strcmp (( string ) $this -> max_attendees , '' ) ? (( int ) $this -> max_attendees ) : 'null' );
2022-10-21 13:19:21 +02:00
$sql .= " , " . ( $this -> date_start_event != '' ? " ' " . $this -> db -> idate ( $this -> date_start_event ) . " ' " : 'null' );
$sql .= " , " . ( $this -> date_end_event != '' ? " ' " . $this -> db -> idate ( $this -> date_end_event ) . " ' " : 'null' );
$sql .= " , " . ( $this -> location ? " ' " . $this -> db -> escape ( $this -> location ) . " ' " : 'null' );
2020-08-21 01:11:22 +02:00
$sql .= " , " . ( $this -> email_msgid ? " ' " . $this -> db -> escape ( $this -> email_msgid ) . " ' " : 'null' );
2020-05-19 22:06:17 +02:00
$sql .= " , " . ( $this -> note_private ? " ' " . $this -> db -> escape ( $this -> note_private ) . " ' " : 'null' );
$sql .= " , " . ( $this -> note_public ? " ' " . $this -> db -> escape ( $this -> note_public ) . " ' " : 'null' );
2024-02-29 15:25:20 +01:00
$sql .= " , " . setEntity ( $this );
2022-11-23 17:32:32 +01:00
$sql .= " , " . ( ! isset ( $this -> ip ) ? 'NULL' : " ' " . $this -> db -> escape ( $this -> ip ) . " ' " );
2020-05-19 22:06:17 +02:00
$sql .= " ) " ;
dol_syslog ( get_class ( $this ) . " ::create " , LOG_DEBUG );
$resql = $this -> db -> query ( $sql );
2021-02-26 18:49:22 +01:00
if ( $resql ) {
2020-05-19 22:06:17 +02:00
$this -> id = $this -> db -> last_insert_id ( MAIN_DB_PREFIX . " projet " );
$ret = $this -> id ;
2020-02-02 09:06:02 +01:00
2021-02-26 18:49:22 +01:00
if ( ! $notrigger ) {
2020-05-19 22:06:17 +02:00
// Call trigger
$result = $this -> call_trigger ( 'PROJECT_CREATE' , $user );
2021-02-26 18:49:22 +01:00
if ( $result < 0 ) {
$error ++ ;
}
2020-05-19 22:06:17 +02:00
// End call triggers
}
2020-05-21 15:05:19 +02:00
} else {
2020-05-19 22:06:17 +02:00
$this -> error = $this -> db -> lasterror ();
$error ++ ;
2014-10-29 20:21:24 +01:00
}
2013-07-07 13:14:32 +02:00
2020-05-19 22:06:17 +02:00
// Update extrafield
2019-11-13 19:35:39 +01:00
if ( ! $error ) {
2020-05-20 20:10:48 +02:00
$result = $this -> insertExtraFields ();
2021-02-26 18:49:22 +01:00
if ( $result < 0 ) {
2020-05-20 20:10:48 +02:00
$error ++ ;
2019-06-14 18:56:30 +02:00
}
}
2023-02-19 16:42:01 +01:00
if ( ! $error && ( getDolGlobalString ( 'MAIN_DISABLEDRAFTSTATUS' ) || getDolGlobalString ( 'MAIN_DISABLEDRAFTSTATUS_PROJECT' ))) {
2020-05-19 22:06:17 +02:00
$res = $this -> setValid ( $user );
2021-02-26 18:49:22 +01:00
if ( $res < 0 ) {
$error ++ ;
}
2017-07-06 15:48:22 +02:00
}
2019-06-14 18:56:30 +02:00
2021-02-26 18:49:22 +01:00
if ( ! $error ) {
2020-05-19 22:06:17 +02:00
$this -> db -> commit ();
return $ret ;
2020-05-21 15:05:19 +02:00
} else {
2020-05-19 22:06:17 +02:00
$this -> db -> rollback ();
return - 1 ;
}
}
/**
* Update a project
2019-02-24 23:32:09 +01:00
*
2020-05-19 22:06:17 +02:00
* @ param User $user User object of making update
* @ param int $notrigger 1 = Disable all triggers
2023-12-06 15:46:39 +01:00
* @ return int Return integer <= 0 if KO , > 0 if OK
2019-02-24 23:32:09 +01:00
*/
2020-05-19 22:06:17 +02:00
public function update ( $user , $notrigger = 0 )
{
2019-11-13 19:35:39 +01:00
global $langs , $conf ;
2012-04-27 11:03:01 +02:00
2019-11-13 19:35:39 +01:00
$error = 0 ;
2012-05-06 00:15:03 +02:00
2020-05-19 22:06:17 +02:00
// Clean parameters
$this -> title = trim ( $this -> title );
$this -> description = trim ( $this -> description );
2021-02-26 18:49:22 +01:00
if ( $this -> opp_amount < 0 ) {
$this -> opp_amount = '' ;
}
if ( $this -> opp_percent < 0 ) {
$this -> opp_percent = '' ;
}
if ( $this -> date_end && $this -> date_end < $this -> date_start ) {
2020-05-19 22:06:17 +02:00
$this -> error = $langs -> trans ( " ErrorDateEndLowerThanDateStart " );
$this -> errors [] = $this -> error ;
$this -> db -> rollback ();
dol_syslog ( get_class ( $this ) . " ::update error -3 " . $this -> error , LOG_ERR );
return - 3 ;
2012-04-27 11:03:01 +02:00
}
2022-03-25 11:53:27 +01:00
$this -> entity = (( isset ( $this -> entity ) && is_numeric ( $this -> entity )) ? $this -> entity : $conf -> entity );
2021-02-26 18:49:22 +01:00
if ( dol_strlen ( trim ( $this -> ref )) > 0 ) {
2020-05-19 22:06:17 +02:00
$this -> db -> begin ();
$sql = " UPDATE " . MAIN_DB_PREFIX . " projet SET " ;
$sql .= " ref=' " . $this -> db -> escape ( $this -> ref ) . " ' " ;
2023-10-20 14:33:39 +02:00
$sql .= " , fk_project= " . ( $this -> fk_project ? (( int ) $this -> fk_project ) : " null " );
2020-05-19 22:06:17 +02:00
$sql .= " , title = ' " . $this -> db -> escape ( $this -> title ) . " ' " ;
$sql .= " , description = ' " . $this -> db -> escape ( $this -> description ) . " ' " ;
$sql .= " , fk_soc = " . ( $this -> socid > 0 ? $this -> socid : " null " );
2024-07-02 01:46:40 +02:00
$sql .= " , fk_statut = " . (( int ) $this -> status );
2020-05-19 22:06:17 +02:00
$sql .= " , fk_opp_status = " . (( is_numeric ( $this -> opp_status ) && $this -> opp_status > 0 ) ? $this -> opp_status : 'null' );
$sql .= " , opp_percent = " . (( is_numeric ( $this -> opp_percent ) && $this -> opp_percent != '' ) ? $this -> opp_percent : 'null' );
$sql .= " , public = " . ( $this -> public ? 1 : 0 );
2022-10-21 13:19:21 +02:00
$sql .= " , datec = " . ( $this -> date_c != '' ? " ' " . $this -> db -> idate ( $this -> date_c ) . " ' " : 'null' );
$sql .= " , dateo = " . ( $this -> date_start != '' ? " ' " . $this -> db -> idate ( $this -> date_start ) . " ' " : 'null' );
$sql .= " , datee = " . ( $this -> date_end != '' ? " ' " . $this -> db -> idate ( $this -> date_end ) . " ' " : 'null' );
$sql .= " , date_close = " . ( $this -> date_close != '' ? " ' " . $this -> db -> idate ( $this -> date_close ) . " ' " : 'null' );
2023-06-21 18:48:30 +02:00
$sql .= " , note_public = " . ( $this -> note_public ? " ' " . $this -> db -> escape ( $this -> note_public ) . " ' " : " null " );
$sql .= " , note_private = " . ( $this -> note_private ? " ' " . $this -> db -> escape ( $this -> note_private ) . " ' " : " null " );
2022-10-21 13:19:21 +02:00
$sql .= " , fk_user_close = " . ( $this -> fk_user_close > 0 ? $this -> fk_user_close : " null " );
2020-05-19 22:06:17 +02:00
$sql .= " , opp_amount = " . ( strcmp ( $this -> opp_amount , '' ) ? price2num ( $this -> opp_amount ) : " null " );
$sql .= " , budget_amount = " . ( strcmp ( $this -> budget_amount , '' ) ? price2num ( $this -> budget_amount ) : " null " );
2024-10-29 02:18:17 +01:00
$sql .= " , fk_user_modif = " . (( int ) $user -> id );
2020-05-19 22:06:17 +02:00
$sql .= " , usage_opportunity = " . ( $this -> usage_opportunity ? 1 : 0 );
$sql .= " , usage_task = " . ( $this -> usage_task ? 1 : 0 );
$sql .= " , usage_bill_time = " . ( $this -> usage_bill_time ? 1 : 0 );
$sql .= " , usage_organize_event = " . ( $this -> usage_organize_event ? 1 : 0 );
2021-02-22 21:00:54 +01:00
$sql .= " , accept_conference_suggestions = " . ( $this -> accept_conference_suggestions ? 1 : 0 );
$sql .= " , accept_booth_suggestions = " . ( $this -> accept_booth_suggestions ? 1 : 0 );
2024-02-13 11:26:40 +01:00
$sql .= " , price_registration = " . ( isset ( $this -> price_registration ) && strcmp ( $this -> price_registration , '' ) ? price2num ( $this -> price_registration ) : " null " );
2024-03-19 12:48:36 +01:00
$sql .= " , price_booth = " . ( isset ( $this -> price_booth ) && strcmp (( string ) $this -> price_booth , '' ) ? price2num ( $this -> price_booth ) : " null " );
$sql .= " , max_attendees = " . ( strcmp (( string ) $this -> max_attendees , '' ) ? ( int ) $this -> max_attendees : " null " );
2022-10-21 13:19:21 +02:00
$sql .= " , date_start_event = " . ( $this -> date_start_event != '' ? " ' " . $this -> db -> idate ( $this -> date_start_event ) . " ' " : 'null' );
$sql .= " , date_end_event = " . ( $this -> date_end_event != '' ? " ' " . $this -> db -> idate ( $this -> date_end_event ) . " ' " : 'null' );
$sql .= " , location = ' " . $this -> db -> escape ( $this -> location ) . " ' " ;
2022-03-25 11:53:27 +01:00
$sql .= " , entity = " . (( int ) $this -> entity );
2021-03-30 19:12:07 +02:00
$sql .= " WHERE rowid = " . (( int ) $this -> id );
2020-05-19 22:06:17 +02:00
dol_syslog ( get_class ( $this ) . " ::update " , LOG_DEBUG );
$resql = $this -> db -> query ( $sql );
2021-02-26 18:49:22 +01:00
if ( $resql ) {
2020-05-19 22:06:17 +02:00
// Update extrafield
2021-02-26 18:49:22 +01:00
if ( ! $error ) {
2020-05-20 20:10:48 +02:00
$result = $this -> insertExtraFields ();
2021-02-26 18:49:22 +01:00
if ( $result < 0 ) {
2020-05-20 20:10:48 +02:00
$error ++ ;
2020-05-19 22:06:17 +02:00
}
2012-04-27 11:03:01 +02:00
}
2012-05-06 00:15:03 +02:00
2021-02-26 18:49:22 +01:00
if ( ! $error && ! $notrigger ) {
2020-05-19 22:06:17 +02:00
// Call trigger
$result = $this -> call_trigger ( 'PROJECT_MODIFY' , $user );
2021-02-26 18:49:22 +01:00
if ( $result < 0 ) {
$error ++ ;
}
2020-05-19 22:06:17 +02:00
// End call triggers
2012-04-27 11:03:01 +02:00
}
2012-05-06 00:15:03 +02:00
2021-02-26 18:49:22 +01:00
if ( ! $error && ( is_object ( $this -> oldcopy ) && $this -> oldcopy -> ref !== $this -> ref )) {
2020-05-19 22:06:17 +02:00
// We remove directory
2022-06-14 17:53:17 +02:00
if ( $conf -> project -> dir_output ) {
$olddir = $conf -> project -> dir_output . " / " . dol_sanitizeFileName ( $this -> oldcopy -> ref );
$newdir = $conf -> project -> dir_output . " / " . dol_sanitizeFileName ( $this -> ref );
2021-02-26 18:49:22 +01:00
if ( file_exists ( $olddir )) {
2020-05-19 22:06:17 +02:00
include_once DOL_DOCUMENT_ROOT . '/core/lib/files.lib.php' ;
$res = @ rename ( $olddir , $newdir );
2021-02-26 18:49:22 +01:00
if ( ! $res ) {
2020-05-19 22:06:17 +02:00
$langs -> load ( " errors " );
$this -> error = $langs -> trans ( 'ErrorFailToRenameDir' , $olddir , $newdir );
2012-04-27 11:03:01 +02:00
$error ++ ;
}
}
}
}
2021-02-26 18:49:22 +01:00
if ( ! $error ) {
2020-05-19 22:06:17 +02:00
$this -> db -> commit ();
$result = 1 ;
2020-05-21 15:05:19 +02:00
} else {
2020-05-19 22:06:17 +02:00
$this -> db -> rollback ();
$result = - 1 ;
2012-04-27 11:03:01 +02:00
}
2020-05-21 15:05:19 +02:00
} else {
2020-05-19 22:06:17 +02:00
$this -> error = $this -> db -> lasterror ();
$this -> errors [] = $this -> error ;
$this -> db -> rollback ();
2021-02-26 18:49:22 +01:00
if ( $this -> db -> lasterrno () == 'DB_ERROR_RECORD_ALREADY_EXISTS' ) {
2020-05-19 22:06:17 +02:00
$result = - 4 ;
2020-05-21 15:05:19 +02:00
} else {
2020-05-19 22:06:17 +02:00
$result = - 2 ;
}
dol_syslog ( get_class ( $this ) . " ::update error " . $result . " " . $this -> error , LOG_ERR );
2012-04-27 11:03:01 +02:00
}
2020-05-21 15:05:19 +02:00
} else {
2020-05-19 22:06:17 +02:00
dol_syslog ( get_class ( $this ) . " ::update ref null " );
$result = - 1 ;
2012-04-27 11:03:01 +02:00
}
2012-05-06 00:15:03 +02:00
2020-05-19 22:06:17 +02:00
return $result ;
2012-05-06 00:15:03 +02:00
}
2013-07-07 13:14:32 +02:00
2018-09-03 19:00:37 +02:00
/**
2020-05-19 22:06:17 +02:00
* Get object from database
2018-09-03 19:00:37 +02:00
*
2020-08-23 18:04:52 +02:00
* @ param int $id Id of object to load
* @ param string $ref Ref of project
2020-08-27 18:50:08 +02:00
* @ param string $ref_ext Ref ext of project
2020-08-23 18:04:52 +02:00
* @ param string $email_msgid Email msgid
* @ return int > 0 if OK , 0 if not found , < 0 if KO
2020-05-19 22:06:17 +02:00
*/
2020-08-27 18:50:08 +02:00
public function fetch ( $id , $ref = '' , $ref_ext = '' , $email_msgid = '' )
2013-04-29 12:02:58 +02:00
{
2021-06-14 20:06:52 +02:00
if ( empty ( $id ) && empty ( $ref ) && empty ( $ref_ext ) && empty ( $email_msgid )) {
2021-06-14 20:13:27 +02:00
dol_syslog ( get_class ( $this ) . " ::fetch Bad parameters " , LOG_WARNING );
2021-02-26 18:49:22 +01:00
return - 1 ;
}
2013-07-07 13:14:32 +02:00
2023-10-20 14:33:39 +02:00
$sql = " SELECT rowid, entity, fk_project, ref, title, description, public, datec, opp_amount, budget_amount, " ;
2022-10-21 13:19:21 +02:00
$sql .= " tms, dateo as date_start, datee as date_end, date_close, fk_soc, fk_user_creat, fk_user_modif, fk_user_close, fk_statut as status, fk_opp_status, opp_percent, " ;
2021-02-21 12:32:16 +01:00
$sql .= " note_private, note_public, model_pdf, usage_opportunity, usage_task, usage_bill_time, usage_organize_event, email_msgid, " ;
2023-06-27 13:40:57 +02:00
$sql .= " accept_conference_suggestions, accept_booth_suggestions, price_registration, price_booth, max_attendees, date_start_event, date_end_event, location, extraparams " ;
2020-05-19 22:06:17 +02:00
$sql .= " FROM " . MAIN_DB_PREFIX . " projet " ;
2021-02-26 18:49:22 +01:00
if ( ! empty ( $id )) {
2021-03-14 11:48:39 +01:00
$sql .= " WHERE rowid = " . (( int ) $id );
2020-08-23 18:04:52 +02:00
} else {
$sql .= " WHERE entity IN ( " . getEntity ( 'project' ) . " ) " ;
2020-09-07 10:18:17 +02:00
if ( ! empty ( $ref )) {
2020-08-23 18:04:52 +02:00
$sql .= " AND ref = ' " . $this -> db -> escape ( $ref ) . " ' " ;
2020-09-08 21:27:28 +02:00
} elseif ( ! empty ( $ref_ext )) {
2020-08-27 18:50:08 +02:00
$sql .= " AND ref_ext = ' " . $this -> db -> escape ( $ref_ext ) . " ' " ;
2020-08-23 18:04:52 +02:00
} else {
$sql .= " AND email_msgid = ' " . $this -> db -> escape ( $email_msgid ) . " ' " ;
}
2013-04-29 12:02:58 +02:00
}
2013-07-07 13:14:32 +02:00
2020-05-19 22:06:17 +02:00
dol_syslog ( get_class ( $this ) . " ::fetch " , LOG_DEBUG );
2019-11-13 19:35:39 +01:00
$resql = $this -> db -> query ( $sql );
2021-02-26 18:49:22 +01:00
if ( $resql ) {
2020-05-19 22:06:17 +02:00
$num_rows = $this -> db -> num_rows ( $resql );
2014-09-23 00:02:19 +02:00
2021-02-26 18:49:22 +01:00
if ( $num_rows ) {
2020-05-19 22:06:17 +02:00
$obj = $this -> db -> fetch_object ( $resql );
2014-09-23 00:02:19 +02:00
2020-05-19 22:06:17 +02:00
$this -> id = $obj -> rowid ;
2020-08-21 01:11:22 +02:00
$this -> entity = $obj -> entity ;
2020-05-19 22:06:17 +02:00
$this -> ref = $obj -> ref ;
2023-10-20 14:33:39 +02:00
$this -> fk_project = $obj -> fk_project ;
2020-05-19 22:06:17 +02:00
$this -> title = $obj -> title ;
$this -> description = $obj -> description ;
$this -> date_c = $this -> db -> jdate ( $obj -> datec );
$this -> datec = $this -> db -> jdate ( $obj -> datec ); // TODO deprecated
$this -> date_m = $this -> db -> jdate ( $obj -> tms );
$this -> datem = $this -> db -> jdate ( $obj -> tms ); // TODO deprecated
2022-10-21 13:19:21 +02:00
$this -> date_start = $this -> db -> jdate ( $obj -> date_start );
$this -> date_end = $this -> db -> jdate ( $obj -> date_end );
2020-05-19 22:06:17 +02:00
$this -> date_close = $this -> db -> jdate ( $obj -> date_close );
$this -> note_private = $obj -> note_private ;
$this -> note_public = $obj -> note_public ;
$this -> socid = $obj -> fk_soc ;
$this -> user_author_id = $obj -> fk_user_creat ;
$this -> user_modification_id = $obj -> fk_user_modif ;
2023-10-17 10:52:19 +02:00
$this -> user_closing_id = $obj -> fk_user_close ;
2020-05-19 22:06:17 +02:00
$this -> public = $obj -> public ;
2020-05-20 20:10:48 +02:00
$this -> statut = $obj -> status ; // deprecated
$this -> status = $obj -> status ;
2020-05-19 22:06:17 +02:00
$this -> opp_status = $obj -> fk_opp_status ;
$this -> opp_amount = $obj -> opp_amount ;
$this -> opp_percent = $obj -> opp_percent ;
$this -> budget_amount = $obj -> budget_amount ;
2020-08-18 14:48:38 +02:00
$this -> model_pdf = $obj -> model_pdf ;
2020-05-19 22:06:17 +02:00
$this -> usage_opportunity = ( int ) $obj -> usage_opportunity ;
$this -> usage_task = ( int ) $obj -> usage_task ;
$this -> usage_bill_time = ( int ) $obj -> usage_bill_time ;
$this -> usage_organize_event = ( int ) $obj -> usage_organize_event ;
2021-02-22 21:00:54 +01:00
$this -> accept_conference_suggestions = ( int ) $obj -> accept_conference_suggestions ;
$this -> accept_booth_suggestions = ( int ) $obj -> accept_booth_suggestions ;
2021-02-21 12:32:16 +01:00
$this -> price_registration = $obj -> price_registration ;
$this -> price_booth = $obj -> price_booth ;
2022-05-04 01:53:45 +02:00
$this -> max_attendees = $obj -> max_attendees ;
2022-10-21 13:19:21 +02:00
$this -> date_start_event = $this -> db -> jdate ( $obj -> date_start_event );
$this -> date_end_event = $this -> db -> jdate ( $obj -> date_end_event );
$this -> location = $obj -> location ;
2020-08-21 01:11:22 +02:00
$this -> email_msgid = $obj -> email_msgid ;
2023-06-27 13:40:57 +02:00
$this -> extraparams = ! empty ( $obj -> extraparams ) ? ( array ) json_decode ( $obj -> extraparams , true ) : array ();
2020-05-19 22:06:17 +02:00
$this -> db -> free ( $resql );
2020-10-23 20:08:35 +02:00
// Retrieve all extrafield
2020-05-19 22:06:17 +02:00
// fetch optionals attributes and labels
$this -> fetch_optionals ();
return 1 ;
}
2014-09-23 00:02:19 +02:00
2020-05-19 22:06:17 +02:00
$this -> db -> free ( $resql );
2014-09-23 00:02:19 +02:00
2020-05-19 22:06:17 +02:00
return 0 ;
2020-05-21 15:05:19 +02:00
} else {
2019-11-13 19:35:39 +01:00
$this -> error = $this -> db -> lasterror ();
2021-03-11 19:09:42 +01:00
$this -> errors [] = $this -> db -> lasterror ();
2014-09-20 10:14:26 +02:00
return - 1 ;
}
2013-04-29 12:02:58 +02:00
}
Created a method generateDocument for several classes
Which are: Commande, Contrat, Livraison, Facture, Projet, Propal, Task, Expedition, CommandeFournisseur, FactureFournisseur and therefore deprecated the following methods supplier_order_pdf_create, supplier_invoice_pdf_create, delivery_order_pdf_create, task_pdf_create, propale_pdf_create, project_pdf_create, facture_pdf_create, expedition_pdf_create, commande_pdf_create
2014-09-16 12:30:37 +02:00
2023-11-08 17:30:51 +01:00
/**
* Fetch object and substitute key
*
* @ param int $id Project id
* @ param string $key Key to substitute
* @ param bool $fetched [ = false ] Not already fetched
* @ return string Substitute key
*/
public function fetchAndSetSubstitution ( $id , $key , $fetched = false )
{
$substitution = '' ;
if ( $fetched === false ) {
$res = $this -> fetch ( $id );
if ( $res > 0 ) {
$fetched = true ;
}
}
if ( $fetched === true ) {
if ( $key == '__PROJECT_ID__' ) {
$substitution = ( $this -> id > 0 ? $this -> id : '' );
} elseif ( $key == '__PROJECT_REF__' ) {
$substitution = $this -> ref ;
} elseif ( $key == '__PROJECT_NAME__' ) {
$substitution = $this -> title ;
}
}
return $substitution ;
}
2020-05-19 22:06:17 +02:00
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
Created a method generateDocument for several classes
Which are: Commande, Contrat, Livraison, Facture, Projet, Propal, Task, Expedition, CommandeFournisseur, FactureFournisseur and therefore deprecated the following methods supplier_order_pdf_create, supplier_invoice_pdf_create, delivery_order_pdf_create, task_pdf_create, propale_pdf_create, project_pdf_create, facture_pdf_create, expedition_pdf_create, commande_pdf_create
2014-09-16 12:30:37 +02:00
/**
2020-05-19 22:06:17 +02:00
* Return list of elements for type , linked to a project
Created a method generateDocument for several classes
Which are: Commande, Contrat, Livraison, Facture, Projet, Propal, Task, Expedition, CommandeFournisseur, FactureFournisseur and therefore deprecated the following methods supplier_order_pdf_create, supplier_invoice_pdf_create, delivery_order_pdf_create, task_pdf_create, propale_pdf_create, project_pdf_create, facture_pdf_create, expedition_pdf_create, commande_pdf_create
2014-09-16 12:30:37 +02:00
*
2025-02-10 21:20:09 +01:00
* @ param string $type 'propal' , 'order' , 'invoice' , 'order_supplier' , 'invoice_supplier' , ...
* @ param string $tablename name of table associated of the type
* @ param string $datefieldname name of date field for filter
* @ param ? int $date_start Start date
* @ param ? int $date_end End date
* @ param string $projectkey Equivalent key to fk_projet for actual type
* @ return array < int , string >| int <- 1 , - 1 >| string Array list of object ids linked to project , < 0 or string if error
Created a method generateDocument for several classes
Which are: Commande, Contrat, Livraison, Facture, Projet, Propal, Task, Expedition, CommandeFournisseur, FactureFournisseur and therefore deprecated the following methods supplier_order_pdf_create, supplier_invoice_pdf_create, delivery_order_pdf_create, task_pdf_create, propale_pdf_create, project_pdf_create, facture_pdf_create, expedition_pdf_create, commande_pdf_create
2014-09-16 12:30:37 +02:00
*/
2024-01-14 12:10:09 +01:00
public function get_element_list ( $type , $tablename , $datefieldname = '' , $date_start = null , $date_end = null , $projectkey = 'fk_projet' )
Created a method generateDocument for several classes
Which are: Commande, Contrat, Livraison, Facture, Projet, Propal, Task, Expedition, CommandeFournisseur, FactureFournisseur and therefore deprecated the following methods supplier_order_pdf_create, supplier_invoice_pdf_create, delivery_order_pdf_create, task_pdf_create, propale_pdf_create, project_pdf_create, facture_pdf_create, expedition_pdf_create, commande_pdf_create
2014-09-16 12:30:37 +02:00
{
2020-05-19 22:06:17 +02:00
// phpcs:enable
2020-12-15 11:34:04 +01:00
global $hookmanager ;
2020-05-19 22:06:17 +02:00
$elements = array ();
Created a method generateDocument for several classes
Which are: Commande, Contrat, Livraison, Facture, Projet, Propal, Task, Expedition, CommandeFournisseur, FactureFournisseur and therefore deprecated the following methods supplier_order_pdf_create, supplier_invoice_pdf_create, delivery_order_pdf_create, task_pdf_create, propale_pdf_create, project_pdf_create, facture_pdf_create, expedition_pdf_create, commande_pdf_create
2014-09-16 12:30:37 +02:00
2021-02-26 18:49:22 +01:00
if ( $this -> id <= 0 ) {
return $elements ;
}
Created a method generateDocument for several classes
Which are: Commande, Contrat, Livraison, Facture, Projet, Propal, Task, Expedition, CommandeFournisseur, FactureFournisseur and therefore deprecated the following methods supplier_order_pdf_create, supplier_invoice_pdf_create, delivery_order_pdf_create, task_pdf_create, propale_pdf_create, project_pdf_create, facture_pdf_create, expedition_pdf_create, commande_pdf_create
2014-09-16 12:30:37 +02:00
2020-05-19 22:06:17 +02:00
$ids = $this -> id ;
2017-01-16 21:16:05 +01:00
2021-02-26 18:49:22 +01:00
if ( $type == 'agenda' ) {
2025-02-10 21:20:09 +01:00
$sql = " SELECT id as rowid FROM " . MAIN_DB_PREFIX . " actioncomm WHERE fk_project IN ( " . $this -> db -> sanitize (( string ) $ids ) . " ) AND entity IN ( " . getEntity ( 'agenda' ) . " ) " ;
2021-02-26 18:49:22 +01:00
} elseif ( $type == 'expensereport' ) {
2025-02-10 21:20:09 +01:00
$sql = " SELECT ed.rowid FROM " . MAIN_DB_PREFIX . " expensereport as e, " . MAIN_DB_PREFIX . " expensereport_det as ed WHERE e.rowid = ed.fk_expensereport AND e.entity IN ( " . getEntity ( 'expensereport' ) . " ) AND ed.fk_projet IN ( " . $this -> db -> sanitize (( string ) $ids ) . " ) " ;
2021-02-26 18:49:22 +01:00
} elseif ( $type == 'project_task' ) {
2025-02-10 21:20:09 +01:00
$sql = " SELECT DISTINCT pt.rowid FROM " . MAIN_DB_PREFIX . " projet_task as pt WHERE pt.fk_projet IN ( " . $this -> db -> sanitize (( string ) $ids ) . " ) " ;
2023-03-08 11:00:58 +01:00
} elseif ( $type == 'element_time' ) { // Case we want to duplicate line foreach user
2025-02-10 21:20:09 +01:00
$sql = " SELECT DISTINCT pt.rowid, ptt.fk_user FROM " . MAIN_DB_PREFIX . " projet_task as pt, " . MAIN_DB_PREFIX . " element_time as ptt WHERE pt.rowid = ptt.fk_element AND ptt.elementtype = 'task' AND pt.fk_projet IN ( " . $this -> db -> sanitize (( string ) $ids ) . " ) " ;
2023-09-27 10:52:39 +02:00
} elseif ( $type == 'stocktransfer_stocktransfer' ) {
2025-02-10 21:20:09 +01:00
$sql = " SELECT ms.rowid, ms.fk_user_author as fk_user FROM " . MAIN_DB_PREFIX . " stocktransfer_stocktransfer as ms, " . MAIN_DB_PREFIX . " entrepot as e WHERE e.rowid = ms.fk_entrepot AND e.entity IN ( " . getEntity ( 'stock' ) . " ) AND ms.origintype = 'project' AND ms.fk_origin IN ( " . $this -> db -> sanitize (( string ) $ids ) . " ) AND ms.type_mouvement = 1 " ;
2021-02-26 18:49:22 +01:00
} elseif ( $type == 'loan' ) {
2025-02-10 21:20:09 +01:00
$sql = " SELECT l.rowid, l.fk_user_author as fk_user FROM " . MAIN_DB_PREFIX . " loan as l WHERE l.entity IN ( " . getEntity ( 'loan' ) . " ) AND l.fk_projet IN ( " . $this -> db -> sanitize (( string ) $ids ) . " ) " ;
2020-05-21 15:05:19 +02:00
} else {
2025-02-10 21:20:09 +01:00
$sql = " SELECT rowid FROM " . MAIN_DB_PREFIX . $tablename . " WHERE " . $projectkey . " IN ( " . $this -> db -> sanitize (( string ) $ids ) . " ) AND entity IN ( " . getEntity ( $type ) . " ) " ;
Created a method generateDocument for several classes
Which are: Commande, Contrat, Livraison, Facture, Projet, Propal, Task, Expedition, CommandeFournisseur, FactureFournisseur and therefore deprecated the following methods supplier_order_pdf_create, supplier_invoice_pdf_create, delivery_order_pdf_create, task_pdf_create, propale_pdf_create, project_pdf_create, facture_pdf_create, expedition_pdf_create, commande_pdf_create
2014-09-16 12:30:37 +02:00
}
2024-01-15 17:48:20 +01:00
if ( isDolTms ( $date_start ) && $type == 'loan' ) {
2025-02-10 21:20:09 +01:00
$sql .= " AND (dateend > ' " . $this -> db -> idate (( int ) $date_start ) . " ' OR dateend IS NULL) " ;
2024-01-15 17:48:20 +01:00
} elseif ( isDolTms ( $date_start ) && ( $type != 'project_task' )) { // For table project_taks, we want the filter on date apply on project_time_spent table
2021-02-26 18:49:22 +01:00
if ( empty ( $datefieldname ) && ! empty ( $this -> table_element_date )) {
$datefieldname = $this -> table_element_date ;
}
if ( empty ( $datefieldname )) {
return 'Error this object has no date field defined' ;
}
2025-02-10 21:20:09 +01:00
$sql .= " AND ( " . $datefieldname . " >= ' " . $this -> db -> idate (( int ) $date_start ) . " ' OR " . $datefieldname . " IS NULL) " ;
2020-05-19 22:06:17 +02:00
}
Created a method generateDocument for several classes
Which are: Commande, Contrat, Livraison, Facture, Projet, Propal, Task, Expedition, CommandeFournisseur, FactureFournisseur and therefore deprecated the following methods supplier_order_pdf_create, supplier_invoice_pdf_create, delivery_order_pdf_create, task_pdf_create, propale_pdf_create, project_pdf_create, facture_pdf_create, expedition_pdf_create, commande_pdf_create
2014-09-16 12:30:37 +02:00
2024-01-15 17:48:20 +01:00
if ( isDolTms ( $date_end ) && $type == 'loan' ) {
2025-02-10 21:20:09 +01:00
$sql .= " AND (datestart < ' " . $this -> db -> idate (( int ) $date_end ) . " ' OR datestart IS NULL) " ;
2024-01-15 17:48:20 +01:00
} elseif ( isDolTms ( $date_end ) && ( $type != 'project_task' )) { // For table project_taks, we want the filter on date apply on project_time_spent table
2021-02-26 18:49:22 +01:00
if ( empty ( $datefieldname ) && ! empty ( $this -> table_element_date )) {
$datefieldname = $this -> table_element_date ;
}
if ( empty ( $datefieldname )) {
return 'Error this object has no date field defined' ;
}
2025-02-10 21:20:09 +01:00
$sql .= " AND ( " . $datefieldname . " <= ' " . $this -> db -> idate (( int ) $date_end ) . " ' OR " . $datefieldname . " IS NULL) " ;
2020-05-19 22:06:17 +02:00
}
2020-12-15 11:34:04 +01:00
$parameters = array (
2024-03-09 16:32:02 +01:00
'sql' => $sql ,
2020-12-15 11:34:04 +01:00
'type' => $type ,
'tablename' => $tablename ,
'datefieldname' => $datefieldname ,
2022-06-22 13:50:54 +02:00
'dates' => $date_start ,
'datee' => $date_end ,
2021-07-29 14:49:41 +02:00
'fk_projet' => $projectkey ,
'ids' => $ids ,
2020-12-15 11:34:04 +01:00
);
2021-12-28 19:47:58 +01:00
$reshook = $hookmanager -> executeHooks ( 'getElementList' , $parameters );
2021-02-26 18:49:22 +01:00
if ( $reshook > 0 ) {
$sql = $hookmanager -> resPrint ;
} else {
$sql .= $hookmanager -> resPrint ;
}
2020-12-15 11:34:04 +01:00
2021-02-26 18:49:22 +01:00
if ( ! $sql ) {
return - 1 ;
}
2020-05-19 22:06:17 +02:00
//print $sql;
dol_syslog ( get_class ( $this ) . " ::get_element_list " , LOG_DEBUG );
$result = $this -> db -> query ( $sql );
2021-02-26 18:49:22 +01:00
if ( $result ) {
2020-05-19 22:06:17 +02:00
$nump = $this -> db -> num_rows ( $result );
2021-02-26 18:49:22 +01:00
if ( $nump ) {
2020-05-19 22:06:17 +02:00
$i = 0 ;
2021-02-26 18:49:22 +01:00
while ( $i < $nump ) {
2020-05-19 22:06:17 +02:00
$obj = $this -> db -> fetch_object ( $result );
Created a method generateDocument for several classes
Which are: Commande, Contrat, Livraison, Facture, Projet, Propal, Task, Expedition, CommandeFournisseur, FactureFournisseur and therefore deprecated the following methods supplier_order_pdf_create, supplier_invoice_pdf_create, delivery_order_pdf_create, task_pdf_create, propale_pdf_create, project_pdf_create, facture_pdf_create, expedition_pdf_create, commande_pdf_create
2014-09-16 12:30:37 +02:00
2020-05-19 22:06:17 +02:00
$elements [ $i ] = $obj -> rowid . ( empty ( $obj -> fk_user ) ? '' : '_' . $obj -> fk_user );
2015-03-04 00:53:35 +01:00
2019-10-20 11:59:21 +02:00
$i ++ ;
2020-05-19 22:06:17 +02:00
}
$this -> db -> free ( $result );
2019-10-20 11:59:21 +02:00
}
Created a method generateDocument for several classes
Which are: Commande, Contrat, Livraison, Facture, Projet, Propal, Task, Expedition, CommandeFournisseur, FactureFournisseur and therefore deprecated the following methods supplier_order_pdf_create, supplier_invoice_pdf_create, delivery_order_pdf_create, task_pdf_create, propale_pdf_create, project_pdf_create, facture_pdf_create, expedition_pdf_create, commande_pdf_create
2014-09-16 12:30:37 +02:00
2020-05-19 22:06:17 +02:00
/* Return array even if empty*/
return $elements ;
2020-05-21 15:05:19 +02:00
} else {
2020-05-19 22:06:17 +02:00
dol_print_error ( $this -> db );
}
2024-01-31 01:28:25 +01:00
return - 1 ;
2020-05-19 22:06:17 +02:00
}
2015-03-04 00:53:35 +01:00
2019-11-21 17:05:06 +01:00
/**
2020-05-19 22:06:17 +02:00
* Delete a project from database
2019-11-21 17:05:06 +01:00
*
2020-05-19 22:06:17 +02:00
* @ param User $user User
* @ param int $notrigger Disable triggers
2023-12-06 15:46:39 +01:00
* @ return int Return integer < 0 if KO , 0 if not possible , > 0 if OK
2019-11-21 17:05:06 +01:00
*/
2020-05-19 22:06:17 +02:00
public function delete ( $user , $notrigger = 0 )
2019-11-21 17:05:06 +01:00
{
2020-05-19 22:06:17 +02:00
global $langs , $conf ;
require_once DOL_DOCUMENT_ROOT . '/core/lib/files.lib.php' ;
2019-11-21 17:05:06 +01:00
2020-05-19 22:06:17 +02:00
$error = 0 ;
2019-11-21 17:05:06 +01:00
2020-05-19 22:06:17 +02:00
$this -> db -> begin ();
2019-11-21 17:05:06 +01:00
2021-02-26 18:49:22 +01:00
if ( ! $error ) {
2020-05-19 22:06:17 +02:00
// Delete linked contacts
$res = $this -> delete_linked_contact ();
2021-02-26 18:49:22 +01:00
if ( $res < 0 ) {
2020-05-19 22:06:17 +02:00
$this -> error = 'ErrorFailToDeleteLinkedContact' ;
//$error++;
$this -> db -> rollback ();
return 0 ;
}
}
2019-11-21 17:05:06 +01:00
2020-05-19 22:06:17 +02:00
// Set fk_projet into elements to null
$listoftables = array (
2024-07-02 01:46:40 +02:00
'propal' => 'fk_projet' ,
'commande' => 'fk_projet' ,
'facture' => 'fk_projet' ,
'supplier_proposal' => 'fk_projet' ,
'commande_fournisseur' => 'fk_projet' ,
'facture_fourn' => 'fk_projet' ,
'expensereport_det' => 'fk_projet' ,
'contrat' => 'fk_projet' ,
2024-03-09 16:32:02 +01:00
'fichinter' => 'fk_projet' ,
'don' => array ( 'field' => 'fk_projet' , 'module' => 'don' ),
'actioncomm' => 'fk_project' ,
2024-10-18 23:14:31 +02:00
'mrp_mo' => array ( 'field' => 'fk_project' , 'module' => 'mrp' ),
2024-07-02 01:46:40 +02:00
'entrepot' => 'fk_project' ,
2020-05-19 22:06:17 +02:00
);
2021-02-26 18:49:22 +01:00
foreach ( $listoftables as $key => $value ) {
2022-09-10 01:16:56 +02:00
if ( is_array ( $value )) {
if ( ! isModEnabled ( $value [ 'module' ])) {
continue ;
}
$fieldname = $value [ 'field' ];
} else {
$fieldname = $value ;
}
$sql = " UPDATE " . MAIN_DB_PREFIX . $key . " SET " . $fieldname . " = NULL where " . $fieldname . " = " . (( int ) $this -> id );
2020-05-19 22:06:17 +02:00
$resql = $this -> db -> query ( $sql );
2021-02-26 18:49:22 +01:00
if ( ! $resql ) {
2020-05-19 22:06:17 +02:00
$this -> errors [] = $this -> db -> lasterror ();
$error ++ ;
break ;
}
}
// Remove linked categories.
if ( ! $error ) {
$sql = " DELETE FROM " . MAIN_DB_PREFIX . " categorie_project " ;
2021-03-30 19:12:07 +02:00
$sql .= " WHERE fk_project = " . (( int ) $this -> id );
2020-05-19 22:06:17 +02:00
$result = $this -> db -> query ( $sql );
if ( ! $result ) {
$error ++ ;
$this -> errors [] = $this -> db -> lasterror ();
}
}
// Fetch tasks
2022-10-18 11:36:17 +02:00
$this -> getLinesArray ( $user , 0 );
2020-05-19 22:06:17 +02:00
// Delete tasks
$ret = $this -> deleteTasks ( $user );
2021-02-26 18:49:22 +01:00
if ( $ret < 0 ) {
$error ++ ;
}
2019-11-21 17:05:06 +01:00
2020-05-19 22:06:17 +02:00
// Delete all child tables
if ( ! $error ) {
$elements = array ( 'categorie_project' ); // elements to delete. TODO Make goodway to delete
2021-02-26 18:49:22 +01:00
foreach ( $elements as $table ) {
2020-05-19 22:06:17 +02:00
if ( ! $error ) {
$sql = " DELETE FROM " . MAIN_DB_PREFIX . $table ;
2021-03-30 19:12:07 +02:00
$sql .= " WHERE fk_project = " . (( int ) $this -> id );
2020-05-19 22:06:17 +02:00
$result = $this -> db -> query ( $sql );
if ( ! $result ) {
$error ++ ;
$this -> errors [] = $this -> db -> lasterror ();
}
2019-11-21 17:05:06 +01:00
}
2020-05-19 22:06:17 +02:00
}
}
2021-02-26 18:49:22 +01:00
if ( ! $error ) {
2020-06-29 14:01:48 +02:00
$sql = " DELETE FROM " . MAIN_DB_PREFIX . " projet_extrafields " ;
2021-08-27 18:18:50 +02:00
$sql .= " WHERE fk_object = " . (( int ) $this -> id );
2020-05-19 22:06:17 +02:00
$resql = $this -> db -> query ( $sql );
2021-02-26 18:49:22 +01:00
if ( ! $resql ) {
2020-06-29 14:01:48 +02:00
$this -> errors [] = $this -> db -> lasterror ();
2020-05-19 22:06:17 +02:00
$error ++ ;
}
}
2020-06-29 14:01:48 +02:00
// Delete project
2021-02-26 18:49:22 +01:00
if ( ! $error ) {
2020-06-29 14:01:48 +02:00
$sql = " DELETE FROM " . MAIN_DB_PREFIX . " projet " ;
2021-03-14 12:20:23 +01:00
$sql .= " WHERE rowid= " . (( int ) $this -> id );
2020-05-19 22:06:17 +02:00
$resql = $this -> db -> query ( $sql );
2021-02-26 18:49:22 +01:00
if ( ! $resql ) {
2020-06-29 14:01:48 +02:00
$this -> errors [] = $langs -> trans ( " CantRemoveProject " , $langs -> transnoentitiesnoconv ( " ProjectOverview " ));
2020-05-19 22:06:17 +02:00
$error ++ ;
}
}
2020-06-29 14:01:48 +02:00
2020-05-19 22:06:17 +02:00
if ( empty ( $error )) {
// We remove directory
$projectref = dol_sanitizeFileName ( $this -> ref );
2022-06-14 17:53:17 +02:00
if ( $conf -> project -> dir_output ) {
$dir = $conf -> project -> dir_output . " / " . $projectref ;
2020-05-19 22:06:17 +02:00
if ( file_exists ( $dir )) {
$res = @ dol_delete_dir_recursive ( $dir );
if ( ! $res ) {
$this -> errors [] = 'ErrorFailToDeleteDir' ;
$error ++ ;
}
2019-11-21 17:05:06 +01:00
}
2019-10-20 11:59:21 +02:00
}
2016-08-29 10:32:00 +02:00
2021-02-26 18:49:22 +01:00
if ( ! $notrigger ) {
2020-05-19 22:06:17 +02:00
// Call trigger
$result = $this -> call_trigger ( 'PROJECT_DELETE' , $user );
if ( $result < 0 ) {
$error ++ ;
2019-11-21 17:05:06 +01:00
}
2020-05-19 22:06:17 +02:00
// End call triggers
2019-11-21 17:05:06 +01:00
}
2020-05-19 22:06:17 +02:00
}
2021-02-26 18:49:22 +01:00
if ( empty ( $error )) {
2020-05-19 22:06:17 +02:00
$this -> db -> commit ();
2019-11-21 17:05:06 +01:00
return 1 ;
2020-05-21 15:05:19 +02:00
} else {
2021-02-26 18:49:22 +01:00
foreach ( $this -> errors as $errmsg ) {
2020-05-19 22:06:17 +02:00
dol_syslog ( get_class ( $this ) . " ::delete " . $errmsg , LOG_ERR );
$this -> error .= ( $this -> error ? ', ' . $errmsg : $errmsg );
}
dol_syslog ( get_class ( $this ) . " ::delete " . $this -> error , LOG_ERR );
$this -> db -> rollback ();
2019-11-21 17:05:06 +01:00
return - 1 ;
}
}
2015-03-04 00:53:35 +01:00
2020-10-06 12:56:28 +02:00
/**
* Return the count of a type of linked elements of this project
*
* @ param string $type The type of the linked elements ( e . g . 'propal' , 'order' , 'invoice' , 'order_supplier' , 'invoice_supplier' )
* @ param string $tablename The name of table associated of the type
* @ param string $projectkey ( optional ) Equivalent key to fk_projet for actual type
* @ return integer The count of the linked elements ( the count is zero on request error too )
*/
public function getElementCount ( $type , $tablename , $projectkey = 'fk_projet' )
{
2021-02-26 18:49:22 +01:00
if ( $this -> id <= 0 ) {
return 0 ;
}
2020-10-06 12:56:28 +02:00
if ( $type == 'agenda' ) {
2021-08-27 18:18:50 +02:00
$sql = " SELECT COUNT(id) as nb FROM " . MAIN_DB_PREFIX . " actioncomm WHERE fk_project = " . (( int ) $this -> id ) . " AND entity IN ( " . getEntity ( 'agenda' ) . " ) " ;
2020-10-06 12:56:28 +02:00
} elseif ( $type == 'expensereport' ) {
2021-03-30 19:12:07 +02:00
$sql = " SELECT COUNT(ed.rowid) as nb FROM " . MAIN_DB_PREFIX . " expensereport as e, " . MAIN_DB_PREFIX . " expensereport_det as ed WHERE e.rowid = ed.fk_expensereport AND e.entity IN ( " . getEntity ( 'expensereport' ) . " ) AND ed.fk_projet = " . (( int ) $this -> id );
2020-10-06 12:56:28 +02:00
} elseif ( $type == 'project_task' ) {
2021-08-23 18:56:46 +02:00
$sql = " SELECT DISTINCT COUNT(pt.rowid) as nb FROM " . MAIN_DB_PREFIX . " projet_task as pt WHERE pt.fk_projet = " . (( int ) $this -> id );
2023-03-08 11:00:58 +01:00
} elseif ( $type == 'element_time' ) { // Case we want to duplicate line foreach user
$sql = " SELECT DISTINCT COUNT(pt.rowid) as nb FROM " . MAIN_DB_PREFIX . " projet_task as pt, " . MAIN_DB_PREFIX . " element_time as ptt WHERE pt.rowid = ptt.fk_element AND ptt.elementtype = 'task' AND pt.fk_projet = " . (( int ) $this -> id );
2020-10-06 12:56:28 +02:00
} elseif ( $type == 'stock_mouvement' ) {
2021-09-30 15:59:47 +02:00
$sql = " SELECT COUNT(ms.rowid) as nb FROM " . MAIN_DB_PREFIX . " stock_mouvement as ms, " . MAIN_DB_PREFIX . " entrepot as e WHERE e.rowid = ms.fk_entrepot AND e.entity IN ( " . getEntity ( 'stock' ) . " ) AND ms.origintype = 'project' AND ms.fk_origin = " . (( int ) $this -> id ) . " AND ms.type_mouvement = 1 " ;
2020-10-06 12:56:28 +02:00
} elseif ( $type == 'loan' ) {
2021-09-30 15:59:47 +02:00
$sql = " SELECT COUNT(l.rowid) as nb FROM " . MAIN_DB_PREFIX . " loan as l WHERE l.entity IN ( " . getEntity ( 'loan' ) . " ) AND l.fk_projet = " . (( int ) $this -> id );
2020-10-06 12:56:28 +02:00
} else {
2021-03-30 19:12:07 +02:00
$sql = " SELECT COUNT(rowid) as nb FROM " . MAIN_DB_PREFIX . $tablename . " WHERE " . $projectkey . " = " . (( int ) $this -> id ) . " AND entity IN ( " . getEntity ( $type ) . " ) " ;
2020-10-06 12:56:28 +02:00
}
$result = $this -> db -> query ( $sql );
2021-02-26 18:49:22 +01:00
if ( ! $result ) {
return 0 ;
}
2020-10-06 12:56:28 +02:00
$obj = $this -> db -> fetch_object ( $result );
$this -> db -> free ( $result );
return $obj -> nb ;
}
2015-04-18 18:11:01 +02:00
/**
2024-07-03 01:33:55 +02:00
* Delete tasks with no children first , then task with children recursively
2015-04-18 18:11:01 +02:00
*
2024-07-03 01:33:55 +02:00
* @ param User $user User
* @ return int Return integer < 0 if KO , 1 if OK
2015-04-18 18:11:01 +02:00
*/
2020-05-19 22:06:17 +02:00
public function deleteTasks ( $user )
2015-04-18 18:11:01 +02:00
{
2020-05-19 22:06:17 +02:00
$countTasks = count ( $this -> lines );
$deleted = false ;
2021-02-26 18:49:22 +01:00
if ( $countTasks ) {
foreach ( $this -> lines as $task ) {
2020-05-19 22:06:17 +02:00
if ( $task -> hasChildren () <= 0 ) { // If there is no children (or error to detect them)
$deleted = true ;
$ret = $task -> delete ( $user );
2021-02-26 18:49:22 +01:00
if ( $ret <= 0 ) {
2020-05-19 22:06:17 +02:00
$this -> errors [] = $this -> db -> lasterror ();
return - 1 ;
}
}
}
}
$this -> getLinesArray ( $user );
2021-02-26 18:49:22 +01:00
if ( $deleted && count ( $this -> lines ) < $countTasks ) {
if ( count ( $this -> lines )) {
2024-07-03 01:33:55 +02:00
$this -> deleteTasks ( $user );
2021-02-26 18:49:22 +01:00
}
2020-05-19 22:06:17 +02:00
}
2015-04-18 18:11:01 +02:00
2020-05-19 22:06:17 +02:00
return 1 ;
2015-04-18 18:11:01 +02:00
}
2016-08-29 10:32:00 +02:00
2016-02-28 00:19:12 +01:00
/**
2020-05-19 22:06:17 +02:00
* Validate a project
2016-02-28 00:19:12 +01:00
*
2020-05-19 22:06:17 +02:00
* @ param User $user User that validate
* @ param int $notrigger 1 = Disable triggers
2023-12-06 15:46:39 +01:00
* @ return int Return integer < 0 if KO , 0 = Nothing done , > 0 if KO
2016-02-28 00:19:12 +01:00
*/
2020-05-19 22:06:17 +02:00
public function setValid ( $user , $notrigger = 0 )
2016-02-28 00:19:12 +01:00
{
2024-07-02 18:46:20 +02:00
global $langs ;
2016-08-29 10:32:00 +02:00
2020-05-19 22:06:17 +02:00
$error = 0 ;
2016-08-29 10:32:00 +02:00
2023-02-19 16:28:04 +01:00
// Protection
if ( $this -> status == self :: STATUS_VALIDATED ) {
2024-01-12 17:55:52 +01:00
dol_syslog ( get_class ( $this ) . " ::validate action abandoned: already validated " , LOG_WARNING );
2023-02-19 16:28:04 +01:00
return 0 ;
}
2020-05-19 22:06:17 +02:00
2023-02-19 16:28:04 +01:00
// Check parameters
if ( preg_match ( '/^' . preg_quote ( $langs -> trans ( " CopyOf " ) . ' ' ) . '/' , $this -> title )) {
$this -> error = $langs -> trans ( " ErrorFieldFormat " , $langs -> transnoentities ( " Label " )) . '. ' . $langs -> trans ( 'RemoveString' , $langs -> transnoentitiesnoconv ( " CopyOf " ));
return - 1 ;
}
2020-05-19 22:06:17 +02:00
2023-02-19 16:28:04 +01:00
$this -> db -> begin ();
2020-05-19 22:06:17 +02:00
2023-02-19 16:28:04 +01:00
$sql = " UPDATE " . MAIN_DB_PREFIX . " projet " ;
$sql .= " SET fk_statut = " . self :: STATUS_VALIDATED ;
$sql .= " WHERE rowid = " . (( int ) $this -> id );
2023-02-19 17:20:51 +01:00
//$sql .= " AND entity = ".((int) $conf->entity); // Disabled, when we use the ID for the where, we must not add any other search condition
2016-08-29 10:32:00 +02:00
2023-02-19 16:28:04 +01:00
dol_syslog ( get_class ( $this ) . " ::setValid " , LOG_DEBUG );
$resql = $this -> db -> query ( $sql );
if ( $resql ) {
// Call trigger
if ( empty ( $notrigger )) {
$result = $this -> call_trigger ( 'PROJECT_VALIDATE' , $user );
if ( $result < 0 ) {
$error ++ ;
2020-05-19 22:06:17 +02:00
}
2023-02-19 16:28:04 +01:00
// End call triggers
}
if ( ! $error ) {
$this -> statut = 1 ;
2024-07-02 01:46:40 +02:00
$this -> status = 1 ;
2023-02-19 16:28:04 +01:00
$this -> db -> commit ();
return 1 ;
2020-05-21 15:05:19 +02:00
} else {
2020-05-19 22:06:17 +02:00
$this -> db -> rollback ();
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 -> error = implode ( ',' , $this -> errors );
2023-02-19 16:28:04 +01:00
dol_syslog ( get_class ( $this ) . " ::setValid " . $this -> error , LOG_ERR );
2020-05-19 22:06:17 +02:00
return - 1 ;
}
2023-02-19 16:28:04 +01:00
} else {
$this -> db -> rollback ();
$this -> error = $this -> db -> lasterror ();
return - 1 ;
2020-05-19 22:06:17 +02:00
}
}
2016-08-29 10:32:00 +02:00
2016-01-18 15:56:51 +01:00
/**
2020-05-19 22:06:17 +02:00
* Close a project
2016-01-18 15:56:51 +01:00
*
2020-05-19 22:06:17 +02:00
* @ param User $user User that close project
2023-12-06 15:46:39 +01:00
* @ return int Return integer < 0 if KO , 0 if already closed , > 0 if OK
2016-01-18 15:56:51 +01:00
*/
2020-05-19 22:06:17 +02:00
public function setClose ( $user )
2016-01-18 15:56:51 +01:00
{
2020-05-19 22:06:17 +02:00
$now = dol_now ();
2016-01-18 15:56:51 +01:00
2020-05-19 22:06:17 +02:00
$error = 0 ;
2016-01-18 15:56:51 +01:00
2024-07-02 01:46:40 +02:00
if ( $this -> status != self :: STATUS_CLOSED ) {
2020-05-19 22:06:17 +02:00
$this -> db -> begin ();
$sql = " UPDATE " . MAIN_DB_PREFIX . " projet " ;
2021-03-30 03:37:54 +02:00
$sql .= " SET fk_statut = " . self :: STATUS_CLOSED . " , fk_user_close = " . (( int ) $user -> id ) . " , date_close = ' " . $this -> db -> idate ( $now ) . " ' " ;
2021-08-27 16:33:03 +02:00
$sql .= " WHERE rowid = " . (( int ) $this -> id );
2020-05-19 22:06:17 +02:00
$sql .= " AND fk_statut = " . self :: STATUS_VALIDATED ;
2023-11-27 11:56:32 +01:00
if ( getDolGlobalString ( 'PROJECT_USE_OPPORTUNITIES' )) {
2020-05-19 22:06:17 +02:00
// TODO What to do if fk_opp_status is not code 'WON' or 'LOST'
}
dol_syslog ( get_class ( $this ) . " ::setClose " , LOG_DEBUG );
$resql = $this -> db -> query ( $sql );
2021-02-26 18:49:22 +01:00
if ( $resql ) {
2020-05-19 22:06:17 +02:00
// Call trigger
$result = $this -> call_trigger ( 'PROJECT_CLOSE' , $user );
2021-02-26 18:49:22 +01:00
if ( $result < 0 ) {
$error ++ ;
}
2020-05-19 22:06:17 +02:00
// End call triggers
2021-02-26 18:49:22 +01:00
if ( ! $error ) {
2024-07-02 01:46:40 +02:00
$this -> status = 2 ;
2020-05-19 22:06:17 +02:00
$this -> db -> commit ();
return 1 ;
2020-05-21 15:05:19 +02:00
} else {
2020-05-19 22:06:17 +02:00
$this -> db -> rollback ();
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 -> error = implode ( ',' , $this -> errors );
2020-05-19 22:06:17 +02:00
dol_syslog ( get_class ( $this ) . " ::setClose " . $this -> error , LOG_ERR );
return - 1 ;
}
2020-05-21 15:05:19 +02:00
} else {
2020-05-19 22:06:17 +02:00
$this -> db -> rollback ();
$this -> error = $this -> db -> lasterror ();
return - 1 ;
}
2017-03-12 15:31:39 +01:00
}
2016-08-29 10:32:00 +02:00
2020-05-19 22:06:17 +02:00
return 0 ;
2016-02-28 00:19:12 +01:00
}
2015-04-18 18:11:01 +02:00
2016-07-09 15:30:42 +02:00
/**
2020-05-19 22:06:17 +02:00
* Return status label of object
2016-07-09 15:30:42 +02:00
*
2020-05-19 22:06:17 +02:00
* @ param int $mode 0 = long label , 1 = short label , 2 = Picto + short label , 3 = Picto , 4 = Picto + long label , 5 = Short label + Picto
* @ return string Label
2016-07-09 15:30:42 +02:00
*/
2020-05-19 22:06:17 +02:00
public function getLibStatut ( $mode = 0 )
2016-07-09 15:30:42 +02:00
{
2024-07-02 01:46:40 +02:00
return $this -> LibStatut ( isset ( $this -> status ) ? $this -> status : $this -> statut , $mode );
2016-07-09 15:30:42 +02:00
}
2016-08-29 10:32:00 +02:00
2020-05-19 22:06:17 +02:00
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
2016-08-29 10:32:00 +02:00
/**
2020-05-19 22:06:17 +02:00
* Renvoi status label for a status
2016-08-29 10:32:00 +02:00
*
2020-05-19 22:06:17 +02:00
* @ param int $status id status
* @ param int $mode 0 = long label , 1 = short label , 2 = Picto + short label , 3 = Picto , 4 = Picto + long label , 5 = Short label + Picto , 6 = Long label + Picto
* @ return string Label
2016-08-29 10:32:00 +02:00
*/
2020-05-19 22:06:17 +02:00
public function LibStatut ( $status , $mode = 0 )
2016-08-29 10:32:00 +02:00
{
2020-05-19 22:06:17 +02:00
// phpcs:enable
global $langs ;
2016-08-29 10:32:00 +02:00
2023-10-20 12:44:08 +02:00
if ( is_null ( $status )) {
return '' ;
}
2020-05-19 22:06:17 +02:00
$statustrans = array (
0 => 'status0' ,
1 => 'status4' ,
2 => 'status6' ,
);
2016-08-29 10:32:00 +02:00
2020-05-19 22:06:17 +02:00
$statusClass = 'status0' ;
if ( ! empty ( $statustrans [ $status ])) {
$statusClass = $statustrans [ $status ];
2016-08-29 10:32:00 +02:00
}
2023-11-24 10:10:24 +01:00
return dolGetStatus ( $langs -> transnoentitiesnoconv ( $this -> labelStatus [ $status ]), $langs -> transnoentitiesnoconv ( $this -> labelStatusShort [ $status ]), '' , $statusClass , $mode );
2017-06-07 16:44:04 +02:00
}
2016-08-29 10:32:00 +02:00
2023-02-07 22:12:47 +01:00
/**
* getTooltipContentArray
2024-09-23 00:37:30 +02:00
* @ param array < string , mixed > $params params to construct tooltip data
2023-02-07 22:12:47 +01:00
* @ since v18
2024-09-23 03:24:19 +02:00
* @ return array { picto ? : string , ref ? : string , refsupplier ? : string , label ? : string , date ? : string , date_echeance ? : string , amountht ? : string , total_ht ? : string , totaltva ? : string , amountlt1 ? : string , amountlt2 ? : string , amountrevenustamp ? : string , totalttc ? : string } | array { optimize : string }
2023-02-07 22:12:47 +01:00
*/
public function getTooltipContentArray ( $params )
{
global $conf , $langs ;
$langs -> load ( 'projects' );
$option = $params [ 'option' ] ? ? '' ;
2024-04-11 19:14:26 +02:00
$moreinpopup = $params [ 'moreinpopup' ] ? ? '' ;
2023-02-07 22:12:47 +01:00
$datas = [];
if ( $option != 'nolink' ) {
$datas [ 'picto' ] = img_picto ( '' , $this -> picto , 'class="pictofixedwidth"' ) . ' <u class="paddingrightonly">' . $langs -> trans ( " Project " ) . '</u>' ;
}
if ( isset ( $this -> status )) {
$datas [ 'picto' ] .= ' ' . $this -> getLibStatut ( 5 );
}
$datas [ 'ref' ] = ( isset ( $datas [ 'picto' ]) ? '<br>' : '' ) . '<b>' . $langs -> trans ( 'Ref' ) . ': </b>' . $this -> ref ; // The space must be after the : to not being explode when showing the title in img_picto
$datas [ 'label' ] = '<br><b>' . $langs -> trans ( 'Label' ) . ': </b>' . $this -> title ; // The space must be after the : to not being explode when showing the title in img_picto
if ( isset ( $this -> public )) {
$datas [ 'visibility' ] = '<br><b>' . $langs -> trans ( " Visibility " ) . " :</b> " ;
$datas [ 'visibility' ] .= ( $this -> public ? img_picto ( $langs -> trans ( 'SharedProject' ), 'world' , 'class="pictofixedwidth"' ) . $langs -> trans ( " SharedProject " ) : img_picto ( $langs -> trans ( 'PrivateProject' ), 'private' , 'class="pictofixedwidth"' ) . $langs -> trans ( " PrivateProject " ));
}
if ( ! empty ( $this -> thirdparty_name )) {
$datas [ 'thirdparty' ] = '<br><b>' . $langs -> trans ( 'ThirdParty' ) . ': </b>' . $this -> thirdparty_name ; // The space must be after the : to not being explode when showing the title in img_picto
}
if ( ! empty ( $this -> date_start )) {
$datas [ 'datestart' ] = '<br><b>' . $langs -> trans ( 'DateStart' ) . ': </b>' . dol_print_date ( $this -> date_start , 'day' ); // The space must be after the : to not being explode when showing the title in img_picto
}
if ( ! empty ( $this -> date_end )) {
$datas [ 'dateend' ] = '<br><b>' . $langs -> trans ( 'DateEnd' ) . ': </b>' . dol_print_date ( $this -> date_end , 'day' ); // The space must be after the : to not being explode when showing the title in img_picto
}
if ( $moreinpopup ) {
$datas [ 'moreinpopup' ] = '<br>' . $moreinpopup ;
}
return $datas ;
}
2016-07-09 15:30:42 +02:00
/**
2025-02-10 21:20:09 +01:00
* Return clickable name ( with optional picto )
2016-07-09 15:30:42 +02:00
*
2025-02-10 21:20:09 +01:00
* @ param int < 0 , 2 > $withpicto 0 = No picto , 1 = Include picto into link , 2 = Only picto
* @ param string $option Variant where the link point to ( '' , 'nolink' )
* @ param int $addlabel 0 = Default , 1 = Add label into string , > 1 = Add first chars into string
* @ param string $moreinpopup Text to add into popup
* @ param string $sep Separator between ref and label if option addlabel is set
* @ param int < 0 , 1 > $notooltip 1 = Disable tooltip
* @ param int <- 1 , 1 > $save_lastsearch_value - 1 = Auto , 0 = No save of lastsearch_values when clicking , 1 = Save lastsearch_values whenclicking
* @ param string $morecss More css on a link
* @ param string $save_pageforbacktolist Back to this page 'context:url'
* @ return string String with URL
2016-07-09 15:30:42 +02:00
*/
2023-09-06 14:56:51 +02:00
public function getNomUrl ( $withpicto = 0 , $option = '' , $addlabel = 0 , $moreinpopup = '' , $sep = ' - ' , $notooltip = 0 , $save_lastsearch_value = - 1 , $morecss = '' , $save_pageforbacktolist = '' )
2016-07-09 15:30:42 +02:00
{
2020-05-19 22:06:17 +02:00
global $conf , $langs , $user , $hookmanager ;
2021-02-26 18:49:22 +01:00
if ( ! empty ( $conf -> dol_no_mouse_hover )) {
$notooltip = 1 ; // Force disable tooltips
}
2016-08-29 10:32:00 +02:00
2020-05-19 22:06:17 +02:00
$result = '' ;
2023-11-27 11:56:32 +01:00
if ( getDolGlobalString ( 'PROJECT_OPEN_ALWAYS_ON_TAB' )) {
2024-01-05 04:18:53 +01:00
$option = getDolGlobalString ( 'PROJECT_OPEN_ALWAYS_ON_TAB' );
2016-08-29 10:32:00 +02:00
}
2023-02-07 22:12:47 +01:00
$params = [
'id' => $this -> id ,
'objecttype' => $this -> element ,
'moreinpopup' => $moreinpopup ,
'option' => $option ,
];
$classfortooltip = 'classfortooltip' ;
$dataparams = '' ;
if ( getDolGlobalInt ( 'MAIN_ENABLE_AJAX_TOOLTIP' )) {
$classfortooltip = 'classforajaxtooltip' ;
2023-04-03 19:51:40 +02:00
$dataparams = ' data-params="' . dol_escape_htmltag ( json_encode ( $params )) . '"' ;
$label = '' ;
} else {
$label = implode ( $this -> getTooltipContentArray ( $params ));
2021-02-26 18:49:22 +01:00
}
2020-05-19 22:06:17 +02:00
2020-05-20 20:10:48 +02:00
$url = '' ;
2021-02-26 18:49:22 +01:00
if ( $option != 'nolink' ) {
2020-05-20 20:10:48 +02:00
if ( preg_match ( '/\.php$/' , $option )) {
$url = dol_buildpath ( $option , 1 ) . '?id=' . $this -> id ;
2021-02-26 18:49:22 +01:00
} elseif ( $option == 'task' ) {
2020-05-20 20:10:48 +02:00
$url = DOL_URL_ROOT . '/projet/tasks.php?id=' . $this -> id ;
2021-02-26 18:49:22 +01:00
} elseif ( $option == 'preview' ) {
2020-05-20 20:10:48 +02:00
$url = DOL_URL_ROOT . '/projet/element.php?id=' . $this -> id ;
2021-03-15 20:20:53 +01:00
} elseif ( $option == 'eventorganization' ) {
$url = DOL_URL_ROOT . '/eventorganization/conferenceorbooth_list.php?projectid=' . $this -> id ;
2020-05-21 15:05:19 +02:00
} else {
2020-05-20 20:10:48 +02:00
$url = DOL_URL_ROOT . '/projet/card.php?id=' . $this -> id ;
2016-08-29 10:32:00 +02:00
}
2020-05-20 20:10:48 +02:00
// Add param to save lastsearch_values or not
$add_save_lastsearch_values = ( $save_lastsearch_value == 1 ? 1 : 0 );
2023-09-10 17:41:22 +02:00
if ( $save_lastsearch_value == - 1 && isset ( $_SERVER [ " PHP_SELF " ]) && preg_match ( '/list\.php/' , $_SERVER [ " PHP_SELF " ])) {
2021-02-26 18:49:22 +01:00
$add_save_lastsearch_values = 1 ;
}
if ( $add_save_lastsearch_values ) {
$url .= '&save_lastsearch_values=1' ;
}
2023-09-06 14:56:51 +02:00
$add_save_backpagefor = ( $save_pageforbacktolist ? 1 : 0 );
if ( $add_save_backpagefor ) {
$url .= " &save_pageforbacktolist= " . urlencode ( $save_pageforbacktolist );
}
2016-08-29 10:32:00 +02:00
}
2020-05-19 22:06:17 +02:00
2020-05-20 20:10:48 +02:00
$linkclose = '' ;
2022-07-28 18:06:37 +02:00
if ( empty ( $notooltip ) && $user -> hasRight ( 'projet' , 'lire' )) {
2023-11-27 11:56:32 +01:00
if ( getDolGlobalString ( 'MAIN_OPTIMIZEFORTEXTBROWSER' )) {
2020-05-20 20:10:48 +02:00
$label = $langs -> trans ( " ShowProject " );
2025-01-09 01:41:24 +01:00
$linkclose .= ' alt="' . dolPrintHTMLForAttribute ( $label ) . '"' ;
2016-08-29 10:32:00 +02:00
}
2025-01-09 01:41:24 +01:00
$linkclose .= ( $label ? ' title="' . dolPrintHTMLForAttribute ( $label ) . '"' : ' title="tocomplete"' );
2023-04-03 19:51:40 +02:00
$linkclose .= $dataparams . ' class="' . $classfortooltip . ( $morecss ? ' ' . $morecss : '' ) . '"' ;
2021-02-26 18:49:22 +01:00
} else {
$linkclose = ( $morecss ? ' class="' . $morecss . '"' : '' );
2016-08-29 10:32:00 +02:00
}
2020-05-20 20:10:48 +02:00
$picto = 'projectpub' ;
2021-02-26 18:49:22 +01:00
if ( ! $this -> public ) {
$picto = 'project' ;
}
2020-05-19 22:06:17 +02:00
2020-05-20 20:10:48 +02:00
$linkstart = '<a href="' . $url . '"' ;
$linkstart .= $linkclose . '>' ;
$linkend = '</a>' ;
2020-05-19 22:06:17 +02:00
2020-05-20 20:10:48 +02:00
$result .= $linkstart ;
2021-02-26 18:49:22 +01:00
if ( $withpicto ) {
2023-04-10 01:39:47 +02:00
$result .= img_object (( $notooltip ? '' : $label ), $picto , 'class="pictofixedwidth em088"' , 0 , 0 , $notooltip ? 0 : 1 );
2021-02-26 18:49:22 +01:00
}
if ( $withpicto != 2 ) {
$result .= $this -> ref ;
}
2020-05-20 20:10:48 +02:00
$result .= $linkend ;
2021-02-26 18:49:22 +01:00
if ( $withpicto != 2 ) {
2022-10-24 01:25:50 +02:00
$result .= (( $addlabel && $this -> title ) ? '<span class="opacitymedium">' . $sep . dol_trunc ( $this -> title , ( $addlabel > 1 ? $addlabel : 0 )) . '</span>' : '' );
2021-02-26 18:49:22 +01:00
}
2020-05-19 22:06:17 +02:00
2020-05-20 20:10:48 +02:00
global $action ;
$hookmanager -> initHooks ( array ( 'projectdao' ));
2024-03-09 16:32:02 +01:00
$parameters = array ( 'id' => $this -> id , 'getnomurl' => & $result );
2020-05-20 20:10:48 +02:00
$reshook = $hookmanager -> executeHooks ( 'getNomUrl' , $parameters , $this , $action ); // Note that $action and $object may have been modified by some hooks
2021-02-26 18:49:22 +01:00
if ( $reshook > 0 ) {
$result = $hookmanager -> resPrint ;
} else {
$result .= $hookmanager -> resPrint ;
}
2020-05-19 22:06:17 +02:00
2020-05-20 20:10:48 +02:00
return $result ;
2016-08-29 10:32:00 +02:00
}
/**
2020-05-19 22:06:17 +02:00
* Initialise an instance with random values .
* Used to build previews or test instances .
* id must be 0 if object instance is a specimen .
2016-08-29 10:32:00 +02:00
*
2024-03-02 16:38:35 +01:00
* @ return int
2016-08-29 10:32:00 +02:00
*/
2020-05-19 22:06:17 +02:00
public function initAsSpecimen ()
2016-08-29 10:32:00 +02:00
{
2020-05-19 22:06:17 +02:00
global $user , $langs , $conf ;
2016-08-29 10:32:00 +02:00
2020-05-19 22:06:17 +02:00
$now = dol_now ();
// Initialise parameters
$this -> id = 0 ;
$this -> ref = 'SPECIMEN' ;
2023-03-24 17:30:00 +01:00
$this -> entity = $conf -> entity ;
2020-05-19 22:06:17 +02:00
$this -> specimen = 1 ;
$this -> socid = 1 ;
$this -> date_c = $now ;
$this -> date_m = $now ;
$this -> date_start = $now ;
$this -> date_end = $now + ( 3600 * 24 * 365 );
$this -> note_public = 'SPECIMEN' ;
2024-03-01 12:39:23 +01:00
$this -> note_private = 'Private Note' ;
$this -> fk_project = 0 ;
2020-05-19 22:06:17 +02:00
$this -> opp_amount = 20000 ;
$this -> budget_amount = 10000 ;
$this -> usage_opportunity = 1 ;
$this -> usage_task = 1 ;
$this -> usage_bill_time = 1 ;
$this -> usage_organize_event = 1 ;
/*
$nbp = mt_rand ( 1 , 9 );
$xnbp = 0 ;
while ( $xnbp < $nbp )
{
$line = new Task ( $this -> db );
$line -> fk_project = 0 ;
$line -> label = $langs -> trans ( " Label " ) . " " . $xnbp ;
$line -> description = $langs -> trans ( " Description " ) . " " . $xnbp ;
$this -> lines [] = $line ;
$xnbp ++ ;
}
*/
2024-03-02 16:38:35 +01:00
return 1 ;
2020-05-19 22:06:17 +02:00
}
2017-06-07 16:44:04 +02:00
2016-11-09 22:54:51 +01:00
/**
2020-05-19 22:06:17 +02:00
* Check if user has permission on current project
2017-06-07 16:44:04 +02:00
*
2020-05-19 22:06:17 +02:00
* @ param User $user Object user to evaluate
* @ param string $mode Type of permission we want to know : 'read' , 'write'
* @ return int > 0 if user has permission , < 0 if user has no permission
2016-11-09 22:54:51 +01:00
*/
2020-11-05 09:40:37 +01:00
public function restrictedProjectArea ( User $user , $mode = 'read' )
2016-11-09 22:54:51 +01:00
{
2020-05-19 22:06:17 +02:00
// To verify role of users
$userAccess = 0 ;
2023-10-15 18:39:13 +02:00
if (( $mode == 'read' && $user -> hasRight ( 'projet' , 'all' , 'lire' )) || ( $mode == 'write' && $user -> hasRight ( 'projet' , 'all' , 'creer' )) || ( $mode == 'delete' && $user -> hasRight ( 'projet' , 'all' , 'supprimer' ))) {
2020-05-19 22:06:17 +02:00
$userAccess = 1 ;
2023-10-15 18:39:13 +02:00
} elseif ( $this -> public && (( $mode == 'read' && $user -> hasRight ( 'projet' , 'lire' )) || ( $mode == 'write' && $user -> hasRight ( 'projet' , 'creer' )) || ( $mode == 'delete' && $user -> hasRight ( 'projet' , 'supprimer' )))) {
2020-05-19 22:06:17 +02:00
$userAccess = 1 ;
2020-11-05 09:40:37 +01:00
} else { // No access due to permission to read all projects, so we check if we are a contact of project
2021-02-26 18:49:22 +01:00
foreach ( array ( 'internal' , 'external' ) as $source ) {
2020-05-19 22:06:17 +02:00
$userRole = $this -> liste_contact ( 4 , $source );
$num = count ( $userRole );
2016-08-29 10:32:00 +02:00
2020-05-19 22:06:17 +02:00
$nblinks = 0 ;
2021-02-26 18:49:22 +01:00
while ( $nblinks < $num ) {
if ( $source == 'internal' && $user -> id == $userRole [ $nblinks ][ 'id' ]) { // $userRole[$nblinks]['id'] is id of user (llx_user) for internal contacts
2023-10-15 18:39:13 +02:00
if ( $mode == 'read' && $user -> hasRight ( 'projet' , 'lire' )) {
2021-02-26 18:49:22 +01:00
$userAccess ++ ;
}
2023-10-15 18:39:13 +02:00
if ( $mode == 'write' && $user -> hasRight ( 'projet' , 'creer' )) {
2021-02-26 18:49:22 +01:00
$userAccess ++ ;
}
2023-10-15 18:39:13 +02:00
if ( $mode == 'delete' && $user -> hasRight ( 'projet' , 'supprimer' )) {
2021-02-26 18:49:22 +01:00
$userAccess ++ ;
}
2020-11-05 09:40:37 +01:00
}
2021-02-26 18:49:22 +01:00
if ( $source == 'external' && $user -> socid > 0 && $user -> socid == $userRole [ $nblinks ][ 'socid' ]) { // $userRole[$nblinks]['id'] is id of contact (llx_socpeople) or external contacts
2023-10-15 18:39:13 +02:00
if ( $mode == 'read' && $user -> hasRight ( 'projet' , 'lire' )) {
2021-02-26 18:49:22 +01:00
$userAccess ++ ;
}
2023-10-15 18:39:13 +02:00
if ( $mode == 'write' && $user -> hasRight ( 'projet' , 'creer' )) {
2021-02-26 18:49:22 +01:00
$userAccess ++ ;
}
2023-10-15 18:39:13 +02:00
if ( $mode == 'delete' && $user -> hasRight ( 'projet' , 'supprimer' )) {
2021-02-26 18:49:22 +01:00
$userAccess ++ ;
}
2020-05-19 22:06:17 +02:00
}
$nblinks ++ ;
2016-08-29 10:32:00 +02:00
}
}
2020-05-19 22:06:17 +02:00
//if (empty($nblinks)) // If nobody has permission, we grant creator
//{
// if ((!empty($this->user_author_id) && $this->user_author_id == $user->id))
// {
// $userAccess = 1;
2020-05-20 20:10:48 +02:00
// }
//}
2016-08-29 10:32:00 +02:00
}
2016-11-09 22:54:51 +01:00
2020-05-20 23:56:06 +02:00
return ( $userAccess ? $userAccess : - 1 );
2020-05-20 20:10:48 +02:00
}
2016-08-29 10:32:00 +02:00
2020-05-20 23:56:06 +02:00
/**
* Return array of projects a user has permission on , is affected to , or all projects
*
* @ param User $user User object
* @ param int $mode 0 = All project I have permission on ( assigned to me or public ), 1 = Projects assigned to me only , 2 = Will return list of all projects with no test on contacts
* @ param int $list 0 = Return array , 1 = Return string list
* @ param int $socid 0 = No filter on third party , id of third party
2024-09-06 15:38:52 +02:00
* @ param string $filter Additional filter on project ( statut , ref , ... ) . TODO Use USF syntax here .
2024-09-23 00:37:30 +02:00
* @ return int [] | string Array of projects id , or string with projects id separated with " , " if list is 1
2020-05-20 23:56:06 +02:00
*/
public function getProjectsAuthorizedForUser ( $user , $mode = 0 , $list = 0 , $socid = 0 , $filter = '' )
2020-05-20 20:10:48 +02:00
{
2020-05-20 23:56:06 +02:00
$projects = array ();
$temp = array ();
2017-06-07 16:44:04 +02:00
2020-05-20 23:56:06 +02:00
$sql = " SELECT " . (( $mode == 0 || $mode == 1 ) ? " DISTINCT " : " " ) . " p.rowid, p.ref " ;
2020-09-07 10:18:17 +02:00
$sql .= " FROM " . MAIN_DB_PREFIX . " projet as p " ;
2021-02-26 18:49:22 +01:00
if ( $mode == 0 ) {
2020-09-07 10:18:17 +02:00
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . " element_contact as ec ON ec.element_id = p.rowid " ;
2021-02-26 18:49:22 +01:00
} elseif ( $mode == 1 ) {
2020-09-07 10:18:17 +02:00
$sql .= " , " . MAIN_DB_PREFIX . " element_contact as ec " ;
2024-09-23 00:37:30 +02:00
} // elseif ($mode == 2) {
// No filter. Use this if user has permission to see all project
// }
2020-09-07 10:18:17 +02:00
$sql .= " WHERE p.entity IN ( " . getEntity ( 'project' ) . " ) " ;
2020-05-20 23:56:06 +02:00
// Internal users must see project he is contact to even if project linked to a third party he can't see.
2021-08-23 17:41:11 +02:00
//if ($socid || ! $user->rights->societe->client->voir) $sql.= " AND (p.fk_soc IS NULL OR p.fk_soc = 0 OR p.fk_soc = ".((int) $socid).")";
2021-02-26 18:49:22 +01:00
if ( $socid > 0 ) {
2021-08-23 17:41:11 +02:00
$sql .= " AND (p.fk_soc IS NULL OR p.fk_soc = 0 OR p.fk_soc = " . (( int ) $socid ) . " ) " ;
2021-02-26 18:49:22 +01:00
}
2020-05-20 23:56:06 +02:00
// Get id of types of contacts for projects (This list never contains a lot of elements)
2020-09-07 10:18:17 +02:00
$listofprojectcontacttype = array ();
2020-05-20 23:56:06 +02:00
$sql2 = " SELECT ctc.rowid, ctc.code FROM " . MAIN_DB_PREFIX . " c_type_contact as ctc " ;
2020-09-07 10:18:17 +02:00
$sql2 .= " WHERE ctc.element = ' " . $this -> db -> escape ( $this -> element ) . " ' " ;
$sql2 .= " AND ctc.source = 'internal' " ;
2020-05-20 23:56:06 +02:00
$resql = $this -> db -> query ( $sql2 );
2021-02-26 18:49:22 +01:00
if ( $resql ) {
while ( $obj = $this -> db -> fetch_object ( $resql )) {
2020-09-07 10:18:17 +02:00
$listofprojectcontacttype [ $obj -> rowid ] = $obj -> code ;
2020-05-19 22:06:17 +02:00
}
2021-02-26 18:49:22 +01:00
} else {
dol_print_error ( $this -> db );
}
if ( count ( $listofprojectcontacttype ) == 0 ) {
$listofprojectcontacttype [ 0 ] = '0' ; // To avoid syntax error if not found
}
2016-08-29 10:32:00 +02:00
2021-02-26 18:49:22 +01:00
if ( $mode == 0 ) {
2020-09-07 10:18:17 +02:00
$sql .= " AND ( p.public = 1 " ;
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
$sql .= " OR ( ec.fk_c_type_contact IN ( " . $this -> db -> sanitize ( implode ( ',' , array_keys ( $listofprojectcontacttype ))) . " ) " ;
2021-08-23 18:56:46 +02:00
$sql .= " AND ec.fk_socpeople = " . (( int ) $user -> id ) . " ) " ;
2020-09-07 10:18:17 +02:00
$sql .= " ) " ;
2021-02-26 18:49:22 +01:00
} elseif ( $mode == 1 ) {
2020-09-07 10:18:17 +02:00
$sql .= " AND ec.element_id = p.rowid " ;
$sql .= " AND ( " ;
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
$sql .= " ( ec.fk_c_type_contact IN ( " . $this -> db -> sanitize ( implode ( ',' , array_keys ( $listofprojectcontacttype ))) . " ) " ;
2021-08-23 18:56:46 +02:00
$sql .= " AND ec.fk_socpeople = " . (( int ) $user -> id ) . " ) " ;
2020-09-07 10:18:17 +02:00
$sql .= " ) " ;
2024-09-23 00:37:30 +02:00
} // elseif ($mode == 2) {
// No filter. Use this if user has permission to see all project
//}
2020-05-20 20:10:48 +02:00
2024-09-10 01:57:46 +02:00
// Manage filter
$errormessage = '' ;
$sql .= forgeSQLFromUniversalSearchCriteria ( $filter , $errormessage );
if ( $errormessage ) {
$this -> errors [] = $errormessage ;
dol_syslog ( __METHOD__ . ' ' . implode ( ',' , $this -> errors ), LOG_ERR );
$sql .= $filter ;
}
2020-05-20 23:56:06 +02:00
//print $sql;
2020-05-20 20:10:48 +02:00
2020-05-20 23:56:06 +02:00
$resql = $this -> db -> query ( $sql );
2021-02-26 18:49:22 +01:00
if ( $resql ) {
2020-05-20 23:56:06 +02:00
$num = $this -> db -> num_rows ( $resql );
$i = 0 ;
2021-02-26 18:49:22 +01:00
while ( $i < $num ) {
2020-05-20 23:56:06 +02:00
$row = $this -> db -> fetch_row ( $resql );
$projects [ $row [ 0 ]] = $row [ 1 ];
$temp [] = $row [ 0 ];
$i ++ ;
}
2016-08-29 10:32:00 +02:00
2020-05-20 23:56:06 +02:00
$this -> db -> free ( $resql );
2017-06-07 16:44:04 +02:00
2021-02-26 18:49:22 +01:00
if ( $list ) {
if ( empty ( $temp )) {
return '0' ;
}
2020-05-20 23:56:06 +02:00
$result = implode ( ',' , $temp );
return $result ;
2020-05-19 22:06:17 +02:00
}
2020-05-21 15:05:19 +02:00
} else {
2020-05-20 23:56:06 +02:00
dol_print_error ( $this -> db );
2020-05-20 20:10:48 +02:00
}
2020-05-19 22:06:17 +02:00
2020-05-20 23:56:06 +02:00
return $projects ;
2020-05-20 20:10:48 +02:00
}
2020-05-19 22:06:17 +02:00
2020-05-20 23:56:06 +02:00
/**
* Load an object from its id and create a new one in database
*
2025-02-10 21:20:09 +01:00
* @ param User $user User making the clone
* @ param int $fromid Id of object to clone
* @ param bool | int < 0 , 1 > $clone_contact Clone contact of project
* @ param bool | int < 0 , 1 > $clone_task Clone task of project
* @ param bool | int < 0 , 1 > $clone_project_file Clone file of project
* @ param bool | int < 0 , 1 > $clone_task_file Clone file of task ( if task are copied )
* @ param bool | int < 0 , 1 > $clone_note Clone note of project
* @ param bool | int < 0 , 1 > $move_date Move task date on clone
* @ param int < 0 , 1 > $notrigger No trigger flag
* @ param int $newthirdpartyid New thirdparty id
* @ return int New id of clone
2020-05-20 23:56:06 +02:00
*/
public function createFromClone ( User $user , $fromid , $clone_contact = false , $clone_task = true , $clone_project_file = false , $clone_task_file = false , $clone_note = true , $move_date = true , $notrigger = 0 , $newthirdpartyid = 0 )
2020-05-20 20:10:48 +02:00
{
2020-05-20 23:56:06 +02:00
global $langs , $conf ;
2016-11-09 22:54:51 +01:00
2020-05-20 23:56:06 +02:00
$error = 0 ;
2024-03-20 20:03:48 +01:00
$clone_project_id = 0 ; // For static toolcheck
2020-05-19 22:06:17 +02:00
2024-03-16 21:43:45 +01:00
dol_syslog ( " createFromClone clone_contact= " . json_encode ( $clone_contact ) . " clone_task= " . json_encode ( $clone_task ) . " clone_project_file= " . json_encode ( $clone_project_file ) . " clone_note= " . json_encode ( $clone_note ) . " move_date= " . json_encode ( $move_date ), LOG_DEBUG );
2020-05-19 22:06:17 +02:00
2020-05-20 23:56:06 +02:00
$now = dol_mktime ( 0 , 0 , 0 , idate ( 'm' , dol_now ()), idate ( 'd' , dol_now ()), idate ( 'Y' , dol_now ()));
2020-05-19 22:06:17 +02:00
2020-05-20 23:56:06 +02:00
$clone_project = new Project ( $this -> db );
2020-05-19 22:06:17 +02:00
2020-05-20 23:56:06 +02:00
$clone_project -> context [ 'createfromclone' ] = 'createfromclone' ;
2020-05-19 22:06:17 +02:00
2020-05-20 23:56:06 +02:00
$this -> db -> begin ();
2020-05-19 22:06:17 +02:00
2020-05-20 23:56:06 +02:00
// Load source object
$clone_project -> fetch ( $fromid );
$clone_project -> fetch_optionals ();
2025-01-20 22:54:37 +01:00
$clone_project -> socid = ( $newthirdpartyid > 0 ? $newthirdpartyid : 0 );
2020-05-20 23:56:06 +02:00
$clone_project -> fetch_thirdparty ();
2020-05-19 22:06:17 +02:00
2020-05-20 23:56:06 +02:00
$orign_dt_start = $clone_project -> date_start ;
$orign_project_ref = $clone_project -> ref ;
2020-05-19 22:06:17 +02:00
2020-05-20 23:56:06 +02:00
$clone_project -> id = 0 ;
if ( $move_date ) {
$clone_project -> date_start = $now ;
2021-02-26 18:49:22 +01:00
if ( ! ( empty ( $clone_project -> date_end ))) {
2024-08-07 02:53:45 +02:00
$clone_project -> date_end += ( $now - $orign_dt_start );
2020-05-19 22:06:17 +02:00
}
2020-05-20 23:56:06 +02:00
}
2020-05-19 22:06:17 +02:00
2021-09-10 11:44:58 +02:00
$clone_project -> date_c = $now ;
2020-05-19 22:06:17 +02:00
2021-02-26 18:49:22 +01:00
if ( ! $clone_note ) {
2020-05-20 23:56:06 +02:00
$clone_project -> note_private = '' ;
$clone_project -> note_public = '' ;
2020-05-20 20:10:48 +02:00
}
2020-05-19 22:06:17 +02:00
2020-05-20 23:56:06 +02:00
//Generate next ref
$defaultref = '' ;
2024-08-15 16:53:49 +02:00
$obj = getDolGlobalString ( 'PROJECT_ADDON' , 'mod_project_simple' );
2020-05-20 23:56:06 +02:00
// Search template files
2023-12-04 13:49:31 +01:00
$file = '' ;
$classname = '' ;
$filefound = 0 ;
2020-05-20 23:56:06 +02:00
$dirmodels = array_merge ( array ( '/' ), ( array ) $conf -> modules_parts [ 'models' ]);
2021-02-26 18:49:22 +01:00
foreach ( $dirmodels as $reldir ) {
2020-05-20 23:56:06 +02:00
$file = dol_buildpath ( $reldir . " core/modules/project/ " . $obj . '.php' , 0 );
2021-02-26 18:49:22 +01:00
if ( file_exists ( $file )) {
2020-05-20 23:56:06 +02:00
$filefound = 1 ;
dol_include_once ( $reldir . " core/modules/project/ " . $obj . '.php' );
2023-12-04 13:49:31 +01:00
$modProject = new $obj ();
2024-09-23 00:37:30 +02:00
'@phan-var-force ModeleNumRefProjects $modProject' ;
2020-05-20 23:56:06 +02:00
$defaultref = $modProject -> getNextValue ( is_object ( $clone_project -> thirdparty ) ? $clone_project -> thirdparty : null , $clone_project );
break ;
2020-05-19 22:06:17 +02:00
}
2020-05-20 20:10:48 +02:00
}
2021-02-26 18:49:22 +01:00
if ( is_numeric ( $defaultref ) && $defaultref <= 0 ) {
$defaultref = '' ;
}
2020-05-19 22:06:17 +02:00
2020-05-20 23:56:06 +02:00
$clone_project -> ref = $defaultref ;
$clone_project -> title = $langs -> trans ( " CopyOf " ) . ' ' . $clone_project -> title ;
2020-05-19 22:06:17 +02:00
2020-05-20 23:56:06 +02:00
// Create clone
$result = $clone_project -> create ( $user , $notrigger );
2020-05-20 20:10:48 +02:00
2020-05-20 23:56:06 +02:00
// Other options
2021-02-26 18:49:22 +01:00
if ( $result < 0 ) {
2020-05-20 23:56:06 +02:00
$this -> error .= $clone_project -> error ;
$error ++ ;
2020-05-20 20:10:48 +02:00
}
2020-05-20 23:56:06 +02:00
2021-02-26 18:49:22 +01:00
if ( ! $error ) {
2020-05-20 23:56:06 +02:00
//Get the new project id
$clone_project_id = $clone_project -> id ;
2020-05-19 22:06:17 +02:00
2020-05-20 23:56:06 +02:00
//Note Update
2021-02-26 18:49:22 +01:00
if ( ! $clone_note ) {
2020-05-20 23:56:06 +02:00
$clone_project -> note_private = '' ;
$clone_project -> note_public = '' ;
2020-05-21 15:05:19 +02:00
} else {
2020-05-20 23:56:06 +02:00
$this -> db -> begin ();
2020-10-31 14:32:18 +01:00
$res = $clone_project -> update_note ( dol_html_entity_decode ( $clone_project -> note_public , ENT_QUOTES | ENT_HTML5 ), '_public' );
2021-02-26 18:49:22 +01:00
if ( $res < 0 ) {
2020-05-20 23:56:06 +02:00
$this -> error .= $clone_project -> error ;
$error ++ ;
$this -> db -> rollback ();
2020-05-21 15:05:19 +02:00
} else {
2020-05-20 23:56:06 +02:00
$this -> db -> commit ();
}
2020-05-20 20:10:48 +02:00
2020-05-20 23:56:06 +02:00
$this -> db -> begin ();
2020-10-31 14:32:18 +01:00
$res = $clone_project -> update_note ( dol_html_entity_decode ( $clone_project -> note_private , ENT_QUOTES | ENT_HTML5 ), '_private' );
2021-02-26 18:49:22 +01:00
if ( $res < 0 ) {
2020-05-20 23:56:06 +02:00
$this -> error .= $clone_project -> error ;
$error ++ ;
$this -> db -> rollback ();
2020-05-21 15:05:19 +02:00
} else {
2020-05-20 23:56:06 +02:00
$this -> db -> commit ();
2020-05-19 22:06:17 +02:00
}
2020-05-20 23:56:06 +02:00
}
2020-05-19 22:06:17 +02:00
2020-05-20 23:56:06 +02:00
//Duplicate contact
2021-02-26 18:49:22 +01:00
if ( $clone_contact ) {
2020-05-20 23:56:06 +02:00
$origin_project = new Project ( $this -> db );
$origin_project -> fetch ( $fromid );
2020-05-19 22:06:17 +02:00
2021-02-26 18:49:22 +01:00
foreach ( array ( 'internal' , 'external' ) as $source ) {
2020-05-20 23:56:06 +02:00
$tab = $origin_project -> liste_contact ( - 1 , $source );
2024-03-09 16:32:02 +01:00
if ( is_array ( $tab ) && count ( $tab ) > 0 ) {
2021-10-21 19:00:48 +02:00
foreach ( $tab as $contacttoadd ) {
$clone_project -> add_contact ( $contacttoadd [ 'id' ], $contacttoadd [ 'code' ], $contacttoadd [ 'source' ], $notrigger );
if ( $clone_project -> error == 'DB_ERROR_RECORD_ALREADY_EXISTS' ) {
$langs -> load ( " errors " );
$this -> error .= $langs -> trans ( " ErrorThisContactIsAlreadyDefinedAsThisType " );
2020-05-19 22:06:17 +02:00
$error ++ ;
2021-10-21 19:00:48 +02:00
} else {
if ( $clone_project -> error != '' ) {
$this -> error .= $clone_project -> error ;
$error ++ ;
}
2020-05-19 22:06:17 +02:00
}
}
2021-10-21 22:24:35 +02:00
} elseif ( $tab < 0 ) {
$this -> error .= $origin_project -> error ;
$error ++ ;
2020-05-19 22:06:17 +02:00
}
}
2020-05-20 20:10:48 +02:00
}
2020-05-19 22:06:17 +02:00
2020-05-20 23:56:06 +02:00
//Duplicate file
2021-02-26 18:49:22 +01:00
if ( $clone_project_file ) {
2020-05-20 23:56:06 +02:00
require_once DOL_DOCUMENT_ROOT . '/core/lib/files.lib.php' ;
2020-05-19 22:06:17 +02:00
2022-06-14 17:53:17 +02:00
$clone_project_dir = $conf -> project -> dir_output . " / " . dol_sanitizeFileName ( $defaultref );
$ori_project_dir = $conf -> project -> dir_output . " / " . dol_sanitizeFileName ( $orign_project_ref );
2020-05-19 22:06:17 +02:00
2021-02-26 18:49:22 +01:00
if ( dol_mkdir ( $clone_project_dir ) >= 0 ) {
2020-05-20 23:56:06 +02:00
$filearray = dol_dir_list ( $ori_project_dir , " files " , 0 , '' , '(\.meta|_preview.*\.png)$' , '' , SORT_ASC , 1 );
2021-02-26 18:49:22 +01:00
foreach ( $filearray as $key => $file ) {
2024-09-23 01:59:14 +02:00
$rescopy = dol_copy ( $ori_project_dir . '/' . $file [ 'name' ], $clone_project_dir . '/' . $file [ 'name' ], '0' , 1 );
2021-02-26 18:49:22 +01:00
if ( is_numeric ( $rescopy ) && $rescopy < 0 ) {
2020-05-20 23:56:06 +02:00
$this -> error .= $langs -> trans ( " ErrorFailToCopyFile " , $ori_project_dir . '/' . $file [ 'name' ], $clone_project_dir . '/' . $file [ 'name' ]);
$error ++ ;
2020-05-19 22:06:17 +02:00
}
}
2020-05-21 15:05:19 +02:00
} else {
2020-05-20 23:56:06 +02:00
$this -> error .= $langs -> trans ( 'ErrorInternalErrorDetected' ) . ':dol_mkdir' ;
$error ++ ;
}
2020-05-19 22:06:17 +02:00
}
2020-05-20 23:56:06 +02:00
//Duplicate task
2021-02-26 18:49:22 +01:00
if ( $clone_task ) {
2020-09-07 10:18:17 +02:00
require_once DOL_DOCUMENT_ROOT . '/projet/class/task.class.php' ;
2020-05-19 22:06:17 +02:00
2020-05-20 23:56:06 +02:00
$taskstatic = new Task ( $this -> db );
2020-05-19 22:06:17 +02:00
2020-05-20 23:56:06 +02:00
// Security check
2020-09-07 10:18:17 +02:00
$socid = 0 ;
2021-02-26 18:49:22 +01:00
if ( $user -> socid > 0 ) {
$socid = $user -> socid ;
}
2020-05-19 22:06:17 +02:00
2024-09-23 00:37:30 +02:00
$tasksarray = $taskstatic -> getTasksArray ( null , null , $fromid , $socid , 0 );
2020-05-19 22:06:17 +02:00
2020-09-07 10:18:17 +02:00
$tab_conv_child_parent = array ();
2024-10-06 13:03:43 +02:00
$result_clone = 0 ;
2020-05-19 22:06:17 +02:00
2020-05-20 23:56:06 +02:00
// Loop on each task, to clone it
2021-02-26 18:49:22 +01:00
foreach ( $tasksarray as $tasktoclone ) {
2023-06-29 15:54:09 +02:00
$result_clone = $taskstatic -> createFromClone ( $user , $tasktoclone -> id , $clone_project_id , $tasktoclone -> fk_task_parent , $move_date , true , false , $clone_task_file , true , false );
2021-02-26 18:49:22 +01:00
if ( $result_clone <= 0 ) {
2021-10-21 19:00:48 +02:00
$this -> error .= $taskstatic -> error ;
2020-05-20 23:56:06 +02:00
$error ++ ;
2020-05-21 15:05:19 +02:00
} else {
2020-05-20 23:56:06 +02:00
$new_task_id = $result_clone ;
$taskstatic -> fetch ( $tasktoclone -> id );
2020-05-20 20:10:48 +02:00
2020-05-20 23:56:06 +02:00
//manage new parent clone task id
// if the current task has child we store the original task id and the equivalent clone task id
2021-02-26 18:49:22 +01:00
if (( $taskstatic -> hasChildren ()) && ! array_key_exists ( $tasktoclone -> id , $tab_conv_child_parent )) {
2020-05-20 23:56:06 +02:00
$tab_conv_child_parent [ $tasktoclone -> id ] = $new_task_id ;
2020-05-19 22:06:17 +02:00
}
}
2020-05-20 20:10:48 +02:00
}
2020-05-19 22:06:17 +02:00
2020-05-20 23:56:06 +02:00
//Parse all clone node to be sure to update new parent
2024-09-23 00:37:30 +02:00
$tasksarray = $taskstatic -> getTasksArray ( null , null , $clone_project_id , $socid , 0 );
2021-02-26 18:49:22 +01:00
foreach ( $tasksarray as $task_cloned ) {
2020-05-20 23:56:06 +02:00
$taskstatic -> fetch ( $task_cloned -> id );
2021-02-26 18:49:22 +01:00
if ( $taskstatic -> fk_task_parent != 0 ) {
2020-05-20 23:56:06 +02:00
$taskstatic -> fk_task_parent = $tab_conv_child_parent [ $taskstatic -> fk_task_parent ];
}
$res = $taskstatic -> update ( $user , $notrigger );
2021-02-26 18:49:22 +01:00
if ( $result_clone <= 0 ) {
2020-05-20 23:56:06 +02:00
$this -> error .= $taskstatic -> error ;
$error ++ ;
2020-05-19 22:06:17 +02:00
}
2020-05-20 20:10:48 +02:00
}
2020-05-19 22:06:17 +02:00
}
}
2020-05-20 23:56:06 +02:00
unset ( $clone_project -> context [ 'createfromclone' ]);
2020-05-19 22:06:17 +02:00
2024-03-20 20:03:48 +01:00
if ( ! $error && $clone_project_id != 0 ) {
2020-05-20 23:56:06 +02:00
$this -> db -> commit ();
return $clone_project_id ;
2020-05-21 15:05:19 +02:00
} else {
2020-05-20 23:56:06 +02:00
$this -> db -> rollback ();
dol_syslog ( get_class ( $this ) . " ::createFromClone nbError: " . $error . " error : " . $this -> error , LOG_ERR );
return - 1 ;
2020-05-19 22:06:17 +02:00
}
2020-05-20 20:10:48 +02:00
}
2020-05-19 22:06:17 +02:00
2020-05-20 20:10:48 +02:00
2020-05-20 23:56:06 +02:00
/**
* Shift project task date from current date to delta
*
* @ param integer $old_project_dt_start Old project start date
* @ return int 1 if OK or < 0 if KO
*/
public function shiftTaskDate ( $old_project_dt_start )
{
global $user , $langs , $conf ;
2020-05-20 20:10:48 +02:00
2020-09-07 10:18:17 +02:00
$error = 0 ;
2021-10-21 19:00:48 +02:00
$result = 0 ;
2020-05-20 20:10:48 +02:00
2020-05-20 23:56:06 +02:00
$taskstatic = new Task ( $this -> db );
2020-05-20 20:10:48 +02:00
2020-05-20 23:56:06 +02:00
// Security check
2020-09-07 10:18:17 +02:00
$socid = 0 ;
2021-02-26 18:49:22 +01:00
if ( $user -> socid > 0 ) {
$socid = $user -> socid ;
}
2020-05-20 20:10:48 +02:00
2024-09-23 00:37:30 +02:00
$tasksarray = $taskstatic -> getTasksArray ( null , null , $this -> id , $socid , 0 );
2020-05-20 20:10:48 +02:00
2021-02-26 18:49:22 +01:00
foreach ( $tasksarray as $tasktoshiftdate ) {
2020-09-07 10:18:17 +02:00
$to_update = false ;
2020-05-20 23:56:06 +02:00
// Fetch only if update of date will be made
2021-02-26 18:49:22 +01:00
if (( ! empty ( $tasktoshiftdate -> date_start )) || ( ! empty ( $tasktoshiftdate -> date_end ))) {
2020-05-20 23:56:06 +02:00
//dol_syslog(get_class($this)."::shiftTaskDate to_update", LOG_DEBUG);
2020-09-07 10:18:17 +02:00
$to_update = true ;
2020-05-20 23:56:06 +02:00
$task = new Task ( $this -> db );
$result = $task -> fetch ( $tasktoshiftdate -> id );
2021-02-26 18:49:22 +01:00
if ( ! $result ) {
2020-05-20 23:56:06 +02:00
$error ++ ;
2020-09-07 10:18:17 +02:00
$this -> error .= $task -> error ;
2020-05-19 22:06:17 +02:00
}
2024-09-23 00:37:30 +02:00
} else {
continue ;
2020-05-19 22:06:17 +02:00
}
2020-05-20 23:56:06 +02:00
//print "$this->date_start + $tasktoshiftdate->date_start - $old_project_dt_start";exit;
2020-05-19 22:06:17 +02:00
2024-01-12 17:55:52 +01:00
//Calculate new task start date with difference between old proj start date and origin task start date
2021-02-26 18:49:22 +01:00
if ( ! empty ( $tasktoshiftdate -> date_start )) {
2020-05-20 23:56:06 +02:00
$task -> date_start = $this -> date_start + ( $tasktoshiftdate -> date_start - $old_project_dt_start );
}
2020-05-19 22:06:17 +02:00
2024-01-12 17:55:52 +01:00
//Calculate new task end date with difference between origin proj end date and origin task end date
2021-02-26 18:49:22 +01:00
if ( ! empty ( $tasktoshiftdate -> date_end )) {
2020-05-20 23:56:06 +02:00
$task -> date_end = $this -> date_start + ( $tasktoshiftdate -> date_end - $old_project_dt_start );
}
2020-05-19 22:06:17 +02:00
2021-02-26 18:49:22 +01:00
if ( $to_update ) {
2020-05-20 23:56:06 +02:00
$result = $task -> update ( $user );
2021-02-26 18:49:22 +01:00
if ( ! $result ) {
2020-05-20 23:56:06 +02:00
$error ++ ;
$this -> error .= $task -> error ;
2020-05-19 22:06:17 +02:00
}
}
}
2021-02-26 18:49:22 +01:00
if ( $error != 0 ) {
2020-05-20 23:56:06 +02:00
return - 1 ;
}
return $result ;
2020-05-20 20:10:48 +02:00
}
2020-05-19 22:06:17 +02:00
2020-05-20 23:56:06 +02:00
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
/**
* Associate element to a project
*
* @ param string $tableName Table of the element to update
* @ param int $elementSelectId Key - rowid of the line of the element to update
* @ return int 1 if OK or < 0 if KO
*/
public function update_element ( $tableName , $elementSelectId )
2020-05-20 20:10:48 +02:00
{
2020-05-20 23:56:06 +02:00
// phpcs:enable
$sql = " UPDATE " . MAIN_DB_PREFIX . $tableName ;
2020-05-19 22:06:17 +02:00
2021-02-26 18:49:22 +01:00
if ( $tableName == " actioncomm " ) {
2020-05-20 23:56:06 +02:00
$sql .= " SET fk_project= " . $this -> id ;
2021-06-09 15:36:47 +02:00
$sql .= " WHERE id= " . (( int ) $elementSelectId );
2023-09-27 10:52:39 +02:00
} elseif ( in_array ( $tableName , [ " entrepot " , " mrp_mo " , " stocktransfer_stocktransfer " ])) {
2021-04-15 09:59:08 +02:00
$sql .= " SET fk_project= " . $this -> id ;
2021-06-09 15:36:47 +02:00
$sql .= " WHERE rowid= " . (( int ) $elementSelectId );
2020-05-21 15:05:19 +02:00
} else {
2020-05-20 23:56:06 +02:00
$sql .= " SET fk_projet= " . $this -> id ;
2021-06-09 15:36:47 +02:00
$sql .= " WHERE rowid= " . (( int ) $elementSelectId );
2020-05-20 23:56:06 +02:00
}
2020-05-19 22:06:17 +02:00
2020-05-20 23:56:06 +02:00
dol_syslog ( get_class ( $this ) . " ::update_element " , LOG_DEBUG );
$resql = $this -> db -> query ( $sql );
if ( ! $resql ) {
$this -> error = $this -> db -> lasterror ();
return - 1 ;
} else {
return 1 ;
2020-05-19 22:06:17 +02:00
}
2020-05-20 23:56:06 +02:00
}
2020-05-20 20:10:48 +02:00
2020-05-20 23:56:06 +02:00
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
/**
* Associate element to a project
*
* @ param string $tableName Table of the element to update
* @ param int $elementSelectId Key - rowid of the line of the element to update
* @ param string $projectfield The column name that stores the link with the project
*
* @ return int 1 if OK or < 0 if KO
*/
public function remove_element ( $tableName , $elementSelectId , $projectfield = 'fk_projet' )
2020-05-20 20:10:48 +02:00
{
2020-05-20 23:56:06 +02:00
// phpcs:enable
$sql = " UPDATE " . MAIN_DB_PREFIX . $tableName ;
2020-05-20 20:10:48 +02:00
2021-02-26 18:49:22 +01:00
if ( $tableName == " actioncomm " ) {
2020-05-20 23:56:06 +02:00
$sql .= " SET fk_project=NULL " ;
2021-06-09 15:36:47 +02:00
$sql .= " WHERE id= " . (( int ) $elementSelectId );
2020-05-21 02:02:54 +02:00
} else {
2020-05-20 23:56:06 +02:00
$sql .= " SET " . $projectfield . " =NULL " ;
2021-06-09 15:36:47 +02:00
$sql .= " WHERE rowid= " . (( int ) $elementSelectId );
2020-05-20 23:56:06 +02:00
}
2020-05-19 22:06:17 +02:00
2020-05-20 23:56:06 +02:00
dol_syslog ( get_class ( $this ) . " ::remove_element " , LOG_DEBUG );
$resql = $this -> db -> query ( $sql );
if ( ! $resql ) {
$this -> error = $this -> db -> lasterror ();
return - 1 ;
} else {
return 1 ;
2020-05-19 22:06:17 +02:00
}
2020-05-20 20:10:48 +02:00
}
2020-05-20 23:56:06 +02:00
/**
* Create an intervention document on disk using template defined into PROJECT_ADDON_PDF
*
* @ param string $modele Force template to use ( '' by default )
2024-01-12 17:55:52 +01:00
* @ param Translate $outputlangs Object lang to use for translation
2020-05-20 23:56:06 +02:00
* @ param int $hidedetails Hide details of lines
* @ param int $hidedesc Hide description
* @ param int $hideref Hide ref
* @ return int 0 if KO , 1 if OK
*/
public function generateDocument ( $modele , $outputlangs , $hidedetails = 0 , $hidedesc = 0 , $hideref = 0 )
{
2020-09-07 10:18:17 +02:00
global $conf , $langs ;
2020-05-20 20:10:48 +02:00
2020-05-20 23:56:06 +02:00
$langs -> load ( " projects " );
2020-05-20 20:10:48 +02:00
2020-09-07 10:18:17 +02:00
if ( ! dol_strlen ( $modele )) {
2020-05-20 23:56:06 +02:00
$modele = 'baleine' ;
2020-05-19 22:06:17 +02:00
2020-09-10 01:49:09 +02:00
if ( $this -> model_pdf ) {
$modele = $this -> model_pdf ;
2023-11-27 11:56:32 +01:00
} elseif ( getDolGlobalString ( 'PROJECT_ADDON_PDF' )) {
2024-01-05 04:18:53 +01:00
$modele = getDolGlobalString ( 'PROJECT_ADDON_PDF' );
2020-05-19 22:06:17 +02:00
}
}
2020-05-20 23:56:06 +02:00
$modelpath = " core/modules/project/doc/ " ;
2020-05-19 22:06:17 +02:00
2020-05-20 23:56:06 +02:00
return $this -> commonGenerateDocument ( $modelpath , $modele , $outputlangs , $hidedetails , $hidedesc , $hideref );
}
2020-05-19 22:06:17 +02:00
2020-05-20 23:56:06 +02:00
/**
* Load time spent into this -> weekWorkLoad and this -> weekWorkLoadPerTask for all day of a week of project .
* Note : array weekWorkLoad and weekWorkLoadPerTask are reset and filled at each call .
*
* @ param int $datestart First day of week ( use dol_get_first_day to find this date )
* @ param int $taskid Filter on a task id
* @ param int $userid Time spent by a particular user
2023-12-06 15:46:39 +01:00
* @ return int Return integer < 0 if OK , > 0 if KO
2020-05-20 23:56:06 +02:00
*/
public function loadTimeSpent ( $datestart , $taskid = 0 , $userid = 0 )
{
2020-09-07 10:18:17 +02:00
$this -> weekWorkLoad = array ();
$this -> weekWorkLoadPerTask = array ();
2020-05-19 22:06:17 +02:00
2021-02-26 18:49:22 +01:00
if ( empty ( $datestart )) {
2024-01-20 09:22:38 +01:00
dol_print_error ( null , 'Error datestart parameter is empty' );
2021-02-26 18:49:22 +01:00
}
2020-05-20 20:10:48 +02:00
2023-03-08 11:00:58 +01:00
$sql = " SELECT ptt.rowid as taskid, ptt.element_duration, ptt.element_date, ptt.element_datehour, ptt.fk_element " ;
$sql .= " FROM " . MAIN_DB_PREFIX . " element_time AS ptt, " . MAIN_DB_PREFIX . " projet_task as pt " ;
$sql .= " WHERE ptt.fk_element = pt.rowid " ;
2023-03-08 11:08:08 +01:00
$sql .= " AND ptt.elementtype = 'task' " ;
2021-08-23 18:56:46 +02:00
$sql .= " AND pt.fk_projet = " . (( int ) $this -> id );
2023-03-08 11:00:58 +01:00
$sql .= " AND (ptt.element_date >= ' " . $this -> db -> idate ( $datestart ) . " ' " ;
$sql .= " AND ptt.element_date <= ' " . $this -> db -> idate ( dol_time_plus_duree ( $datestart , 1 , 'w' ) - 1 ) . " ') " ;
2021-02-26 18:49:22 +01:00
if ( $taskid ) {
2023-03-08 11:00:58 +01:00
$sql .= " AND ptt.fk_element= " . (( int ) $taskid );
2021-02-26 18:49:22 +01:00
}
if ( is_numeric ( $userid )) {
2021-06-09 15:36:47 +02:00
$sql .= " AND ptt.fk_user= " . (( int ) $userid );
2021-02-26 18:49:22 +01:00
}
2020-05-20 20:10:48 +02:00
2020-05-20 23:56:06 +02:00
//print $sql;
2020-09-07 10:18:17 +02:00
$resql = $this -> db -> query ( $sql );
2021-02-26 18:49:22 +01:00
if ( $resql ) {
2024-09-23 00:37:30 +02:00
$dayallreadyfound = array ();
2020-05-19 22:06:17 +02:00
2020-05-20 23:56:06 +02:00
$num = $this -> db -> num_rows ( $resql );
$i = 0 ;
// Loop on each record found, so each couple (project id, task id)
2021-02-26 18:49:22 +01:00
while ( $i < $num ) {
2020-09-07 10:18:17 +02:00
$obj = $this -> db -> fetch_object ( $resql );
2023-03-08 11:00:58 +01:00
$day = $this -> db -> jdate ( $obj -> element_date ); // task_date is date without hours
2024-09-23 00:37:30 +02:00
if ( empty ( $dayallreadyfound [ $day ])) {
2023-03-08 11:00:58 +01:00
$this -> weekWorkLoad [ $day ] = $obj -> element_duration ;
$this -> weekWorkLoadPerTask [ $day ][ $obj -> fk_element ] = $obj -> element_duration ;
2020-05-21 15:05:19 +02:00
} else {
2023-03-08 11:00:58 +01:00
$this -> weekWorkLoad [ $day ] += $obj -> element_duration ;
$this -> weekWorkLoadPerTask [ $day ][ $obj -> fk_element ] += $obj -> element_duration ;
2020-05-20 23:56:06 +02:00
}
2024-09-23 00:37:30 +02:00
$dayallreadyfound [ $day ] = 1 ;
2020-05-20 23:56:06 +02:00
$i ++ ;
2020-05-19 22:06:17 +02:00
}
2020-05-20 23:56:06 +02:00
$this -> db -> free ( $resql );
return 1 ;
2020-05-21 15:05:19 +02:00
} else {
2020-05-20 23:56:06 +02:00
$this -> error = " Error " . $this -> db -> lasterror ();
dol_syslog ( get_class ( $this ) . " ::fetch " . $this -> error , LOG_ERR );
return - 1 ;
2020-05-19 22:06:17 +02:00
}
2020-05-20 20:10:48 +02:00
}
2020-05-19 22:06:17 +02:00
2020-05-20 23:58:32 +02:00
/**
* Load time spent into this -> weekWorkLoad and this -> weekWorkLoadPerTask for all day of a week of project .
* Note : array weekWorkLoad and weekWorkLoadPerTask are reset and filled at each call .
*
* @ param int $datestart First day of week ( use dol_get_first_day to find this date )
* @ param int $taskid Filter on a task id
* @ param int $userid Time spent by a particular user
2023-12-06 15:46:39 +01:00
* @ return int Return integer < 0 if OK , > 0 if KO
2020-05-20 23:58:32 +02:00
*/
public function loadTimeSpentMonth ( $datestart , $taskid = 0 , $userid = 0 )
{
$this -> monthWorkLoad = array ();
$this -> monthWorkLoadPerTask = array ();
2020-05-19 22:06:17 +02:00
2021-02-26 18:49:22 +01:00
if ( empty ( $datestart )) {
2024-01-20 09:22:38 +01:00
dol_print_error ( null , 'Error datestart parameter is empty' );
2021-02-26 18:49:22 +01:00
}
2020-05-20 23:27:45 +02:00
2023-03-08 11:00:58 +01:00
$sql = " SELECT ptt.rowid as taskid, ptt.element_duration, ptt.element_date, ptt.element_datehour, ptt.fk_element " ;
$sql .= " FROM " . MAIN_DB_PREFIX . " element_time AS ptt, " . MAIN_DB_PREFIX . " projet_task as pt " ;
$sql .= " WHERE ptt.fk_element = pt.rowid " ;
2023-03-08 11:08:08 +01:00
$sql .= " AND ptt.elementtype = 'task' " ;
2021-08-23 18:56:46 +02:00
$sql .= " AND pt.fk_projet = " . (( int ) $this -> id );
2023-03-08 11:00:58 +01:00
$sql .= " AND (ptt.element_date >= ' " . $this -> db -> idate ( $datestart ) . " ' " ;
$sql .= " AND ptt.element_date <= ' " . $this -> db -> idate ( dol_time_plus_duree ( $datestart , 1 , 'm' ) - 1 ) . " ') " ;
2022-10-28 15:48:46 +02:00
if ( $taskid ) {
2023-03-08 11:00:58 +01:00
$sql .= " AND ptt.fk_element= " . (( int ) $taskid );
2021-02-26 18:49:22 +01:00
}
if ( is_numeric ( $userid )) {
2021-06-09 15:36:47 +02:00
$sql .= " AND ptt.fk_user= " . (( int ) $userid );
2021-02-26 18:49:22 +01:00
}
2020-05-19 22:06:17 +02:00
2020-05-20 23:58:32 +02:00
//print $sql;
$resql = $this -> db -> query ( $sql );
2021-02-26 18:49:22 +01:00
if ( $resql ) {
2020-05-20 23:58:32 +02:00
$weekalreadyfound = array ();
$num = $this -> db -> num_rows ( $resql );
$i = 0 ;
2024-09-23 00:37:30 +02:00
$week_number = '' ; // Initialisation for static analysis
2020-05-20 23:58:32 +02:00
// Loop on each record found, so each couple (project id, task id)
2021-02-26 18:49:22 +01:00
while ( $i < $num ) {
2020-05-20 23:58:32 +02:00
$obj = $this -> db -> fetch_object ( $resql );
2023-03-08 11:00:58 +01:00
if ( ! empty ( $obj -> element_date )) {
$date = explode ( '-' , $obj -> element_date );
2024-08-13 20:39:40 +02:00
$week_number = getWeekNumber (( int ) $date [ 2 ], ( int ) $date [ 1 ], ( int ) $date [ 0 ]);
2020-05-20 23:58:32 +02:00
}
2021-02-26 18:49:22 +01:00
if ( empty ( $weekalreadyfound [ $week_number ])) {
2023-03-08 11:00:58 +01:00
$this -> monthWorkLoad [ $week_number ] = $obj -> element_duration ;
$this -> monthWorkLoadPerTask [ $week_number ][ $obj -> fk_element ] = $obj -> element_duration ;
2020-05-21 15:05:19 +02:00
} else {
2023-03-08 11:00:58 +01:00
$this -> monthWorkLoad [ $week_number ] += $obj -> element_duration ;
2025-01-27 10:03:02 +01:00
if ( ! isset ( $this -> monthWorkLoadPerTask [ $week_number ][ $obj -> fk_element ])) {
2025-01-27 10:04:35 +01:00
$this -> monthWorkLoadPerTask [ $week_number ][ $obj -> fk_element ] = 0 ;
2025-01-27 10:03:02 +01:00
}
2023-03-08 11:00:58 +01:00
$this -> monthWorkLoadPerTask [ $week_number ][ $obj -> fk_element ] += $obj -> element_duration ;
2020-05-20 23:58:32 +02:00
}
$weekalreadyfound [ $week_number ] = 1 ;
$i ++ ;
2020-05-19 22:06:17 +02:00
}
2020-05-20 23:58:32 +02:00
$this -> db -> free ( $resql );
return 1 ;
2020-05-21 15:05:19 +02:00
} else {
2020-05-20 23:58:32 +02:00
$this -> error = " Error " . $this -> db -> lasterror ();
dol_syslog ( get_class ( $this ) . " ::fetch " . $this -> error , LOG_ERR );
return - 1 ;
2020-05-19 22:06:17 +02:00
}
2020-05-20 20:10:48 +02:00
}
2020-05-19 22:06:17 +02:00
2020-05-20 23:56:06 +02:00
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
/**
* Load indicators for dashboard ( this -> nbtodo and this -> nbtodolate )
*
2024-01-12 17:55:52 +01:00
* @ param User $user Object user
2023-12-06 15:46:39 +01:00
* @ return WorkboardResponse | int Return integer < 0 if KO , WorkboardResponse if OK
2020-05-20 23:56:06 +02:00
*/
public function load_board ( $user )
2020-05-20 20:10:48 +02:00
{
2020-05-20 23:56:06 +02:00
// phpcs:enable
global $conf , $langs ;
2020-05-20 20:10:48 +02:00
2024-01-12 17:55:52 +01:00
// For external user, no check is done on company because readability is managed by public status of project and assignment.
2020-05-20 23:56:06 +02:00
//$socid=$user->socid;
2020-05-20 20:10:48 +02:00
2022-08-30 12:02:53 +02:00
$response = new WorkboardResponse ();
$response -> warning_delay = $conf -> project -> warning_delay / 60 / 60 / 24 ;
$response -> label = $langs -> trans ( " OpenedProjects " );
$response -> labelShort = $langs -> trans ( " Opened " );
$response -> url = DOL_URL_ROOT . '/projet/list.php?search_project_user=-1&search_status=1&mainmenu=project' ;
2024-08-23 14:58:50 +02:00
$response -> url_late = DOL_URL_ROOT . '/projet/list.php?search_option=late&mainmenu=project' ;
2022-08-30 12:02:53 +02:00
$response -> img = img_object ( '' , " projectpub " );
$response -> nbtodo = 0 ;
$response -> nbtodolate = 0 ;
2020-05-19 22:06:17 +02:00
2020-05-20 23:56:06 +02:00
$sql = " SELECT p.rowid, p.fk_statut as status, p.fk_opp_status, p.datee as datee " ;
$sql .= " FROM ( " . MAIN_DB_PREFIX . " projet as p " ;
$sql .= " ) " ;
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . " societe as s on p.fk_soc = s.rowid " ;
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.
2020-05-20 23:56:06 +02:00
//if (! $user->rights->societe->client->voir && ! $socid) $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."societe_commerciaux as sc ON sc.fk_soc = s.rowid";
$sql .= " WHERE p.fk_statut = 1 " ;
$sql .= " AND p.entity IN ( " . getEntity ( 'project' ) . ')' ;
2022-08-30 12:02:53 +02:00
$projectsListId = null ;
2022-12-09 14:27:43 +01:00
if ( ! $user -> hasRight ( " projet " , " all " , " lire " )) {
2022-08-30 12:02:53 +02:00
$response -> url = DOL_URL_ROOT . '/projet/list.php?search_status=1&mainmenu=project' ;
$projectsListId = $this -> getProjectsAuthorizedForUser ( $user , 0 , 1 );
if ( empty ( $projectsListId )) {
return $response ;
}
2021-03-22 11:30:18 +01:00
$sql .= " AND p.rowid IN ( " . $this -> db -> sanitize ( $projectsListId ) . " ) " ;
2021-02-26 18:49:22 +01:00
}
2022-08-30 12:02:53 +02:00
2020-05-20 23:56:06 +02:00
// No need to check company, as filtering of projects must be done by getProjectsAuthorizedForUser
2021-08-23 17:41:11 +02:00
//if ($socid || ! $user->rights->societe->client->voir) $sql.= " AND (p.fk_soc IS NULL OR p.fk_soc = 0 OR p.fk_soc = ".((int) $socid).")";
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-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-05-20 23:56:06 +02:00
//print $sql;
$resql = $this -> db -> query ( $sql );
2021-02-26 18:49:22 +01:00
if ( $resql ) {
2020-05-20 23:56:06 +02:00
$project_static = new Project ( $this -> db );
// This assignment in condition is not a bug. It allows walking the results.
2021-02-26 18:49:22 +01:00
while ( $obj = $this -> db -> fetch_object ( $resql )) {
2020-05-20 23:56:06 +02:00
$response -> nbtodo ++ ;
2020-05-19 22:06:17 +02:00
2020-05-20 23:56:06 +02:00
$project_static -> statut = $obj -> status ;
2024-07-02 01:46:40 +02:00
$project_static -> status = $obj -> status ;
2021-07-05 13:44:05 +02:00
$project_static -> opp_status = $obj -> fk_opp_status ;
2022-06-08 17:00:04 +02:00
$project_static -> date_end = $this -> db -> jdate ( $obj -> datee );
2020-05-19 22:06:17 +02:00
2020-05-20 23:56:06 +02:00
if ( $project_static -> hasDelay ()) {
$response -> nbtodolate ++ ;
}
2020-05-20 20:10:48 +02:00
}
2020-05-19 22:06:17 +02:00
2020-05-20 23:56:06 +02:00
return $response ;
}
2020-05-19 22:06:17 +02:00
2022-08-30 12:02:53 +02:00
$this -> error = $this -> db -> error ();
return - 1 ;
}
2020-05-19 22:06:17 +02:00
2020-05-20 23:56:06 +02:00
/**
* Function used to replace a thirdparty id with another one .
*
2022-12-28 13:27:13 +01:00
* @ param DoliDB $dbs Database handler
* @ param int $origin_id Old thirdparty id
* @ param int $dest_id New thirdparty id
2020-05-20 23:56:06 +02:00
* @ return bool
*/
2022-12-28 13:27:13 +01:00
public static function replaceThirdparty ( DoliDB $dbs , $origin_id , $dest_id )
2020-05-20 23:56:06 +02:00
{
$tables = array (
'projet'
);
2020-05-19 22:06:17 +02:00
2022-12-28 13:27:13 +01:00
return CommonObject :: commonReplaceThirdparty ( $dbs , $origin_id , $dest_id , $tables );
2020-05-20 23:56:06 +02:00
}
2020-05-19 22:06:17 +02:00
2020-05-20 23:56:06 +02:00
/**
2024-01-12 17:55:52 +01:00
* Load indicators this -> nb for the state board
2020-05-20 23:56:06 +02:00
*
2023-12-01 19:51:32 +01:00
* @ return int Return integer < 0 if KO , > 0 if OK
2020-05-20 23:56:06 +02:00
*/
2024-01-18 18:55:53 +01:00
public function loadStateBoard ()
2020-05-20 23:56:06 +02:00
{
global $user ;
2020-05-19 22:06:17 +02:00
2020-05-20 23:56:06 +02:00
$this -> nb = array ();
2020-05-19 22:06:17 +02:00
2020-05-20 23:56:06 +02:00
$sql = " SELECT count(p.rowid) as nb " ;
$sql .= " FROM " . MAIN_DB_PREFIX . " projet as p " ;
$sql .= " WHERE " ;
$sql .= " p.entity IN ( " . getEntity ( 'project' ) . " ) " ;
2023-10-15 18:39:13 +02:00
if ( ! $user -> hasRight ( 'projet' , 'all' , 'lire' )) {
2020-05-20 23:56:06 +02:00
$projectsListId = $this -> getProjectsAuthorizedForUser ( $user , 0 , 1 );
2021-03-22 12:47:23 +01:00
$sql .= " AND p.rowid IN ( " . $this -> db -> sanitize ( $projectsListId ) . " ) " ;
2020-05-20 23:56:06 +02:00
}
2020-05-19 22:06:17 +02:00
2020-05-20 23:56:06 +02:00
$resql = $this -> db -> query ( $sql );
2021-02-26 18:49:22 +01:00
if ( $resql ) {
while ( $obj = $this -> db -> fetch_object ( $resql )) {
2020-05-20 23:56:06 +02:00
$this -> nb [ " projects " ] = $obj -> nb ;
2020-05-19 22:06:17 +02:00
}
2020-05-20 23:56:06 +02:00
$this -> db -> free ( $resql );
return 1 ;
2020-05-21 15:05:19 +02:00
} else {
2020-05-20 23:56:06 +02:00
dol_print_error ( $this -> db );
$this -> error = $this -> db -> error ();
return - 1 ;
2020-05-19 22:06:17 +02:00
}
2020-05-20 20:10:48 +02:00
}
2020-05-19 22:06:17 +02:00
2020-05-20 23:56:06 +02:00
/**
* Is the project delayed ?
*
* @ return bool
*/
public function hasDelay ()
{
global $conf ;
2020-05-19 22:06:17 +02:00
2024-07-02 01:46:40 +02:00
if ( ! ( $this -> status == self :: STATUS_VALIDATED )) {
2021-02-26 18:49:22 +01:00
return false ;
}
2022-06-08 17:00:04 +02:00
if ( ! $this -> date_end ) {
2021-02-26 18:49:22 +01:00
return false ;
}
2020-05-19 22:06:17 +02:00
2020-05-20 23:56:06 +02:00
$now = dol_now ();
2020-05-19 22:06:17 +02:00
2022-06-14 17:53:17 +02:00
return ( $this -> date_end ) < ( $now - $conf -> project -> warning_delay );
2020-05-20 23:56:06 +02:00
}
2020-05-20 20:10:48 +02:00
2020-05-20 23:56:06 +02:00
/**
2024-01-12 17:55:52 +01:00
* Charge les information d 'ordre info dans l' objet commande
2020-05-20 23:56:06 +02:00
*
* @ param int $id Id of order
* @ return void
*/
public function info ( $id )
2020-05-20 20:10:48 +02:00
{
2020-05-20 23:56:06 +02:00
$sql = 'SELECT c.rowid, datec as datec, tms as datem,' ;
$sql .= ' date_close as datecloture,' ;
2023-10-28 02:06:07 +02:00
$sql .= ' fk_user_creat as fk_user_author, fk_user_close as fk_user_cloture' ;
2020-05-20 23:56:06 +02:00
$sql .= ' FROM ' . MAIN_DB_PREFIX . 'projet as c' ;
2021-03-14 11:48:39 +01:00
$sql .= ' WHERE c.rowid = ' . (( int ) $id );
2020-05-20 23:56:06 +02:00
$result = $this -> db -> query ( $sql );
2021-02-26 18:49:22 +01:00
if ( $result ) {
if ( $this -> db -> num_rows ( $result )) {
2020-05-20 23:56:06 +02:00
$obj = $this -> db -> fetch_object ( $result );
2023-10-24 11:37:29 +02:00
2020-05-20 23:56:06 +02:00
$this -> id = $obj -> rowid ;
2020-05-20 20:10:48 +02:00
2023-10-24 11:37:29 +02:00
$this -> user_creation_id = $obj -> fk_user_author ;
$this -> user_closing_id = $obj -> fk_user_cloture ;
2020-05-19 22:06:17 +02:00
2020-05-20 23:56:06 +02:00
$this -> date_creation = $this -> db -> jdate ( $obj -> datec );
$this -> date_modification = $this -> db -> jdate ( $obj -> datem );
$this -> date_cloture = $this -> db -> jdate ( $obj -> datecloture );
2020-05-19 22:06:17 +02:00
}
2020-05-20 20:10:48 +02:00
2020-05-20 23:56:06 +02:00
$this -> db -> free ( $result );
2020-05-21 15:05:19 +02:00
} else {
2020-05-20 23:56:06 +02:00
dol_print_error ( $this -> db );
2020-05-19 22:06:17 +02:00
}
2020-05-20 20:10:48 +02:00
}
2020-05-19 22:06:17 +02:00
2020-05-20 23:56:06 +02:00
/**
* Sets object to supplied categories .
*
* Deletes object from existing categories not supplied .
* Adds it to non existing supplied categories .
* Existing categories are left untouch .
*
2022-12-31 14:01:03 +01:00
* @ param int [] | int $categories Category or categories IDs
2023-12-01 19:51:32 +01:00
* @ return int Return integer < 0 if KO , > 0 if OK
2020-05-20 23:56:06 +02:00
*/
public function setCategories ( $categories )
2020-05-20 20:10:48 +02:00
{
2020-05-20 23:56:06 +02:00
require_once DOL_DOCUMENT_ROOT . '/categories/class/categorie.class.php' ;
2020-12-24 00:53:10 +01:00
return parent :: setCategoriesCommon ( $categories , Categorie :: TYPE_PROJECT );
2020-05-20 23:56:06 +02:00
}
2020-05-19 22:06:17 +02:00
2020-05-20 23:56:06 +02:00
/**
2023-04-10 11:23:18 +02:00
* Create an array of tasks of current project
2020-05-20 23:56:06 +02:00
*
2024-09-23 00:37:30 +02:00
* @ param ? User $user Object user we want project allowed to
2022-10-18 11:36:17 +02:00
* @ param int $loadRoleMode 1 = will test Roles on task ; 0 used in delete project action
2023-04-10 11:23:18 +02:00
* @ return int > 0 if OK , < 0 if KO
2020-05-20 23:56:06 +02:00
*/
2022-10-18 11:43:55 +02:00
public function getLinesArray ( $user , $loadRoleMode = 1 )
2020-05-20 23:56:06 +02:00
{
require_once DOL_DOCUMENT_ROOT . '/projet/class/task.class.php' ;
$taskstatic = new Task ( $this -> db );
2020-05-20 20:10:48 +02:00
2024-09-23 00:37:30 +02:00
$this -> lines = $taskstatic -> getTasksArray ( null , $user , $this -> id , 0 , 0 , '' , '-1' , '' , 0 , 0 , null , 0 , array (), 0 , $loadRoleMode );
2023-05-01 18:12:59 +02:00
return 1 ;
2020-05-20 23:56:06 +02:00
}
2023-02-01 23:31:39 +01:00
/**
2024-07-15 13:40:55 +02:00
* Function sending an email to the current project with the text supplied in parameter .
* TODO When this is used ?
2023-02-01 23:31:39 +01:00
*
* @ param string $text Content of message ( not html entities encoded )
* @ param string $subject Subject of message
2024-09-23 00:37:30 +02:00
* @ param string [] $filename_list Array of attached files
* @ param string [] $mimetype_list Array of mime types of attached files
* @ param string [] $mimefilename_list Array of public names of attached files
2023-02-01 23:31:39 +01:00
* @ param string $addr_cc Email cc
* @ param string $addr_bcc Email bcc
* @ param int $deliveryreceipt Ask a delivery receipt
* @ param int $msgishtml 1 = String IS already html , 0 = String IS NOT html , - 1 = Unknown need autodetection
2024-01-12 17:55:52 +01:00
* @ param string $errors_to errors to
2023-02-01 23:31:39 +01:00
* @ param string $moreinheader Add more html headers
2023-02-08 21:45:46 +01:00
* @ since V18
2023-12-01 19:51:32 +01:00
* @ return int Return integer < 0 if KO , > 0 if OK
2023-02-01 23:31:39 +01:00
*/
2023-02-08 21:45:46 +01:00
public function sendEmail ( $text , $subject , $filename_list = array (), $mimetype_list = array (), $mimefilename_list = array (), $addr_cc = " " , $addr_bcc = " " , $deliveryreceipt = 0 , $msgishtml = - 1 , $errors_to = '' , $moreinheader = '' )
2023-02-01 23:31:39 +01:00
{
// TODO EMAIL
2023-02-08 21:45:46 +01:00
return 1 ;
2023-02-01 23:31:39 +01:00
}
2024-07-15 13:40:55 +02:00
2022-12-21 13:28:39 +01:00
/**
2024-08-07 01:20:43 +02:00
* Return clickable link of object ( with eventually picto )
2022-12-21 13:28:39 +01:00
*
2025-02-03 11:24:16 +01:00
* @ param string $option Where point the link ( 0 => main card , 1 , 2 => shipment , 'nolink' => No link )
* @ param ? array < string , mixed > $arraydata Array of data
* @ param string $size Size of thumb ( '' = auto , 'large' = large , 'small' = small )
* @ return string HTML Code for Kanban thumb .
2022-12-21 13:28:39 +01:00
*/
2024-06-20 17:16:53 +02:00
public function getKanbanView ( $option = '' , $arraydata = null , $size = '' )
2022-12-21 13:28:39 +01:00
{
2024-06-20 17:16:53 +02:00
global $conf , $langs ;
2023-03-07 22:04:40 +01:00
$selected = ( empty ( $arraydata [ 'selected' ]) ? 0 : $arraydata [ 'selected' ]);
2024-06-20 17:16:53 +02:00
if ( empty ( $size )) {
if ( empty ( $conf -> dol_optimize_smallscreen )) {
$size = 'large' ;
} else {
$size = 'small' ;
}
}
$return = '<div class="box-flex-item ' . ( $size == 'small' ? 'box-flex-item-small' : '' ) . ' box-flex-grow-zero">' ;
2022-12-21 13:28:39 +01:00
$return .= '<div class="info-box info-box-sm">' ;
$return .= '<span class="info-box-icon bg-infobox-action">' ;
2023-04-29 13:04:45 +02:00
$return .= img_picto ( '' , $this -> public ? 'projectpub' : $this -> picto );
2022-12-21 13:28:39 +01:00
//$return .= '<i class="fa fa-dol-action"></i>'; // Can be image
$return .= '</span>' ;
$return .= '<div class="info-box-content">' ;
2023-05-11 11:03:26 +02:00
$return .= '<span class="info-box-ref inline-block tdoverflowmax150 valignmiddle">' . ( method_exists ( $this , 'getNomUrl' ) ? $this -> getNomUrl () : $this -> ref );
2023-02-21 00:54:00 +01:00
if ( $this -> hasDelay ()) {
$return .= img_warning ( $langs -> trans ( 'Late' ));
2022-12-21 13:28:39 +01:00
}
2023-02-21 00:54:00 +01:00
$return .= '</span>' ;
2023-10-17 15:43:56 +02:00
if ( $selected >= 0 ) {
$return .= '<input id="cb' . $this -> id . '" class="flat checkforselect fright" type="checkbox" name="toselect[]" value="' . $this -> id . '"' . ( $selected ? ' checked="checked"' : '' ) . '>' ;
}
2023-04-29 13:04:45 +02:00
// Date
/*
2023-02-21 00:54:00 +01:00
if ( property_exists ( $this , 'date_start' ) && $this -> date_start ) {
2023-02-21 02:12:20 +01:00
$return .= '<br><span class="info-box-label">' . dol_print_date ( $this -> date_start , 'day' ) . '</>' ;
2023-02-21 00:54:00 +01:00
}
if ( property_exists ( $this , 'date_end' ) && $this -> date_end ) {
if ( $this -> date_start ) {
$return .= ' - ' ;
} else {
$return .= '<br>' ;
}
2023-04-29 13:04:45 +02:00
$return .= '<span class="info-box-label">' . dol_print_date ( $this -> date_end , 'day' ) . '</span>' ;
} */
2024-06-22 15:36:10 +02:00
if ( property_exists ( $this , 'thirdparty' ) && ! is_null ( $this -> thirdparty ) && is_object ( $this -> thirdparty ) && $this -> thirdparty instanceof Societe ) {
2024-07-15 13:40:55 +02:00
$return .= '<br><div class="info-box-ref tdoverflowmax125 inline-block valignmiddle">' . $this -> thirdparty -> getNomUrl ( 1 );
2024-03-09 16:32:02 +01:00
$return .= '</div>' ;
2024-06-22 15:36:10 +02:00
if ( ! empty ( $this -> thirdparty -> phone )) {
$return .= '<div class="inline-block valignmiddle">' ;
2024-09-23 00:37:30 +02:00
$return .= dol_print_phone ( $this -> thirdparty -> phone , $this -> thirdparty -> country_code , 0 , $this -> thirdparty -> id , 'tel' , 'hidenum' , 'phone' , $this -> thirdparty -> phone , 0 , 'paddingleft paddingright' ); // @phan-suppress-current-line PhanPluginSuspiciousParamPosition
2024-06-22 15:36:10 +02:00
$return .= '</div>' ;
}
2024-07-15 13:40:55 +02:00
if ( ! empty ( $this -> thirdparty -> email )) {
$return .= '<div class="inline-block valignmiddle">' ;
2024-07-24 16:07:15 +02:00
$return .= dol_print_email ( $this -> thirdparty -> email , 0 , $this -> thirdparty -> id , 'thirdparty' , - 1 , 1 , 2 , 'paddingleft paddingright' );
2024-07-15 13:40:55 +02:00
$return .= '</div>' ;
}
2023-09-29 12:04:18 +02:00
}
2023-04-29 13:04:45 +02:00
if ( ! empty ( $arraydata [ 'assignedusers' ])) {
2023-07-01 16:43:59 +02:00
$return .= '<br>' ;
if ( $this -> public ) {
$return .= img_picto ( $langs -> trans ( 'Visibility' ) . ': ' . $langs -> trans ( 'SharedProject' ), 'world' , 'class="paddingrightonly valignmiddle"' );
2023-12-13 12:46:23 +01:00
//print $langs->trans('SharedProject');
2023-07-01 16:43:59 +02:00
} else {
$return .= img_picto ( $langs -> trans ( 'Visibility' ) . ': ' . $langs -> trans ( 'PrivateProject' ), 'private' , 'class="paddingrightonly valignmiddle"' );
//print $langs->trans('PrivateProject');
}
$return .= ' <span class="small valignmiddle">' . $arraydata [ 'assignedusers' ] . '</span>' ;
2023-02-21 00:54:00 +01:00
}
/* if ( property_exists ( $this , 'user_author_id' )) {
2022-12-21 13:28:39 +01:00
$return .= '<br><span class="info-box-label opacitymedium">' . $langs -> trans ( " Author " ) . '</span>' ;
$return .= '<span> : ' . $user -> getNomUrl ( 1 ) . '</span>' ;
2023-02-21 00:54:00 +01:00
} */
2023-11-22 13:53:47 +01:00
$return .= '<br><div>' ; // start div line status
2023-02-21 00:54:00 +01:00
if ( $this -> usage_opportunity && $this -> opp_status_code ) {
//$return .= '<br><span class="info-bo-label opacitymedium">'.$langs->trans("OpportunityStatusShort").'</span>';
2023-11-22 13:53:47 +01:00
//$return .= '<div class="small inline-block">'.dol_trunc($langs->trans("OppStatus".$this->opp_status_code), 5).'</div>';
$return .= '<div class="opacitymedium small marginrightonly inline-block" title="' . dol_escape_htmltag ( $langs -> trans ( " OppStatus " . $this -> opp_status_code )) . '">' . round ( $this -> opp_percent ) . '%</div>' ;
$return .= ' <div class="amount small marginrightonly inline-block">' . price ( $this -> opp_amount ) . '</div>' ;
2022-12-21 13:28:39 +01:00
}
if ( method_exists ( $this , 'getLibStatut' )) {
2023-12-19 11:51:48 +01:00
$return .= '<div class="info-box-status small inline-block valignmiddle">' . $this -> getLibStatut ( 3 ) . '</div>' ;
2022-12-21 13:28:39 +01:00
}
2023-11-22 13:53:47 +01:00
$return .= '</div>' ; // end div line status
2022-12-21 13:28:39 +01:00
$return .= '</div>' ;
$return .= '</div>' ;
$return .= '</div>' ;
2023-11-22 13:53:47 +01:00
2022-12-21 13:28:39 +01:00
return $return ;
}
2023-10-20 14:33:39 +02:00
/**
* Return array of sub - projects of the current project
*
2024-09-23 00:37:30 +02:00
* @ return stdClass [] Children of this project as objects with rowid & title as members
2023-10-20 14:33:39 +02:00
*/
public function getChildren ()
{
$children = [];
$sql = 'SELECT rowid,title' ;
$sql .= ' FROM ' . MAIN_DB_PREFIX . 'projet' ;
$sql .= ' WHERE fk_project = ' . (( int ) $this -> id );
$sql .= ' ORDER BY title' ;
$result = $this -> db -> query ( $sql );
if ( $result ) {
$n = $this -> db -> num_rows ( $result );
while ( $n ) {
$children [] = $this -> db -> fetch_object ( $result );
$n -- ;
}
$this -> db -> free ( $result );
} else {
dol_print_error ( $this -> db );
}
return $children ;
}
2024-02-23 17:15:40 +01:00
/**
* Method for calculating weekly hours worked and generating a report
* @ return int 0 if OK , <> 0 if KO ( this function is used also by cron so only 0 is OK )
*/
public function createWeeklyReport ()
{
global $mysoc , $user ;
$now = dol_now ();
$nowDate = dol_getdate ( $now , true );
2024-03-16 22:13:00 +01:00
$errormesg = '' ;
2024-03-09 16:32:02 +01:00
$errorsMsg = array ();
2024-02-23 17:15:40 +01:00
$firstDayOfWeekTS = dol_get_first_day_week ( $nowDate [ 'mday' ], $nowDate [ 'mon' ], $nowDate [ 'year' ]);
$firstDayOfWeekDate = dol_mktime ( 0 , 0 , 0 , $nowDate [ 'mon' ], $firstDayOfWeekTS [ 'first_day' ], $nowDate [ 'year' ]);
$lastWeekStartTS = dol_time_plus_duree ( $firstDayOfWeekDate , - 7 , 'd' );
$lastWeekEndTS = dol_time_plus_duree ( $lastWeekStartTS , 6 , 'd' );
$startDate = dol_print_date ( $lastWeekStartTS , '%Y-%m-%d 00:00:00' );
$endDate = dol_print_date ( $lastWeekEndTS , '%Y-%m-%d 23:59:59' );
$sql = " SELECT
u . rowid AS user_id ,
CONCAT ( u . firstname , ' ' , u . lastname ) AS name ,
u . email , u . weeklyhours ,
SUM ( et . element_duration ) AS total_seconds
FROM
2024-03-17 22:49:18 +01:00
" .MAIN_DB_PREFIX. " element_time AS et
2024-02-23 17:15:40 +01:00
JOIN
2024-03-17 22:49:18 +01:00
" .MAIN_DB_PREFIX. " user AS u ON et . fk_user = u . rowid
2024-02-23 17:15:40 +01:00
WHERE
et . element_date BETWEEN '".$this->db->escape($startDate)."' AND '".$this->db->escape($endDate)."'
AND et . elementtype = 'task'
GROUP BY
et . fk_user " ;
$resql = $this -> db -> query ( $sql );
if ( ! $resql ) {
dol_print_error ( $this -> db );
return - 1 ;
} else {
$reportContent = " <span>Weekly time report from $startDate to $endDate </span><br><br> " ;
$reportContent .= '<table border="1" style="border-collapse: collapse;">' ;
$reportContent .= '<tr><th>Nom d\'utilisateur</th><th>Temps saisi (heures)</th><th>Temps travaillé par semaine (heures)</th></tr>' ;
$weekendEnabled = 0 ;
$to = '' ;
$nbMailSend = 0 ;
$error = 0 ;
2024-03-14 22:35:00 +01:00
$errors_to = '' ;
2024-02-23 17:15:40 +01:00
while ( $obj = $this -> db -> fetch_object ( $resql )) {
$to = $obj -> email ;
$numHolidays = num_public_holiday ( $lastWeekStartTS , $lastWeekEndTS , $mysoc -> country_code , 1 );
if ( getDolGlobalString ( 'MAIN_NON_WORKING_DAYS_INCLUDE_SATURDAY' ) && getDolGlobalString ( 'MAIN_NON_WORKING_DAYS_INCLUDE_SUNDAY' )) {
2024-08-07 02:53:45 +02:00
$numHolidays -= 2 ;
2024-02-23 17:15:40 +01:00
$weekendEnabled = 2 ;
}
$dailyHours = $obj -> weeklyhours / ( 7 - $weekendEnabled );
// Adjust total on seconde
$adjustedSeconds = $obj -> total_seconds + ( $numHolidays * $dailyHours * 3600 );
$totalHours = round ( $adjustedSeconds / 3600 , 2 );
$reportContent .= " <tr><td> { $obj -> name } </td><td> { $totalHours } </td><td> " . round ( $obj -> weeklyhours , 2 ) . " </td></tr> " ;
$reportContent .= '</table>' ;
require_once DOL_DOCUMENT_ROOT . '/core/class/CMailFile.class.php' ;
// PREPARE EMAIL
$errormesg = '' ;
$subject = 'Rapport hebdomadaire des temps travaillés' ;
$from = getDolGlobalString ( 'MAIN_MAIL_EMAIL_FROM' );
if ( empty ( $from )) {
$errormesg = " Failed to get sender into global setup MAIN_MAIL_EMAIL_FROM " ;
$error ++ ;
}
2024-09-05 16:05:37 +02:00
$mail = new CMailFile ( $subject , $to , $from , $reportContent , array (), array (), array (), '' , '' , 0 , - 1 , '' , '' , '' , 'text/html' );
2024-02-23 17:15:40 +01:00
if ( $mail -> sendfile ()) {
$nbMailSend ++ ;
// Add a line into event table
require_once DOL_DOCUMENT_ROOT . '/comm/action/class/actioncomm.class.php' ;
// Insert record of emails sent
$actioncomm = new ActionComm ( $this -> db );
$actioncomm -> type_code = 'AC_OTH_AUTO' ; // Event insert into agenda automatically
$actioncomm -> socid = $this -> thirdparty -> id ; // To link to a company
$actioncomm -> contact_id = 0 ;
$actioncomm -> code = 'AC_EMAIL' ;
$actioncomm -> label = 'createWeeklyReportOK()' ;
$actioncomm -> fk_project = $this -> id ;
$actioncomm -> datep = dol_now ();
$actioncomm -> datef = $actioncomm -> datep ;
$actioncomm -> percentage = - 1 ; // Not applicable
$actioncomm -> authorid = $user -> id ; // User saving action
$actioncomm -> userownerid = $user -> id ; // Owner of action
// Fields when action is an email (content should be added into note)
$actioncomm -> email_msgid = $mail -> msgid ;
$actioncomm -> email_subject = $subject ;
$actioncomm -> email_from = $from ;
$actioncomm -> email_sender = '' ;
$actioncomm -> email_to = $to ;
$actioncomm -> errors_to = $errors_to ;
$actioncomm -> elementtype = 'project_task' ;
2024-03-14 18:03:32 +01:00
$actioncomm -> fk_element = ( int ) $this -> element ;
2024-02-23 17:15:40 +01:00
$actioncomm -> create ( $user );
} else {
$errormesg = $mail -> error . ' : ' . $to ;
$error ++ ;
// Add a line into event table
require_once DOL_DOCUMENT_ROOT . '/comm/action/class/actioncomm.class.php' ;
// Insert record of emails sent
$actioncomm = new ActionComm ( $this -> db );
$actioncomm -> type_code = 'AC_OTH_AUTO' ; // Event insert into agenda automatically
$actioncomm -> socid = $this -> thirdparty -> id ; // To link to a company
$actioncomm -> contact_id = 0 ;
$actioncomm -> code = 'AC_EMAIL' ;
$actioncomm -> label = 'createWeeklyReportKO()' ;
$actioncomm -> note_private = $errormesg ;
$actioncomm -> fk_project = $this -> id ;
$actioncomm -> datep = dol_now ();
$actioncomm -> datef = $actioncomm -> datep ;
$actioncomm -> authorid = $user -> id ; // User saving action
$actioncomm -> userownerid = $user -> id ; // Owner of action
// Fields when action is an email (content should be added into note)
$actioncomm -> email_msgid = $mail -> msgid ;
$actioncomm -> email_from = $from ;
$actioncomm -> email_sender = '' ;
$actioncomm -> email_to = $to ;
$actioncomm -> errors_to = $errors_to ;
$actioncomm -> elementtype = 'project_task' ;
2024-03-14 18:03:32 +01:00
$actioncomm -> fk_element = ( int ) $this -> element ;
2024-02-23 17:15:40 +01:00
$actioncomm -> create ( $user );
}
$this -> db -> commit ();
}
}
2024-03-16 22:13:00 +01:00
if ( ! empty ( $errormesg )) {
2024-02-23 17:15:40 +01:00
$errorsMsg [] = $errormesg ;
}
if ( ! $error ) {
$this -> output .= 'Nb of emails sent : ' . $nbMailSend ;
dol_syslog ( __METHOD__ . " end - " . $this -> output , LOG_INFO );
return 0 ;
} else {
2024-03-16 22:13:00 +01:00
$this -> error = 'Nb of emails sent : ' . $nbMailSend . ', ' . ( empty ( $errorsMsg ) ? $error : implode ( ', ' , $errorsMsg ));
2024-02-23 17:15:40 +01:00
dol_syslog ( __METHOD__ . " end - " . $this -> error , LOG_INFO );
return $error ;
}
}
2002-05-11 20:53:13 +02:00
}