2019-10-15 19:59:16 +02:00
< ? php
/* Copyright ( C ) 2017 Laurent Destailleur < eldy @ users . sourceforge . net >
2020-04-21 08:14:02 +02:00
* Copyright ( C ) 2020 Lenin Rivas < lenin @ leninrivas . com >
2024-01-13 15:34:02 +01:00
* Copyright ( C ) 2023 - 2024 Frédéric France < frederic . france @ free . fr >
2024-03-11 12:55:55 +01:00
* Copyright ( C ) 2024 MDW < mdeweerd @ users . noreply . github . com >
2019-10-15 19:59:16 +02:00
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 3 of the License , or
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
2022-09-07 20:21:01 +02:00
* along with this program . If not , see < https :// www . gnu . org / licenses />.
2019-10-15 19:59:16 +02:00
*/
/**
2024-02-02 23:46:12 +01:00
* \file mrp / class / mo . class . php
2019-10-15 19:59:16 +02:00
* \ingroup mrp
* \brief This file is a CRUD class file for Mo ( Create / Read / Update / Delete )
*/
// Put here all includes required by your class file
2019-11-11 23:59:36 +01:00
require_once DOL_DOCUMENT_ROOT . '/core/class/commonobject.class.php' ;
2022-07-22 13:41:24 +02:00
require_once DOL_DOCUMENT_ROOT . '/core/class/commonobjectline.class.php' ;
2019-10-15 19:59:16 +02:00
2024-02-02 23:46:12 +01:00
2019-10-15 19:59:16 +02:00
/**
* Class for Mo
*/
class Mo extends CommonObject
{
/**
* @ var string ID to identify managed object
*/
public $element = 'mo' ;
/**
* @ var string Name of table without prefix where object is stored
*/
public $table_element = 'mrp_mo' ;
/**
* @ var int Does mo support multicompany module ? 0 = No test on entity , 1 = Test with field entity , 2 = Test with link by societe
*/
2022-03-11 11:18:09 +01:00
public $ismultientitymanaged = 1 ;
2019-10-15 19:59:16 +02:00
/**
* @ var int Does mo support extrafields ? 0 = No , 1 = Yes
*/
public $isextrafieldmanaged = 1 ;
/**
* @ var string String with name of icon for mo . Must be the part after the 'object_' into object_mo . png
*/
public $picto = 'mrp' ;
const STATUS_DRAFT = 0 ;
2019-11-11 23:59:36 +01:00
const STATUS_VALIDATED = 1 ; // To produce
2019-10-15 19:59:16 +02:00
const STATUS_INPROGRESS = 2 ;
2019-10-27 00:01:16 +02:00
const STATUS_PRODUCED = 3 ;
2020-01-09 22:14:39 +01:00
const STATUS_CANCELED = 9 ;
2019-10-15 19:59:16 +02:00
/**
2021-03-15 14:16:55 +01:00
* 'type' field format ( 'integer' , 'integer:ObjectClass:PathToClass[:AddCreateButtonOrNot[:Filter]]' , 'sellist:TableName:LabelFieldName[:KeyFieldName[:KeyFieldParent[:Filter]]]' , 'varchar(x)' , 'double(24,8)' , 'real' , 'price' , 'text' , 'text:none' , 'html' , 'date' , 'datetime' , 'timestamp' , 'duration' , 'mail' , 'phone' , 'url' , 'password' )
2020-01-09 22:14:39 +01:00
* Note : Filter can be a string like " (t.ref:like:'SO-%') or (t.date_creation:<:'20160101') or (t.nature:is:NULL) "
2019-10-15 19:59:16 +02:00
* 'label' the translation key .
2021-03-15 14:16:55 +01:00
* 'picto' is code of a picto to show before value in forms
2024-03-22 00:37:56 +01:00
* 'enabled' is a condition when the field must be managed ( Example : 1 or 'getDolGlobalString("MY_SETUP_PARAM")'
2021-03-15 14:16:55 +01:00
* 'position' is the sort order of field .
2019-10-15 19:59:16 +02:00
* 'notnull' is set to 1 if not null in database . Set to - 1 if we must set data to null if empty ( '' or 0 ) .
2021-03-15 14:16:55 +01:00
* '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 )
* '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 .
2019-10-15 19:59:16 +02:00
* 'index' if we want an index in database .
2024-01-12 18:06:50 +01:00
* 'foreignkey' => 'tablename.field' if the field is a foreign key ( it is recommended to name the field fk_ ... ) .
2019-10-15 19:59:16 +02:00
* 'searchall' is 1 if we want to search in this field when making a search from the quick search button .
* 'isameasure' must be set to 1 if you want to have a total on list for this field . Field type must be summable like integer or double ( 24 , 8 ) .
2021-03-15 14:16:55 +01:00
* '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 : 'maxwidth200' , 'wordbreak' , 'tdoverflowmax200'
* 'help' is a 'TranslationString' to use to show a tooltip on field . You can also use 'TranslationString:keyfortooltiponlick' for a tooltip on click .
2019-10-15 19:59:16 +02:00
* 'showoncombobox' if value of the field must be visible into the label of the combobox that list record
2021-03-15 14:16:55 +01:00
* '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 .
2021-04-29 12:10:55 +02:00
* 'arrayofkeyval' to set list of value if type is a list of predefined values . For example : array ( " 0 " => " Draft " , " 1 " => " Active " , " -1 " => " Cancel " )
2021-03-15 14:16:55 +01:00
* 'autofocusoncreate' to have field having the focus on a create form . Only 1 field should have this property set to 1.
* 'comment' is not used . You can store here any text of your choice . It is not used by application .
*
* Note : To have value dynamic , you can set value to 0 in definition and edit the value on the fly into the constructor .
2019-10-15 19:59:16 +02:00
*/
/**
2024-03-18 18:59:41 +01:00
* @ var array < string , array { type : string , label : string , enabled : int < 0 , 2 >| string , position : int , notnull ? : int , visible : int , noteditable ? : int , default ? : string , index ? : int , foreignkey ? : string , searchall ? : int , isameasure ? : int , css ? : string , csslist ? : string , help ? : string , showoncombobox ? : int , disabled ? : int , arrayofkeyval ? : array < int , string > , comment ? : string } > Array with all fields and their property . Do not use it as a static var . It may be modified by constructor .
2019-10-15 19:59:16 +02:00
*/
2019-11-11 23:59:36 +01:00
public $fields = array (
2024-03-08 21:34:18 +01:00
'rowid' => array ( 'type' => 'integer' , 'label' => 'TechnicalID' , 'enabled' => 1 , 'visible' => - 2 , 'position' => 1 , 'notnull' => 1 , 'index' => 1 , 'comment' => " Id " ,),
'entity' => array ( 'type' => 'integer' , 'label' => 'Entity' , 'enabled' => 1 , 'visible' => 0 , 'position' => 5 , 'notnull' => 1 , 'default' => '1' , 'index' => 1 ),
2024-03-15 00:31:27 +01:00
'ref' => array ( 'type' => 'varchar(128)' , 'label' => 'Ref' , 'enabled' => 1 , 'visible' => 4 , 'position' => 10 , 'notnull' => 1 , 'default' => '(PROV)' , 'index' => 1 , 'searchall' => 1 , 'comment' => " Reference of object " , 'showoncombobox' => 1 , 'noteditable' => 1 ),
2024-03-08 21:34:18 +01:00
'fk_bom' => array ( 'type' => 'integer:Bom:bom/class/bom.class.php:0:(t.status:=:1)' , 'filter' => 'active=1' , 'label' => 'BOM' , 'enabled' => '$conf->bom->enabled' , 'visible' => 1 , 'position' => 33 , 'notnull' => - 1 , 'index' => 1 , 'comment' => " Original BOM " , 'css' => 'minwidth100 maxwidth500' , 'csslist' => 'tdoverflowmax150' , 'picto' => 'bom' ),
'mrptype' => array ( 'type' => 'integer' , 'label' => 'Type' , 'enabled' => 1 , 'visible' => 1 , 'position' => 34 , 'notnull' => 1 , 'default' => '0' , 'arrayofkeyval' => array ( 0 => 'Manufacturing' , 1 => 'Disassemble' ), 'css' => 'minwidth150' , 'csslist' => 'minwidth150 center' ),
'fk_product' => array ( 'type' => 'integer:Product:product/class/product.class.php:0' , 'label' => 'Product' , 'enabled' => 'isModEnabled("product")' , 'visible' => 1 , 'position' => 35 , 'notnull' => 1 , 'index' => 1 , 'comment' => " Product to produce " , 'css' => 'maxwidth300' , 'csslist' => 'tdoverflowmax100' , 'picto' => 'product' ),
2024-03-15 00:31:27 +01:00
'qty' => array ( 'type' => 'real' , 'label' => 'QtyToProduce' , 'enabled' => 1 , 'visible' => 1 , 'position' => 40 , 'notnull' => 1 , 'comment' => " Qty to produce " , 'css' => 'width75' , 'default' => '1' , 'isameasure' => 1 ),
'label' => array ( 'type' => 'varchar(255)' , 'label' => 'Label' , 'enabled' => 1 , 'visible' => 1 , 'position' => 42 , 'notnull' => - 1 , 'searchall' => 1 , 'showoncombobox' => 2 , 'css' => 'maxwidth300' , 'csslist' => 'tdoverflowmax200' , 'alwayseditable' => 1 ),
2024-03-08 21:34:18 +01:00
'fk_soc' => array ( 'type' => 'integer:Societe:societe/class/societe.class.php:1' , 'label' => 'ThirdParty' , 'picto' => 'company' , 'enabled' => 'isModEnabled("societe")' , 'visible' => - 1 , 'position' => 50 , 'notnull' => - 1 , 'index' => 1 , 'css' => 'maxwidth400' , 'csslist' => 'tdoverflowmax150' ),
'fk_project' => array ( 'type' => 'integer:Project:projet/class/project.class.php:1:(fk_statut:=:1)' , 'label' => 'Project' , 'picto' => 'project' , 'enabled' => '$conf->project->enabled' , 'visible' => - 1 , 'position' => 51 , 'notnull' => - 1 , 'index' => 1 , 'css' => 'minwidth200 maxwidth400' , 'csslist' => 'tdoverflowmax100' ),
'fk_warehouse' => array ( 'type' => 'integer:Entrepot:product/stock/class/entrepot.class.php:0' , 'label' => 'WarehouseForProduction' , 'picto' => 'stock' , 'enabled' => 'isModEnabled("stock")' , 'visible' => 1 , 'position' => 52 , 'css' => 'maxwidth400' , 'csslist' => 'tdoverflowmax200' ),
'note_public' => array ( 'type' => 'html' , 'label' => 'NotePublic' , 'enabled' => 1 , 'visible' => 0 , 'position' => 61 , 'notnull' => - 1 ,),
'note_private' => array ( 'type' => 'html' , 'label' => 'NotePrivate' , 'enabled' => 1 , 'visible' => 0 , 'position' => 62 , 'notnull' => - 1 ,),
'date_creation' => array ( 'type' => 'datetime' , 'label' => 'DateCreation' , 'enabled' => 1 , 'visible' => - 2 , 'position' => 500 , 'notnull' => 1 ,),
'tms' => array ( 'type' => 'timestamp' , 'label' => 'DateModification' , 'enabled' => 1 , 'visible' => - 2 , 'position' => 501 , 'notnull' => 1 ,),
'date_valid' => array ( 'type' => 'datetime' , 'label' => 'DateValidation' , 'enabled' => 1 , 'visible' => - 2 , 'position' => 502 ,),
'fk_user_creat' => array ( 'type' => 'integer:User:user/class/user.class.php' , 'label' => 'UserAuthor' , 'enabled' => 1 , 'visible' => - 2 , 'position' => 510 , 'notnull' => 1 , 'foreignkey' => 'user.rowid' , 'csslist' => 'tdoverflowmax100' ),
'fk_user_modif' => array ( 'type' => 'integer:User:user/class/user.class.php' , 'label' => 'UserModif' , 'enabled' => 1 , 'visible' => - 2 , 'position' => 511 , 'notnull' => - 1 , 'csslist' => 'tdoverflowmax100' ),
'date_start_planned' => array ( 'type' => 'datetime' , 'label' => 'DateStartPlannedMo' , 'enabled' => 1 , 'visible' => 1 , 'position' => 55 , 'notnull' => - 1 , 'index' => 1 , 'help' => 'KeepEmptyForAsap' , 'alwayseditable' => 1 , 'csslist' => 'nowraponall' ),
'date_end_planned' => array ( 'type' => 'datetime' , 'label' => 'DateEndPlannedMo' , 'enabled' => 1 , 'visible' => 1 , 'position' => 56 , 'notnull' => - 1 , 'index' => 1 , 'alwayseditable' => 1 , 'csslist' => 'nowraponall' ),
'import_key' => array ( 'type' => 'varchar(14)' , 'label' => 'ImportId' , 'enabled' => 1 , 'visible' => - 2 , 'position' => 1000 , 'notnull' => - 1 ,),
'model_pdf' => array ( 'type' => 'varchar(255)' , 'label' => 'Model pdf' , 'enabled' => 1 , 'visible' => 0 , 'position' => 1010 ),
2024-03-15 00:31:27 +01:00
'status' => array ( 'type' => 'integer' , 'label' => 'Status' , 'enabled' => 1 , 'visible' => 2 , 'position' => 1000 , 'default' => '0' , 'notnull' => 1 , 'index' => 1 , 'arrayofkeyval' => array ( '0' => 'Draft' , '1' => 'Validated' , '2' => 'InProgress' , '3' => 'StatusMOProduced' , '9' => 'Canceled' )),
'fk_parent_line' => array ( 'type' => 'integer:MoLine:mrp/class/mo.class.php' , 'label' => 'ParentMo' , 'enabled' => 1 , 'visible' => 0 , 'position' => 1020 , 'default' => '0' , 'notnull' => 0 , 'index' => 1 , 'showoncombobox' => 0 ),
2019-10-15 19:59:16 +02:00
);
public $rowid ;
public $entity ;
2021-09-02 15:23:31 +02:00
public $ref ;
2023-02-12 18:31:35 +01:00
/**
* @ var int mrptype
*/
2021-09-02 15:23:31 +02:00
public $mrptype ;
2019-10-15 19:59:16 +02:00
public $label ;
public $qty ;
2019-10-27 16:28:03 +01:00
public $fk_warehouse ;
2019-10-15 19:59:16 +02:00
public $fk_soc ;
2022-12-30 13:27:12 +01:00
public $socid ;
2019-12-09 08:07:59 +01:00
/**
* @ var string public note
*/
2019-10-15 19:59:16 +02:00
public $note_public ;
2019-12-09 08:07:59 +01:00
/**
* @ var string private note
*/
2019-10-15 19:59:16 +02:00
public $note_private ;
2019-11-01 10:56:46 +01:00
/**
* @ var integer | string date_creation
*/
2019-10-15 19:59:16 +02:00
public $date_creation ;
2019-11-01 10:56:46 +01:00
2023-06-28 14:46:45 +02:00
/**
* @ var integer | string date_validation
*/
public $date_valid ;
2019-11-01 10:56:46 +01:00
2019-10-15 19:59:16 +02:00
public $fk_user_creat ;
public $fk_user_modif ;
public $import_key ;
public $status ;
2023-02-12 18:31:35 +01:00
/**
* @ var int ID of product
*/
2019-10-15 19:59:16 +02:00
public $fk_product ;
2019-11-10 12:09:09 +01:00
2023-02-12 18:31:35 +01:00
/**
* @ var Product product object
*/
public $product ;
2019-11-10 12:08:41 +01:00
/**
* @ var integer | string date_start_planned
*/
2019-10-15 19:59:16 +02:00
public $date_start_planned ;
2019-11-10 12:09:09 +01:00
2019-11-10 12:08:41 +01:00
/**
* @ var integer | string date_end_planned
*/
2019-10-15 19:59:16 +02:00
public $date_end_planned ;
2019-11-10 12:09:09 +01:00
2023-02-12 18:31:35 +01:00
/**
* @ var int ID bom
*/
2019-10-15 19:59:16 +02:00
public $fk_bom ;
2023-02-12 18:31:35 +01:00
/**
* @ var Bom bom
*/
public $bom ;
/**
* @ var int ID project
*/
public $fk_project ;
2019-10-15 19:59:16 +02:00
2023-08-24 14:19:45 +02:00
/**
* @ var double New quantity . When we update the quantity to produce , we set this to save old value before calling the -> update that call the updateProduction that need this
* to recalculate all the quantities in lines to consume and produce .
*/
public $oldQty ;
2019-10-15 19:59:16 +02:00
// If this object has a subtable with lines
/**
2020-12-05 23:53:55 +01:00
* @ var string Name of subtable line
2019-10-15 19:59:16 +02:00
*/
2021-03-04 15:02:46 +01:00
public $table_element_line = 'mrp_production' ;
2019-10-15 19:59:16 +02:00
/**
2020-12-05 23:53:55 +01:00
* @ var string Field with ID of parent key if this field has a parent
2019-10-15 19:59:16 +02:00
*/
2019-12-09 00:06:51 +01:00
public $fk_element = 'fk_mo' ;
2019-10-15 19:59:16 +02:00
/**
2020-12-05 23:53:55 +01:00
* @ var string Name of subtable class that manage subtable lines
2019-10-15 19:59:16 +02:00
*/
2019-12-09 00:06:51 +01:00
public $class_element_line = 'MoLine' ;
2019-10-15 19:59:16 +02:00
/**
2024-03-11 22:32:48 +01:00
* @ var array < string , array < string >> List of child tables . To test if we can delete object .
2019-10-15 19:59:16 +02:00
*/
2019-12-16 13:06:25 +01:00
protected $childtables = array ();
2019-10-15 19:59:16 +02:00
/**
2024-03-11 22:32:48 +01:00
* @ var string [] List of child tables . To know object to delete on cascade .
2019-10-15 19:59:16 +02:00
*/
2019-12-16 13:06:25 +01:00
protected $childtablesoncascade = array ( 'mrp_production' );
2019-10-15 19:59:16 +02:00
/**
* @ var MoLine [] Array of subtable lines
*/
2019-12-09 00:06:51 +01:00
public $lines = array ();
2019-10-15 19:59:16 +02:00
2023-02-12 18:31:35 +01:00
/**
2024-03-14 15:52:37 +01:00
* @ var MoLine | null MO line
2023-02-12 18:31:35 +01:00
*/
2024-03-15 00:31:27 +01:00
public $line = null ;
2023-02-12 18:31:35 +01:00
/**
* @ var int ID of parent line
*/
2022-02-08 16:01:18 +01:00
public $fk_parent_line ;
2019-10-15 19:59:16 +02:00
2023-02-12 18:31:35 +01:00
/**
* @ var array tpl
*/
public $tpl = array ();
2019-10-15 19:59:16 +02:00
2023-08-24 14:19:45 +02:00
2019-10-15 19:59:16 +02:00
/**
* Constructor
*
2024-01-13 15:50:02 +01:00
* @ param DoliDB $db Database handler
2019-10-15 19:59:16 +02:00
*/
public function __construct ( DoliDB $db )
{
2024-03-09 02:52:09 +01:00
global $langs ;
2019-10-15 19:59:16 +02:00
$this -> db = $db ;
2023-11-27 11:56:32 +01:00
if ( ! getDolGlobalString ( 'MAIN_SHOW_TECHNICAL_ID' ) && isset ( $this -> fields [ 'rowid' ])) {
2021-02-26 18:26:44 +01:00
$this -> fields [ 'rowid' ][ 'visible' ] = 0 ;
}
2022-08-28 14:20:24 +02:00
if ( ! isModEnabled ( 'multicompany' ) && isset ( $this -> fields [ 'entity' ])) {
2021-02-26 18:26:44 +01:00
$this -> fields [ 'entity' ][ 'enabled' ] = 0 ;
}
2019-10-15 19:59:16 +02:00
// Unset fields that are disabled
2021-02-26 18:26:44 +01:00
foreach ( $this -> fields as $key => $val ) {
if ( isset ( $val [ 'enabled' ]) && empty ( $val [ 'enabled' ])) {
2019-10-15 19:59:16 +02:00
unset ( $this -> fields [ $key ]);
}
}
// Translate some data of arrayofkeyval
2021-02-26 18:26:44 +01:00
foreach ( $this -> fields as $key => $val ) {
if ( ! empty ( $val [ 'arrayofkeyval' ]) && is_array ( $val [ 'arrayofkeyval' ])) {
foreach ( $val [ 'arrayofkeyval' ] as $key2 => $val2 ) {
2019-11-11 23:59:36 +01:00
$this -> fields [ $key ][ 'arrayofkeyval' ][ $key2 ] = $langs -> trans ( $val2 );
2019-10-15 19:59:16 +02:00
}
}
}
}
/**
* Create object into database
*
* @ param User $user User that creates
2024-01-12 17:47:54 +01:00
* @ param int $notrigger 0 = launch triggers after , 1 = disable triggers
2023-12-06 15:46:39 +01:00
* @ return int Return integer <= 0 if KO , Id of created object if OK
2019-10-15 19:59:16 +02:00
*/
2024-01-12 17:47:54 +01:00
public function create ( User $user , $notrigger = 0 )
2019-10-15 19:59:16 +02:00
{
2019-12-08 23:45:06 +01:00
$error = 0 ;
2019-12-20 17:39:42 +01:00
$idcreated = 0 ;
2019-12-08 23:45:06 +01:00
2023-04-27 14:02:59 +02:00
// If kits feature is enabled and we don't allow kits into BOM and MO, we check that the product is not a kit/virtual product
if ( getDolGlobalString ( 'PRODUIT_SOUSPRODUITS' ) && ! getDolGlobalString ( 'ALLOW_USE_KITS_INTO_BOM_AND_MO' ) && $this -> fk_product > 0 ) {
2020-11-26 14:32:40 +01:00
include_once DOL_DOCUMENT_ROOT . '/product/class/product.class.php' ;
2020-11-26 14:15:20 +01:00
$tmpproduct = new Product ( $this -> db );
2020-11-26 14:32:40 +01:00
$tmpproduct -> fetch ( $this -> fk_product );
2020-11-26 14:15:20 +01:00
if ( $tmpproduct -> hasFatherOrChild ( 1 ) > 0 ) {
2020-11-26 14:32:40 +01:00
$this -> error = 'ErrorAVirtualProductCantBeUsedIntoABomOrMo' ;
2020-11-26 14:15:20 +01:00
$this -> errors [] = $this -> error ;
return - 1 ;
}
}
2023-04-27 14:02:59 +02:00
$this -> db -> begin ();
2021-09-02 15:23:31 +02:00
if ( $this -> fk_bom > 0 ) {
2024-01-14 12:26:37 +01:00
// If there is a known BOM, we force the type of MO to the type of BOM
2023-01-08 21:43:12 +01:00
include_once DOL_DOCUMENT_ROOT . '/bom/class/bom.class.php' ;
2021-09-02 15:23:31 +02:00
$tmpbom = new BOM ( $this -> db );
$tmpbom -> fetch ( $this -> fk_bom );
$this -> mrptype = $tmpbom -> bomtype ;
}
2019-12-20 17:39:42 +01:00
if ( ! $error ) {
$idcreated = $this -> createCommon ( $user , $notrigger );
if ( $idcreated <= 0 ) {
$error ++ ;
}
2019-12-08 23:45:06 +01:00
}
2019-12-02 15:23:21 +01:00
2019-12-20 17:39:42 +01:00
if ( ! $error ) {
2023-04-27 14:02:59 +02:00
$result = $this -> createProduction ( $user , $notrigger ); // Insert lines from BOM
2019-12-20 17:39:42 +01:00
if ( $result <= 0 ) {
$error ++ ;
2019-12-08 23:45:06 +01:00
}
}
2019-12-02 15:23:21 +01:00
2019-12-16 13:06:25 +01:00
if ( ! $error ) {
2019-12-02 15:23:21 +01:00
$this -> db -> commit ();
} else {
$this -> db -> rollback ();
}
2019-12-20 17:39:42 +01:00
return $idcreated ;
2019-10-15 19:59:16 +02:00
}
/**
* Clone an object into another one
*
* @ param User $user User that creates
* @ param int $fromid Id of object to clone
* @ return mixed New object created , < 0 if KO
*/
public function createFromClone ( User $user , $fromid )
{
global $langs , $extrafields ;
2020-10-31 14:32:18 +01:00
$error = 0 ;
dol_syslog ( __METHOD__ , LOG_DEBUG );
$object = new self ( $this -> db );
$this -> db -> begin ();
// Load source object
$result = $object -> fetchCommon ( $fromid );
2021-02-26 18:26:44 +01:00
if ( $result > 0 && ! empty ( $object -> table_element_line )) {
$object -> fetchLines ();
}
2020-10-31 14:32:18 +01:00
// get lines so they will be clone
//foreach($this->lines as $line)
// $line->fetch_optionals();
// Reset some properties
unset ( $object -> id );
unset ( $object -> fk_user_creat );
unset ( $object -> import_key );
2024-02-12 18:10:48 +01:00
// Remove produced and consumed lines
foreach ( $object -> lines as $key => $line ) {
if ( in_array ( $line -> role , array ( 'consumed' , 'produced' ))) {
unset ( $object -> lines [ $key ]);
}
}
2020-10-31 14:32:18 +01:00
// Clear fields
$object -> ref = empty ( $this -> fields [ 'ref' ][ 'default' ]) ? " copy_of_ " . $object -> ref : $this -> fields [ 'ref' ][ 'default' ];
$object -> label = empty ( $this -> fields [ 'label' ][ 'default' ]) ? $langs -> trans ( " CopyOf " ) . " " . $object -> label : $this -> fields [ 'label' ][ 'default' ];
$object -> status = self :: STATUS_DRAFT ;
// ...
// Clear extrafields that are unique
2021-02-26 18:26:44 +01:00
if ( is_array ( $object -> array_options ) && count ( $object -> array_options ) > 0 ) {
2020-10-31 14:32:18 +01:00
$extrafields -> fetch_name_optionals_label ( $this -> table_element );
2021-02-26 18:26:44 +01:00
foreach ( $object -> array_options as $key => $option ) {
2020-10-31 14:32:18 +01:00
$shortkey = preg_replace ( '/options_/' , '' , $key );
2021-02-26 18:26:44 +01:00
if ( ! empty ( $extrafields -> attributes [ $this -> element ][ 'unique' ][ $shortkey ])) {
2022-05-17 14:55:38 +02:00
//var_dump($key);
//var_dump($clonedObj->array_options[$key]); exit;
2020-10-31 14:32:18 +01:00
unset ( $object -> array_options [ $key ]);
}
}
}
// Create clone
2019-10-15 19:59:16 +02:00
$object -> context [ 'createfromclone' ] = 'createfromclone' ;
2020-10-31 14:32:18 +01:00
$result = $object -> createCommon ( $user );
if ( $result < 0 ) {
$error ++ ;
$this -> error = $object -> error ;
$this -> errors = $object -> errors ;
}
2021-02-26 18:26:44 +01:00
if ( ! $error ) {
2020-10-31 14:32:18 +01:00
// copy internal contacts
2021-02-26 18:26:44 +01:00
if ( $this -> copy_linked_contact ( $object , 'internal' ) < 0 ) {
2020-10-31 14:32:18 +01:00
$error ++ ;
}
}
2021-02-26 18:26:44 +01:00
if ( ! $error ) {
2020-10-31 14:32:18 +01:00
// copy external contacts if same company
2021-02-26 18:26:44 +01:00
if ( property_exists ( $this , 'socid' ) && $this -> socid == $object -> socid ) {
if ( $this -> copy_linked_contact ( $object , 'external' ) < 0 ) {
2020-10-31 14:32:18 +01:00
$error ++ ;
2021-02-26 18:26:44 +01:00
}
2020-10-31 14:32:18 +01:00
}
}
unset ( $object -> context [ 'createfromclone' ]);
// End
if ( ! $error ) {
$this -> db -> commit ();
return $object ;
} else {
$this -> db -> rollback ();
return - 1 ;
}
2019-10-15 19:59:16 +02:00
}
/**
* Load object in memory from the database
*
* @ param int $id Id object
* @ param string $ref Ref
2023-12-01 19:51:32 +01:00
* @ return int Return integer < 0 if KO , 0 if not found , > 0 if OK
2019-10-15 19:59:16 +02:00
*/
public function fetch ( $id , $ref = null )
{
$result = $this -> fetchCommon ( $id , $ref );
2021-02-26 18:26:44 +01:00
if ( $result > 0 && ! empty ( $this -> table_element_line )) {
$this -> fetchLines ();
}
2022-12-30 13:27:12 +01:00
$this -> socid = $this -> fk_soc ;
2019-10-15 19:59:16 +02:00
return $result ;
}
/**
* Load object lines in memory from the database
*
2023-12-01 19:51:32 +01:00
* @ return int Return integer < 0 if KO , 0 if not found , > 0 if OK
2019-10-15 19:59:16 +02:00
*/
public function fetchLines ()
{
2019-11-11 23:59:36 +01:00
$this -> lines = array ();
2019-10-15 19:59:16 +02:00
$result = $this -> fetchLinesCommon ();
return $result ;
}
/**
* Load list of objects in memory from the database .
*
2024-03-11 11:23:34 +01:00
* @ param string $sortorder Sort Order
* @ param string $sortfield Sort field
* @ param int $limit Limit
* @ param int $offset Offset
* @ param string | array $filter Filter USF .
* @ param string $filtermode Filter mode ( AND or OR )
* @ return array | int int < 0 if KO , array of pages if OK
*/
public function fetchAll ( $sortorder = '' , $sortfield = '' , $limit = 0 , $offset = 0 , $filter = '' , $filtermode = 'AND' )
2019-10-15 19:59:16 +02:00
{
dol_syslog ( __METHOD__ , LOG_DEBUG );
2019-11-11 23:59:36 +01:00
$records = array ();
2019-10-15 19:59:16 +02:00
$sql = 'SELECT ' ;
$sql .= $this -> getFieldList ();
2019-11-11 23:59:36 +01:00
$sql .= ' FROM ' . MAIN_DB_PREFIX . $this -> table_element . ' as t' ;
2021-02-26 18:26:44 +01:00
if ( isset ( $this -> ismultientitymanaged ) && $this -> ismultientitymanaged == 1 ) {
2023-01-16 14:40:35 +01:00
$sql .= ' WHERE t.entity IN (' . getEntity ( $this -> element ) . ')' ;
2021-02-26 18:26:44 +01:00
} else {
$sql .= ' WHERE 1 = 1' ;
}
2024-03-11 11:23:34 +01:00
2019-10-15 19:59:16 +02:00
// Manage filter
2024-03-11 11:23:34 +01:00
if ( is_array ( $filter )) {
$sqlwhere = array ();
if ( count ( $filter ) > 0 ) {
foreach ( $filter as $key => $value ) {
if ( $key == 't.rowid' ) {
$sqlwhere [] = $this -> db -> sanitize ( $key ) . " = " . (( int ) $value );
} elseif ( strpos ( $key , 'date' ) !== false ) {
$sqlwhere [] = $this -> db -> sanitize ( $key ) . " = ' " . $this -> db -> idate ( $value ) . " ' " ;
} else {
$sqlwhere [] = $this -> db -> sanitize ( $key ) . " LIKE '% " . $this -> db -> escape ( $this -> db -> escapeforlike ( $value )) . " %' " ;
}
2019-10-15 19:59:16 +02:00
}
}
2024-03-11 11:23:34 +01:00
if ( count ( $sqlwhere ) > 0 ) {
$sql .= ' AND (' . implode ( ' ' . $this -> db -> escape ( $filtermode ) . ' ' , $sqlwhere ) . ')' ;
}
$filter = '' ;
2019-10-15 19:59:16 +02:00
}
2024-03-11 11:23:34 +01:00
// Manage filter
$errormessage = '' ;
$sql .= forgeSQLFromUniversalSearchCriteria ( $filter , $errormessage );
if ( $errormessage ) {
$this -> errors [] = $errormessage ;
2024-03-11 12:38:21 +01:00
dol_syslog ( __METHOD__ . ' ' . implode ( ',' , $this -> errors ), LOG_ERR );
2024-03-11 11:23:34 +01:00
return - 1 ;
2019-10-15 19:59:16 +02:00
}
if ( ! empty ( $sortfield )) {
$sql .= $this -> db -> order ( $sortfield , $sortorder );
}
if ( ! empty ( $limit )) {
2021-08-27 22:42:04 +02:00
$sql .= $this -> db -> plimit ( $limit , $offset );
2019-10-15 19:59:16 +02:00
}
$resql = $this -> db -> query ( $sql );
if ( $resql ) {
$num = $this -> db -> num_rows ( $resql );
2020-10-31 14:32:18 +01:00
$i = 0 ;
2021-02-26 18:26:44 +01:00
while ( $i < min ( $limit , $num )) {
2020-10-31 14:32:18 +01:00
$obj = $this -> db -> fetch_object ( $resql );
2019-10-15 19:59:16 +02:00
$record = new self ( $this -> db );
$record -> setVarsFromFetchObj ( $obj );
$records [ $record -> id ] = $record ;
$i ++ ;
}
$this -> db -> free ( $resql );
return $records ;
} else {
2019-11-11 23:59:36 +01:00
$this -> errors [] = 'Error ' . $this -> db -> lasterror ();
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
dol_syslog ( __METHOD__ . ' ' . implode ( ',' , $this -> errors ), LOG_ERR );
2019-10-15 19:59:16 +02:00
return - 1 ;
}
}
2020-01-07 19:08:35 +01:00
/**
* Get list of lines linked to current line for a defined role .
*
* @ param string $role Get lines linked to current line with the selected role ( 'consumed' , 'produced' , ... )
2024-01-14 12:26:37 +01:00
* @ param int $lineid Id of production line to filter children
2020-01-07 19:08:35 +01:00
* @ return array Array of lines
*/
public function fetchLinesLinked ( $role , $lineid = 0 )
{
$resarray = array ();
$mostatic = new MoLine ( $this -> db );
$sql = 'SELECT ' ;
$sql .= $mostatic -> getFieldList ();
$sql .= ' FROM ' . MAIN_DB_PREFIX . $mostatic -> table_element . ' as t' ;
$sql .= " WHERE t.role = ' " . $this -> db -> escape ( $role ) . " ' " ;
2021-02-26 18:26:44 +01:00
if ( $lineid > 0 ) {
2021-04-26 19:12:23 +02:00
$sql .= ' AND t.fk_mrp_production = ' . (( int ) $lineid );
2021-02-26 18:26:44 +01:00
} else {
2021-08-27 23:36:06 +02:00
$sql .= 'AND t.fk_mo = ' . (( int ) $this -> id );
2021-02-26 18:26:44 +01:00
}
2020-01-07 19:08:35 +01:00
$resql = $this -> db -> query ( $sql );
if ( $resql ) {
$num = $this -> db -> num_rows ( $resql );
2020-01-10 00:03:10 +01:00
$i = 0 ;
2020-01-07 19:08:35 +01:00
while ( $i < $num ) {
$obj = $this -> db -> fetch_object ( $resql );
if ( $obj ) {
$resarray [] = array (
2024-03-08 21:34:18 +01:00
'rowid' => $obj -> rowid ,
'date' => $this -> db -> jdate ( $obj -> date_creation ),
2020-01-07 19:08:35 +01:00
'qty' => $obj -> qty ,
'role' => $obj -> role ,
'fk_product' => $obj -> fk_product ,
'fk_warehouse' => $obj -> fk_warehouse ,
'batch' => $obj -> batch ,
2023-11-06 11:15:43 +01:00
'fk_stock_movement' => $obj -> fk_stock_movement ,
'fk_unit' => $obj -> fk_unit
2020-01-07 19:08:35 +01:00
);
}
$i ++ ;
}
return $resarray ;
} else {
$this -> error = $this -> db -> lasterror ();
return array ();
}
}
2020-02-11 17:12:22 +01:00
/**
* Count number of movement with origin of MO
*
* @ return int Number of movements
*/
2020-02-11 19:37:24 +01:00
public function countMovements ()
{
2020-02-11 17:12:22 +01:00
$result = 0 ;
$sql = 'SELECT COUNT(rowid) as nb FROM ' . MAIN_DB_PREFIX . 'stock_mouvement as sm' ;
2021-08-27 18:18:50 +02:00
$sql .= " WHERE sm.origintype = 'mo' and sm.fk_origin = " . (( int ) $this -> id );
2020-02-11 17:12:22 +01:00
$resql = $this -> db -> query ( $sql );
if ( $resql ) {
$num = $this -> db -> num_rows ( $resql );
$i = 0 ;
while ( $i < $num ) {
$obj = $this -> db -> fetch_object ( $resql );
if ( $obj ) {
$result = $obj -> nb ;
}
$i ++ ;
}
} else {
$this -> error = $this -> db -> lasterror ();
}
return $result ;
}
2019-10-15 19:59:16 +02:00
/**
* Update object into database
*
* @ param User $user User that modifies
2024-01-12 19:48:18 +01:00
* @ param int $notrigger 0 = launch triggers after , 1 = disable triggers
2023-12-01 19:51:32 +01:00
* @ return int Return integer < 0 if KO , > 0 if OK
2019-10-15 19:59:16 +02:00
*/
2024-01-12 18:07:53 +01:00
public function update ( User $user , $notrigger = 0 )
2019-10-15 19:59:16 +02:00
{
2019-12-20 17:39:42 +01:00
$error = 0 ;
$this -> db -> begin ();
$result = $this -> updateCommon ( $user , $notrigger );
if ( $result <= 0 ) {
$error ++ ;
}
2023-04-27 14:02:59 +02:00
// Update the lines (the qty) to consume or to produce
$result = $this -> updateProduction ( $user , $notrigger );
if ( $result <= 0 ) {
$error ++ ;
}
2020-01-10 00:03:10 +01:00
if ( ! $error ) {
2019-12-20 17:39:42 +01:00
$this -> db -> commit ();
return 1 ;
2020-05-21 15:05:19 +02:00
} else {
2019-12-20 17:39:42 +01:00
$this -> db -> rollback ();
return - 1 ;
}
}
2023-04-27 14:02:59 +02:00
2019-12-20 17:39:42 +01:00
/**
2020-04-22 12:34:02 +02:00
* Erase and update the line to consume and to produce .
2019-12-20 17:39:42 +01:00
*
* @ param User $user User that modifies
2024-01-12 17:47:54 +01:00
* @ param int $notrigger 0 = launch triggers after , 1 = disable triggers
2023-12-01 19:51:32 +01:00
* @ return int Return integer < 0 if KO , > 0 if OK
2019-12-20 17:39:42 +01:00
*/
2024-01-12 17:47:54 +01:00
public function createProduction ( User $user , $notrigger = 0 )
2023-04-27 14:02:59 +02:00
{
$error = 0 ;
$role = " " ;
if ( $this -> status != self :: STATUS_DRAFT ) {
return - 1 ;
}
$this -> db -> begin ();
// Insert lines in mrp_production table from BOM data
if ( ! $error ) {
$sql = 'DELETE FROM ' . MAIN_DB_PREFIX . 'mrp_production WHERE fk_mo = ' . (( int ) $this -> id );
$this -> db -> query ( $sql );
$moline = new MoLine ( $this -> db );
// Line to produce
$moline -> fk_mo = $this -> id ;
$moline -> qty = $this -> qty ;
$moline -> fk_product = $this -> fk_product ;
$moline -> position = 1 ;
2023-11-19 00:46:09 +01:00
include_once DOL_DOCUMENT_ROOT . '/product/class/product.class.php' ;
2023-11-06 11:15:43 +01:00
$tmpproduct = new Product ( $this -> db );
$tmpproduct -> fetch ( $this -> fk_product );
$moline -> fk_unit = $tmpproduct -> fk_unit ;
2023-04-27 14:02:59 +02:00
if ( $this -> fk_bom > 0 ) { // If a BOM is defined, we know what to produce.
include_once DOL_DOCUMENT_ROOT . '/bom/class/bom.class.php' ;
2023-08-05 14:09:11 +02:00
$bom = new BOM ( $this -> db );
2023-04-27 14:02:59 +02:00
$bom -> fetch ( $this -> fk_bom );
if ( $bom -> bomtype == 1 ) {
$role = 'toproduce' ;
$moline -> role = 'toconsume' ;
} else {
$role = 'toconsume' ;
$moline -> role = 'toproduce' ;
}
} else {
if ( $this -> mrptype == 1 ) {
$moline -> role = 'toconsume' ;
} else {
$moline -> role = 'toproduce' ;
}
}
$resultline = $moline -> create ( $user , false ); // Never use triggers here
if ( $resultline <= 0 ) {
$error ++ ;
$this -> error = $moline -> error ;
$this -> errors = $moline -> errors ;
dol_print_error ( $this -> db , $moline -> error , $moline -> errors );
}
if ( $this -> fk_bom > 0 ) { // If a BOM is defined, we know what to consume.
if ( $bom -> id > 0 ) {
// Lines to consume
if ( ! $error ) {
foreach ( $bom -> lines as $line ) {
$moline = new MoLine ( $this -> db );
$moline -> fk_mo = $this -> id ;
$moline -> origin_id = $line -> id ;
$moline -> origin_type = 'bomline' ;
2023-12-04 13:46:42 +01:00
if ( ! empty ( $line -> fk_unit )) {
$moline -> fk_unit = $line -> fk_unit ;
}
2023-04-27 14:02:59 +02:00
if ( $line -> qty_frozen ) {
$moline -> qty = $line -> qty ; // Qty to consume does not depends on quantity to produce
} else {
2023-12-04 13:46:42 +01:00
$moline -> qty = price2num (( $line -> qty / ( ! empty ( $bom -> qty ) ? $bom -> qty : 1 )) * $this -> qty / ( ! empty ( $line -> efficiency ) ? $line -> efficiency : 1 ), 'MS' ); // Calculate with Qty to produce and more presition
2023-04-27 14:02:59 +02:00
}
if ( $moline -> qty <= 0 ) {
$error ++ ;
$this -> error = " BadValueForquantityToConsume " ;
break ;
} else {
$moline -> fk_product = $line -> fk_product ;
$moline -> role = $role ;
$moline -> position = $line -> position ;
$moline -> qty_frozen = $line -> qty_frozen ;
$moline -> disable_stock_change = $line -> disable_stock_change ;
2023-12-04 13:46:42 +01:00
if ( ! empty ( $line -> fk_default_workstation )) {
$moline -> fk_default_workstation = $line -> fk_default_workstation ;
}
2023-04-27 14:02:59 +02:00
$resultline = $moline -> create ( $user , false ); // Never use triggers here
if ( $resultline <= 0 ) {
$error ++ ;
$this -> error = $moline -> error ;
$this -> errors = $moline -> errors ;
dol_print_error ( $this -> db , $moline -> error , $moline -> errors );
break ;
}
}
}
}
}
}
}
if ( ! $error ) {
$this -> db -> commit ();
return 1 ;
} else {
$this -> db -> rollback ();
return - 1 ;
}
}
/**
2023-08-24 13:36:24 +02:00
* Update quantities in lines to consume and / or lines to produce .
2023-04-27 14:02:59 +02:00
*
* @ param User $user User that modifies
2024-01-12 17:47:54 +01:00
* @ param int $notrigger 0 = launch triggers after , 1 = disable triggers
2023-12-01 19:51:32 +01:00
* @ return int Return integer < 0 if KO , > 0 if OK
2023-04-27 14:02:59 +02:00
*/
2024-01-12 17:47:54 +01:00
public function updateProduction ( User $user , $notrigger = 0 )
2019-12-20 17:39:42 +01:00
{
$error = 0 ;
2023-12-04 13:46:42 +01:00
if ( $this -> status != self :: STATUS_DRAFT ) {
return 1 ;
}
2019-12-20 17:39:42 +01:00
$this -> db -> begin ();
2023-04-03 16:54:37 +02:00
$oldQty = $this -> oldQty ;
$newQty = $this -> qty ;
2023-04-05 11:45:17 +02:00
if ( $newQty != $oldQty && ! empty ( $this -> oldQty )) {
2023-04-05 15:37:35 +02:00
$sql = " SELECT rowid FROM " . MAIN_DB_PREFIX . " mrp_production WHERE fk_mo = " . ( int ) $this -> id ;
2023-04-03 16:54:37 +02:00
$resql = $this -> db -> query ( $sql );
2023-04-03 17:00:40 +02:00
if ( $resql ) {
2023-04-03 16:54:37 +02:00
while ( $obj = $this -> db -> fetch_object ( $resql )) {
$moLine = new MoLine ( $this -> db );
$res = $moLine -> fetch ( $obj -> rowid );
2023-12-04 13:46:42 +01:00
if ( ! $res ) {
$error ++ ;
}
2023-04-03 16:54:37 +02:00
2023-04-03 17:00:40 +02:00
if ( $moLine -> role == 'toconsume' || $moLine -> role == 'toproduce' ) {
2023-04-03 16:54:37 +02:00
if ( empty ( $moLine -> qty_frozen )) {
$qty = $newQty * $moLine -> qty / $oldQty ;
2023-11-19 00:54:39 +01:00
$moLine -> qty = price2num ( $qty , 'MS' );
2023-04-03 16:54:37 +02:00
$res = $moLine -> update ( $user );
2023-12-04 13:46:42 +01:00
if ( ! $res ) {
$error ++ ;
}
2019-12-20 17:39:42 +01:00
}
}
}
}
}
if ( ! $error ) {
$this -> db -> commit ();
return 1 ;
} else {
$this -> db -> rollback ();
return - 1 ;
}
2019-10-15 19:59:16 +02:00
}
2019-12-20 17:39:42 +01:00
2019-10-15 19:59:16 +02:00
/**
* Delete object in database
*
2023-10-20 03:09:58 +02:00
* @ param User $user User that deletes
2024-01-12 18:07:53 +01:00
* @ param int $notrigger 0 = launch triggers after , 1 = disable triggers
2023-10-20 03:09:58 +02:00
* @ param bool $also_cancel_consumed_and_produced_lines true if the consumed and produced lines will be deleted ( and stocks incremented / decremented back ) ( false by default )
2023-12-01 19:51:32 +01:00
* @ return int Return integer < 0 if KO , > 0 if OK
2019-10-15 19:59:16 +02:00
*/
2024-01-12 18:07:53 +01:00
public function delete ( User $user , $notrigger = 0 , $also_cancel_consumed_and_produced_lines = false )
2019-10-15 19:59:16 +02:00
{
2023-10-20 03:09:58 +02:00
$error = 0 ;
$this -> db -> begin ();
if ( $also_cancel_consumed_and_produced_lines ) {
$result = $this -> cancelConsumedAndProducedLines ( $user , 0 , false , $notrigger );
if ( $result < 0 ) {
$error ++ ;
}
}
if ( ! $error ) {
$result = $this -> deleteCommon ( $user , $notrigger );
if ( $result < 0 ) {
$error ++ ;
}
}
if ( $error ) {
$this -> db -> rollback ();
return - 1 ;
} else {
$this -> db -> commit ();
return 1 ;
}
2019-10-15 19:59:16 +02:00
}
/**
* Delete a line of object in database
*
2024-02-02 23:46:12 +01:00
* @ param User $user User that delete
* @ param int $idline Id of line to delete
* @ param int $notrigger 0 = launch triggers after , 1 = disable triggers
* @ param int $fk_movement Movement
* @ return int Return > 0 if OK , < 0 if KO
2019-10-15 19:59:16 +02:00
*/
2024-02-02 23:46:12 +01:00
public function deleteLine ( User $user , $idline , $notrigger = 0 , $fk_movement = 0 )
2019-10-15 19:59:16 +02:00
{
2022-04-06 15:19:34 +02:00
global $langs ;
2023-07-12 12:53:27 +02:00
$langs -> loadLangs ( array ( 'stocks' , 'mrp' ));
2022-04-06 12:32:10 +02:00
2021-02-26 18:26:44 +01:00
if ( $this -> status < 0 ) {
2019-10-15 19:59:16 +02:00
$this -> error = 'ErrorDeleteLineNotAllowedByObjectStatus' ;
return - 2 ;
}
2022-04-06 15:19:34 +02:00
$productstatic = new Product ( $this -> db );
2024-03-03 19:59:34 +01:00
2024-03-01 20:27:55 +01:00
$arrayoflines = $this -> fetchLinesLinked ( 'consumed' , $idline ); // Get lines consumed under the one to delete
2022-04-06 15:19:34 +02:00
2024-03-01 20:19:37 +01:00
$result = 0 ;
2022-04-06 15:19:34 +02:00
2024-03-01 20:19:37 +01:00
$this -> db -> begin ();
if ( ! empty ( $arrayoflines )) {
// If there is child lines
2022-04-06 15:19:34 +02:00
$stockmove = new MouvementStock ( $this -> db );
$stockmove -> setOrigin ( $this -> element , $this -> id );
2022-08-31 22:14:20 +02:00
if ( ! empty ( $fk_movement )) {
2024-03-01 20:19:37 +01:00
// The fk_movement was not recorded so we try to guess the product and quantity to restore.
2022-04-06 15:19:34 +02:00
$moline = new MoLine ( $this -> db );
2024-03-05 03:51:36 +01:00
$TArrayMoLine = $moline -> fetchAll ( '' , '' , 1 , 0 , '(fk_stock_movement:=:' . (( int ) $fk_movement ) . ')' );
2022-04-06 15:19:34 +02:00
$moline = array_shift ( $TArrayMoLine );
$movement = new MouvementStock ( $this -> db );
$movement -> fetch ( $fk_movement );
$productstatic -> fetch ( $movement -> product_id );
$qtytoprocess = $movement -> qty ;
// Reverse stock movement
$labelmovementCancel = $langs -> trans ( " CancelProductionForRef " , $productstatic -> ref );
$codemovementCancel = $langs -> trans ( " StockIncrease " );
if (( $qtytoprocess >= 0 )) {
$idstockmove = $stockmove -> reception ( $user , $movement -> product_id , $movement -> warehouse_id , $qtytoprocess , 0 , $labelmovementCancel , '' , '' , $movement -> batch , dol_now (), 0 , $codemovementCancel );
} else {
$idstockmove = $stockmove -> livraison ( $user , $movement -> product_id , $movement -> warehouse_id , $qtytoprocess , 0 , $labelmovementCancel , dol_now (), '' , '' , $movement -> batch , 0 , $codemovementCancel );
}
if ( $idstockmove < 0 ) {
$this -> error ++ ;
setEventMessages ( $stockmove -> error , $stockmove -> errors , 'errors' );
} else {
2024-03-01 20:19:37 +01:00
$result = $moline -> delete ( $user , $notrigger );
2022-04-06 15:19:34 +02:00
}
} else {
2024-03-01 20:19:37 +01:00
// Loop on each child lines
2022-04-06 15:19:34 +02:00
foreach ( $arrayoflines as $key => $arrayofline ) {
$lineDetails = $arrayoflines [ $key ];
$productstatic -> fetch ( $lineDetails [ 'fk_product' ]);
$qtytoprocess = $lineDetails [ 'qty' ];
// Reverse stock movement
$labelmovementCancel = $langs -> trans ( " CancelProductionForRef " , $productstatic -> ref );
$codemovementCancel = $langs -> trans ( " StockIncrease " );
2024-03-01 20:19:37 +01:00
2022-04-06 15:19:34 +02:00
if ( $qtytoprocess >= 0 ) {
$idstockmove = $stockmove -> reception ( $user , $lineDetails [ 'fk_product' ], $lineDetails [ 'fk_warehouse' ], $qtytoprocess , 0 , $labelmovementCancel , '' , '' , $lineDetails [ 'batch' ], dol_now (), 0 , $codemovementCancel );
} else {
$idstockmove = $stockmove -> livraison ( $user , $lineDetails [ 'fk_product' ], $lineDetails [ 'fk_warehouse' ], $qtytoprocess , 0 , $labelmovementCancel , dol_now (), '' , '' , $lineDetails [ 'batch' ], 0 , $codemovementCancel );
}
if ( $idstockmove < 0 ) {
$this -> error ++ ;
setEventMessages ( $stockmove -> error , $stockmove -> errors , 'errors' );
} else {
2024-03-01 20:19:37 +01:00
$moline = new MoLine ( $this -> db );
$moline -> fetch ( $lineDetails [ 'rowid' ]);
$resdel = $moline -> delete ( $user , $notrigger );
if ( $resdel < 0 ) {
$this -> error ++ ;
setEventMessages ( $moline -> error , $moline -> errors , 'errors' );
}
2022-04-06 15:19:34 +02:00
}
}
2024-03-01 20:19:37 +01:00
if ( empty ( $this -> error )) {
$result = $this -> deleteLineCommon ( $user , $idline , $notrigger );
}
2022-04-06 15:19:34 +02:00
}
} else {
2024-03-01 20:19:37 +01:00
// No child lines
$result = $this -> deleteLineCommon ( $user , $idline , $notrigger );
}
if ( ! empty ( $this -> error ) || $result <= 0 ) {
$this -> db -> rollback ();
} else {
$this -> db -> commit ();
2022-04-06 15:19:34 +02:00
}
2024-03-01 20:19:37 +01:00
return $result ;
2019-10-15 19:59:16 +02:00
}
2019-12-20 15:31:05 +01:00
/**
* Returns the reference to the following non used MO depending on the active numbering module
* defined into MRP_MO_ADDON
*
* @ param Product $prod Object product
* @ return string MO free reference
*/
public function getNextNumRef ( $prod )
{
global $langs , $conf ;
$langs -> load ( " mrp " );
2023-11-27 11:56:32 +01:00
if ( getDolGlobalString ( 'MRP_MO_ADDON' )) {
2019-12-20 15:31:05 +01:00
$mybool = false ;
2023-10-15 18:39:13 +02:00
$file = getDolGlobalString ( 'MRP_MO_ADDON' ) . " .php " ;
2024-01-05 04:18:53 +01:00
$classname = getDolGlobalString ( 'MRP_MO_ADDON' );
2019-12-20 15:31:05 +01:00
// Include file with class
$dirmodels = array_merge ( array ( '/' ), ( array ) $conf -> modules_parts [ 'models' ]);
2021-02-26 18:26:44 +01:00
foreach ( $dirmodels as $reldir ) {
2019-12-20 15:31:05 +01:00
$dir = dol_buildpath ( $reldir . " core/modules/mrp/ " );
// Load file with numbering class (if found)
2024-03-21 13:22:02 +01:00
$mybool = (( bool ) @ include_once $dir . $file ) || $mybool ;
2019-12-20 15:31:05 +01:00
}
2021-02-26 18:26:44 +01:00
if ( $mybool === false ) {
2024-01-20 09:22:38 +01:00
dol_print_error ( null , " Failed to include file " . $file );
2019-12-20 15:31:05 +01:00
return '' ;
}
$obj = new $classname ();
$numref = $obj -> getNextValue ( $prod , $this );
2021-02-26 18:26:44 +01:00
if ( $numref != " " ) {
2019-12-20 15:31:05 +01:00
return $numref ;
2020-05-21 15:05:19 +02:00
} else {
2019-12-20 15:31:05 +01:00
$this -> error = $obj -> error ;
//dol_print_error($this->db,get_class($this)."::getNextNumRef ".$obj->error);
return " " ;
}
2020-05-21 15:05:19 +02:00
} else {
2019-12-20 15:31:05 +01:00
print $langs -> trans ( " Error " ) . " " . $langs -> trans ( " Error_MRP_MO_ADDON_NotDefined " );
return " " ;
}
}
/**
* Validate Mo
*
* @ param User $user User making status change
* @ param int $notrigger 1 = Does not execute triggers , 0 = execute triggers
2023-12-06 15:46:39 +01:00
* @ return int Return integer <= 0 if OK , 0 = Nothing done , > 0 if KO
2019-12-20 15:31:05 +01:00
*/
public function validate ( $user , $notrigger = 0 )
{
2024-03-09 02:52:09 +01:00
global $conf ;
2019-12-20 15:31:05 +01:00
require_once DOL_DOCUMENT_ROOT . '/core/lib/files.lib.php' ;
$error = 0 ;
// Protection
2021-02-26 18:26:44 +01:00
if ( $this -> status == self :: STATUS_VALIDATED ) {
2024-01-12 18:06:50 +01:00
dol_syslog ( get_class ( $this ) . " ::validate action abandoned: already validated " , LOG_WARNING );
2019-12-20 15:31:05 +01:00
return 0 ;
}
2022-08-31 22:14:20 +02:00
/* if ( ! (( empty ( $conf -> global -> MAIN_USE_ADVANCED_PERMS ) && ! empty ( $user -> rights -> mrp -> create ))
|| ( ! empty ( $conf -> global -> MAIN_USE_ADVANCED_PERMS ) && ! empty ( $user -> rights -> mrp -> mrp_advance -> validate ))))
2019-12-20 15:31:05 +01:00
{
$this -> error = 'NotEnoughPermissions' ;
dol_syslog ( get_class ( $this ) . " ::valid " . $this -> error , LOG_ERR );
return - 1 ;
} */
$now = dol_now ();
$this -> db -> begin ();
// Define new ref
2021-02-26 18:26:44 +01:00
if ( ! $error && ( preg_match ( '/^[\(]?PROV/i' , $this -> ref ) || empty ( $this -> ref ))) { // empty should not happened, but when it occurs, the test save life
2019-12-20 15:31:05 +01:00
$this -> fetch_product ();
$num = $this -> getNextNumRef ( $this -> product );
2020-05-21 15:05:19 +02:00
} else {
2019-12-20 15:31:05 +01:00
$num = $this -> ref ;
}
$this -> newref = $num ;
// Validate
$sql = " UPDATE " . MAIN_DB_PREFIX . $this -> table_element ;
$sql .= " SET ref = ' " . $this -> db -> escape ( $num ) . " ', " ;
$sql .= " status = " . self :: STATUS_VALIDATED . " , " ;
$sql .= " date_valid=' " . $this -> db -> idate ( $now ) . " ', " ;
$sql .= " fk_user_valid = " . $user -> id ;
2021-08-27 16:33:03 +02:00
$sql .= " WHERE rowid = " . (( int ) $this -> id );
2019-12-20 15:31:05 +01:00
dol_syslog ( get_class ( $this ) . " ::validate() " , LOG_DEBUG );
$resql = $this -> db -> query ( $sql );
2021-02-26 18:26:44 +01:00
if ( ! $resql ) {
2019-12-20 15:31:05 +01:00
dol_print_error ( $this -> db );
$this -> error = $this -> db -> lasterror ();
$error ++ ;
}
2021-02-26 18:26:44 +01:00
if ( ! $error && ! $notrigger ) {
2019-12-20 15:31:05 +01:00
// Call trigger
$result = $this -> call_trigger ( 'MRP_MO_VALIDATE' , $user );
2021-02-26 18:26:44 +01:00
if ( $result < 0 ) {
$error ++ ;
}
2019-12-20 15:31:05 +01:00
// End call triggers
}
2021-02-26 18:26:44 +01:00
if ( ! $error ) {
2019-12-20 15:31:05 +01:00
$this -> oldref = $this -> ref ;
// Rename directory if dir was a temporary ref
2021-02-26 18:26:44 +01:00
if ( preg_match ( '/^[\(]?PROV/i' , $this -> ref )) {
2019-12-20 15:31:05 +01:00
// Now we rename also files into index
$sql = 'UPDATE ' . MAIN_DB_PREFIX . " ecm_files set filename = CONCAT(' " . $this -> db -> escape ( $this -> newref ) . " ', SUBSTR(filename, " . ( strlen ( $this -> ref ) + 1 ) . " )), filepath = 'mrp/ " . $this -> db -> escape ( $this -> newref ) . " ' " ;
$sql .= " WHERE filename LIKE ' " . $this -> db -> escape ( $this -> ref ) . " %' AND filepath = 'mrp/ " . $this -> db -> escape ( $this -> ref ) . " ' and entity = " . $conf -> entity ;
$resql = $this -> db -> query ( $sql );
2021-02-26 18:26:44 +01:00
if ( ! $resql ) {
2023-12-04 13:46:42 +01:00
$error ++ ;
$this -> error = $this -> db -> lasterror ();
2021-02-26 18:26:44 +01:00
}
2023-10-31 19:28:11 +01:00
$sql = 'UPDATE ' . MAIN_DB_PREFIX . " ecm_files set filepath = 'mrp/ " . $this -> db -> escape ( $this -> newref ) . " ' " ;
$sql .= " WHERE filepath = 'mrp/ " . $this -> db -> escape ( $this -> ref ) . " ' and entity = " . $conf -> entity ;
$resql = $this -> db -> query ( $sql );
if ( ! $resql ) {
2023-12-04 13:46:42 +01:00
$error ++ ;
$this -> error = $this -> db -> lasterror ();
2023-10-31 19:28:11 +01:00
}
2019-12-20 15:31:05 +01:00
// We rename directory ($this->ref = old ref, $num = new ref) in order not to lose the attachments
$oldref = dol_sanitizeFileName ( $this -> ref );
$newref = dol_sanitizeFileName ( $num );
$dirsource = $conf -> mrp -> dir_output . '/' . $oldref ;
$dirdest = $conf -> mrp -> dir_output . '/' . $newref ;
2021-02-26 18:26:44 +01:00
if ( ! $error && file_exists ( $dirsource )) {
2019-12-20 15:31:05 +01:00
dol_syslog ( get_class ( $this ) . " ::validate() rename dir " . $dirsource . " into " . $dirdest );
2021-02-26 18:26:44 +01:00
if ( @ rename ( $dirsource , $dirdest )) {
2019-12-20 15:31:05 +01:00
dol_syslog ( " Rename ok " );
// Rename docs starting with $oldref with $newref
$listoffiles = dol_dir_list ( $conf -> mrp -> dir_output . '/' . $newref , 'files' , 1 , '^' . preg_quote ( $oldref , '/' ));
2021-02-26 18:26:44 +01:00
foreach ( $listoffiles as $fileentry ) {
2019-12-20 15:31:05 +01:00
$dirsource = $fileentry [ 'name' ];
$dirdest = preg_replace ( '/^' . preg_quote ( $oldref , '/' ) . '/' , $newref , $dirsource );
$dirsource = $fileentry [ 'path' ] . '/' . $dirsource ;
$dirdest = $fileentry [ 'path' ] . '/' . $dirdest ;
@ rename ( $dirsource , $dirdest );
}
}
}
}
}
// Set new ref and current status
2021-02-26 18:26:44 +01:00
if ( ! $error ) {
2019-12-20 15:31:05 +01:00
$this -> ref = $num ;
$this -> status = self :: STATUS_VALIDATED ;
}
2021-02-26 18:26:44 +01:00
if ( ! $error ) {
2019-12-20 15:31:05 +01:00
$this -> db -> commit ();
return 1 ;
2020-05-21 15:05:19 +02:00
} else {
2019-12-20 15:31:05 +01:00
$this -> db -> rollback ();
return - 1 ;
}
}
2019-12-20 17:39:42 +01:00
/**
* Set draft status
*
* @ param User $user Object user that modify
* @ param int $notrigger 1 = Does not execute triggers , 0 = Execute triggers
2023-12-01 19:51:32 +01:00
* @ return int Return integer < 0 if KO , > 0 if OK
2019-12-20 17:39:42 +01:00
*/
public function setDraft ( $user , $notrigger = 0 )
{
// Protection
2021-02-26 18:26:44 +01:00
if ( $this -> status <= self :: STATUS_DRAFT ) {
2019-12-20 17:39:42 +01:00
return 0 ;
}
2022-08-31 22:14:20 +02:00
/* if ( ! (( empty ( $conf -> global -> MAIN_USE_ADVANCED_PERMS ) && ! empty ( $user -> rights -> mymodule -> write ))
|| ( ! empty ( $conf -> global -> MAIN_USE_ADVANCED_PERMS ) && ! empty ( $user -> rights -> mymodule -> mymodule_advance -> validate ))))
2019-12-20 17:39:42 +01:00
{
$this -> error = 'Permission denied' ;
return - 1 ;
} */
2020-05-20 23:15:18 +02:00
return $this -> setStatusCommon ( $user , self :: STATUS_DRAFT , $notrigger , 'MRP_MO_UNVALIDATE' );
2019-12-20 17:39:42 +01:00
}
/**
* Set cancel status
*
2023-10-20 03:09:58 +02:00
* @ param User $user Object user that modify
* @ param int $notrigger 1 = Does not execute triggers , 0 = Execute triggers
* @ param bool $also_cancel_consumed_and_produced_lines true if the consumed and produced lines will be deleted ( and stocks incremented / decremented back ) ( false by default )
2023-12-06 15:46:39 +01:00
* @ return int Return integer < 0 if KO , 0 = Nothing done , > 0 if OK
2019-12-20 17:39:42 +01:00
*/
2023-10-20 03:09:58 +02:00
public function cancel ( $user , $notrigger = 0 , $also_cancel_consumed_and_produced_lines = false )
2019-12-20 17:39:42 +01:00
{
// Protection
2021-02-26 18:26:44 +01:00
if ( $this -> status != self :: STATUS_VALIDATED && $this -> status != self :: STATUS_INPROGRESS ) {
2019-12-20 17:39:42 +01:00
return 0 ;
}
2022-08-31 22:14:20 +02:00
/* if ( ! (( empty ( $conf -> global -> MAIN_USE_ADVANCED_PERMS ) && ! empty ( $user -> rights -> mymodule -> write ))
|| ( ! empty ( $conf -> global -> MAIN_USE_ADVANCED_PERMS ) && ! empty ( $user -> rights -> mymodule -> mymodule_advance -> validate ))))
2019-12-20 17:39:42 +01:00
{
$this -> error = 'Permission denied' ;
return - 1 ;
} */
2023-10-20 03:09:58 +02:00
$error = 0 ;
$this -> db -> begin ();
if ( $also_cancel_consumed_and_produced_lines ) {
$result = $this -> cancelConsumedAndProducedLines ( $user , 0 , true , $notrigger );
if ( $result < 0 ) {
$error ++ ;
}
}
if ( ! $error ) {
$result = $this -> setStatusCommon ( $user , self :: STATUS_CANCELED , $notrigger , 'MRP_MO_CANCEL' );
if ( $result < 0 ) {
$error ++ ;
}
}
if ( $error ) {
$this -> db -> rollback ();
return - 1 ;
} else {
$this -> db -> commit ();
return 1 ;
}
2019-12-20 17:39:42 +01:00
}
/**
* Set back to validated status
*
* @ param User $user Object user that modify
* @ param int $notrigger 1 = Does not execute triggers , 0 = Execute triggers
2023-12-06 15:46:39 +01:00
* @ return int Return integer < 0 if KO , 0 = Nothing done , > 0 if OK
2019-12-20 17:39:42 +01:00
*/
public function reopen ( $user , $notrigger = 0 )
{
// Protection
2021-02-26 18:26:44 +01:00
if ( $this -> status != self :: STATUS_PRODUCED && $this -> status != self :: STATUS_CANCELED ) {
2019-12-20 17:39:42 +01:00
return 0 ;
}
2022-08-31 22:14:20 +02:00
/* if ( ! (( empty ( $conf -> global -> MAIN_USE_ADVANCED_PERMS ) && ! empty ( $user -> rights -> mymodule -> write ))
|| ( ! empty ( $conf -> global -> MAIN_USE_ADVANCED_PERMS ) && ! empty ( $user -> rights -> mymodule -> mymodule_advance -> validate ))))
2019-12-20 17:39:42 +01:00
{
$this -> error = 'Permission denied' ;
return - 1 ;
} */
2020-05-20 23:15:56 +02:00
return $this -> setStatusCommon ( $user , self :: STATUS_VALIDATED , $notrigger , 'MRP_MO_REOPEN' );
2019-12-20 17:39:42 +01:00
}
2023-10-20 03:09:58 +02:00
/**
* Cancel consumed and produced lines ( movement stocks )
*
* @ param User $user Object user that modify
2024-01-13 15:34:02 +01:00
* @ param int $mode Type line supported ( 0 by default ) ( 0 : consumed and produced lines ; 1 : consumed lines ; 2 : produced lines )
2023-10-20 03:09:58 +02:00
* @ param bool $also_delete_lines true if the consumed / produced lines is deleted ( false by default )
* @ param int $notrigger 1 = Does not execute triggers , 0 = Execute triggers
2023-12-06 15:46:39 +01:00
* @ return int Return integer < 0 if KO , 0 = Nothing done , > 0 if OK
2023-10-20 03:09:58 +02:00
*/
public function cancelConsumedAndProducedLines ( $user , $mode = 0 , $also_delete_lines = false , $notrigger = 0 )
{
global $langs ;
if ( ! isModEnabled ( 'stock' )) {
return 1 ;
}
require_once DOL_DOCUMENT_ROOT . '/product/class/product.class.php' ;
require_once DOL_DOCUMENT_ROOT . '/product/stock/class/mouvementstock.class.php' ;
$error = 0 ;
$langs -> load ( 'stocks' );
$this -> db -> begin ();
// Cancel consumed lines
if ( empty ( $mode ) || $mode == 1 ) {
$arrayoflines = $this -> fetchLinesLinked ( 'consumed' );
if ( ! empty ( $arrayoflines )) {
foreach ( $arrayoflines as $key => $lineDetails ) {
$productstatic = new Product ( $this -> db );
$productstatic -> fetch ( $lineDetails [ 'fk_product' ]);
$qtytoprocess = $lineDetails [ 'qty' ];
// Reverse stock movement
$labelmovementCancel = $langs -> trans ( " CancelProductionForRef " , $productstatic -> ref );
$codemovementCancel = $langs -> trans ( " StockIncrease " );
$stockmove = new MouvementStock ( $this -> db );
$stockmove -> setOrigin ( $this -> element , $this -> id );
if ( $qtytoprocess >= 0 ) {
$idstockmove = $stockmove -> reception ( $user , $lineDetails [ 'fk_product' ], $lineDetails [ 'fk_warehouse' ], $qtytoprocess , 0 , $labelmovementCancel , '' , '' , $lineDetails [ 'batch' ], dol_now (), 0 , $codemovementCancel );
} else {
$idstockmove = $stockmove -> livraison ( $user , $lineDetails [ 'fk_product' ], $lineDetails [ 'fk_warehouse' ], $qtytoprocess , 0 , $labelmovementCancel , dol_now (), '' , '' , $lineDetails [ 'batch' ], 0 , $codemovementCancel );
}
if ( $idstockmove < 0 ) {
$this -> error = $stockmove -> error ;
$this -> errors = $stockmove -> errors ;
$error ++ ;
break ;
}
if ( $also_delete_lines ) {
$result = $this -> deleteLineCommon ( $user , $lineDetails [ 'rowid' ], $notrigger );
if ( $result < 0 ) {
$error ++ ;
break ;
}
}
}
}
}
// Cancel produced lines
if ( empty ( $mode ) || $mode == 2 ) {
$arrayoflines = $this -> fetchLinesLinked ( 'produced' );
if ( ! empty ( $arrayoflines )) {
foreach ( $arrayoflines as $key => $lineDetails ) {
$productstatic = new Product ( $this -> db );
$productstatic -> fetch ( $lineDetails [ 'fk_product' ]);
$qtytoprocess = $lineDetails [ 'qty' ];
// Reverse stock movement
$labelmovementCancel = $langs -> trans ( " CancelProductionForRef " , $productstatic -> ref );
$codemovementCancel = $langs -> trans ( " StockDecrease " );
$stockmove = new MouvementStock ( $this -> db );
$stockmove -> setOrigin ( $this -> element , $this -> id );
if ( $qtytoprocess >= 0 ) {
$idstockmove = $stockmove -> livraison ( $user , $lineDetails [ 'fk_product' ], $lineDetails [ 'fk_warehouse' ], $qtytoprocess , 0 , $labelmovementCancel , dol_now (), '' , '' , $lineDetails [ 'batch' ], 0 , $codemovementCancel );
} else {
$idstockmove = $stockmove -> reception ( $user , $lineDetails [ 'fk_product' ], $lineDetails [ 'fk_warehouse' ], $qtytoprocess , 0 , $labelmovementCancel , '' , '' , $lineDetails [ 'batch' ], dol_now (), 0 , $codemovementCancel );
}
if ( $idstockmove < 0 ) {
$this -> error = $stockmove -> error ;
$this -> errors = $stockmove -> errors ;
$error ++ ;
break ;
}
if ( $also_delete_lines ) {
$result = $this -> deleteLineCommon ( $user , $lineDetails [ 'rowid' ], $notrigger );
if ( $result < 0 ) {
$error ++ ;
break ;
}
}
}
}
}
if ( $error ) {
$this -> db -> rollback ();
return - 1 ;
} else {
$this -> db -> commit ();
return 1 ;
}
}
2023-02-05 23:28:54 +01:00
/**
* getTooltipContentArray
*
* @ param array $params ex option , infologin
* @ since v18
* @ return array
*/
public function getTooltipContentArray ( $params )
{
2024-03-09 02:52:09 +01:00
global $langs ;
2023-02-05 23:28:54 +01:00
2023-02-21 20:33:35 +01:00
$langs -> loadLangs ([ 'mrp' , 'products' ]);
$nofetch = isset ( $params [ 'nofetch' ]) ? true : false ;
2023-02-05 23:28:54 +01:00
$datas = [];
$datas [ 'picto' ] = img_picto ( '' , $this -> picto ) . ' <u class="paddingrightonly">' . $langs -> trans ( " ManufacturingOrder " ) . '</u>' ;
if ( isset ( $this -> status )) {
$datas [ 'picto' ] .= ' ' . $this -> getLibStatut ( 5 );
}
$datas [ 'ref' ] = '<br><b>' . $langs -> trans ( 'Ref' ) . ':</b> ' . $this -> ref ;
if ( isset ( $this -> label )) {
$datas [ 'label' ] = '<br><b>' . $langs -> trans ( 'Label' ) . ':</b> ' . $this -> label ;
}
2023-02-12 18:31:35 +01:00
if ( isset ( $this -> mrptype )) {
$datas [ 'type' ] = '<br><b>' . $langs -> trans ( 'Type' ) . ':</b> ' . $this -> fields [ 'mrptype' ][ 'arrayofkeyval' ][ $this -> mrptype ];
}
2023-02-21 20:33:35 +01:00
if ( isset ( $this -> qty )) {
$datas [ 'qty' ] = '<br><b>' . $langs -> trans ( 'QtyToProduce' ) . ':</b> ' . $this -> qty ;
}
if ( ! $nofetch && isset ( $this -> fk_product )) {
require_once DOL_DOCUMENT_ROOT . '/product/class/product.class.php' ;
$product = new Product ( $this -> db );
$product -> fetch ( $this -> fk_product );
$datas [ 'product' ] = '<br><b>' . $langs -> trans ( 'Product' ) . ':</b> ' . $product -> getNomUrl ( 1 , '' , 0 , - 1 , 1 );
}
if ( ! $nofetch && isset ( $this -> fk_warehouse )) {
require_once DOL_DOCUMENT_ROOT . '/product/stock/class/entrepot.class.php' ;
$warehouse = new Entrepot ( $this -> db );
$warehouse -> fetch ( $this -> fk_warehouse );
$datas [ 'warehouse' ] = '<br><b>' . $langs -> trans ( 'WarehouseForProduction' ) . ':</b> ' . $warehouse -> getNomUrl ( 1 , '' , 0 , 1 );
}
2023-02-05 23:28:54 +01:00
return $datas ;
}
2020-10-31 14:32:18 +01:00
/**
2024-01-12 18:06:50 +01:00
* Return a link to the object card ( with optionally the picto )
2020-10-31 14:32:18 +01:00
*
* @ param int $withpicto Include picto in link ( 0 = No picto , 1 = Include picto into link , 2 = Only picto )
* @ param string $option On what the link point to ( 'nolink' , '' , 'production' , ... )
* @ param int $notooltip 1 = Disable tooltip
* @ param string $morecss Add more css on link
* @ param int $save_lastsearch_value - 1 = Auto , 0 = No save of lastsearch_values when clicking , 1 = Save lastsearch_values whenclicking
* @ return string String with URL
*/
public function getNomUrl ( $withpicto = 0 , $option = '' , $notooltip = 0 , $morecss = '' , $save_lastsearch_value = - 1 )
{
2023-11-19 00:54:39 +01:00
global $conf , $langs , $action , $hookmanager ;
2020-10-31 14:32:18 +01:00
2021-02-26 18:26:44 +01:00
if ( ! empty ( $conf -> dol_no_mouse_hover )) {
$notooltip = 1 ; // Force disable tooltips
}
2020-10-31 14:32:18 +01:00
$result = '' ;
2023-02-06 22:21:54 +01:00
$params = [
'id' => $this -> id ,
'objecttype' => $this -> element ,
'option' => $option ,
2023-02-21 20:33:35 +01:00
'nofetch' => 1 ,
2023-02-06 22:21:54 +01:00
];
$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-07-04 20:08:34 +02:00
}
2020-10-31 14:32:18 +01:00
2021-09-18 19:34:46 +02:00
$url = DOL_URL_ROOT . '/mrp/mo_card.php?id=' . $this -> id ;
2021-02-26 18:26:44 +01:00
if ( $option == 'production' ) {
2021-09-18 19:34:46 +02:00
$url = DOL_URL_ROOT . '/mrp/mo_production.php?id=' . $this -> id ;
2021-02-26 18:26:44 +01:00
}
2020-10-31 14:32:18 +01:00
2021-02-26 18:26:44 +01:00
if ( $option != 'nolink' ) {
2020-10-31 14:32:18 +01: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:26:44 +01:00
$add_save_lastsearch_values = 1 ;
}
if ( $add_save_lastsearch_values ) {
$url .= '&save_lastsearch_values=1' ;
}
2020-10-31 14:32:18 +01:00
}
$linkclose = '' ;
2021-02-26 18:26:44 +01:00
if ( empty ( $notooltip )) {
2023-11-27 11:56:32 +01:00
if ( getDolGlobalString ( 'MAIN_OPTIMIZEFORTEXTBROWSER' )) {
2020-10-31 14:32:18 +01:00
$label = $langs -> trans ( " ShowMo " );
$linkclose .= ' alt="' . dol_escape_htmltag ( $label , 1 ) . '"' ;
}
2023-12-04 13:46:42 +01:00
$linkclose .= ( $label ? ' title="' . dol_escape_htmltag ( $label , 1 ) . '"' : ' title="tocomplete"' );
2023-04-03 19:51:40 +02:00
$linkclose .= $dataparams . ' class="' . $classfortooltip . ( $morecss ? ' ' . $morecss : '' ) . '"' ;
2021-02-26 18:26:44 +01:00
} else {
$linkclose = ( $morecss ? ' class="' . $morecss . '"' : '' );
}
2019-10-15 19:59:16 +02:00
$linkstart = '<a href="' . $url . '"' ;
2019-11-11 23:59:36 +01:00
$linkstart .= $linkclose . '>' ;
$linkend = '</a>' ;
2019-10-15 19:59:16 +02:00
$result .= $linkstart ;
2021-02-26 18:26:44 +01:00
if ( $withpicto ) {
2023-04-10 01:39:47 +02:00
$result .= img_object (( $notooltip ? '' : $label ), ( $this -> picto ? $this -> picto : 'generic' ), (( $withpicto != 2 ) ? 'class="paddingright"' : '' ), 0 , 0 , $notooltip ? 0 : 1 );
2021-02-26 18:26:44 +01:00
}
if ( $withpicto != 2 ) {
$result .= $this -> ref ;
}
2019-10-15 19:59:16 +02:00
$result .= $linkend ;
//if ($withpicto != 2) $result.=(($addlabel && $this->label) ? $sep . dol_trunc($this->label, ($addlabel > 1 ? $addlabel : 0)) : '');
$hookmanager -> initHooks ( array ( 'modao' ));
2024-03-08 21:34:18 +01:00
$parameters = array ( 'id' => $this -> id , 'getnomurl' => & $result );
2019-11-11 23:59:36 +01:00
$reshook = $hookmanager -> executeHooks ( 'getNomUrl' , $parameters , $this , $action ); // Note that $action and $object may have been modified by some hooks
2021-02-26 18:26:44 +01:00
if ( $reshook > 0 ) {
$result = $hookmanager -> resPrint ;
} else {
$result .= $hookmanager -> resPrint ;
}
2019-10-15 19:59:16 +02:00
return $result ;
2020-10-31 14:32:18 +01:00
}
2019-10-15 19:59:16 +02:00
/**
* Return label of the 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 of status
*/
public function getLibStatut ( $mode = 0 )
{
return $this -> LibStatut ( $this -> status , $mode );
}
2020-10-31 14:32:18 +01:00
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
2019-10-15 19:59:16 +02:00
/**
* Return the status
*
* @ 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 of status
*/
public function LibStatut ( $status , $mode = 0 )
{
// phpcs:enable
2021-02-26 18:26:44 +01:00
if ( empty ( $this -> labelStatus )) {
2019-10-15 19:59:16 +02:00
global $langs ;
//$langs->load("mrp");
2020-10-25 14:11:09 +01:00
$this -> labelStatus [ self :: STATUS_DRAFT ] = $langs -> transnoentitiesnoconv ( 'Draft' );
$this -> labelStatus [ self :: STATUS_VALIDATED ] = $langs -> transnoentitiesnoconv ( 'ValidatedToProduce' );
$this -> labelStatus [ self :: STATUS_INPROGRESS ] = $langs -> transnoentitiesnoconv ( 'InProgress' );
$this -> labelStatus [ self :: STATUS_PRODUCED ] = $langs -> transnoentitiesnoconv ( 'StatusMOProduced' );
$this -> labelStatus [ self :: STATUS_CANCELED ] = $langs -> transnoentitiesnoconv ( 'Canceled' );
$this -> labelStatusShort [ self :: STATUS_DRAFT ] = $langs -> transnoentitiesnoconv ( 'Draft' );
$this -> labelStatusShort [ self :: STATUS_VALIDATED ] = $langs -> transnoentitiesnoconv ( 'Validated' );
$this -> labelStatusShort [ self :: STATUS_INPROGRESS ] = $langs -> transnoentitiesnoconv ( 'InProgress' );
$this -> labelStatusShort [ self :: STATUS_PRODUCED ] = $langs -> transnoentitiesnoconv ( 'StatusMOProduced' );
$this -> labelStatusShort [ self :: STATUS_CANCELED ] = $langs -> transnoentitiesnoconv ( 'Canceled' );
2019-10-15 19:59:16 +02:00
}
2019-10-24 13:09:50 +02:00
$statusType = 'status' . $status ;
2021-02-26 18:26:44 +01:00
if ( $status == self :: STATUS_VALIDATED ) {
$statusType = 'status1' ;
}
if ( $status == self :: STATUS_INPROGRESS ) {
$statusType = 'status4' ;
}
if ( $status == self :: STATUS_PRODUCED ) {
$statusType = 'status6' ;
}
if ( $status == self :: STATUS_CANCELED ) {
$statusType = 'status9' ;
}
2019-10-24 13:09:50 +02:00
2020-01-03 15:01:14 +01:00
return dolGetStatus ( $this -> labelStatus [ $status ], $this -> labelStatusShort [ $status ], '' , $statusType , $mode );
2019-10-15 19:59:16 +02:00
}
/**
* Load the info information in the object
*
* @ param int $id Id of object
* @ return void
*/
public function info ( $id )
{
$sql = 'SELECT rowid, date_creation as datec, tms as datem,' ;
2019-11-11 23:59:36 +01:00
$sql .= ' fk_user_creat, fk_user_modif' ;
$sql .= ' FROM ' . MAIN_DB_PREFIX . $this -> table_element . ' as t' ;
2021-03-14 11:48:39 +01:00
$sql .= ' WHERE t.rowid = ' . (( int ) $id );
2019-11-11 23:59:36 +01:00
$result = $this -> db -> query ( $sql );
2021-02-26 18:26:44 +01:00
if ( $result ) {
if ( $this -> db -> num_rows ( $result )) {
2019-10-15 19:59:16 +02:00
$obj = $this -> db -> fetch_object ( $result );
2023-10-24 11:37:29 +02:00
2019-10-15 19:59:16 +02:00
$this -> id = $obj -> rowid ;
2022-06-28 13:09:53 +02:00
$this -> user_creation_id = $obj -> fk_user_creat ;
$this -> user_modification_id = $obj -> fk_user_modif ;
2019-10-15 19:59:16 +02:00
$this -> date_creation = $this -> db -> jdate ( $obj -> datec );
2022-06-28 13:09:53 +02:00
$this -> date_modification = empty ( $obj -> datem ) ? '' : $this -> db -> jdate ( $obj -> datem );
2019-10-15 19:59:16 +02:00
}
$this -> db -> free ( $result );
2020-05-21 15:05:19 +02:00
} else {
2019-10-15 19:59:16 +02:00
dol_print_error ( $this -> db );
}
}
/**
* Initialise object with example values
* Id must be 0 if object instance is a specimen
*
2024-03-02 16:38:35 +01:00
* @ return int
2019-10-15 19:59:16 +02:00
*/
public function initAsSpecimen ()
{
2024-03-02 16:38:35 +01:00
$ret = $this -> initAsSpecimenCommon ();
2021-09-05 02:18:53 +02:00
$this -> lines = array ();
2024-03-02 16:38:35 +01:00
return $ret ;
2019-10-15 19:59:16 +02:00
}
/**
* Create an array of lines
2023-05-01 18:12:59 +02:00
*
* @ param string $rolefilter string lines role filter
* @ return array | int array of lines if OK , < 0 if KO
2019-10-15 19:59:16 +02:00
*/
2022-02-08 16:01:18 +01:00
public function getLinesArray ( $rolefilter = '' )
2019-10-15 19:59:16 +02:00
{
2020-10-31 14:32:18 +01:00
$this -> lines = array ();
$objectline = new MoLine ( $this -> db );
2022-02-08 16:01:18 +01:00
2024-03-05 03:51:36 +01:00
$filter = '(fk_mo:=:' . (( int ) $this -> id ) . ')' ;
2023-12-04 13:46:42 +01:00
if ( ! empty ( $rolefilter )) {
2024-03-05 03:51:36 +01:00
$filter .= " AND (role:=:' " . $this -> db -> escape ( $rolefilter ) . " ') " ;
2023-12-04 13:46:42 +01:00
}
2024-03-05 03:51:36 +01:00
$result = $objectline -> fetchAll ( 'ASC' , 'position' , 0 , 0 , $filter );
2020-10-31 14:32:18 +01:00
2021-02-26 18:26:44 +01:00
if ( is_numeric ( $result )) {
2022-12-31 14:43:31 +01:00
$this -> error = $objectline -> error ;
$this -> errors = $objectline -> errors ;
2020-10-31 14:32:18 +01:00
return $result ;
} else {
$this -> lines = $result ;
return $this -> lines ;
}
2019-10-15 19:59:16 +02:00
}
/**
* Create a document onto disk according to template module .
*
* @ param string $modele Force template to use ( '' to not force )
2024-01-12 18:06:50 +01:00
* @ param Translate $outputlangs object lang a utiliser pour traduction
2019-10-15 19:59:16 +02:00
* @ param int $hidedetails Hide details of lines
* @ param int $hidedesc Hide description
* @ param int $hideref Hide ref
* @ param null | array $moreparams Array to provide more information
* @ return int 0 if KO , 1 if OK
*/
public function generateDocument ( $modele , $outputlangs , $hidedetails = 0 , $hidedesc = 0 , $hideref = 0 , $moreparams = null )
{
2024-03-09 02:52:09 +01:00
global $langs ;
2019-10-15 19:59:16 +02:00
$langs -> load ( " mrp " );
2019-11-11 23:59:36 +01:00
if ( ! dol_strlen ( $modele )) {
2019-12-20 17:39:42 +01:00
//$modele = 'standard';
2020-01-10 00:03:10 +01:00
$modele = '' ; // Remove this once a pdf_standard.php exists.
2019-10-15 19:59:16 +02:00
2020-09-10 01:49:09 +02:00
if ( $this -> model_pdf ) {
$modele = $this -> model_pdf ;
2024-02-29 20:15:23 +01:00
} elseif ( getDolGlobalString ( 'MRP_MO_ADDON_PDF' )) {
$modele = getDolGlobalString ( 'MRP_MO_ADDON_PDF' );
2019-10-15 19:59:16 +02:00
}
}
$modelpath = " core/modules/mrp/doc/ " ;
2021-02-26 18:26:44 +01:00
if ( empty ( $modele )) {
return 1 ; // Remove this once a pdf_standard.php exists.
}
2019-12-20 17:39:42 +01:00
2019-10-15 19:59:16 +02:00
return $this -> commonGenerateDocument ( $modelpath , $modele , $outputlangs , $hidedetails , $hidedesc , $hideref , $moreparams );
}
2019-11-12 01:48:12 +01:00
/**
* Return HTML table table of source object lines
* TODO Move this and previous function into output html class file ( htmlline . class . php ) .
* If lines are into a template , title must also be into a template
* But for the moment we don 't know if it' s possible , so we keep the method available on overloaded objects .
*
* @ param string $restrictlist '' = All lines , 'services' = Restrict to services only
* @ param array $selectedLines Array of lines id for selected lines
* @ return void
*/
public function printOriginLinesList ( $restrictlist = '' , $selectedLines = array ())
{
2024-03-09 02:52:09 +01:00
global $langs , $hookmanager , $form , $action ;
2019-11-12 01:48:12 +01:00
2022-01-20 17:07:18 +01:00
$langs -> load ( 'stocks' );
$text_stock_options = $langs -> trans ( " RealStockDesc " ) . '<br>' ;
$text_stock_options .= $langs -> trans ( " RealStockWillAutomaticallyWhen " ) . '<br>' ;
2023-11-27 11:56:32 +01:00
$text_stock_options .= ( getDolGlobalString ( 'STOCK_CALCULATE_ON_SHIPMENT' ) || getDolGlobalString ( 'STOCK_CALCULATE_ON_SHIPMENT_CLOSE' ) ? '- ' . $langs -> trans ( " DeStockOnShipment " ) . '<br>' : '' );
$text_stock_options .= ( getDolGlobalString ( 'STOCK_CALCULATE_ON_VALIDATE_ORDER' ) ? '- ' . $langs -> trans ( " DeStockOnValidateOrder " ) . '<br>' : '' );
$text_stock_options .= ( getDolGlobalString ( 'STOCK_CALCULATE_ON_BILL' ) ? '- ' . $langs -> trans ( " DeStockOnBill " ) . '<br>' : '' );
$text_stock_options .= ( getDolGlobalString ( 'STOCK_CALCULATE_ON_SUPPLIER_BILL' ) ? '- ' . $langs -> trans ( " ReStockOnBill " ) . '<br>' : '' );
$text_stock_options .= ( getDolGlobalString ( 'STOCK_CALCULATE_ON_SUPPLIER_VALIDATE_ORDER' ) ? '- ' . $langs -> trans ( " ReStockOnValidateOrder " ) . '<br>' : '' );
$text_stock_options .= ( getDolGlobalString ( 'STOCK_CALCULATE_ON_SUPPLIER_DISPATCH_ORDER' ) ? '- ' . $langs -> trans ( " ReStockOnDispatchOrder " ) . '<br>' : '' );
$text_stock_options .= ( getDolGlobalString ( 'STOCK_CALCULATE_ON_RECEPTION' ) || getDolGlobalString ( 'STOCK_CALCULATE_ON_RECEPTION_CLOSE' ) ? '- ' . $langs -> trans ( " StockOnReception " ) . '<br>' : '' );
2022-01-20 16:55:57 +01:00
2019-11-12 01:48:12 +01:00
print '<tr class="liste_titre">' ;
2022-02-07 16:28:58 +01:00
// Product or sub-bom
2022-08-10 04:07:18 +02:00
print '<td class="linecoldescription">' . $langs -> trans ( 'Ref' );
2023-11-27 11:56:32 +01:00
if ( getDolGlobalString ( 'BOM_SUB_BOM' )) {
2022-02-07 16:28:58 +01:00
print ' <a id="show_all" href="#">' . img_picto ( '' , 'folder-open' , 'class="paddingright"' ) . $langs -> trans ( " ExpandAll " ) . '</a> ' ;
print '<a id="hide_all" href="#">' . img_picto ( '' , 'folder' , 'class="paddingright"' ) . $langs -> trans ( " UndoExpandAll " ) . '</a> ' ;
}
print '</td>' ;
2022-08-10 04:07:18 +02:00
// Qty
2021-05-06 21:34:59 +02:00
print '<td class="right">' . $langs -> trans ( 'Qty' );
if ( $this -> bom -> bomtype == 0 ) {
print ' <span class="opacitymedium">(' . $langs -> trans ( " ForAQuantityOf " , $this -> bom -> qty ) . ')</span>' ;
} else {
print ' <span class="opacitymedium">(' . $langs -> trans ( " ForAQuantityToConsumeOf " , $this -> bom -> qty ) . ')</span>' ;
}
2023-11-06 11:15:43 +01:00
// Unit
print '<td class="right">' . $langs -> trans ( 'Unit' );
2021-05-06 21:34:59 +02:00
print '</td>' ;
2022-01-20 17:07:18 +01:00
print '<td class="center">' . $form -> textwithpicto ( $langs -> trans ( " PhysicalStock " ), $text_stock_options , 1 ) . '</td>' ;
print '<td class="center">' . $form -> textwithpicto ( $langs -> trans ( " VirtualStock " ), $langs -> trans ( " VirtualStockDesc " )) . '</td>' ;
2019-11-12 01:48:12 +01:00
print '<td class="center">' . $langs -> trans ( 'QtyFrozen' ) . '</td>' ;
print '<td class="center">' . $langs -> trans ( 'DisableStockChange' ) . '</td>' ;
2022-02-07 17:00:49 +01:00
print '<td class="center">' . $langs -> trans ( 'MoChildGenerate' ) . '</td>' ;
2019-11-12 01:48:12 +01:00
//print '<td class="center">'.$form->showCheckAddButtons('checkforselect', 1).'</td>';
2022-08-10 04:07:18 +02:00
//print '<td class="center"></td>';
2019-11-12 01:48:12 +01:00
print '</tr>' ;
2019-12-16 13:06:25 +01:00
$i = 0 ;
2019-11-12 01:48:12 +01:00
2021-02-26 18:26:44 +01:00
if ( ! empty ( $this -> lines )) {
foreach ( $this -> lines as $line ) {
2021-12-16 17:58:08 +01:00
$reshook = 0 ;
if ( is_object ( $hookmanager )) {
2024-03-08 21:34:18 +01:00
$parameters = array ( 'line' => $line , 'i' => $i , 'restrictlist' => $restrictlist , 'selectedLines' => $selectedLines );
2023-12-04 13:46:42 +01:00
if ( ! empty ( $line -> fk_parent_line )) {
$parameters [ 'fk_parent_line' ] = $line -> fk_parent_line ;
}
2021-12-16 17:58:08 +01:00
$reshook = $hookmanager -> executeHooks ( 'printOriginObjectLine' , $parameters , $this , $action ); // Note that $action and $object may have been modified by some hooks
2019-11-12 01:48:12 +01:00
}
2021-12-16 17:58:08 +01:00
if ( empty ( $reshook )) {
2019-11-12 01:48:12 +01:00
$this -> printOriginLine ( $line , '' , $restrictlist , '/core/tpl' , $selectedLines );
2021-12-16 17:58:08 +01:00
}
2019-11-12 01:48:12 +01:00
$i ++ ;
}
}
}
/**
* Return HTML with a line of table array of source object lines
* TODO Move this and previous function into output html class file ( htmlline . class . php ) .
* If lines are into a template , title must also be into a template
* But for the moment we don 't know if it' s possible as we keep a method available on overloaded objects .
*
2023-02-12 18:31:35 +01:00
* @ param MoLine $line Line
2019-11-12 01:48:12 +01:00
* @ param string $var Var
* @ param string $restrictlist '' = All lines , 'services' = Restrict to services only ( strike line if not )
* @ param string $defaulttpldir Directory where to find the template
* @ param array $selectedLines Array of lines id for selected lines
* @ return void
*/
public function printOriginLine ( $line , $var , $restrictlist = '' , $defaulttpldir = '/core/tpl' , $selectedLines = array ())
{
2023-12-23 12:33:19 +01:00
$productstatic = new Product ( $this -> db );
2019-11-12 01:48:12 +01:00
$this -> tpl [ 'id' ] = $line -> id ;
2019-12-16 13:06:25 +01:00
$this -> tpl [ 'label' ] = '' ;
2023-12-23 12:33:19 +01:00
if ( ! empty ( $line -> fk_product ) && $line -> fk_product > 0 ) {
2019-11-12 01:48:12 +01:00
$productstatic -> fetch ( $line -> fk_product );
2022-01-20 17:07:18 +01:00
$productstatic -> load_virtual_stock ();
2019-12-16 13:06:25 +01:00
$this -> tpl [ 'label' ] .= $productstatic -> getNomUrl ( 1 );
2023-12-13 12:46:23 +01:00
//$this->tpl['label'].= ' - '.$productstatic->label;
2020-05-21 15:05:19 +02:00
} else {
2023-12-23 12:33:19 +01:00
// If origin MO line is not a product, but another MO
2019-11-12 09:47:39 +01:00
// TODO
2019-11-12 01:48:12 +01:00
}
2020-04-22 12:56:52 +02:00
$this -> tpl [ 'qty_bom' ] = 1 ;
if ( is_object ( $this -> bom ) && $this -> bom -> qty > 1 ) {
$this -> tpl [ 'qty_bom' ] = $this -> bom -> qty ;
}
2022-01-20 17:07:18 +01:00
$this -> tpl [ 'stock' ] = $productstatic -> stock_reel ;
$this -> tpl [ 'seuil_stock_alerte' ] = $productstatic -> seuil_stock_alerte ;
$this -> tpl [ 'virtual_stock' ] = $productstatic -> stock_theorique ;
2019-11-12 01:48:12 +01:00
$this -> tpl [ 'qty' ] = $line -> qty ;
2023-11-06 11:15:43 +01:00
$this -> tpl [ 'fk_unit' ] = $line -> fk_unit ;
2019-11-12 01:48:12 +01:00
$this -> tpl [ 'qty_frozen' ] = $line -> qty_frozen ;
$this -> tpl [ 'disable_stock_change' ] = $line -> disable_stock_change ;
2020-02-28 16:12:42 +01:00
$this -> tpl [ 'efficiency' ] = $line -> efficiency ;
2019-11-12 01:48:12 +01:00
2023-12-23 12:33:19 +01:00
global $conf ; // used into template
$res = include DOL_DOCUMENT_ROOT . '/mrp/tpl/originproductline.tpl.php' ;
2019-11-12 01:48:12 +01:00
}
2020-10-16 17:08:23 +02:00
/**
* Function used to replace a thirdparty id with another one .
*
* @ param DoliDB $db Database handler
* @ param int $origin_id Old thirdparty id
* @ param int $dest_id New thirdparty id
* @ return bool
*/
public static function replaceThirdparty ( $db , $origin_id , $dest_id )
{
2021-01-29 16:20:43 +01:00
$tables = array ( 'mrp_mo' );
2020-10-16 17:08:23 +02:00
return CommonObject :: commonReplaceThirdparty ( $db , $origin_id , $dest_id , $tables );
}
2022-02-15 11:46:30 +01:00
/**
2024-01-14 12:26:37 +01:00
* Function used to return children of Mo
2022-02-15 11:46:30 +01:00
*
2023-02-12 18:31:35 +01:00
* @ return Mo [] | int array if OK , - 1 if KO
2022-02-15 11:46:30 +01:00
*/
2022-02-15 12:46:50 +01:00
public function getMoChilds ()
{
2022-02-15 11:46:30 +01:00
$TMoChilds = array ();
$error = 0 ;
$sql = " SELECT rowid FROM " . MAIN_DB_PREFIX . " mrp_mo as mo_child " ;
2024-03-08 21:34:18 +01:00
$sql .= " WHERE fk_parent_line IN " ;
$sql .= " (SELECT rowid FROM " . MAIN_DB_PREFIX . " mrp_production as line_parent " ;
$sql .= " WHERE fk_mo= " . (( int ) $this -> id ) . " ) " ;
2022-02-15 11:46:30 +01:00
$resql = $this -> db -> query ( $sql );
2022-02-15 12:46:50 +01:00
if ( $resql ) {
if ( $this -> db -> num_rows ( $resql ) > 0 ) {
while ( $obj = $this -> db -> fetch_object ( $resql )) {
2022-02-15 11:46:30 +01:00
$MoChild = new Mo ( $this -> db );
$res = $MoChild -> fetch ( $obj -> rowid );
2023-12-04 13:46:42 +01:00
if ( $res > 0 ) {
$TMoChilds [ $MoChild -> id ] = $MoChild ;
} else {
$error ++ ;
}
2022-02-15 11:46:30 +01:00
}
}
} else {
$error ++ ;
}
2022-02-15 12:46:50 +01:00
if ( $error ) {
2022-02-15 11:46:30 +01:00
return - 1 ;
} else {
return $TMoChilds ;
}
}
2023-10-31 12:25:59 +01:00
/**
* Function used to return all child MOs recursively
*
* @ param int $depth Depth for recursing loop count
2024-03-13 15:34:29 +01:00
* @ return Mo [] | int [] | int array of MOs if OK , - 1 if KO
2023-10-31 12:25:59 +01:00
*/
public function getAllMoChilds ( $depth = 0 )
{
2023-12-04 13:46:42 +01:00
if ( $depth > 1000 ) {
return - 1 ;
}
2023-10-31 12:25:59 +01:00
$TMoChilds = array ();
$error = 0 ;
$childMoList = $this -> getMoChilds ();
2023-12-04 13:46:42 +01:00
if ( $childMoList == - 1 ) {
return - 1 ;
}
2023-10-31 12:25:59 +01:00
2023-12-04 13:46:42 +01:00
foreach ( $childMoList as $childMo ) {
$TMoChilds [ $childMo -> id ] = $childMo ;
}
2023-10-31 12:25:59 +01:00
foreach ( $childMoList as $childMo ) {
$childMoChildren = $childMo -> getAllMoChilds ( $depth + 1 );
if ( $childMoChildren == - 1 ) {
$error ++ ;
} else {
foreach ( $childMoChildren as $child ) {
$TMoChilds [ $child -> id ] = $child ;
}
}
}
if ( $error ) {
return - 1 ;
} else {
return $TMoChilds ;
}
}
2022-02-15 11:46:30 +01:00
/**
2024-01-14 12:26:37 +01:00
* Function used to return children of Mo
2022-02-15 11:46:30 +01:00
*
2023-02-12 18:31:35 +01:00
* @ return Mo | int MO object if OK , - 1 if KO , 0 if not exist
2022-02-15 11:46:30 +01:00
*/
2022-02-15 12:46:50 +01:00
public function getMoParent ()
{
2022-02-15 11:46:30 +01:00
$MoParent = new Mo ( $this -> db );
$error = 0 ;
$sql = " SELECT lineparent.fk_mo as id_moparent FROM " . MAIN_DB_PREFIX . " mrp_mo as mo " ;
2024-03-08 21:34:18 +01:00
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . " mrp_production lineparent ON mo.fk_parent_line = lineparent.rowid " ;
$sql .= " WHERE mo.rowid = " . (( int ) $this -> id );
2022-02-15 11:46:30 +01:00
$resql = $this -> db -> query ( $sql );
2022-02-15 12:46:50 +01:00
if ( $resql ) {
if ( $this -> db -> num_rows ( $resql ) > 0 ) {
2022-02-15 11:46:30 +01:00
$obj = $this -> db -> fetch_object ( $resql );
$res = $MoParent -> fetch ( $obj -> id_moparent );
2023-12-04 13:46:42 +01:00
if ( $res < 0 ) {
$error ++ ;
}
2022-02-15 11:46:30 +01:00
} else {
return 0 ;
}
} else {
$error ++ ;
}
2022-02-15 12:46:50 +01:00
if ( $error ) {
2022-02-15 11:46:30 +01:00
return - 1 ;
} else {
return $MoParent ;
}
}
2023-01-09 15:52:33 +01:00
/**
* Return clicable link of object ( with eventually picto )
*
* @ param string $option Where point the link ( 0 => main card , 1 , 2 => shipment , 'nolink' => No link )
2023-01-18 22:27:52 +01:00
* @ param array $arraydata Array of data
* @ return string HTML Code for Kanban thumb .
2023-01-09 15:52:33 +01:00
*/
2023-01-18 22:27:52 +01:00
public function getKanbanView ( $option = '' , $arraydata = null )
2023-01-09 15:52:33 +01:00
{
global $langs ;
2023-03-07 22:04:40 +01:00
$selected = ( empty ( $arraydata [ 'selected' ]) ? 0 : $arraydata [ 'selected' ]);
2023-01-09 15:52:33 +01:00
$return = '<div class="box-flex-item box-flex-grow-zero">' ;
$return .= '<div class="info-box info-box-sm">' ;
$return .= '<span class="info-box-icon bg-infobox-action">' ;
$return .= img_picto ( '' , $this -> picto );
//$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 ) . '</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-07-24 23:20:17 +02:00
if ( ! empty ( $arraydata [ 'bom' ])) {
$return .= '<br><span class="info-box-label">' . $arraydata [ 'bom' ] -> getNomUrl ( 1 ) . '</span>' ;
}
if ( ! empty ( $arraydata [ 'product' ])) {
$return .= '<br><span class="info-box-label">' . $arraydata [ 'product' ] -> getNomUrl ( 1 ) . '</span>' ;
2023-01-09 15:52:33 +01:00
}
if ( property_exists ( $this , 'qty' )) {
$return .= '<br><span class="info-box-label">' . $langs -> trans ( 'Quantity' ) . ' : ' . $this -> qty . '</span>' ;
}
if ( method_exists ( $this , 'getLibStatut' )) {
2023-12-19 11:51:48 +01:00
$return .= '<br><div class="info-box-status">' . $this -> getLibStatut ( 3 ) . '</div>' ;
2023-01-09 15:52:33 +01:00
}
$return .= '</div>' ;
$return .= '</div>' ;
$return .= '</div>' ;
return $return ;
}
2019-10-15 19:59:16 +02:00
}
2024-03-09 02:52:09 +01:00
2019-10-15 19:59:16 +02:00
/**
* Class MoLine . You can also remove this and generate a CRUD class for lines objects .
*/
2019-12-08 23:45:06 +01:00
class MoLine extends CommonObjectLine
2019-10-15 19:59:16 +02:00
{
2019-12-08 23:45:06 +01:00
/**
* @ var string ID to identify managed object
*/
public $element = 'mrp_production' ;
/**
* @ var string Name of table without prefix where object is stored
*/
public $table_element = 'mrp_production' ;
/**
* @ var int Does myobject support multicompany module ? 0 = No test on entity , 1 = Test with field entity , 2 = Test with link by societe
*/
public $ismultientitymanaged = 0 ;
/**
* @ var int Does moline support extrafields ? 0 = No , 1 = Yes
*/
2023-11-18 23:17:57 +01:00
public $isextrafieldmanaged = 1 ;
2019-12-08 23:45:06 +01:00
2019-12-16 13:06:25 +01:00
public $fields = array (
2024-03-08 21:34:18 +01:00
'rowid' => array ( 'type' => 'integer' , 'label' => 'ID' , 'enabled' => 1 , 'visible' => - 1 , 'notnull' => 1 , 'position' => 10 ),
'fk_mo' => array ( 'type' => 'integer' , 'label' => 'Mo' , 'enabled' => 1 , 'visible' => - 1 , 'notnull' => 1 , 'position' => 15 ),
'origin_id' => array ( 'type' => 'integer' , 'label' => 'Origin' , 'enabled' => 1 , 'visible' => - 1 , 'notnull' => 0 , 'position' => 17 ),
'origin_type' => array ( 'type' => 'varchar(10)' , 'label' => 'Origin type' , 'enabled' => 1 , 'visible' => - 1 , 'notnull' => 0 , 'position' => 18 ),
'position' => array ( 'type' => 'integer' , 'label' => 'Position' , 'enabled' => 1 , 'visible' => - 1 , 'notnull' => 1 , 'position' => 20 ),
'fk_product' => array ( 'type' => 'integer' , 'label' => 'Product' , 'enabled' => 1 , 'visible' => - 1 , 'notnull' => 1 , 'position' => 25 ),
'fk_warehouse' => array ( 'type' => 'integer' , 'label' => 'Warehouse' , 'enabled' => 1 , 'visible' => - 1 , 'position' => 30 ),
'qty' => array ( 'type' => 'real' , 'label' => 'Qty' , 'enabled' => 1 , 'visible' => - 1 , 'notnull' => 1 , 'position' => 35 ),
2024-03-11 22:32:48 +01:00
'qty_frozen' => array ( 'type' => 'smallint' , 'label' => 'QuantityFrozen' , 'enabled' => 1 , 'visible' => 1 , 'default' => '0' , 'position' => 105 , 'css' => 'maxwidth50imp' , 'help' => 'QuantityConsumedInvariable' ),
'disable_stock_change' => array ( 'type' => 'smallint' , 'label' => 'DisableStockChange' , 'enabled' => 1 , 'visible' => 1 , 'default' => '0' , 'position' => 108 , 'css' => 'maxwidth50imp' , 'help' => 'DisableStockChangeHelp' ),
2024-03-08 21:34:18 +01:00
'batch' => array ( 'type' => 'varchar(30)' , 'label' => 'Batch' , 'enabled' => 1 , 'visible' => - 1 , 'position' => 140 ),
'role' => array ( 'type' => 'varchar(10)' , 'label' => 'Role' , 'enabled' => 1 , 'visible' => - 1 , 'position' => 145 ),
'fk_mrp_production' => array ( 'type' => 'integer' , 'label' => 'Fk mrp production' , 'enabled' => 1 , 'visible' => - 1 , 'position' => 150 ),
'fk_stock_movement' => array ( 'type' => 'integer' , 'label' => 'StockMovement' , 'enabled' => 1 , 'visible' => - 1 , 'position' => 155 ),
'date_creation' => array ( 'type' => 'datetime' , 'label' => 'DateCreation' , 'enabled' => 1 , 'visible' => - 2 , 'notnull' => 1 , 'position' => 160 ),
'tms' => array ( 'type' => 'timestamp' , 'label' => 'Tms' , 'enabled' => 1 , 'visible' => - 1 , 'notnull' => 1 , 'position' => 165 ),
'fk_user_creat' => array ( 'type' => 'integer' , 'label' => 'UserCreation' , 'enabled' => 1 , 'visible' => - 1 , 'notnull' => 1 , 'position' => 170 ),
'fk_user_modif' => array ( 'type' => 'integer' , 'label' => 'UserModification' , 'enabled' => 1 , 'visible' => - 1 , 'position' => 175 ),
'import_key' => array ( 'type' => 'varchar(14)' , 'label' => 'ImportId' , 'enabled' => 1 , 'visible' => - 1 , 'position' => 180 ),
'fk_default_workstation' => array ( 'type' => 'integer' , 'label' => 'DefaultWorkstation' , 'enabled' => 1 , 'visible' => 1 , 'notnull' => 0 , 'position' => 185 ),
'fk_unit' => array ( 'type' => 'int' , 'label' => 'Unit' , 'enabled' => 1 , 'visible' => 1 , 'notnull' => 0 , 'position' => 186 )
2019-12-08 23:45:06 +01:00
);
public $rowid ;
public $fk_mo ;
2021-02-02 11:19:58 +01:00
public $origin_id ;
public $origin_type ;
2019-12-08 23:45:06 +01:00
public $position ;
public $fk_product ;
public $fk_warehouse ;
public $qty ;
public $qty_frozen ;
public $disable_stock_change ;
2023-02-12 18:31:35 +01:00
public $efficiency ;
2019-12-08 23:45:06 +01:00
public $batch ;
public $role ;
public $fk_mrp_production ;
public $fk_stock_movement ;
public $date_creation ;
public $fk_user_creat ;
public $fk_user_modif ;
public $import_key ;
2023-02-12 18:31:35 +01:00
public $fk_parent_line ;
2023-11-06 11:15:43 +01:00
public $fk_unit ;
2019-12-08 23:45:06 +01:00
2023-04-18 20:49:27 +02:00
/**
* @ var int Service Workstation
2023-04-18 11:01:57 +02:00
*/
2023-04-18 11:06:26 +02:00
public $fk_default_workstation ;
2023-04-18 11:01:57 +02:00
2019-12-08 23:45:06 +01:00
/**
* Constructor
*
2024-01-13 15:50:02 +01:00
* @ param DoliDB $db Database handler
2019-12-08 23:45:06 +01:00
*/
public function __construct ( DoliDB $db )
{
2024-03-09 02:52:09 +01:00
global $langs ;
2019-12-08 23:45:06 +01:00
$this -> db = $db ;
2023-11-27 11:56:32 +01:00
if ( ! getDolGlobalString ( 'MAIN_SHOW_TECHNICAL_ID' ) && isset ( $this -> fields [ 'rowid' ])) {
2021-02-26 18:26:44 +01:00
$this -> fields [ 'rowid' ][ 'visible' ] = 0 ;
}
2022-08-28 14:20:24 +02:00
if ( ! isModEnabled ( 'multicompany' ) && isset ( $this -> fields [ 'entity' ])) {
2021-02-26 18:26:44 +01:00
$this -> fields [ 'entity' ][ 'enabled' ] = 0 ;
}
2019-12-08 23:45:06 +01:00
// Unset fields that are disabled
2021-02-26 18:26:44 +01:00
foreach ( $this -> fields as $key => $val ) {
if ( isset ( $val [ 'enabled' ]) && empty ( $val [ 'enabled' ])) {
2019-12-08 23:45:06 +01:00
unset ( $this -> fields [ $key ]);
}
}
// Translate some data of arrayofkeyval
2021-02-26 18:26:44 +01:00
if ( is_object ( $langs )) {
foreach ( $this -> fields as $key => $val ) {
if ( ! empty ( $val [ 'arrayofkeyval' ]) && is_array ( $val [ 'arrayofkeyval' ])) {
foreach ( $val [ 'arrayofkeyval' ] as $key2 => $val2 ) {
2019-12-16 13:06:25 +01:00
$this -> fields [ $key ][ 'arrayofkeyval' ][ $key2 ] = $langs -> trans ( $val2 );
2019-12-08 23:45:06 +01:00
}
}
}
}
}
/**
* Create object into database
*
* @ param User $user User that creates
2024-01-12 19:48:18 +01:00
* @ param int $notrigger 0 = launch triggers after , 1 = disable triggers
2023-12-01 19:51:32 +01:00
* @ return int Return integer < 0 if KO , Id of created object if OK
2019-12-08 23:45:06 +01:00
*/
2024-01-12 17:47:54 +01:00
public function create ( User $user , $notrigger = 0 )
2019-12-08 23:45:06 +01:00
{
2020-02-12 22:45:27 +01:00
if ( empty ( $this -> qty )) {
$this -> error = 'BadValueForQty' ;
return - 1 ;
}
2019-12-08 23:45:06 +01:00
return $this -> createCommon ( $user , $notrigger );
}
/**
* Load object in memory from the database
*
* @ param int $id Id object
* @ param string $ref Ref
2023-12-01 19:51:32 +01:00
* @ return int Return integer < 0 if KO , 0 if not found , > 0 if OK
2019-12-08 23:45:06 +01:00
*/
public function fetch ( $id , $ref = null )
{
$result = $this -> fetchCommon ( $id , $ref );
return $result ;
}
2019-12-09 00:06:51 +01:00
/**
* Load list of objects in memory from the database .
*
2024-03-05 03:51:36 +01:00
* @ param string $sortorder Sort Order
* @ param string $sortfield Sort field
* @ param int $limit limit
* @ param int $offset Offset
* @ param string | array $filter Filter array . Example array ( 'field' => 'valueforlike' , 'customurl' =>... )
* @ param string $filtermode Filter mode ( AND or OR )
* @ return array | int int < 0 if KO , array of pages if OK
*/
public function fetchAll ( $sortorder = '' , $sortfield = '' , $limit = 0 , $offset = 0 , $filter = '' , $filtermode = 'AND' )
2019-12-09 00:06:51 +01:00
{
dol_syslog ( __METHOD__ , LOG_DEBUG );
$records = array ();
$sql = 'SELECT ' ;
$sql .= $this -> getFieldList ();
$sql .= ' FROM ' . MAIN_DB_PREFIX . $this -> table_element . ' as t' ;
2021-02-26 18:26:44 +01:00
if ( isset ( $this -> ismultientitymanaged ) && $this -> ismultientitymanaged == 1 ) {
2023-01-16 14:40:35 +01:00
$sql .= ' WHERE t.entity IN (' . getEntity ( $this -> element ) . ')' ;
2021-02-26 18:26:44 +01:00
} else {
$sql .= ' WHERE 1 = 1' ;
}
2024-03-05 03:51:36 +01:00
// Deprecated.
if ( is_array ( $filter )) {
$sqlwhere = array ();
if ( count ( $filter ) > 0 ) {
foreach ( $filter as $key => $value ) {
if ( $key == 't.rowid' ) {
$sqlwhere [] = $key . " = " . (( int ) $value );
} elseif ( strpos ( $key , 'date' ) !== false ) {
$sqlwhere [] = $key . " = ' " . $this -> db -> idate ( $value ) . " ' " ;
} else {
$sqlwhere [] = $key . " LIKE '% " . $this -> db -> escape ( $this -> db -> escapeforlike ( $value )) . " %' " ;
}
2019-12-09 00:06:51 +01:00
}
}
2024-03-05 03:51:36 +01:00
if ( count ( $sqlwhere ) > 0 ) {
$sql .= ' AND (' . implode ( ' ' . $this -> db -> escape ( $filtermode ) . ' ' , $sqlwhere ) . ')' ;
}
$filter = '' ;
2019-12-09 00:06:51 +01:00
}
2024-03-05 03:51:36 +01:00
// Manage filter
$errormessage = '' ;
$sql .= forgeSQLFromUniversalSearchCriteria ( $filter , $errormessage );
if ( $errormessage ) {
$this -> errors [] = $errormessage ;
2024-03-08 21:34:18 +01:00
dol_syslog ( __METHOD__ . ' ' . implode ( ',' , $this -> errors ), LOG_ERR );
2024-03-05 03:51:36 +01:00
return - 1 ;
2019-12-09 00:06:51 +01:00
}
if ( ! empty ( $sortfield )) {
$sql .= $this -> db -> order ( $sortfield , $sortorder );
}
if ( ! empty ( $limit )) {
2021-08-27 22:42:04 +02:00
$sql .= $this -> db -> plimit ( $limit , $offset );
2019-12-09 00:06:51 +01:00
}
$resql = $this -> db -> query ( $sql );
if ( $resql ) {
$num = $this -> db -> num_rows ( $resql );
$i = 0 ;
2022-02-08 15:54:31 +01:00
while ( $i < ( $limit ? min ( $limit , $num ) : $num )) {
2019-12-09 00:06:51 +01:00
$obj = $this -> db -> fetch_object ( $resql );
$record = new self ( $this -> db );
$record -> setVarsFromFetchObj ( $obj );
$records [ $record -> id ] = $record ;
$i ++ ;
}
$this -> db -> free ( $resql );
return $records ;
} else {
$this -> errors [] = 'Error ' . $this -> db -> lasterror ();
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
dol_syslog ( __METHOD__ . ' ' . implode ( ',' , $this -> errors ), LOG_ERR );
2019-12-09 00:06:51 +01:00
return - 1 ;
}
}
2019-12-08 23:45:06 +01:00
/**
* Update object into database
*
* @ param User $user User that modifies
2024-01-12 17:47:54 +01:00
* @ param int $notrigger 0 = launch triggers after , 1 = disable triggers
2023-12-01 19:51:32 +01:00
* @ return int Return integer < 0 if KO , > 0 if OK
2019-12-08 23:45:06 +01:00
*/
2024-01-12 17:47:54 +01:00
public function update ( User $user , $notrigger = 0 )
2019-12-08 23:45:06 +01:00
{
return $this -> updateCommon ( $user , $notrigger );
}
/**
* Delete object in database
*
2024-01-12 17:47:54 +01:00
* @ param User $user User that deletes
* @ param int $notrigger 0 = launch triggers after , 1 = disable triggers
* @ return int Return integer < 0 if KO , > 0 if OK
2019-12-08 23:45:06 +01:00
*/
2024-01-12 17:47:54 +01:00
public function delete ( User $user , $notrigger = 0 )
2019-12-08 23:45:06 +01:00
{
return $this -> deleteCommon ( $user , $notrigger );
//return $this->deleteCommon($user, $notrigger, 1);
}
2019-10-15 19:59:16 +02:00
}