2019-02-26 19:27:04 +01:00
< ? php
2023-02-06 18:02:28 +01:00
/* Copyright ( C ) 2019 Laurent Destailleur < eldy @ users . sourceforge . net >
* Copyright ( C ) 2023 Benjamin Falière < benjamin . faliere @ altairis . fr >
2023-05-22 15:52:25 +02:00
* Copyright ( C ) 2023 Charlene Benke < charlene @ patas - monkey . com >
2024-03-02 16:38:35 +01:00
* Copyright ( C ) 2024 Frédéric France < frederic . france @ free . fr >
2024-03-11 22:52:15 +01:00
* Copyright ( C ) 2024 MDW < mdeweerd @ users . noreply . github . com >
2019-02-26 19:27:04 +01:00
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 3 of the License , or
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
2019-09-23 21:55:30 +02:00
* along with this program . If not , see < https :// www . gnu . org / licenses />.
2019-02-26 19:27:04 +01:00
*/
/**
2023-02-02 21:29:23 +01:00
* \file htdocs / bom / class / bom . class . php
2019-02-26 19:27:04 +01:00
* \ingroup bom
2019-03-04 13:30:43 +01:00
* \brief This file is a CRUD class file for BOM ( Create / Read / Update / Delete )
2019-02-26 19:27:04 +01:00
*/
// 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-12 10:03:31 +02:00
require_once DOL_DOCUMENT_ROOT . '/core/lib/date.lib.php' ;
2024-08-31 19:28:02 +02:00
require_once DOL_DOCUMENT_ROOT . '/bom/class/bomline.class.php' ;
2023-07-24 18:45:39 +02:00
if ( isModEnabled ( 'workstation' )) {
require_once DOL_DOCUMENT_ROOT . '/workstation/class/workstation.class.php' ;
}
2021-06-24 09:54:30 +02:00
2019-02-26 19:27:04 +01:00
/**
2019-03-04 13:30:43 +01:00
* Class for BOM
2019-02-26 19:27:04 +01:00
*/
2019-03-04 13:30:43 +01:00
class BOM extends CommonObject
2019-02-26 19:27:04 +01:00
{
2023-06-30 10:14:04 +02:00
/**
* @ var string ID of module .
*/
public $module = 'bom' ;
2019-02-26 19:27:04 +01:00
/**
* @ var string ID to identify managed object
*/
public $element = 'bom' ;
/**
* @ var string Name of table without prefix where object is stored
*/
public $table_element = 'bom_bom' ;
/**
* @ var string String with name of icon for bom . Must be the part after the 'object_' into object_bom . png
*/
2019-03-04 12:46:07 +01:00
public $picto = 'bom' ;
2019-02-26 19:27:04 +01:00
2023-08-29 21:58:28 +02:00
/**
* @ var Product Object product of the BOM
*/
public $product ;
2019-02-26 19:27:04 +01:00
2019-03-12 19:20:01 +01:00
const STATUS_DRAFT = 0 ;
const STATUS_VALIDATED = 1 ;
2019-05-22 19:34:08 +02:00
const STATUS_CANCELED = 9 ;
2019-03-12 19:20:01 +01:00
2019-02-26 19:27:04 +01: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:42:31 +01:00
* Note : Filter can be a string like " (t.ref:like:'SO-%') or (t.date_creation:<:'20160101') or (t.nature:is:NULL) "
2019-02-26 19:27:04 +01: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 .
* 'notnull' is set to 1 if not null in database . Set to - 1 if we must set data to null if empty ( '' or 0 ) .
2020-01-09 22:42:31 +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 )
2019-03-17 01:45:46 +01:00
* 'noteditable' says if field is not editable ( 1 or 0 )
2021-03-15 14:16:55 +01:00
* 'default' is a default value for creation ( can still be overwrote by the Setup of Default Values if field is editable in creation form ) . Note : If default is set to '(PROV)' and field is 'ref' , the default value will be set to '(PROVid)' where id is rowid when a new record is created .
2019-02-26 19:27:04 +01:00
* 'index' if we want an index in database .
2024-01-12 20:58:09 +01:00
* 'foreignkey' => 'tablename.field' if the field is a foreign key ( it is recommended to name the field fk_ ... ) .
2019-02-26 19:27:04 +01: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 ) .
2022-03-24 13:31:03 +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 : 'css' => 'minwidth300 maxwidth500 widthcentpercentminusx' , 'cssview' => 'wordbreak' , 'csslist' => 'tdoverflowmax200'
2021-03-15 14:16:55 +01:00
* 'help' is a 'TranslationString' to use to show a tooltip on field . You can also use 'TranslationString:keyfortooltiponlick' for a tooltip on click .
2019-02-26 19:27:04 +01: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-02-26 19:27:04 +01:00
*/
// BEGIN MODULEBUILDER PROPERTIES
/**
2025-02-05 00:40:06 +01:00
* @ var array < string , array { type : string , label : string , enabled : int < 0 , 2 >| string , position : int , notnull ? : int , visible : int <- 6 , 6 >| string , alwayseditable ? : int < 0 , 1 > , noteditable ? : int < 0 , 1 > , default ? : string , index ? : int , foreignkey ? : string , searchall ? : int < 0 , 1 > , isameasure ? : int < 0 , 1 > , css ? : string , csslist ? : string , help ? : string , showoncombobox ? : int < 0 , 4 > , disabled ? : int < 0 , 1 > , arrayofkeyval ? : array < int | string , string > , autofocusoncreate ? : int < 0 , 1 > , comment ? : string , copytoclipboard ? : int < 1 , 2 > , validate ? : int < 0 , 1 > , showonheader ? : int < 0 , 1 > } > Array with all fields and their property . Do not use it as a static var . It may be modified by constructor .
2019-02-26 19:27:04 +01: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 " ,),
2024-12-05 00:06:24 +01:00
'entity' => array ( 'type' => 'integer' , 'label' => 'Entity' , 'enabled' => 1 , 'visible' => 0 , 'notnull' => 1 , 'default' => '1' , 'index' => 1 , 'position' => 5 ),
2024-03-14 23:58:52 +01:00
'ref' => array ( 'type' => 'varchar(128)' , 'label' => 'Ref' , 'enabled' => 1 , 'noteditable' => 1 , 'visible' => 4 , 'position' => 10 , 'notnull' => 1 , 'default' => '(PROV)' , 'index' => 1 , 'searchall' => 1 , 'comment' => " Reference of BOM " , 'showoncombobox' => 1 , 'csslist' => 'nowraponall' ),
2024-12-05 00:06:24 +01:00
'label' => array ( 'type' => 'varchar(255)' , 'label' => 'Label' , 'enabled' => 1 , 'visible' => 1 , 'position' => 30 , 'notnull' => 1 , 'searchall' => 1 , 'showoncombobox' => 2 , 'autofocusoncreate' => 1 , 'css' => 'minwidth300 maxwidth400' , 'csslist' => 'tdoverflowmax200' ),
2024-03-08 21:34:18 +01:00
'bomtype' => array ( 'type' => 'integer' , 'label' => 'Type' , 'enabled' => 1 , 'visible' => 1 , 'position' => 33 , 'notnull' => 1 , 'default' => '0' , 'arrayofkeyval' => array ( 0 => 'Manufacturing' , 1 => 'Disassemble' ), 'css' => 'minwidth175' , 'csslist' => 'minwidth175 center' ),
2021-03-05 09:47:38 +01:00
//'bomtype' => array('type'=>'integer', 'label'=>'Type', 'enabled'=>1, 'visible'=>-1, 'position'=>32, 'notnull'=>1, 'default'=>'0', 'arrayofkeyval'=>array(0=>'Manufacturing')),
2024-03-08 21:34:18 +01:00
'fk_product' => array ( 'type' => 'integer:Product:product/class/product.class.php:1:((finished:is:null) or (finished:!=:0))' , 'label' => 'Product' , 'picto' => 'product' , 'enabled' => 1 , 'visible' => 1 , 'position' => 35 , 'notnull' => 1 , 'index' => 1 , 'help' => 'ProductBOMHelp' , 'css' => 'maxwidth500' , 'csslist' => 'tdoverflowmax100' ),
'description' => array ( 'type' => 'text' , 'label' => 'Description' , 'enabled' => 1 , 'visible' => - 1 , 'position' => 60 , 'notnull' => - 1 ,),
2024-12-05 00:06:24 +01:00
'qty' => array ( 'type' => 'real' , 'label' => 'Quantity' , 'enabled' => 1 , 'visible' => 1 , 'default' => '1' , 'position' => 55 , 'notnull' => 1 , 'isameasure' => 1 , 'css' => 'maxwidth50imp right' ),
//'efficiency' => array('type'=>'real', 'label'=>'ManufacturingEfficiency', 'enabled'=>1, 'visible'=>-1, 'default'=>'1', 'position'=>100, 'notnull'=>0, 'css'=>'maxwidth50imp', 'help'=>'ValueOfMeansLossForProductProduced'),
2024-03-08 21:34:18 +01:00
'duration' => array ( 'type' => 'duration' , 'label' => 'EstimatedDuration' , 'enabled' => 1 , 'visible' => - 1 , 'position' => 101 , 'notnull' => - 1 , 'css' => 'maxwidth50imp' , 'help' => 'EstimatedDurationDesc' ),
'fk_warehouse' => array ( 'type' => 'integer:Entrepot:product/stock/class/entrepot.class.php:0' , 'label' => 'WarehouseForProduction' , 'picto' => 'stock' , 'enabled' => 1 , 'visible' => - 1 , 'position' => 102 , 'css' => 'maxwidth500' , 'csslist' => 'tdoverflowmax100' ),
'note_public' => array ( 'type' => 'html' , 'label' => 'NotePublic' , 'enabled' => 1 , 'visible' => - 2 , 'position' => 161 , 'notnull' => - 1 ,),
'note_private' => array ( 'type' => 'html' , 'label' => 'NotePrivate' , 'enabled' => 1 , 'visible' => - 2 , 'position' => 162 , 'notnull' => - 1 ,),
'date_creation' => array ( 'type' => 'datetime' , 'label' => 'DateCreation' , 'enabled' => 1 , 'visible' => - 2 , 'position' => 300 , '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 , 'notnull' => 0 ,),
'fk_user_creat' => array ( 'type' => 'integer:User:user/class/user.class.php' , 'label' => 'UserCreation' , 'picto' => 'user' , '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' , 'picto' => 'user' , 'enabled' => 1 , 'visible' => - 2 , 'position' => 511 , 'notnull' => - 1 , 'csslist' => 'tdoverflowmax100' ),
'fk_user_valid' => array ( 'type' => 'integer:User:user/class/user.class.php' , 'label' => 'UserValidation' , 'picto' => 'user' , 'enabled' => 1 , 'visible' => - 2 , 'position' => 512 , 'notnull' => 0 , 'csslist' => 'tdoverflowmax100' ),
'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-12-05 00:06:24 +01:00
'status' => array ( 'type' => 'integer' , 'label' => 'Status' , 'enabled' => 1 , 'visible' => 2 , 'position' => 1000 , 'notnull' => 1 , 'default' => '0' , 'index' => 1 , 'arrayofkeyval' => array ( 0 => 'Draft' , 1 => 'Enabled' , 9 => 'Disabled' )),
2019-02-26 19:27:04 +01:00
);
2020-11-24 21:28:57 +01:00
/**
* @ var int rowid
*/
2019-02-26 19:27:04 +01:00
public $rowid ;
2020-11-24 21:28:57 +01:00
/**
* @ var string ref
*/
2019-02-26 19:27:04 +01:00
public $ref ;
2020-11-24 21:28:57 +01:00
/**
* @ var string label
*/
2019-02-26 19:27:04 +01:00
public $label ;
2020-11-24 21:28:57 +01:00
/**
* @ var int bomtype
*/
2020-11-13 10:26:16 +01:00
public $bomtype ;
2020-11-24 21:28:57 +01:00
/**
* @ var string description
*/
2019-02-26 19:27:04 +01:00
public $description ;
2019-11-01 10:44:29 +01:00
2023-06-28 14:46:45 +02:00
/**
2024-08-07 02:49:38 +02:00
* @ var int | string date_valid
2023-06-28 14:46:45 +02:00
*/
public $date_valid ;
2019-11-01 10:44:29 +01:00
2020-11-24 21:28:57 +01:00
/**
* @ var int Id User creator
*/
2019-02-26 19:27:04 +01:00
public $fk_user_creat ;
2020-11-24 21:28:57 +01:00
/**
* @ var int Id User modifying
*/
2019-02-26 19:27:04 +01:00
public $fk_user_modif ;
2020-11-24 21:28:57 +01:00
2023-06-28 14:46:45 +02:00
/**
* @ var int Id User modifying
*/
public $fk_user_valid ;
/**
* @ var int Id User modifying
*/
public $fk_warehouse ;
2020-11-24 21:28:57 +01:00
/**
* @ var string import key
*/
2019-02-26 19:27:04 +01:00
public $import_key ;
2020-11-24 21:28:57 +01:00
/**
* @ var int status
*/
2019-02-26 19:27:04 +01:00
public $status ;
2020-11-24 21:28:57 +01:00
/**
* @ var int product Id
*/
2019-02-26 19:27:04 +01:00
public $fk_product ;
2024-08-10 23:21:46 +02:00
/**
* @ var float
*/
2019-02-26 19:27:04 +01:00
public $qty ;
2024-08-10 23:21:46 +02:00
/**
2024-08-15 17:05:00 +02:00
* @ var float
2024-08-10 23:21:46 +02:00
*/
2023-06-28 14:46:45 +02:00
public $duration ;
2024-08-10 23:21:46 +02:00
/**
* @ var float
*/
2019-05-25 19:29:33 +02:00
public $efficiency ;
2019-02-26 19:27:04 +01:00
// END MODULEBUILDER PROPERTIES
// If this object has a subtable with lines
/**
2024-01-23 16:07:59 +01:00
* @ var string Name of subtable line
2019-02-26 19:27:04 +01:00
*/
2019-06-22 20:17:40 +02:00
public $table_element_line = 'bom_bomline' ;
2019-02-26 19:27:04 +01:00
/**
2020-12-05 23:53:55 +01:00
* @ var string Fieldname with ID of parent key if this field has a parent
2019-02-26 19:27:04 +01:00
*/
2019-06-22 20:17:40 +02:00
public $fk_element = 'fk_bom' ;
2019-02-26 19:27:04 +01:00
/**
2020-12-05 23:53:55 +01:00
* @ var string Name of subtable class that manage subtable lines
2019-02-26 19:27:04 +01:00
*/
2019-06-22 20:17:40 +02:00
public $class_element_line = 'BOMLine' ;
2020-12-05 23:53:55 +01:00
// /**
// * @var array List of child tables. To test if we can delete object.
// */
// protected $childtables=array();
2019-02-26 19:27:04 +01:00
/**
2024-03-11 22:52:15 +01:00
* @ var string [] List of child tables . To know object to delete on cascade .
2019-02-26 19:27:04 +01:00
*/
2019-11-11 23:59:36 +01:00
protected $childtablesoncascade = array ( 'bom_bomline' );
2019-02-26 19:27:04 +01:00
/**
2019-06-22 20:17:40 +02:00
* @ var BOMLine [] Array of subtable lines
2019-02-26 19:27:04 +01:00
*/
2019-06-22 20:17:40 +02:00
public $lines = array ();
2019-02-26 19:27:04 +01:00
2020-03-30 10:20:56 +02:00
/**
2024-01-23 16:07:59 +01:00
* @ var float Calculated cost for the BOM
2020-03-30 10:20:56 +02:00
*/
public $total_cost = 0 ;
/**
2024-01-23 16:07:59 +01:00
* @ var float Calculated cost for 1 unit of the product in BOM
2020-03-30 10:20:56 +02:00
*/
public $unit_cost = 0 ;
2019-02-26 19:27:04 +01:00
/**
* Constructor
*
2024-01-13 15:50:02 +01:00
* @ param DoliDB $db Database handler
2019-02-26 19:27:04 +01:00
*/
public function __construct ( DoliDB $db )
{
2019-06-20 02:56:44 +02:00
global $conf , $langs ;
2019-02-26 19:27:04 +01:00
$this -> db = $db ;
2024-05-05 00:34:19 +02:00
$this -> ismultientitymanaged = 1 ;
2024-05-03 18:01:17 +02:00
$this -> isextrafieldmanaged = 1 ;
2023-11-27 11:39:32 +01:00
if ( ! getDolGlobalString ( 'MAIN_SHOW_TECHNICAL_ID' ) && isset ( $this -> fields [ 'rowid' ])) {
2021-02-23 17:51:46 +01:00
$this -> fields [ 'rowid' ][ 'visible' ] = 0 ;
}
2022-08-28 13:40:32 +02:00
if ( ! isModEnabled ( 'multicompany' ) && isset ( $this -> fields [ 'entity' ])) {
2021-02-23 17:51:46 +01:00
$this -> fields [ 'entity' ][ 'enabled' ] = 0 ;
}
2019-02-26 19:27:04 +01:00
// Unset fields that are disabled
2021-02-23 17:51:46 +01:00
foreach ( $this -> fields as $key => $val ) {
if ( isset ( $val [ 'enabled' ]) && empty ( $val [ 'enabled' ])) {
2019-02-26 19:27:04 +01:00
unset ( $this -> fields [ $key ]);
}
}
// Translate some data of arrayofkeyval
2021-02-23 17:51:46 +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-02-26 19:27:04 +01:00
}
}
}
}
/**
* Create object into database
*
* @ param User $user User that creates
2024-01-12 17:47:54 +01:00
* @ param int $notrigger false = launch triggers after , true = disable triggers
2023-12-01 19:51:32 +01:00
* @ return int Return integer < 0 if KO , Id of created object if OK
2019-02-26 19:27:04 +01:00
*/
2024-01-12 17:47:54 +01:00
public function create ( User $user , $notrigger = 1 )
2019-02-26 19:27:04 +01:00
{
2021-02-23 17:51:46 +01:00
if ( $this -> efficiency <= 0 || $this -> efficiency > 1 ) {
$this -> efficiency = 1 ;
}
2019-06-13 14:20:13 +02:00
2019-02-26 19:27:04 +01:00
return $this -> createCommon ( $user , $notrigger );
}
/**
* Clone an object into another one
*
* @ param User $user User that creates
* @ param int $fromid Id of object to clone
2024-08-15 17:05:00 +02:00
* @ return BOM | int <- 1 , - 1 > New object created , < 0 if KO
2019-02-26 19:27:04 +01:00
*/
public function createFromClone ( User $user , $fromid )
{
global $langs , $hookmanager , $extrafields ;
2020-10-31 14:32:18 +01:00
$error = 0 ;
2019-02-26 19:27:04 +01:00
2020-10-31 14:32:18 +01:00
dol_syslog ( __METHOD__ , LOG_DEBUG );
2019-02-26 19:27:04 +01:00
2020-10-31 14:32:18 +01:00
$object = new self ( $this -> db );
2019-02-26 19:27:04 +01:00
2020-10-31 14:32:18 +01:00
$this -> db -> begin ();
2019-02-26 19:27:04 +01:00
2020-10-31 14:32:18 +01:00
// Load source object
$result = $object -> fetchCommon ( $fromid );
2021-02-23 17:51:46 +01:00
if ( $result > 0 && ! empty ( $object -> table_element_line )) {
$object -> fetchLines ();
}
2019-06-03 22:07:34 +02:00
2020-10-31 14:32:18 +01:00
// Get lines so they will be clone
//foreach ($object->lines as $line)
// $line->fetch_optionals();
2019-06-03 22:07:34 +02:00
2020-10-31 14:32:18 +01:00
// Reset some properties
unset ( $object -> id );
unset ( $object -> fk_user_creat );
unset ( $object -> import_key );
2019-02-26 19:27:04 +01:00
2020-10-31 14:32:18 +01:00
// Clear fields
2024-08-15 17:05:00 +02:00
$default_ref = $this -> fields [ 'ref' ][ 'default' ] ? ? null ;
$object -> ref = empty ( $default_ref ) ? $langs -> trans ( " copy_of_ " ) . $object -> ref : $default_ref ;
2024-09-29 21:52:31 +02:00
// @phan-suppress-next-line PhanTypeInvalidDimOffset
2020-10-31 14:32:18 +01:00
$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-23 17:51:46 +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 ( $object -> table_element );
2021-02-23 17:51:46 +01:00
foreach ( $object -> array_options as $key => $option ) {
2020-10-31 14:32:18 +01:00
$shortkey = preg_replace ( '/options_/' , '' , $key );
2021-02-23 17:51:46 +01:00
if ( ! empty ( $extrafields -> attributes [ $this -> element ][ 'unique' ][ $shortkey ])) {
2020-10-31 14:32:18 +01:00
//var_dump($key); var_dump($clonedObj->array_options[$key]); exit;
unset ( $object -> array_options [ $key ]);
}
}
}
// Create clone
2019-02-26 19:27:04 +01: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 ;
}
2019-06-03 22:07:34 +02:00
2021-02-23 17:51:46 +01:00
if ( ! $error ) {
2020-10-31 14:32:18 +01:00
// copy internal contacts
2021-02-23 17:51:46 +01:00
if ( $this -> copy_linked_contact ( $object , 'internal' ) < 0 ) {
2020-10-31 14:32:18 +01:00
$error ++ ;
}
}
2019-06-03 22:07:34 +02:00
2021-02-23 17:51:46 +01:00
if ( ! $error ) {
2020-10-31 14:32:18 +01:00
// copy external contacts if same company
2024-08-15 17:05:00 +02:00
// @phan-suppress-next-line PhanUndeclaredProperty
2021-02-23 17:51:46 +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-23 17:51:46 +01:00
}
2020-10-31 14:32:18 +01:00
}
}
2019-06-03 22:07:34 +02:00
2020-10-31 14:32:18 +01:00
// If there is lines, create lines too
2019-06-03 22:07:34 +02:00
2019-02-26 19:27:04 +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-02-26 19:27:04 +01:00
}
/**
* Load object in memory from the database
*
2024-08-15 17:05:00 +02:00
* @ param int $id Id object
* @ param string $ref Ref
* @ return int <- 1 , 1 > Return integer < 0 if KO , 0 if not found , > 0 if OK
2019-02-26 19:27:04 +01:00
*/
public function fetch ( $id , $ref = null )
{
$result = $this -> fetchCommon ( $id , $ref );
2020-07-04 16:14:53 +02:00
2021-02-23 17:51:46 +01:00
if ( $result > 0 && ! empty ( $this -> table_element_line )) {
$this -> fetchLines ();
}
2021-09-20 15:29:55 +02:00
//$this->calculateCosts(); // This consume a high number of subrequests. Do not call it into fetch but when you need it.
2020-07-04 16:14:53 +02:00
2019-02-26 19:27:04 +01: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-02-26 19:27:04 +01:00
*/
2019-03-12 19:20:01 +01:00
public function fetchLines ()
2019-02-26 19:27:04 +01:00
{
2019-11-11 23:59:36 +01:00
$this -> lines = array ();
2019-02-26 19:27:04 +01:00
2019-06-03 18:11:53 +02:00
$result = $this -> fetchLinesCommon ();
return $result ;
2019-03-12 19:20:01 +01:00
}
2019-02-26 19:27:04 +01:00
2022-07-06 13:55:43 +02:00
/**
2022-07-06 17:28:29 +02:00
* Load object lines in memory from the database by type of product
2022-07-06 13:55:43 +02:00
*
2024-08-15 17:05:00 +02:00
* @ param int < 0 , 1 > $typeproduct 0 type product , 1 type service
2022-07-06 17:28:29 +02:00
2024-08-15 17:05:00 +02:00
* @ return int <- 1 , 1 > Return integer < 0 if KO , 0 if not found , > 0 if OK
2022-07-06 13:55:43 +02:00
*/
2022-07-06 17:28:29 +02:00
public function fetchLinesbytypeproduct ( $typeproduct = 0 )
2022-07-06 13:55:43 +02:00
{
$this -> lines = array ();
$objectlineclassname = get_class ( $this ) . 'Line' ;
if ( ! class_exists ( $objectlineclassname )) {
$this -> error = 'Error, class ' . $objectlineclassname . ' not found during call of fetchLinesCommon' ;
return - 1 ;
}
$objectline = new $objectlineclassname ( $this -> db );
2024-08-17 19:32:52 +02:00
'@phan-var-force BOMLine $objectline' ;
2022-07-06 13:55:43 +02:00
$sql = " SELECT " . $objectline -> getFieldList ( 'l' );
$sql .= " FROM " . $this -> db -> prefix () . $objectline -> table_element . " as l " ;
$sql .= " LEFT JOIN " . $this -> db -> prefix () . " product as p ON p.rowid = l.fk_product " ;
$sql .= " WHERE l.fk_ " . $this -> db -> escape ( $this -> element ) . " = " . (( int ) $this -> id );
2022-07-12 12:23:23 +02:00
$sql .= " AND p.fk_product_type = " . (( int ) $typeproduct );
2022-07-06 13:55:43 +02:00
if ( isset ( $objectline -> fields [ 'position' ])) {
$sql .= $this -> db -> order ( 'position' , 'ASC' );
}
$resql = $this -> db -> query ( $sql );
if ( $resql ) {
$num_rows = $this -> db -> num_rows ( $resql );
$i = 0 ;
while ( $i < $num_rows ) {
$obj = $this -> db -> fetch_object ( $resql );
if ( $obj ) {
$newline = new $objectlineclassname ( $this -> db );
2024-08-17 19:32:52 +02:00
'@phan-var-force BOMLine $newline' ;
2022-07-06 13:55:43 +02:00
$newline -> setVarsFromFetchObj ( $obj );
$this -> lines [] = $newline ;
}
$i ++ ;
}
2022-07-12 14:56:25 +02:00
return $num_rows ;
2022-07-06 13:55:43 +02:00
} else {
$this -> error = $this -> db -> lasterror ();
$this -> errors [] = $this -> error ;
return - 1 ;
}
}
2019-02-26 19:27:04 +01:00
/**
* 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
2024-08-15 17:05:00 +02:00
* @ param int < 0 , max > $limit Limit
* @ param int < 0 , max > $offset Offset
2024-03-11 11:23:34 +01:00
* @ param string $filter Filter USF
* @ param string $filtermode Filter mode ( AND or OR )
2024-08-15 17:05:00 +02:00
* @ return BOM [] | int <- 1 , - 1 > int < 0 if KO , array of pages if OK
2024-03-11 11:23:34 +01:00
*/
public function fetchAll ( $sortorder = '' , $sortfield = '' , $limit = 0 , $offset = 0 , $filter = '' , $filtermode = 'AND' )
2019-02-26 19:27:04 +01:00
{
dol_syslog ( __METHOD__ , LOG_DEBUG );
2019-11-11 23:59:36 +01:00
$records = array ();
2019-02-26 19:27:04 +01:00
2019-06-03 18:11:53 +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-23 17:51:46 +01:00
if ( $this -> ismultientitymanaged ) {
2023-01-16 14:40:35 +01:00
$sql .= ' WHERE t.entity IN (' . getEntity ( $this -> element ) . ')' ;
2021-02-23 17:51:46 +01:00
} else {
$sql .= ' WHERE 1 = 1' ;
}
2024-03-05 00:15:33 +01:00
2024-03-11 11:23:34 +01:00
// Manage filter
2024-03-05 00:15:33 +01:00
$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 00:15:33 +01:00
return - 1 ;
2019-02-26 19:27:04 +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-02-26 19:27:04 +01:00
}
$resql = $this -> db -> query ( $sql );
if ( $resql ) {
$num = $this -> db -> num_rows ( $resql );
2021-02-23 17:51:46 +01:00
while ( $obj = $this -> db -> fetch_object ( $resql )) {
2019-02-26 19:27:04 +01:00
$record = new self ( $this -> db );
2019-06-03 18:11:53 +02:00
$record -> setVarsFromFetchObj ( $obj );
2019-02-26 19:27:04 +01:00
$records [ $record -> id ] = $record ;
}
$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-02-26 19:27:04 +01:00
return - 1 ;
}
}
/**
* Update object into database
*
2024-08-15 17:05:00 +02:00
* @ param User $user User that modifies
* @ param int < 0 , 1 > $notrigger 0 = launch triggers after , 1 = disable triggers
* @ return int <- 1 , - 1 >| int < 1 , 1 > Return integer < 0 if KO , > 0 if OK
2019-02-26 19:27:04 +01:00
*/
2024-01-12 17:47:54 +01:00
public function update ( User $user , $notrigger = 1 )
2019-02-26 19:27:04 +01:00
{
2021-02-23 17:51:46 +01:00
if ( $this -> efficiency <= 0 || $this -> efficiency > 1 ) {
$this -> efficiency = 1 ;
}
2019-06-13 14:20:13 +02:00
2019-02-26 19:27:04 +01:00
return $this -> updateCommon ( $user , $notrigger );
}
/**
* Delete object in database
*
2024-08-15 17:05:00 +02:00
* @ param User $user User that deletes
* @ param int < 0 , 1 > $notrigger 0 = launch triggers after , 1 = disable triggers
* @ return int <- 1 , - 1 >| int < 1 , 1 > Return integer < 0 if KO , > 0 if OK
2019-02-26 19:27:04 +01:00
*/
2024-01-12 17:47:54 +01:00
public function delete ( User $user , $notrigger = 1 )
2019-02-26 19:27:04 +01:00
{
return $this -> deleteCommon ( $user , $notrigger );
//return $this->deleteCommon($user, $notrigger, 1);
}
2022-08-15 15:18:08 +02:00
/**
* Add an BOM line into database ( linked to BOM )
*
2024-08-15 17:05:00 +02:00
* @ param int $fk_product Id of product
* @ param float $qty Quantity
* @ param int < 0 , 1 > $qty_frozen If the qty is Frozen
* @ param int $disable_stock_change Disable stock change on using in MO
* @ param float $efficiency Efficiency in MO
* @ param int <- 1 , max > $position Position of BOM - Line in BOM - Lines
* @ param ? int $fk_bom_child Id of BOM Child
* @ param ? string $import_key Import Key
* @ param int $fk_unit Unit
2024-10-25 21:00:02 +02:00
* @ param array < string , mixed > $array_options extrafields array
2024-08-15 17:05:00 +02:00
* @ param ? int $fk_default_workstation Default workstation
* @ return int <- 3 , max > Return integer < 0 if KO , Id of created object if OK
2022-08-15 15:18:08 +02:00
*/
2024-02-27 00:14:53 +01:00
public function addLine ( $fk_product , $qty , $qty_frozen = 0 , $disable_stock_change = 0 , $efficiency = 1.0 , $position = - 1 , $fk_bom_child = null , $import_key = null , $fk_unit = 0 , $array_options = array (), $fk_default_workstation = null )
2022-08-15 15:19:16 +02:00
{
2022-08-15 15:18:08 +02:00
global $mysoc , $conf , $langs , $user ;
$logtext = " ::addLine bomid= $this->id , qty= $qty , fk_product= $fk_product , qty_frozen= $qty_frozen , disable_stock_change= $disable_stock_change , efficiency= $efficiency " ;
$logtext .= " , fk_bom_child= $fk_bom_child , import_key= $import_key " ;
dol_syslog ( get_class ( $this ) . $logtext , LOG_DEBUG );
2022-08-15 15:19:16 +02:00
if ( $this -> statut == self :: STATUS_DRAFT ) {
2022-08-15 15:18:08 +02:00
include_once DOL_DOCUMENT_ROOT . '/core/lib/price.lib.php' ;
// Clean parameters
2022-08-15 15:19:16 +02:00
if ( empty ( $qty )) {
2022-08-15 15:18:08 +02:00
$qty = 0 ;
}
2022-08-15 15:19:16 +02:00
if ( empty ( $qty_frozen )) {
2022-08-15 15:18:08 +02:00
$qty_frozen = 0 ;
}
2022-08-15 15:19:16 +02:00
if ( empty ( $disable_stock_change )) {
2022-08-15 15:18:08 +02:00
$disable_stock_change = 0 ;
}
2022-08-15 15:19:16 +02:00
if ( empty ( $efficiency )) {
2022-08-15 15:18:08 +02:00
$efficiency = 1.0 ;
}
2022-08-15 15:19:16 +02:00
if ( empty ( $fk_bom_child )) {
2022-08-15 15:18:08 +02:00
$fk_bom_child = null ;
}
2022-08-15 15:19:16 +02:00
if ( empty ( $import_key )) {
2024-08-15 17:05:00 +02:00
$import_key = '' ;
2022-08-15 15:18:08 +02:00
}
2022-08-15 15:19:16 +02:00
if ( empty ( $position )) {
2022-08-15 15:18:08 +02:00
$position = - 1 ;
}
2024-01-23 16:07:59 +01:00
$qty = ( float ) price2num ( $qty );
$efficiency = ( float ) price2num ( $efficiency );
$position = ( float ) price2num ( $position );
2022-08-15 15:18:08 +02:00
$this -> db -> begin ();
// Rank to use
2022-08-18 18:07:56 +02:00
$rangMax = $this -> line_max ();
2022-08-15 15:18:08 +02:00
$rankToUse = $position ;
2022-08-18 18:07:56 +02:00
if ( $rankToUse <= 0 or $rankToUse > $rangMax ) { // New line after existing lines
2022-08-15 15:18:08 +02:00
$rankToUse = $rangMax + 1 ;
2022-08-18 18:07:56 +02:00
} else { // New line between the existing lines
foreach ( $this -> lines as $bl ) {
if ( $bl -> position >= $rankToUse ) {
$bl -> position ++ ;
$bl -> update ( $user );
}
}
2022-08-15 15:18:08 +02:00
}
// Insert line
2023-04-27 09:42:54 +02:00
$line = new BOMLine ( $this -> db );
2022-08-15 15:18:08 +02:00
2023-04-27 09:42:54 +02:00
$line -> context = $this -> context ;
2022-08-15 15:18:08 +02:00
2023-04-27 09:42:54 +02:00
$line -> fk_bom = $this -> id ;
$line -> fk_product = $fk_product ;
$line -> qty = $qty ;
$line -> qty_frozen = $qty_frozen ;
$line -> disable_stock_change = $disable_stock_change ;
$line -> efficiency = $efficiency ;
$line -> fk_bom_child = $fk_bom_child ;
$line -> import_key = $import_key ;
$line -> position = $rankToUse ;
$line -> fk_unit = $fk_unit ;
2023-04-27 14:42:56 +02:00
$line -> fk_default_workstation = $fk_default_workstation ;
2022-08-15 15:18:08 +02:00
2022-12-05 12:30:26 +01:00
if ( is_array ( $array_options ) && count ( $array_options ) > 0 ) {
2023-04-27 09:42:54 +02:00
$line -> array_options = $array_options ;
2022-12-05 12:30:26 +01:00
}
2023-04-27 09:42:54 +02:00
$result = $line -> create ( $user );
2022-08-15 15:18:08 +02:00
2022-08-15 15:19:16 +02:00
if ( $result > 0 ) {
2022-08-15 15:18:08 +02:00
$this -> calculateCosts ();
$this -> db -> commit ();
2022-08-18 18:07:56 +02:00
return $result ;
} else {
2023-04-27 09:47:00 +02:00
$this -> setErrorsFromObject ( $line );
2022-08-18 18:07:56 +02:00
dol_syslog ( get_class ( $this ) . " ::addLine error= " . $this -> error , LOG_ERR );
$this -> db -> rollback ();
return - 2 ;
}
} else {
dol_syslog ( get_class ( $this ) . " ::addLine status of BOM must be Draft to allow use of ->addLine() " , LOG_ERR );
return - 3 ;
}
}
/**
* Update an BOM line into database
*
2024-08-15 17:05:00 +02:00
* @ param int $rowid Id of line to update
* @ param float $qty Quantity
* @ param float $qty_frozen Frozen quantity
* @ param int $disable_stock_change Disable stock change on using in MO
* @ param float $efficiency Efficiency in MO
* @ param int <- 1 , max > $position Position of BOM - Line in BOM - Lines
* @ param ? string $import_key Import Key
* @ param int $fk_unit Unit of line
2024-10-25 21:00:02 +02:00
* @ param array < string , mixed > $array_options extrafields array
2024-08-15 17:05:00 +02:00
* @ param ? int $fk_default_workstation Default workstation
* @ return int <- 3 , max > Return integer < 0 if KO , Id of updated BOM - Line if OK
2022-08-18 18:07:56 +02:00
*/
2023-12-20 14:22:45 +01:00
public function updateLine ( $rowid , $qty , $qty_frozen = 0 , $disable_stock_change = 0 , $efficiency = 1.0 , $position = - 1 , $import_key = null , $fk_unit = 0 , $array_options = array (), $fk_default_workstation = null )
2022-08-18 18:07:56 +02:00
{
2024-03-24 17:01:07 +01:00
global $user ;
2022-08-18 18:07:56 +02:00
$logtext = " ::updateLine bomid= $this->id , qty= $qty , qty_frozen= $qty_frozen , disable_stock_change= $disable_stock_change , efficiency= $efficiency " ;
2022-08-19 17:29:05 +02:00
$logtext .= " , import_key= $import_key " ;
2022-08-18 18:07:56 +02:00
dol_syslog ( get_class ( $this ) . $logtext , LOG_DEBUG );
if ( $this -> statut == self :: STATUS_DRAFT ) {
include_once DOL_DOCUMENT_ROOT . '/core/lib/price.lib.php' ;
// Clean parameters
if ( empty ( $qty )) {
$qty = 0 ;
}
if ( empty ( $qty_frozen )) {
$qty_frozen = 0 ;
}
if ( empty ( $disable_stock_change )) {
$disable_stock_change = 0 ;
}
if ( empty ( $efficiency )) {
$efficiency = 1.0 ;
}
if ( empty ( $import_key )) {
2024-08-15 17:05:00 +02:00
$import_key = '' ;
2022-08-18 18:07:56 +02:00
}
if ( empty ( $position )) {
$position = - 1 ;
}
2024-01-23 16:07:59 +01:00
$qty = ( float ) price2num ( $qty );
$efficiency = ( float ) price2num ( $efficiency );
$position = ( float ) price2num ( $position );
2022-08-18 18:07:56 +02:00
$this -> db -> begin ();
2024-10-15 15:39:29 +02:00
// Fetch current line from the database and then clone the object and set it in $oldline property
2022-08-18 18:07:56 +02:00
$line = new BOMLine ( $this -> db );
$line -> fetch ( $rowid );
$line -> fetch_optionals ();
$staticLine = clone $line ;
$line -> oldcopy = $staticLine ;
2023-04-27 09:42:54 +02:00
$line -> context = $this -> context ;
2022-08-18 18:07:56 +02:00
// Rank to use
2022-08-18 18:12:40 +02:00
$rankToUse = ( int ) $position ;
if ( $rankToUse != $line -> oldcopy -> position ) { // check if position have a new value
2022-08-18 18:07:56 +02:00
foreach ( $this -> lines as $bl ) {
2023-12-04 12:01:45 +01:00
if ( $bl -> position >= $rankToUse and $bl -> position < ( $line -> oldcopy -> position + 1 )) { // move rank up
2022-08-18 18:07:56 +02:00
$bl -> position ++ ;
$bl -> update ( $user );
}
2023-12-04 12:01:45 +01:00
if ( $bl -> position <= $rankToUse and $bl -> position > ( $line -> oldcopy -> position )) { // move rank down
2022-08-18 18:07:56 +02:00
$bl -> position -- ;
$bl -> update ( $user );
}
}
}
2023-04-27 09:42:54 +02:00
$line -> fk_bom = $this -> id ;
$line -> qty = $qty ;
$line -> qty_frozen = $qty_frozen ;
$line -> disable_stock_change = $disable_stock_change ;
$line -> efficiency = $efficiency ;
$line -> import_key = $import_key ;
$line -> position = $rankToUse ;
2023-11-06 11:15:43 +01:00
2023-11-19 00:46:09 +01:00
2023-12-04 12:01:45 +01:00
if ( ! empty ( $fk_unit )) {
$line -> fk_unit = $fk_unit ;
}
2023-11-06 11:15:43 +01:00
2022-08-18 18:07:56 +02:00
2022-12-05 12:30:26 +01:00
if ( is_array ( $array_options ) && count ( $array_options ) > 0 ) {
// We replace values in this->line->array_options only for entries defined into $array_options
foreach ( $array_options as $key => $value ) {
2023-04-27 09:42:54 +02:00
$line -> array_options [ $key ] = $array_options [ $key ];
2022-12-05 12:30:26 +01:00
}
}
2024-04-16 22:36:35 +02:00
if ( $line -> fk_default_workstation != $fk_default_workstation ) {
2024-04-18 02:48:52 +02:00
$line -> fk_default_workstation = ( $fk_default_workstation > 0 ? $fk_default_workstation : 0 );
2023-09-04 13:59:28 +02:00
}
2022-12-05 12:30:26 +01:00
2023-04-27 09:42:54 +02:00
$result = $line -> update ( $user );
2022-08-18 18:07:56 +02:00
if ( $result > 0 ) {
$this -> calculateCosts ();
$this -> db -> commit ();
return $result ;
2022-08-15 15:18:08 +02:00
} else {
2023-04-27 09:47:00 +02:00
$this -> setErrorsFromObject ( $line );
2022-08-15 15:18:08 +02:00
dol_syslog ( get_class ( $this ) . " ::addLine error= " . $this -> error , LOG_ERR );
$this -> db -> rollback ();
return - 2 ;
}
2022-08-15 15:19:16 +02:00
} else {
2022-08-15 15:18:08 +02:00
dol_syslog ( get_class ( $this ) . " ::addLine status of BOM must be Draft to allow use of ->addLine() " , LOG_ERR );
return - 3 ;
}
}
2019-06-03 20:46:11 +02:00
/**
* Delete a line of object in database
*
2024-08-15 17:05:00 +02:00
* @ param User $user User that delete
* @ param int $idline Id of line to delete
* @ param int < 0 , 1 > $notrigger 0 = launch triggers after , 1 = disable triggers
* @ return int <- 2 , - 1 >| int < 1 , 1 > > 0 if OK , < 0 if KO
2019-06-03 20:46:11 +02:00
*/
2024-01-12 19:48:18 +01:00
public function deleteLine ( User $user , $idline , $notrigger = 0 )
2019-06-03 20:46:11 +02:00
{
2021-02-23 17:51:46 +01:00
if ( $this -> status < 0 ) {
2019-06-03 20:46:11 +02:00
$this -> error = 'ErrorDeleteLineNotAllowedByObjectStatus' ;
return - 2 ;
}
2022-08-18 18:07:56 +02:00
$this -> db -> begin ();
2024-10-15 15:39:29 +02:00
// Fetch current line from the database and then clone the object and set it in $oldline property
2022-08-18 18:07:56 +02:00
$line = new BOMLine ( $this -> db );
$line -> fetch ( $idline );
$line -> fetch_optionals ();
$staticLine = clone $line ;
$line -> oldcopy = $staticLine ;
2023-04-27 09:42:54 +02:00
$line -> context = $this -> context ;
2022-08-18 18:07:56 +02:00
2023-04-27 09:42:54 +02:00
$result = $line -> delete ( $user , $notrigger );
2022-08-18 18:07:56 +02:00
//Positions (rank) reordering
foreach ( $this -> lines as $bl ) {
if ( $bl -> position > ( $line -> oldcopy -> position )) { // move rank down
$bl -> position -- ;
$bl -> update ( $user );
}
}
if ( $result > 0 ) {
$this -> calculateCosts ();
$this -> db -> commit ();
return $result ;
} else {
2023-04-27 09:47:00 +02:00
$this -> setErrorsFromObject ( $line );
2022-08-18 18:07:56 +02:00
dol_syslog ( get_class ( $this ) . " ::addLine error= " . $this -> error , LOG_ERR );
$this -> db -> rollback ();
return - 2 ;
}
2019-06-03 20:46:11 +02:00
}
2019-03-12 19:20:01 +01:00
2019-03-15 18:06:26 +01:00
/**
* Returns the reference to the following non used BOM depending on the active numbering module
* defined into BOM_ADDON
*
* @ param Product $prod Object product
* @ return string BOM free reference
*/
public function getNextNumRef ( $prod )
{
2020-10-31 14:32:18 +01:00
global $langs , $conf ;
$langs -> load ( " mrp " );
2019-03-15 18:06:26 +01:00
2023-11-27 11:39:32 +01:00
if ( getDolGlobalString ( 'BOM_ADDON' )) {
2020-10-31 14:32:18 +01:00
$mybool = false ;
2023-10-15 15:32:35 +02:00
$file = getDolGlobalString ( 'BOM_ADDON' ) . " .php " ;
2024-01-05 04:18:53 +01:00
$classname = getDolGlobalString ( 'BOM_ADDON' );
2020-10-31 14:32:18 +01:00
// Include file with class
$dirmodels = array_merge ( array ( '/' ), ( array ) $conf -> modules_parts [ 'models' ]);
2021-02-23 17:51:46 +01:00
foreach ( $dirmodels as $reldir ) {
2020-10-31 14:32:18 +01:00
$dir = dol_buildpath ( $reldir . " core/modules/bom/ " );
// Load file with numbering class (if found)
2024-03-21 13:20:56 +01:00
$mybool = (( bool ) @ include_once $dir . $file ) || $mybool ;
2020-10-31 14:32:18 +01:00
}
2024-08-07 03:05:02 +02:00
if ( ! $mybool ) {
2024-01-20 09:22:38 +01:00
dol_print_error ( null , " Failed to include file " . $file );
2020-10-31 14:32:18 +01:00
return '' ;
}
$obj = new $classname ();
2024-08-17 19:32:52 +02:00
'@phan-var-force ModeleNumRefBoms $obj' ;
2020-10-31 14:32:18 +01:00
$numref = $obj -> getNextValue ( $prod , $this );
2021-02-23 17:51:46 +01:00
if ( $numref != " " ) {
2020-10-31 14:32:18 +01:00
return $numref ;
} else {
$this -> error = $obj -> error ;
//dol_print_error($this->db,get_class($this)."::getNextNumRef ".$obj->error);
return " " ;
}
} else {
print $langs -> trans ( " Error " ) . " " . $langs -> trans ( " Error_BOM_ADDON_NotDefined " );
return " " ;
}
2019-03-15 18:06:26 +01:00
}
2019-03-12 19:20:01 +01:00
/**
* Validate bom
*
2024-08-15 17:05:00 +02:00
* @ param User $user User making status change
* @ param int < 0 , 1 > $notrigger 1 = Does not execute triggers , 0 = execute triggers
* @ return int <- 1 , 1 > Return integer <= 0 if OK , 0 = Nothing done , > 0 if KO
2019-03-12 19:20:01 +01:00
*/
2019-10-16 01:36:07 +02:00
public function validate ( $user , $notrigger = 0 )
2019-03-12 19:20:01 +01:00
{
2023-08-29 21:58:28 +02:00
global $conf ;
2019-07-28 22:26:55 +02:00
2020-10-31 14:32:18 +01:00
require_once DOL_DOCUMENT_ROOT . '/core/lib/files.lib.php' ;
2019-03-12 19:20:01 +01:00
2020-10-31 14:32:18 +01:00
$error = 0 ;
2019-03-12 19:20:01 +01:00
2020-10-31 14:32:18 +01:00
// Protection
2021-02-23 17:51:46 +01:00
if ( $this -> status == self :: STATUS_VALIDATED ) {
2024-01-12 20:58:09 +01:00
dol_syslog ( get_class ( $this ) . " ::validate action abandoned: already validated " , LOG_WARNING );
2020-10-31 14:32:18 +01:00
return 0 ;
}
2019-03-12 19:20:01 +01:00
2020-10-31 14:32:18 +01:00
$now = dol_now ();
2019-03-12 19:20:01 +01:00
2020-10-31 14:32:18 +01:00
$this -> db -> begin ();
2019-03-12 19:20:01 +01:00
2020-10-31 14:32:18 +01:00
// Define new ref
2021-02-23 17:51:46 +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
2020-10-31 14:32:18 +01:00
$this -> fetch_product ();
$num = $this -> getNextNumRef ( $this -> product );
} else {
$num = $this -> ref ;
}
$this -> newref = dol_sanitizeFileName ( $num );
2019-03-12 19:20:01 +01:00
2020-10-31 14:32:18 +01:00
// 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 ) . " ', " ;
2021-06-09 15:36:47 +02:00
$sql .= " fk_user_valid = " . (( int ) $user -> id );
$sql .= " WHERE rowid = " . (( int ) $this -> id );
2019-03-12 19:20:01 +01:00
2020-10-31 14:32:18 +01:00
dol_syslog ( get_class ( $this ) . " ::validate() " , LOG_DEBUG );
$resql = $this -> db -> query ( $sql );
2021-02-23 17:51:46 +01:00
if ( ! $resql ) {
2020-10-31 14:32:18 +01:00
dol_print_error ( $this -> db );
$this -> error = $this -> db -> lasterror ();
$error ++ ;
}
2019-03-12 19:20:01 +01:00
2021-02-23 17:51:46 +01:00
if ( ! $error && ! $notrigger ) {
2020-10-31 14:32:18 +01:00
// Call trigger
$result = $this -> call_trigger ( 'BOM_VALIDATE' , $user );
2021-02-23 17:51:46 +01:00
if ( $result < 0 ) {
$error ++ ;
}
2020-10-31 14:32:18 +01:00
// End call triggers
}
2021-02-23 17:51:46 +01:00
if ( ! $error ) {
2020-10-31 14:32:18 +01:00
$this -> oldref = $this -> ref ;
// Rename directory if dir was a temporary ref
2021-02-23 17:51:46 +01:00
if ( preg_match ( '/^[\(]?PROV/i' , $this -> ref )) {
2020-10-31 14:32:18 +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 = 'bom/ " . $this -> db -> escape ( $this -> newref ) . " ' " ;
$sql .= " WHERE filename LIKE ' " . $this -> db -> escape ( $this -> ref ) . " %' AND filepath = 'bom/ " . $this -> db -> escape ( $this -> ref ) . " ' and entity = " . $conf -> entity ;
$resql = $this -> db -> query ( $sql );
2021-02-23 17:51:46 +01:00
if ( ! $resql ) {
2023-12-04 12:01:45 +01:00
$error ++ ;
$this -> error = $this -> db -> lasterror ();
2021-02-23 17:51:46 +01:00
}
2023-10-31 19:28:11 +01:00
$sql = 'UPDATE ' . MAIN_DB_PREFIX . " ecm_files set filepath = 'bom/ " . $this -> db -> escape ( $this -> newref ) . " ' " ;
$sql .= " WHERE filepath = 'bom/ " . $this -> db -> escape ( $this -> ref ) . " ' and entity = " . $conf -> entity ;
$resql = $this -> db -> query ( $sql );
if ( ! $resql ) {
2023-12-04 12:01:45 +01:00
$error ++ ;
$this -> error = $this -> db -> lasterror ();
2023-10-31 19:28:11 +01:00
}
2020-10-31 14:32:18 +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 -> bom -> dir_output . '/' . $oldref ;
$dirdest = $conf -> bom -> dir_output . '/' . $newref ;
2021-02-23 17:51:46 +01:00
if ( ! $error && file_exists ( $dirsource )) {
2020-10-31 14:32:18 +01:00
dol_syslog ( get_class ( $this ) . " ::validate() rename dir " . $dirsource . " into " . $dirdest );
2021-02-23 17:51:46 +01:00
if ( @ rename ( $dirsource , $dirdest )) {
2020-10-31 14:32:18 +01:00
dol_syslog ( " Rename ok " );
// Rename docs starting with $oldref with $newref
$listoffiles = dol_dir_list ( $conf -> bom -> dir_output . '/' . $newref , 'files' , 1 , '^' . preg_quote ( $oldref , '/' ));
2021-02-23 17:51:46 +01:00
foreach ( $listoffiles as $fileentry ) {
2020-10-31 14:32:18 +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-23 17:51:46 +01:00
if ( ! $error ) {
2020-10-31 14:32:18 +01:00
$this -> ref = $num ;
$this -> status = self :: STATUS_VALIDATED ;
}
2021-02-23 17:51:46 +01:00
if ( ! $error ) {
2020-10-31 14:32:18 +01:00
$this -> db -> commit ();
return 1 ;
} else {
$this -> db -> rollback ();
return - 1 ;
}
2019-03-12 19:20:01 +01:00
}
/**
* Set draft status
*
2024-08-15 17:05:00 +02:00
* @ param User $user Object user that modify
* @ param int < 0 , 1 > $notrigger 1 = Does not execute triggers , 0 = Execute triggers
* @ return int <- 1 , 1 > Return integer < 0 if KO , 0 = Nothing done , > 0 if OK
2019-03-12 19:20:01 +01:00
*/
2019-10-16 01:20:58 +02:00
public function setDraft ( $user , $notrigger = 0 )
2019-03-12 19:20:01 +01:00
{
2019-10-16 01:20:58 +02:00
// Protection
2021-02-23 17:51:46 +01:00
if ( $this -> status <= self :: STATUS_DRAFT ) {
2019-10-16 01:20:58 +02:00
return 0 ;
}
2019-03-12 19:20:01 +01:00
2019-10-16 01:20:58 +02:00
return $this -> setStatusCommon ( $user , self :: STATUS_DRAFT , $notrigger , 'BOM_UNVALIDATE' );
}
2019-03-12 19:20:01 +01:00
2019-10-16 01:20:58 +02:00
/**
* Set cancel status
*
2024-08-15 17:05:00 +02:00
* @ param User $user Object user that modify
* @ param int < 0 , 1 > $notrigger 1 = Does not execute triggers , 0 = Execute triggers
* @ return int <- 1 , 1 > Return integer < 0 if KO , 0 = Nothing done , > 0 if OK
2019-10-16 01:20:58 +02:00
*/
public function cancel ( $user , $notrigger = 0 )
{
// Protection
2021-02-23 17:51:46 +01:00
if ( $this -> status != self :: STATUS_VALIDATED ) {
2019-10-16 01:20:58 +02:00
return 0 ;
}
2019-03-12 19:20:01 +01:00
2019-10-16 01:36:07 +02:00
return $this -> setStatusCommon ( $user , self :: STATUS_CANCELED , $notrigger , 'BOM_CLOSE' );
2019-10-16 01:20:58 +02:00
}
2019-03-12 19:20:01 +01:00
2019-10-16 01:20:58 +02:00
/**
2024-08-15 17:05:00 +02:00
* Reopen if canceled
2019-10-16 01:20:58 +02:00
*
2024-08-15 17:05:00 +02:00
* @ param User $user Object user that modify
* @ param int < 0 , 1 > $notrigger 1 = Does not execute triggers , 0 = Execute triggers
* @ return int <- 1 , 1 > Return integer < 0 if KO , 0 = Nothing done , > 0 if OK
2019-10-16 01:20:58 +02:00
*/
public function reopen ( $user , $notrigger = 0 )
{
// Protection
2021-02-23 17:51:46 +01:00
if ( $this -> status != self :: STATUS_CANCELED ) {
2019-10-16 01:20:58 +02:00
return 0 ;
}
2019-03-21 17:37:56 +01:00
2019-10-16 01:36:07 +02:00
return $this -> setStatusCommon ( $user , self :: STATUS_VALIDATED , $notrigger , 'BOM_REOPEN' );
2019-03-12 19:20:01 +01:00
}
2023-02-02 21:29:23 +01:00
/**
* getTooltipContentArray
2024-09-23 03:24:19 +02:00
* @ param array < string , mixed > $params params to construct tooltip data
2023-02-02 21:29:23 +01:00
* @ since v18
2024-09-23 03:24:19 +02:00
* @ return array { picto ? : string , ref ? : string , refsupplier ? : string , label ? : string , date ? : string , date_echeance ? : string , amountht ? : string , total_ht ? : string , totaltva ? : string , amountlt1 ? : string , amountlt2 ? : string , amountrevenustamp ? : string , totalttc ? : string } | array { optimize : string }
2023-02-02 21:29:23 +01:00
*/
public function getTooltipContentArray ( $params )
{
global $conf , $langs , $user ;
2023-02-02 21:57:34 +01:00
$langs -> loadLangs ([ 'product' , 'mrp' ]);
2023-02-02 21:29:23 +01:00
$datas = [];
2023-11-27 11:39:32 +01:00
if ( getDolGlobalString ( 'MAIN_OPTIMIZEFORTEXTBROWSER' )) {
2023-02-02 21:29:23 +01:00
return [ 'optimize' => $langs -> trans ( " ShowBillOfMaterials " )];
}
$picto = img_picto ( '' , $this -> picto ) . ' <u class="paddingrightonly">' . $langs -> trans ( " BillOfMaterials " ) . '</u>' ;
if ( isset ( $this -> status )) {
$picto .= ' ' . $this -> getLibStatut ( 5 );
}
$datas [ 'picto' ] = $picto ;
$datas [ 'ref' ] = '<br><b>' . $langs -> trans ( 'Ref' ) . ':</b> ' . $this -> ref ;
if ( isset ( $this -> label )) {
$datas [ 'label' ] = '<br><b>' . $langs -> trans ( 'Label' ) . ':</b> ' . $this -> label ;
}
if ( ! empty ( $this -> fk_product ) && $this -> fk_product > 0 ) {
include_once DOL_DOCUMENT_ROOT . '/product/class/product.class.php' ;
$product = new Product ( $this -> db );
$resultFetch = $product -> fetch ( $this -> fk_product );
if ( $resultFetch > 0 ) {
$datas [ 'product' ] = " <br><b> " . $langs -> trans ( " Product " ) . '</b>: ' . $product -> ref . ' - ' . $product -> label ;
}
}
return $datas ;
}
2019-10-16 01:36:07 +02:00
2019-02-26 19:27:04 +01:00
/**
2024-01-12 20:58:09 +01:00
* Return a link to the object card ( with optionally the picto )
2019-02-26 19:27:04 +01:00
*
2024-08-15 17:05:00 +02:00
* @ param int < 0 , 2 > $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' , ... )
* @ param int < 0 , 1 > $notooltip 1 = Disable tooltip
* @ param string $morecss Add more css on link
* @ param int <- 1 , 1 > $save_lastsearch_value - 1 = Auto , 0 = No save of lastsearch_values when clicking , 1 = Save lastsearch_values whenclicking
2019-02-26 19:27:04 +01:00
* @ return string String with URL
*/
2019-02-26 21:48:21 +01:00
public function getNomUrl ( $withpicto = 0 , $option = '' , $notooltip = 0 , $morecss = '' , $save_lastsearch_value = - 1 )
2019-02-26 19:27:04 +01:00
{
global $db , $conf , $langs , $hookmanager ;
2020-10-31 14:32:18 +01:00
2021-02-23 17:51:46 +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 21:43:50 +01:00
$params = [
'id' => $this -> id ,
'objecttype' => $this -> element ,
'option' => $option ,
];
$classfortooltip = 'classfortooltip' ;
$dataparams = '' ;
if ( getDolGlobalInt ( 'MAIN_ENABLE_AJAX_TOOLTIP' )) {
$classfortooltip = 'classforajaxtooltip' ;
2023-04-03 19:51:40 +02:00
$dataparams = ' data-params="' . dol_escape_htmltag ( json_encode ( $params )) . '"' ;
$label = '' ;
} else {
$label = implode ( $this -> getTooltipContentArray ( $params ));
2022-01-06 21:48:12 +01:00
}
2021-06-24 09:54:30 +02:00
$url = DOL_URL_ROOT . '/bom/bom_card.php?id=' . $this -> id ;
2020-10-31 14:32:18 +01:00
2021-02-23 17:51:46 +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-23 17:51:46 +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-23 17:51:46 +01:00
if ( empty ( $notooltip )) {
2023-11-27 11:39:32 +01:00
if ( getDolGlobalString ( 'MAIN_OPTIMIZEFORTEXTBROWSER' )) {
2020-10-31 14:32:18 +01:00
$label = $langs -> trans ( " ShowBillOfMaterials " );
2025-01-09 02:01:49 +01:00
$linkclose .= ' alt="' . dolPrintHTMLForAttribute ( $label ) . '"' ;
2020-10-31 14:32:18 +01:00
}
2025-01-09 02:01:49 +01:00
$linkclose .= ( $label ? ' title="' . dolPrintHTMLForAttribute ( $label ) . '"' : ' title="tocomplete"' );
2023-02-05 16:02:03 +01:00
$linkclose .= $dataparams . ' class="' . $classfortooltip . ( $morecss ? ' ' . $morecss : '' ) . '"' ;
2021-02-23 17:51:46 +01:00
} else {
$linkclose = ( $morecss ? ' class="' . $morecss . '"' : '' );
}
2019-02-26 19:27:04 +01:00
$linkstart = '<a href="' . $url . '"' ;
2019-11-11 23:59:36 +01:00
$linkstart .= $linkclose . '>' ;
$linkend = '</a>' ;
2019-02-26 19:27:04 +01:00
$result .= $linkstart ;
2021-02-23 17:51:46 +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-23 17:51:46 +01:00
}
if ( $withpicto != 2 ) {
$result .= $this -> ref ;
}
2019-02-26 19:27:04 +01:00
$result .= $linkend ;
//if ($withpicto != 2) $result.=(($addlabel && $this->label) ? $sep . dol_trunc($this->label, ($addlabel > 1 ? $addlabel : 0)) : '');
2019-11-11 23:59:36 +01:00
global $action , $hookmanager ;
2019-02-26 19:27:04 +01:00
$hookmanager -> initHooks ( array ( 'bomdao' ));
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-23 17:51:46 +01:00
if ( $reshook > 0 ) {
$result = $hookmanager -> resPrint ;
} else {
$result .= $hookmanager -> resPrint ;
}
2019-02-26 19:27:04 +01:00
return $result ;
}
/**
* 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-02-26 19:27:04 +01:00
/**
* Return the status
*
2024-08-15 17:05:00 +02:00
* @ param int $status Id status
* @ param int < 0 , 6 > $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
2019-02-26 19:27:04 +01:00
* @ return string Label of status
*/
public function LibStatut ( $status , $mode = 0 )
{
// phpcs:enable
2021-02-23 17:51:46 +01:00
if ( empty ( $this -> labelStatus )) {
2019-02-26 19:27:04 +01:00
global $langs ;
2019-03-04 12:46:07 +01:00
//$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 ( 'Enabled' );
$this -> labelStatus [ self :: STATUS_CANCELED ] = $langs -> transnoentitiesnoconv ( 'Disabled' );
2019-02-26 19:27:04 +01:00
}
2019-10-24 13:09:50 +02:00
$statusType = 'status' . $status ;
2021-02-23 17:51:46 +01:00
if ( $status == self :: STATUS_VALIDATED ) {
$statusType = 'status4' ;
}
if ( $status == self :: STATUS_CANCELED ) {
$statusType = 'status6' ;
}
2019-10-24 13:09:50 +02:00
2019-11-01 12:52:03 +01:00
return dolGetStatus ( $this -> labelStatus [ $status ], $this -> labelStatus [ $status ], '' , $statusType , $mode );
2019-02-26 19:27:04 +01: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-23 17:51:46 +01:00
if ( $result ) {
if ( $this -> db -> num_rows ( $result )) {
2019-02-26 19:27:04 +01:00
$obj = $this -> db -> fetch_object ( $result );
2023-10-24 11:37:29 +02:00
2019-02-26 19:27:04 +01: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-02-26 19:27:04 +01: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-02-26 19:27:04 +01:00
}
$this -> db -> free ( $result );
2020-05-21 15:05:19 +02:00
} else {
2019-02-26 19:27:04 +01:00
dol_print_error ( $this -> db );
}
}
2019-05-19 16:21:11 +02:00
/**
* Create an array of lines
*
2024-08-15 17:05:00 +02:00
* @ return BOMLine [] | int array of lines if OK , < 0 if KO
2019-05-19 16:21:11 +02:00
*/
public function getLinesArray ()
{
2020-10-31 14:32:18 +01:00
$this -> lines = array ();
2019-05-19 16:21:11 +02:00
2020-10-31 14:32:18 +01:00
$objectline = new BOMLine ( $this -> db );
2024-03-05 03:51:36 +01:00
$result = $objectline -> fetchAll ( 'ASC' , 'position' , 0 , 0 , '(fk_bom:=:' . (( int ) $this -> id ) . ')' );
2019-05-19 16:21:11 +02:00
2021-02-23 17:51:46 +01:00
if ( is_numeric ( $result )) {
2022-06-02 09:46:26 +02: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-05-19 16:21:11 +02:00
}
2019-06-03 20:46:11 +02:00
/**
* Create a document onto disk according to template module .
*
* @ param string $modele Force template to use ( '' to not force )
2024-01-12 20:58:09 +01:00
* @ param Translate $outputlangs object lang a utiliser pour traduction
2024-08-15 17:05:00 +02:00
* @ param int < 0 , 1 > $hidedetails Hide details of lines
* @ param int < 0 , 1 > $hidedesc Hide description
* @ param int < 0 , 1 > $hideref Hide ref
2024-10-25 21:00:02 +02:00
* @ param ? array < string , mixed > $moreparams Array to provide more information
2024-08-15 17:05:00 +02:00
* @ return int < 0 , 1 > 0 if KO , 1 if OK
2019-06-03 20:46:11 +02:00
*/
public function generateDocument ( $modele , $outputlangs , $hidedetails = 0 , $hidedesc = 0 , $hideref = 0 , $moreparams = null )
{
2019-11-11 23:59:36 +01:00
global $conf , $langs ;
2019-06-03 20:46:11 +02:00
$langs -> load ( " mrp " );
2020-08-04 11:02:16 +02:00
$outputlangs -> load ( " products " );
2019-06-03 20:46:11 +02:00
2019-11-11 23:59:36 +01:00
if ( ! dol_strlen ( $modele )) {
2023-07-04 14:57:01 +02:00
$modele = '' ;
2019-06-03 20:46:11 +02:00
2020-09-10 01:49:09 +02:00
if ( $this -> model_pdf ) {
$modele = $this -> model_pdf ;
2023-11-27 11:39:32 +01:00
} elseif ( getDolGlobalString ( 'BOM_ADDON_PDF' )) {
2024-01-05 04:18:53 +01:00
$modele = getDolGlobalString ( 'BOM_ADDON_PDF' );
2019-06-03 20:46:11 +02:00
}
}
$modelpath = " core/modules/bom/doc/ " ;
2023-07-04 14:57:01 +02:00
if ( ! empty ( $modele )) {
return $this -> commonGenerateDocument ( $modelpath , $modele , $outputlangs , $hidedetails , $hidedesc , $hideref , $moreparams );
} else {
return 0 ;
}
2019-06-03 20:46:11 +02:00
}
2024-01-11 10:17:50 +01:00
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
/**
* Return if at least one photo is available
*
* @ param string $sdir Directory to scan
* @ return boolean True if at least one photo is available , False if not
*/
public function is_photo_available ( $sdir )
{
// phpcs:enable
include_once DOL_DOCUMENT_ROOT . '/core/lib/files.lib.php' ;
include_once DOL_DOCUMENT_ROOT . '/core/lib/images.lib.php' ;
$sdir .= '/' . get_exdir ( 0 , 0 , 0 , 0 , $this , 'bom' );
$dir_osencoded = dol_osencode ( $sdir );
if ( file_exists ( $dir_osencoded )) {
$handle = opendir ( $dir_osencoded );
if ( is_resource ( $handle )) {
while (( $file = readdir ( $handle )) !== false ) {
if ( ! utf8_check ( $file )) {
$file = mb_convert_encoding ( $file , 'UTF-8' , 'ISO-8859-1' ); // To be sure data is stored in UTF8 in memory
}
if ( dol_is_file ( $sdir . $file ) && image_format_supported ( $file ) >= 0 ) {
return true ;
}
}
}
}
return false ;
}
2019-02-26 19:27:04 +01:00
/**
* Initialise object with example values
* Id must be 0 if object instance is a specimen
*
2024-08-15 17:05:00 +02:00
* @ return int < 1 , 1 >
2019-02-26 19:27:04 +01:00
*/
public function initAsSpecimen ()
{
2020-10-31 14:32:18 +01:00
$this -> initAsSpecimenCommon ();
$this -> ref = 'BOM-123' ;
2023-08-29 21:58:28 +02:00
$this -> date_creation = dol_now () - 20000 ;
2024-03-02 16:38:35 +01:00
return 1 ;
2019-02-26 19:27:04 +01:00
}
/**
* Action executed by scheduler
* CAN BE A CRON TASK . In such a case , parameters come from the schedule job setup field 'Parameters'
*
* @ return int 0 if OK , <> 0 if KO ( this function is used also by cron so only 0 is OK )
*/
public function doScheduledJob ()
{
global $conf , $langs ;
//$conf->global->SYSLOG_FILE = 'DOL_DATA_ROOT/dolibarr_mydedicatedlofile.log';
$error = 0 ;
$this -> output = '' ;
2019-11-11 23:59:36 +01:00
$this -> error = '' ;
2019-02-26 19:27:04 +01:00
dol_syslog ( __METHOD__ , LOG_DEBUG );
$now = dol_now ();
$this -> db -> begin ();
// ...
$this -> db -> commit ();
return $error ;
}
2020-03-24 10:32:31 +01:00
2020-03-30 10:20:56 +02:00
/**
2021-09-20 15:29:55 +02:00
* BOM costs calculation based on cost_price or pmp of each BOM line .
* Set the property -> total_cost and -> unit_cost of BOM .
2020-05-07 23:39:03 +02:00
*
2024-03-15 16:40:04 +01:00
* @ return int | string Return integer < 0 if KO , > 0 if OK , or printable error result from hook
2020-03-30 10:20:56 +02:00
*/
2020-03-30 10:25:57 +02:00
public function calculateCosts ()
{
2024-12-04 08:42:18 +01:00
global $hookmanager ;
2022-07-06 13:55:43 +02:00
2020-04-10 10:59:32 +02:00
include_once DOL_DOCUMENT_ROOT . '/product/class/product.class.php' ;
2020-03-30 10:20:56 +02:00
$this -> unit_cost = 0 ;
2020-03-24 10:32:31 +01:00
$this -> total_cost = 0 ;
2020-03-30 10:20:56 +02:00
2024-03-08 21:34:18 +01:00
$parameters = array ();
2022-09-15 16:02:49 +02:00
$reshook = $hookmanager -> executeHooks ( 'calculateCostsBom' , $parameters , $this ); // Note that $action and $object may have been modified by hook
if ( $reshook > 0 ) {
return $hookmanager -> resPrint ;
}
2021-09-20 15:29:55 +02:00
if ( is_array ( $this -> lines ) && count ( $this -> lines )) {
require_once DOL_DOCUMENT_ROOT . '/fourn/class/fournisseur.product.class.php' ;
$productFournisseur = new ProductFournisseur ( $this -> db );
2020-03-24 10:32:31 +01:00
$tmpproduct = new Product ( $this -> db );
2021-09-20 15:29:55 +02:00
foreach ( $this -> lines as & $line ) {
$tmpproduct -> cost_price = 0 ;
$tmpproduct -> pmp = 0 ;
2022-07-06 13:55:43 +02:00
$result = $tmpproduct -> fetch ( $line -> fk_product , '' , '' , '' , 0 , 1 , 1 ); // We discard selling price and language loading
2021-09-20 15:29:55 +02:00
2022-07-12 10:09:45 +02:00
if ( $tmpproduct -> type == $tmpproduct :: TYPE_PRODUCT ) {
2022-07-06 13:55:43 +02:00
if ( empty ( $line -> fk_bom_child )) {
if ( $result < 0 ) {
$this -> error = $tmpproduct -> error ;
return - 1 ;
}
2024-02-08 00:10:23 +01:00
$unit_cost = ( ! empty ( $tmpproduct -> cost_price )) ? $tmpproduct -> cost_price : $tmpproduct -> pmp ;
$line -> unit_cost = ( float ) price2num ( $unit_cost );
2022-07-06 13:55:43 +02:00
if ( empty ( $line -> unit_cost )) {
if ( $productFournisseur -> find_min_price_product_fournisseur ( $line -> fk_product ) > 0 ) {
2023-02-09 18:08:23 +01:00
if ( $productFournisseur -> fourn_remise_percent != " 0 " ) {
$line -> unit_cost = $productFournisseur -> fourn_unitprice_with_discount ;
} else {
$line -> unit_cost = $productFournisseur -> fourn_unitprice ;
}
2022-07-06 13:55:43 +02:00
}
2022-01-26 14:41:36 +01:00
}
2020-03-24 10:32:31 +01:00
2024-01-23 16:07:59 +01:00
$line -> total_cost = ( float ) price2num ( $line -> qty * $line -> unit_cost , 'MT' );
2022-01-26 14:41:36 +01:00
2022-07-06 13:55:43 +02:00
$this -> total_cost += $line -> total_cost ;
} else {
$bom_child = new BOM ( $this -> db );
$res = $bom_child -> fetch ( $line -> fk_bom_child );
if ( $res > 0 ) {
$bom_child -> calculateCosts ();
$line -> childBom [] = $bom_child ;
2024-01-23 16:07:59 +01:00
$this -> total_cost += ( float ) price2num ( $bom_child -> total_cost * $line -> qty , 'MT' );
2023-01-18 00:20:53 +01:00
$this -> total_cost += $line -> total_cost ;
2022-07-06 13:55:43 +02:00
} else {
$this -> error = $bom_child -> error ;
return - 2 ;
}
}
2022-01-26 14:41:36 +01:00
} else {
2023-04-27 14:02:59 +02:00
// Convert qty of line into hours
2024-11-15 15:05:51 +01:00
require_once DOL_DOCUMENT_ROOT . '/core/class/cunits.class.php' ;
$measuringUnits = new CUnits ( $this -> db );
$measuringUnits -> fetch ( $line -> fk_unit );
// The unit is a unit for time, so the $measuringUnits->scale is not a power of 10, but directly the factor to change unit into seconds
$qtyhourforline = $line -> qty * ( int ) $measuringUnits -> scale / 3600 ;
2022-07-06 16:51:50 +02:00
2023-11-19 00:46:09 +01:00
if ( isModEnabled ( 'workstation' ) && ! empty ( $line -> fk_default_workstation )) {
2022-09-16 11:11:20 +02:00
$workstation = new Workstation ( $this -> db );
2023-11-19 00:46:09 +01:00
$res = $workstation -> fetch ( $line -> fk_default_workstation );
2022-09-16 11:11:20 +02:00
2023-12-04 12:01:45 +01:00
if ( $res > 0 ) {
2024-01-23 16:07:59 +01:00
$line -> total_cost = ( float ) price2num ( $qtyhourforline * ( $workstation -> thm_operator_estimated + $workstation -> thm_machine_estimated ), 'MT' );
2023-12-04 12:01:45 +01:00
} else {
2022-09-16 11:11:20 +02:00
$this -> error = $workstation -> error ;
2023-12-04 12:01:45 +01:00
return - 3 ;
2022-07-06 13:55:43 +02:00
}
2022-07-06 16:17:22 +02:00
} else {
2023-04-27 14:02:59 +02:00
$defaultdurationofservice = $tmpproduct -> duration ;
$reg = array ();
$qtyhourservice = 0 ;
if ( preg_match ( '/^(\d+)([a-z]+)$/' , $defaultdurationofservice , $reg )) {
2024-10-24 14:01:30 +02:00
$qtyhourservice = convertDurationtoHour (( float ) $reg [ 1 ], $reg [ 2 ]);
2023-04-27 14:02:59 +02:00
}
if ( $qtyhourservice ) {
2024-01-23 16:07:59 +01:00
$line -> total_cost = ( float ) price2num ( $qtyhourforline / $qtyhourservice * $tmpproduct -> cost_price , 'MT' );
2023-04-27 14:02:59 +02:00
} else {
2024-01-23 16:07:59 +01:00
$line -> total_cost = ( float ) price2num ( $line -> qty * $tmpproduct -> cost_price , 'MT' );
2023-04-27 14:02:59 +02:00
}
2022-01-26 14:41:36 +01:00
}
2022-07-06 16:17:22 +02:00
2022-07-06 13:55:43 +02:00
$this -> total_cost += $line -> total_cost ;
2022-01-26 14:41:36 +01:00
}
2021-09-20 15:29:55 +02:00
}
2024-01-23 16:07:59 +01:00
$this -> total_cost = ( float ) price2num ( $this -> total_cost , 'MT' );
2022-07-06 13:55:43 +02:00
2022-01-26 14:41:36 +01:00
if ( $this -> qty > 0 ) {
2024-01-23 16:07:59 +01:00
$this -> unit_cost = ( float ) price2num ( $this -> total_cost / $this -> qty , 'MU' );
2022-01-26 14:41:36 +01:00
} elseif ( $this -> qty < 0 ) {
2024-01-23 16:07:59 +01:00
$this -> unit_cost = ( float ) price2num ( $this -> total_cost * $this -> qty , 'MU' );
2021-09-20 15:29:55 +02:00
}
2020-05-07 23:39:03 +02:00
}
2023-01-04 11:36:46 +01:00
return 1 ;
2020-03-24 10:32:31 +01:00
}
2022-02-09 15:55:21 +01:00
2021-11-23 21:52:40 +01:00
/**
* Function used to replace a product id with another one .
*
2024-08-15 17:05:00 +02:00
* @ param DoliDB $db Database handler
* @ param int $origin_id Old product id
* @ param int $dest_id New product id
2021-11-23 21:52:40 +01:00
* @ return bool
*/
public static function replaceProduct ( DoliDB $db , $origin_id , $dest_id )
{
$tables = array (
'bom_bomline'
);
return CommonObject :: commonReplaceProduct ( $db , $origin_id , $dest_id , $tables );
}
2022-02-22 21:49:17 +01:00
2022-02-09 15:55:21 +01:00
/**
* Get Net needs by product
*
2024-06-24 22:16:47 +02:00
* @ param array < int , array { qty : float , fk_unit : ? int } > $TNetNeeds Array of ChildBom and infos linked to
* @ param float $qty qty needed ( used as a factor to produce 1 unit )
2022-02-09 15:55:21 +01:00
* @ return void
*/
2022-02-10 10:22:53 +01:00
public function getNetNeeds ( & $TNetNeeds = array (), $qty = 0 )
{
2022-08-31 22:14:20 +02:00
if ( ! empty ( $this -> lines )) {
2022-02-10 10:22:53 +01:00
foreach ( $this -> lines as $line ) {
2022-08-31 22:14:20 +02:00
if ( ! empty ( $line -> childBom )) {
2023-12-04 12:01:45 +01:00
foreach ( $line -> childBom as $childBom ) {
2024-03-08 21:34:18 +01:00
$childBom -> getNetNeeds ( $TNetNeeds , $line -> qty * $qty );
2023-12-04 12:01:45 +01:00
}
2022-02-10 10:22:53 +01:00
} else {
2024-06-23 22:10:12 +02:00
if ( empty ( $TNetNeeds [ $line -> fk_product ][ 'qty' ])) {
2024-06-24 22:16:47 +02:00
$TNetNeeds [ $line -> fk_product ][ 'qty' ] = 0.0 ;
2022-05-18 12:31:09 +02:00
}
2024-06-23 22:10:12 +02:00
// When using nested level (or not), the qty for needs must always use the same unit to be able to be cumulated.
// So if unit in bom is not the same than default, we must recalculate qty after units comparisons.
$TNetNeeds [ $line -> fk_product ][ 'fk_unit' ] = $line -> fk_unit ;
$TNetNeeds [ $line -> fk_product ][ 'qty' ] += $line -> qty * $qty ;
2022-02-09 15:55:21 +01:00
}
}
}
}
/**
2024-06-23 22:10:12 +02:00
* Get / add Net needs Tree by product or bom
2022-02-09 15:55:21 +01:00
*
2024-06-25 11:59:32 +02:00
* @ param array < int , array { product : array , bom : BOM , parentid : int , qty : float , level : int , fk_unit : ? int } > $TNetNeeds Array of ChildBom and infos linked to
2024-08-15 17:05:00 +02:00
* @ param float $qty qty needed ( used as a factor to produce 1 unit )
* @ param int < 0 , 1000 > $level level of recursivity
2022-02-09 15:55:21 +01:00
* @ return void
*/
2022-02-10 10:22:53 +01:00
public function getNetNeedsTree ( & $TNetNeeds = array (), $qty = 0 , $level = 0 )
{
2022-08-31 22:14:20 +02:00
if ( ! empty ( $this -> lines )) {
2022-02-10 10:22:53 +01:00
foreach ( $this -> lines as $line ) {
2022-08-31 22:14:20 +02:00
if ( ! empty ( $line -> childBom )) {
2022-02-10 10:22:53 +01:00
foreach ( $line -> childBom as $childBom ) {
2022-02-09 15:55:21 +01:00
$TNetNeeds [ $childBom -> id ][ 'bom' ] = $childBom ;
$TNetNeeds [ $childBom -> id ][ 'parentid' ] = $this -> id ;
2024-06-23 22:10:12 +02:00
// When using nested level (or not), the qty for needs must always use the same unit to be able to be cumulated.
// So if unit in bom is not the same than default, we must recalculate qty after units comparisons.
//$TNetNeeds[$childBom->id]['fk_unit'] = $line->fk_unit;
2024-03-08 21:34:18 +01:00
$TNetNeeds [ $childBom -> id ][ 'qty' ] = $line -> qty * $qty ;
2022-02-09 15:55:21 +01:00
$TNetNeeds [ $childBom -> id ][ 'level' ] = $level ;
2024-03-08 21:34:18 +01:00
$childBom -> getNetNeedsTree ( $TNetNeeds , $line -> qty * $qty , $level + 1 );
2022-02-09 15:55:21 +01:00
}
2022-02-10 10:22:53 +01:00
} else {
2024-06-23 22:10:12 +02:00
// When using nested level (or not), the qty for needs must always use the same unit to be able to be cumulated.
// So if unit in bom is not the same than default, we must recalculate qty after units comparisons.
2024-06-24 22:16:47 +02:00
if ( ! isset ( $TNetNeeds [ $this -> id ][ 'product' ])) {
$TNetNeeds [ $this -> id ][ 'product' ] = array ();
}
if ( ! isset ( $TNetNeeds [ $this -> id ][ 'product' ][ $line -> fk_product ])) {
$TNetNeeds [ $this -> id ][ 'product' ][ $line -> fk_product ] = array ();
}
2024-06-23 22:10:12 +02:00
$TNetNeeds [ $this -> id ][ 'product' ][ $line -> fk_product ][ 'fk_unit' ] = $line -> fk_unit ;
2024-06-25 11:52:56 +02:00
if ( ! isset ( $TNetNeeds [ $this -> id ][ 'product' ][ $line -> fk_product ][ 'qty' ])) {
2024-06-24 22:16:47 +02:00
$TNetNeeds [ $this -> id ][ 'product' ][ $line -> fk_product ][ 'qty' ] = 0.0 ;
}
2022-02-09 15:55:21 +01:00
$TNetNeeds [ $this -> id ][ 'product' ][ $line -> fk_product ][ 'qty' ] += $line -> qty * $qty ;
$TNetNeeds [ $this -> id ][ 'product' ][ $line -> fk_product ][ 'level' ] = $level ;
}
}
}
}
2022-09-01 17:16:59 +02:00
/**
* Recursively retrieves all parent bom in the tree that leads to the $bom_id bom
*
2024-08-15 17:05:00 +02:00
* @ param BOM [] $TParentBom We put all found parent bom in $TParentBom
* @ param int $bom_id ID of bom from which we want to get parent bom ids
* @ param int < 0 , 1000 > $level Protection against infinite loop
2022-09-01 17:16:59 +02:00
* @ return void
*/
2023-12-20 14:22:45 +01:00
public function getParentBomTreeRecursive ( & $TParentBom , $bom_id = 0 , $level = 1 )
2022-09-01 17:23:40 +02:00
{
2022-09-01 17:16:59 +02:00
2022-09-02 10:28:19 +02:00
// Protection against infinite loop
if ( $level > 1000 ) {
2022-09-02 11:57:29 +02:00
return ;
2022-09-02 10:28:19 +02:00
}
2023-12-04 12:01:45 +01:00
if ( empty ( $bom_id )) {
2024-03-08 21:34:18 +01:00
$bom_id = $this -> id ;
2023-12-04 12:01:45 +01:00
}
2022-09-02 10:28:19 +02:00
2022-09-01 17:16:59 +02:00
$sql = ' SELECT l . fk_bom , b . label
FROM '.MAIN_DB_PREFIX.' bom_bomline l
INNER JOIN '.MAIN_DB_PREFIX.$this->table_element.' b ON b . rowid = l . fk_bom
2022-09-02 08:44:16 +02:00
WHERE fk_bom_child = ' . (( int ) $bom_id );
2022-09-01 17:16:59 +02:00
$resql = $this -> db -> query ( $sql );
2022-09-01 17:23:40 +02:00
if ( ! empty ( $resql )) {
while ( $res = $this -> db -> fetch_object ( $resql )) {
2022-09-01 17:16:59 +02:00
$TParentBom [ $res -> fk_bom ] = $res -> fk_bom ;
2024-03-08 21:34:18 +01:00
$this -> getParentBomTreeRecursive ( $TParentBom , $res -> fk_bom , $level + 1 );
2022-09-01 17:16:59 +02:00
}
}
}
2022-12-21 18:18:38 +01:00
/**
2024-08-07 01:20:43 +02:00
* Return clickable link of object ( with eventually picto )
2022-12-21 18:18:38 +01:00
*
2024-08-17 19:32:52 +02:00
* @ param string $option Where point the link ( 0 => main card , 1 , 2 => shipment , 'nolink' => No link )
* @ param array { prod : ? Product , selected : int <- 1 , 1 > } $arraydata Array of data
* @ return string HTML Code for Kanban thumb .
2022-12-21 18:18:38 +01:00
*/
2023-01-18 22:27:52 +01:00
public function getKanbanView ( $option = '' , $arraydata = null )
2022-12-21 18:18:38 +01:00
{
global $db , $langs ;
2023-03-07 22:04:40 +01:00
$selected = ( empty ( $arraydata [ 'selected' ]) ? 0 : $arraydata [ 'selected' ]);
2022-12-21 18:18:38 +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 .= '</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 () : '' ) . '</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"' : '' ) . '>' ;
}
2024-08-15 17:05:00 +02:00
$arrayofkeyval = $this -> fields [ 'bomtype' ][ 'arrayofkeyval' ] ? ? null ;
if ( ! empty ( $arrayofkeyval )) {
2022-12-21 18:18:38 +01:00
$return .= '<br><span class="info-box-label opacitymedium">' . $langs -> trans ( " Type " ) . ' : </span>' ;
if ( $this -> bomtype == 0 ) {
2024-08-15 17:05:00 +02:00
$return .= '<span class="info-box-label">' . $arrayofkeyval [ 0 ] . '</span>' ;
2022-12-21 18:18:38 +01:00
} else {
2024-08-15 17:05:00 +02:00
$return .= '<span class="info-box-label">' . $arrayofkeyval [ 1 ] . '</span>' ;
2022-12-21 18:18:38 +01:00
}
}
2023-10-03 19:54:06 +02:00
if ( ! empty ( $arraydata [ 'prod' ])) {
$prod = $arraydata [ 'prod' ];
2022-12-21 18:18:38 +01:00
$return .= '<br><span class="info-box-label">' . $prod -> getNomUrl ( 1 ) . '</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>' ;
2022-12-21 18:18:38 +01:00
}
$return .= '</div>' ;
$return .= '</div>' ;
$return .= '</div>' ;
return $return ;
}
2019-02-26 19:27:04 +01:00
}