2004-11-30 20:25:48 +01:00
< ? php
2012-03-18 11:13:01 +01:00
/* Copyright ( C ) 2003 - 2006 Rodolphe Quiedeville < rodolphe @ quiedeville . org >
2017-10-07 13:04:31 +02:00
* Copyright ( C ) 2004 - 2017 Laurent Destailleur < eldy @ users . sourceforge . net >
2018-10-27 14:43:12 +02:00
* Copyright ( C ) 2005 - 2012 Regis Houssin < regis . houssin @ inodbox . com >
2012-03-18 11:13:01 +01:00
* Copyright ( C ) 2007 Franky Van Liedekerke < franky . van . liedekerke @ telenet . be >
2020-09-03 12:43:38 +02:00
* Copyright ( C ) 2010 - 2020 Juanjo Menent < jmenent @ 2 byte . es >
2018-09-02 11:08:41 +02:00
* Copyright ( C ) 2010 - 2018 Philippe Grand < philippe . grand @ atoo - net . com >
2015-02-15 15:07:24 +01:00
* Copyright ( C ) 2012 - 2015 Marcos García < marcosgdf @ gmail . com >
2013-04-09 17:18:07 +02:00
* Copyright ( C ) 2013 Florian Henry < florian . henry @ open - concept . pro >
2013-06-04 16:33:23 +02:00
* Copyright ( C ) 2013 Cédric Salvador < csalvador @ gpcsolutions . fr >
2018-09-02 11:08:41 +02:00
* Copyright ( C ) 2018 Nicolas ZABOURI < info @ inovea - conseil . com >
2022-02-15 11:00:05 +01:00
* Copyright ( C ) 2018 - 2022 Frédéric France < frederic . france @ netlogic . fr >
2022-03-22 13:46:55 +01:00
* Copyright ( C ) 2018 - 2022 Ferran Marcet < fmarcet @ 2 byte . es >
2021-07-20 07:07:01 +02:00
* Copyright ( C ) 2021 Josep Lluís Amador < joseplluis @ lliuretic . cat >
2022-01-28 15:08:02 +01:00
* Copyright ( C ) 2022 Gauthier VERDOL < gauthier . verdol @ atm - consulting . fr >
2004-11-30 20:25:48 +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
2013-01-16 15:36:08 +01:00
* the Free Software Foundation ; either version 3 of the License , or
2004-11-30 20:25:48 +01:00
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
2019-09-23 21:55:30 +02:00
* along with this program . If not , see < https :// www . gnu . org / licenses />.
2004-11-30 20:25:48 +01:00
*/
2006-12-11 21:52:39 +01:00
/**
2010-07-21 14:35:56 +02:00
* \file htdocs / fourn / class / fournisseur . commande . class . php
2009-01-09 22:46:58 +01:00
* \ingroup fournisseur , commande
2010-07-21 13:57:52 +02:00
* \brief File of class to manage suppliers orders
2008-07-01 21:46:18 +02:00
*/
2004-11-30 20:25:48 +01:00
2022-03-17 18:53:50 +01:00
require_once DOL_DOCUMENT_ROOT . '/core/class/commonorder.class.php' ;
2012-08-22 23:11:24 +02:00
require_once DOL_DOCUMENT_ROOT . '/product/class/product.class.php' ;
2021-02-25 23:21:30 +01:00
if ( ! empty ( $conf -> productbatch -> enabled )) {
require_once DOL_DOCUMENT_ROOT . '/product/class/productbatch.class.php' ;
}
2016-02-16 23:58:21 +01:00
require_once DOL_DOCUMENT_ROOT . '/multicurrency/class/multicurrency.class.php' ;
2004-11-30 20:25:48 +01:00
2008-07-01 21:46:18 +02:00
/**
2012-04-14 20:21:06 +02:00
* Class to manage predefined suppliers products
2008-07-01 21:46:18 +02:00
*/
2012-07-11 18:13:41 +02:00
class CommandeFournisseur extends CommonOrder
2004-11-30 20:25:48 +01:00
{
2020-09-07 10:18:17 +02:00
/**
2018-08-23 18:35:45 +02:00
* @ var string ID to identify managed object
*/
2019-11-13 19:35:39 +01:00
public $element = 'order_supplier' ;
2018-08-29 15:37:35 +02:00
2020-09-07 10:18:17 +02:00
/**
2018-08-22 18:48:53 +02:00
* @ var string Name of table without prefix where object is stored
*/
2019-11-13 19:35:39 +01:00
public $table_element = 'commande_fournisseur' ;
2018-08-29 15:37:35 +02:00
2020-09-07 10:18:17 +02:00
/**
2020-12-05 23:53:55 +01:00
* @ var string Name of subtable line
2018-09-02 11:08:41 +02:00
*/
public $table_element_line = 'commande_fournisseurdet' ;
2018-09-01 15:27:55 +02:00
2020-09-07 10:18:17 +02:00
/**
2020-12-05 23:53:55 +01:00
* @ var string Field with ID of parent key if this field has a parent
2018-09-01 15:27:55 +02:00
*/
public $fk_element = 'fk_commande' ;
2019-10-30 10:00:52 +01:00
/**
* @ var string String with name of icon for myobject . Must be the part after the 'object_' into object_myobject . png
*/
2020-04-24 23:56:57 +02:00
public $picto = 'supplier_order' ;
2017-06-30 11:40:26 +02:00
2020-09-07 10:18:17 +02:00
/**
* 0 = No test on entity , 1 = Test with field entity , 2 = Test with link by societe
* @ var int
*/
public $ismultientitymanaged = 1 ;
2018-08-29 15:37:35 +02:00
2020-09-07 10:18:17 +02:00
/**
* 0 = Default , 1 = View may be restricted to sales representative only if no permission to see all or to company of external user if external user
* @ var integer
*/
public $restrictiononfksoc = 1 ;
2017-06-30 11:40:26 +02:00
2020-09-07 10:18:17 +02:00
/**
* { @ inheritdoc }
*/
protected $table_ref_field = 'ref' ;
2014-12-25 21:47:39 +01:00
2020-09-07 10:18:17 +02:00
/**
2018-09-01 23:20:20 +02:00
* @ var int ID
*/
public $id ;
2014-05-01 19:17:45 +02:00
2015-04-03 05:18:47 +02:00
/**
2016-02-16 16:45:19 +01:00
* Supplier order reference
2015-11-16 13:29:37 +01:00
* @ var string
2015-04-03 05:18:47 +02:00
*/
2020-09-07 10:18:17 +02:00
public $ref ;
public $ref_supplier ;
public $brouillon ;
public $statut ; // 0=Draft -> 1=Validated -> 2=Approved -> 3=Ordered/Process runing -> 4=Received partially -> 5=Received totally -> (reopen) 4=Received partially
// -> 7=Canceled/Never received -> (reopen) 3=Process runing
// -> 6=Canceled -> (reopen) 2=Approved
// -> 9=Refused -> (reopen) 1=Validated
// Note: billed or not is on another field "billed"
public $statuts ; // List of status
public $billed ;
public $socid ;
public $fourn_id ;
2021-09-23 13:23:16 +02:00
public $date ;
2021-09-15 12:32:18 +02:00
public $date_creation ;
2020-09-07 10:18:17 +02:00
public $date_valid ;
public $date_approve ;
public $date_approve2 ; // Used when SUPPLIER_ORDER_3_STEPS_TO_BE_APPROVED is set
public $date_commande ;
2020-03-24 19:06:37 +01:00
2020-11-11 18:08:40 +01:00
/**
* @ var int Date expected for delivery
* @ deprecated See delivery_date
*/
public $date_livraison ;
2020-09-07 10:18:17 +02:00
/**
2020-11-16 13:57:59 +01:00
* @ var int Date expected for delivery
2020-09-07 10:18:17 +02:00
*/
2020-10-06 11:37:55 +02:00
public $delivery_date ;
2018-09-02 11:08:41 +02:00
2020-09-07 10:18:17 +02:00
public $total_ht ;
public $total_tva ;
public $total_localtax1 ; // Total Local tax 1
public $total_localtax2 ; // Total Local tax 2
public $total_ttc ;
public $source ;
2018-09-02 11:08:41 +02:00
2020-09-07 10:18:17 +02:00
/**
* @ var int ID
*/
public $fk_project ;
2018-10-10 12:16:20 +02:00
2020-09-07 10:18:17 +02:00
public $cond_reglement_id ;
public $cond_reglement_code ;
2021-02-11 14:53:29 +01:00
public $cond_reglement_label ; // Label
public $cond_reglement_doc ; // Label on documents
2018-10-10 12:16:20 +02:00
2020-09-07 10:18:17 +02:00
/**
* @ var int ID
*/
public $fk_account ;
2018-10-10 12:16:20 +02:00
2020-09-07 10:18:17 +02:00
public $mode_reglement_id ;
public $mode_reglement_code ;
public $user_author_id ;
public $user_valid_id ;
public $user_approve_id ;
public $user_approve_id2 ; // Used when SUPPLIER_ORDER_3_STEPS_TO_BE_APPROVED is set
2012-04-11 14:37:36 +02:00
2021-06-05 01:11:05 +02:00
public $refuse_note ;
2020-09-07 10:18:17 +02:00
public $extraparams = array ();
2011-09-11 20:35:38 +02:00
2015-03-23 01:39:12 +01:00
/**
* @ var CommandeFournisseurLigne []
*/
public $lines = array ();
2018-09-02 11:08:41 +02:00
2016-02-16 16:45:19 +01:00
//Add for supplier_proposal
2020-09-07 10:18:17 +02:00
public $origin ;
public $origin_id ;
public $linked_objects = array ();
2011-09-11 20:35:38 +02:00
2016-02-16 23:58:21 +01:00
// Multicurrency
2018-10-10 12:16:20 +02:00
/**
2020-09-07 10:18:17 +02:00
* @ var int ID
*/
public $fk_multicurrency ;
public $multicurrency_code ;
public $multicurrency_tx ;
public $multicurrency_total_ht ;
public $multicurrency_total_tva ;
public $multicurrency_total_ttc ;
2022-03-24 19:27:42 +01:00
/**
* 'type' field format ( 'integer' , 'integer:ObjectClass:PathToClass[:AddCreateButtonOrNot[:Filter[:Sortfield]]]' , 'sellist:TableName:LabelFieldName[:KeyFieldName[:KeyFieldParent[:Filter[:Sortfield]]]]' , 'varchar(x)' , 'double(24,8)' , 'real' , 'price' , 'text' , 'text:none' , 'html' , 'date' , 'datetime' , 'timestamp' , 'duration' , 'mail' , 'phone' , 'url' , 'password' )
* Note : Filter can be a string like " (t.ref:like:'SO-%') or (t.date_creation:<:'20160101') or (t.nature:is:NULL) "
* 'label' the translation key .
* 'picto' is code of a picto to show before value in forms
* 'enabled' is a condition when the field must be managed ( Example : 1 or '$conf->global->MY_SETUP_PARAM' or '!empty($conf->multicurrency->enabled)' ... )
* 'position' is the sort order of field .
* 'notnull' is set to 1 if not null in database . Set to - 1 if we must set data to null if empty ( '' or 0 ) .
* 'visible' says if field is visible in list ( Examples : 0 = Not visible , 1 = Visible on list and create / update / view forms , 2 = Visible on list only , 3 = Visible on create / update / view form only ( not list ), 4 = Visible on list and update / view form only ( not create ) . 5 = Visible on list and view only ( not create / not update ) . Using a negative value means field is not shown by default on list but can be selected for viewing )
* 'noteditable' says if field is not editable ( 1 or 0 )
* 'default' is a default value for creation ( can still be overwrote by the Setup of Default Values if field is editable in creation form ) . Note : If default is set to '(PROV)' and field is 'ref' , the default value will be set to '(PROVid)' where id is rowid when a new record is created .
* 'index' if we want an index in database .
* 'foreignkey' => 'tablename.field' if the field is a foreign key ( it is recommanded to name the field fk_ ... ) .
* '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 or 2 if field can be used for measure . Field type must be summable like integer or double ( 24 , 8 ) . Use 1 in most cases , or 2 if you don ' t want to see the column total into list ( for example for percentage )
* 'css' and 'cssview' and 'csslist' is the CSS style to use on field . 'css' is used in creation and update . 'cssview' is used in view mode . 'csslist' is used for columns in lists . For example : 'css' => 'minwidth300 maxwidth500 widthcentpercentminusx' , 'cssview' => 'wordbreak' , 'csslist' => 'tdoverflowmax200'
* 'help' is a 'TranslationString' to use to show a tooltip on field . You can also use 'TranslationString:keyfortooltiponlick' for a tooltip on click .
* 'showoncombobox' if value of the field must be visible into the label of the combobox that list record
* 'disabled' is 1 if we want to have the field locked by a 'disabled' attribute . In most cases , this is never set into the definition of $fields into class , but is set dynamically by some part of code .
* 'arrayofkeyval' to set a list of values if type is a list of predefined values . For example : array ( " 0 " => " Draft " , " 1 " => " Active " , " -1 " => " Cancel " ) . Note that type can be 'integer' or 'varchar'
* 'autofocusoncreate' to have field having the focus on a create form . Only 1 field should have this property set to 1.
* 'comment' is not used . You can store here any text of your choice . It is not used by application .
* 'validate' is 1 if need to validate with $this -> validateField ()
* 'copytoclipboard' is 1 or 2 to allow to add a picto to copy value into clipboard ( 1 = picto after label , 2 = picto after value )
*
* Note : To have value dynamic , you can set value to 0 in definition and edit the value on the fly into the constructor .
*/
2020-09-07 10:18:17 +02:00
public $fields = array (
2022-03-24 19:27:42 +01:00
'rowid' => array ( 'type' => 'integer' , 'label' => 'TechnicalID' , 'enabled' => 1 , 'visible' => 0 , 'notnull' => 1 , 'position' => 10 ),
'ref' => array ( 'type' => 'varchar(255)' , 'label' => 'Ref' , 'enabled' => 1 , 'visible' => 1 , 'showoncombobox' => 1 , 'position' => 25 , 'searchall' => 1 ),
2020-09-07 10:18:17 +02:00
'ref_ext' => array ( 'type' => 'varchar(255)' , 'label' => 'Ref ext' , 'enabled' => 1 , 'visible' => 0 , 'position' => 35 ),
2022-03-24 19:27:42 +01:00
'ref_supplier' => array ( 'type' => 'varchar(255)' , 'label' => 'RefOrderSupplierShort' , 'enabled' => 1 , 'visible' => 1 , 'position' => 40 , 'searchall' => 1 ),
2022-06-14 17:53:17 +02:00
'fk_projet' => array ( 'type' => 'integer:Project:projet/class/project.class.php:1:fk_statut=1' , 'label' => 'Project' , 'enabled' => '$conf->project->enabled' , 'visible' =>- 1 , 'position' => 45 ),
2022-03-24 19:27:42 +01:00
'date_valid' => array ( 'type' => 'datetime' , 'label' => 'DateValidation' , 'enabled' => 1 , 'visible' =>- 1 , 'position' => 60 ),
'date_approve' => array ( 'type' => 'datetime' , 'label' => 'DateApprove' , 'enabled' => 1 , 'visible' =>- 1 , 'position' => 62 ),
'date_approve2' => array ( 'type' => 'datetime' , 'label' => 'DateApprove2' , 'enabled' => 1 , 'visible' => 3 , 'position' => 64 ),
'date_commande' => array ( 'type' => 'date' , 'label' => 'OrderDateShort' , 'enabled' => 1 , 'visible' => 1 , 'position' => 70 ),
'date_livraison' => array ( 'type' => 'datetime' , 'label' => 'DeliveryDate' , 'enabled' => 'empty($conf->global->ORDER_DISABLE_DELIVERY_DATE)' , 'visible' => 1 , 'position' => 74 ),
'fk_user_author' => array ( 'type' => 'integer:User:user/class/user.class.php' , 'label' => 'UserAuthor' , 'enabled' => 1 , 'visible' => 3 , 'position' => 75 ),
'fk_user_modif' => array ( 'type' => 'integer:User:user/class/user.class.php' , 'label' => 'UserModif' , 'enabled' => 1 , 'visible' => 3 , 'notnull' =>- 1 , 'position' => 80 ),
'fk_user_valid' => array ( 'type' => 'integer:User:user/class/user.class.php' , 'label' => 'UserValidation' , 'enabled' => 1 , 'visible' => 3 , 'position' => 85 ),
'fk_user_approve' => array ( 'type' => 'integer:User:user/class/user.class.php' , 'label' => 'UserApproval' , 'enabled' => 1 , 'visible' => 3 , 'position' => 90 ),
'fk_user_approve2' => array ( 'type' => 'integer:User:user/class/user.class.php' , 'label' => 'UserApproval2' , 'enabled' => 1 , 'visible' => 3 , 'position' => 95 ),
'source' => array ( 'type' => 'smallint(6)' , 'label' => 'Source' , 'enabled' => 1 , 'visible' => 3 , 'notnull' => 1 , 'position' => 100 ),
'billed' => array ( 'type' => 'smallint(6)' , 'label' => 'Billed' , 'enabled' => 1 , 'visible' => 1 , 'position' => 110 ),
'total_tva' => array ( 'type' => 'double(24,8)' , 'label' => 'Tva' , 'enabled' => 1 , 'visible' => 1 , 'position' => 130 , 'isameasure' => 1 ),
'localtax1' => array ( 'type' => 'double(24,8)' , 'label' => 'Localtax1' , 'enabled' => 1 , 'visible' => 3 , 'position' => 135 , 'isameasure' => 1 ),
'localtax2' => array ( 'type' => 'double(24,8)' , 'label' => 'Localtax2' , 'enabled' => 1 , 'visible' => 3 , 'position' => 140 , 'isameasure' => 1 ),
'total_ht' => array ( 'type' => 'double(24,8)' , 'label' => 'TotalHT' , 'enabled' => 1 , 'visible' => 1 , 'position' => 145 , 'isameasure' => 1 ),
2020-09-07 10:18:17 +02:00
'total_ttc' => array ( 'type' => 'double(24,8)' , 'label' => 'TotalTTC' , 'enabled' => 1 , 'visible' =>- 1 , 'position' => 150 , 'isameasure' => 1 ),
2022-09-09 01:39:52 +02:00
'note_public' => array ( 'type' => 'text' , 'label' => 'NotePublic' , 'enabled' => 1 , 'visible' => 0 , 'position' => 155 , 'searchall' => 1 ),
'note_private' => array ( 'type' => 'text' , 'label' => 'NotePrivate' , 'enabled' => 1 , 'visible' => 0 , 'position' => 160 , 'searchall' => 1 ),
2020-09-07 10:18:17 +02:00
'model_pdf' => array ( 'type' => 'varchar(255)' , 'label' => 'ModelPDF' , 'enabled' => 1 , 'visible' => 0 , 'position' => 165 ),
2022-03-24 19:27:42 +01:00
'fk_input_method' => array ( 'type' => 'integer' , 'label' => 'OrderMode' , 'enabled' => 1 , 'visible' => 3 , 'position' => 170 ),
'fk_cond_reglement' => array ( 'type' => 'integer' , 'label' => 'PaymentTerm' , 'enabled' => 1 , 'visible' => 3 , 'position' => 175 ),
'fk_mode_reglement' => array ( 'type' => 'integer' , 'label' => 'PaymentMode' , 'enabled' => 1 , 'visible' => 3 , 'position' => 180 ),
'extraparams' => array ( 'type' => 'varchar(255)' , 'label' => 'Extraparams' , 'enabled' => 1 , 'visible' => 0 , 'position' => 190 ),
2022-05-21 00:08:18 +02:00
'fk_account' => array ( 'type' => 'integer' , 'label' => 'BankAccount' , 'enabled' => '$conf->banque->enabled' , 'visible' => 3 , 'position' => 200 ),
2022-03-24 19:27:42 +01:00
'fk_incoterms' => array ( 'type' => 'integer' , 'label' => 'IncotermCode' , 'enabled' => 1 , 'visible' => 3 , 'position' => 205 ),
'location_incoterms' => array ( 'type' => 'varchar(255)' , 'label' => 'IncotermLocation' , 'enabled' => 1 , 'visible' => 3 , 'position' => 210 ),
'fk_multicurrency' => array ( 'type' => 'integer' , 'label' => 'Fk multicurrency' , 'enabled' => 1 , 'visible' => 0 , 'position' => 215 ),
'multicurrency_code' => array ( 'type' => 'varchar(255)' , 'label' => 'Currency' , 'enabled' => '!empty($conf->multicurrency->enabled)' , 'visible' =>- 1 , 'position' => 220 ),
'multicurrency_tx' => array ( 'type' => 'double(24,8)' , 'label' => 'CurrencyRate' , 'enabled' => '!empty($conf->multicurrency->enabled)' , 'visible' =>- 1 , 'position' => 225 ),
'multicurrency_total_ht' => array ( 'type' => 'double(24,8)' , 'label' => 'MulticurrencyAmountHT' , 'enabled' => '!empty($conf->multicurrency->enabled)' , 'visible' =>- 1 , 'position' => 230 ),
'multicurrency_total_tva' => array ( 'type' => 'double(24,8)' , 'label' => 'MulticurrencyAmountVAT' , 'enabled' => '!empty($conf->multicurrency->enabled)' , 'visible' =>- 1 , 'position' => 235 ),
'multicurrency_total_ttc' => array ( 'type' => 'double(24,8)' , 'label' => 'MulticurrencyAmountTTC' , 'enabled' => '!empty($conf->multicurrency->enabled)' , 'visible' =>- 1 , 'position' => 240 ),
'date_creation' => array ( 'type' => 'datetime' , 'label' => 'Date creation' , 'enabled' => 1 , 'visible' =>- 1 , 'position' => 500 ),
2022-05-21 00:08:18 +02:00
'fk_soc' => array ( 'type' => 'integer:Societe:societe/class/societe.class.php' , 'label' => 'ThirdParty' , 'enabled' => '$conf->societe->enabled' , 'visible' => 1 , 'notnull' => 1 , 'position' => 46 ),
2022-03-24 19:27:42 +01:00
'entity' => array ( 'type' => 'integer' , 'label' => 'Entity' , 'default' => 1 , 'enabled' => 1 , 'visible' => 0 , 'notnull' => 1 , 'position' => 1000 , 'index' => 1 ),
'tms' => array ( 'type' => 'datetime' , 'label' => " DateModificationShort " , 'enabled' => 1 , 'visible' =>- 1 , 'notnull' => 1 , 'position' => 501 ),
'last_main_doc' => array ( 'type' => 'varchar(255)' , 'label' => 'LastMainDoc' , 'enabled' => 1 , 'visible' => 0 , 'position' => 700 ),
'fk_statut' => array ( 'type' => 'smallint(6)' , 'label' => 'Status' , 'enabled' => 1 , 'visible' => 1 , 'position' => 701 ),
'import_key' => array ( 'type' => 'varchar(14)' , 'label' => 'ImportId' , 'enabled' => 1 , 'visible' => 0 , 'position' => 900 ),
2020-09-07 10:18:17 +02:00
);
2020-02-11 19:18:36 +01:00
2017-10-07 13:04:31 +02:00
/**
* Draft status
*/
const STATUS_DRAFT = 0 ;
2018-09-02 11:08:41 +02:00
2017-10-07 13:04:31 +02:00
/**
* Validated status
*/
const STATUS_VALIDATED = 1 ;
2018-09-02 11:08:41 +02:00
2017-10-07 13:04:31 +02:00
/**
* Accepted
*/
const STATUS_ACCEPTED = 2 ;
2018-09-02 11:08:41 +02:00
2017-10-07 13:04:31 +02:00
/**
* Order sent , shipment on process
*/
const STATUS_ORDERSENT = 3 ;
2018-09-02 11:08:41 +02:00
2017-10-07 13:04:31 +02:00
/**
* Received partially
*/
const STATUS_RECEIVED_PARTIALLY = 4 ;
2018-09-02 11:08:41 +02:00
2017-10-07 13:04:31 +02:00
/**
* Received completely
*/
const STATUS_RECEIVED_COMPLETELY = 5 ;
2018-09-02 11:08:41 +02:00
2017-10-07 13:04:31 +02:00
/**
* Order canceled
*/
const STATUS_CANCELED = 6 ;
2018-09-02 11:08:41 +02:00
2017-10-07 13:04:31 +02:00
/**
* Order canceled / never received
*/
const STATUS_CANCELED_AFTER_ORDER = 7 ;
2018-09-02 11:08:41 +02:00
2017-10-07 13:04:31 +02:00
/**
* Refused
*/
const STATUS_REFUSED = 9 ;
2017-06-30 11:40:26 +02:00
2021-05-17 10:47:00 +02:00
/**
* The constant used into source field to track the order was generated by the replenishement feature
*/
const SOURCE_ID_REPLENISHMENT = 42 ;
2017-06-30 11:40:26 +02:00
2015-03-23 01:39:12 +01:00
/**
2020-09-07 10:18:17 +02:00
* Constructor
*
* @ param DoliDB $db Database handler
*/
public function __construct ( $db )
{
$this -> db = $db ;
}
2011-09-11 20:35:38 +02:00
2020-09-07 10:18:17 +02:00
/**
* Get object and lines from database
*
* @ param int $id Id of order to load
* @ param string $ref Ref of object
* @ return int > 0 if OK , < 0 if KO , 0 if not found
*/
public function fetch ( $id , $ref = '' )
{
global $conf ;
// Check parameters
2021-02-25 23:21:30 +01:00
if ( empty ( $id ) && empty ( $ref )) {
return - 1 ;
}
2020-09-07 10:18:17 +02:00
2021-02-21 21:47:26 +01:00
$sql = " SELECT c.rowid, c.entity, c.ref, ref_supplier, c.fk_soc, c.fk_statut, c.amount_ht, c.total_ht, c.total_ttc, c.total_tva, " ;
2020-09-07 10:18:17 +02:00
$sql .= " c.localtax1, c.localtax2, " ;
$sql .= " c.date_creation, c.date_valid, c.date_approve, c.date_approve2, " ;
$sql .= " c.fk_user_author, c.fk_user_valid, c.fk_user_approve, c.fk_user_approve2, " ;
2020-11-11 18:08:40 +01:00
$sql .= " c.date_commande as date_commande, c.date_livraison as delivery_date, c.fk_cond_reglement, c.fk_mode_reglement, c.fk_projet as fk_project, c.remise_percent, c.source, c.fk_input_method, " ;
2020-09-07 10:18:17 +02:00
$sql .= " c.fk_account, " ;
$sql .= " c.note_private, c.note_public, c.model_pdf, c.extraparams, c.billed, " ;
$sql .= " c.fk_multicurrency, c.multicurrency_code, c.multicurrency_tx, c.multicurrency_total_ht, c.multicurrency_total_tva, c.multicurrency_total_ttc, " ;
$sql .= " cm.libelle as methode_commande, " ;
2021-02-11 14:53:29 +01:00
$sql .= " cr.code as cond_reglement_code, cr.libelle as cond_reglement_label, cr.libelle_facture as cond_reglement_doc, " ;
2020-09-07 10:18:17 +02:00
$sql .= " p.code as mode_reglement_code, p.libelle as mode_reglement_libelle " ;
$sql .= ', c.fk_incoterms, c.location_incoterms' ;
$sql .= ', i.libelle as label_incoterms' ;
$sql .= " FROM " . MAIN_DB_PREFIX . " commande_fournisseur as c " ;
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . " c_payment_term as cr ON c.fk_cond_reglement = cr.rowid " ;
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . " c_paiement as p ON c.fk_mode_reglement = p.id " ;
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . " c_input_method as cm ON cm.rowid = c.fk_input_method " ;
$sql .= ' LEFT JOIN ' . MAIN_DB_PREFIX . 'c_incoterms as i ON c.fk_incoterms = i.rowid' ;
2021-02-25 23:21:30 +01:00
if ( empty ( $id )) {
$sql .= " WHERE c.entity IN ( " . getEntity ( 'supplier_order' ) . " ) " ;
} else {
2021-04-24 20:18:11 +02:00
$sql .= " WHERE c.rowid= " . (( int ) $id );
2021-02-25 23:21:30 +01:00
}
2020-09-07 10:18:17 +02:00
2021-02-25 23:21:30 +01:00
if ( $ref ) {
$sql .= " AND c.ref=' " . $this -> db -> escape ( $ref ) . " ' " ;
}
2020-09-07 10:18:17 +02:00
dol_syslog ( get_class ( $this ) . " ::fetch " , LOG_DEBUG );
$resql = $this -> db -> query ( $sql );
2021-02-25 23:21:30 +01:00
if ( $resql ) {
2020-09-07 10:18:17 +02:00
$obj = $this -> db -> fetch_object ( $resql );
2021-02-25 23:21:30 +01:00
if ( ! $obj ) {
2020-09-07 10:18:17 +02:00
$this -> error = 'Bill with id ' . $id . ' not found' ;
dol_syslog ( get_class ( $this ) . '::fetch ' . $this -> error );
return 0 ;
}
2011-09-11 20:35:38 +02:00
2020-09-07 10:18:17 +02:00
$this -> id = $obj -> rowid ;
$this -> entity = $obj -> entity ;
$this -> ref = $obj -> ref ;
$this -> ref_supplier = $obj -> ref_supplier ;
$this -> socid = $obj -> fk_soc ;
$this -> fourn_id = $obj -> fk_soc ;
$this -> statut = $obj -> fk_statut ;
$this -> status = $obj -> fk_statut ;
$this -> billed = $obj -> billed ;
$this -> user_author_id = $obj -> fk_user_author ;
$this -> user_valid_id = $obj -> fk_user_valid ;
$this -> user_approve_id = $obj -> fk_user_approve ;
$this -> user_approve_id2 = $obj -> fk_user_approve2 ;
$this -> total_ht = $obj -> total_ht ;
2021-02-21 21:47:26 +01:00
$this -> total_tva = $obj -> total_tva ;
2020-09-07 10:18:17 +02:00
$this -> total_localtax1 = $obj -> localtax1 ;
$this -> total_localtax2 = $obj -> localtax2 ;
$this -> total_ttc = $obj -> total_ttc ;
2021-09-15 12:32:18 +02:00
$this -> date_creation = $this -> db -> jdate ( $obj -> date_creation );
2020-09-07 10:18:17 +02:00
$this -> date_valid = $this -> db -> jdate ( $obj -> date_valid );
$this -> date_approve = $this -> db -> jdate ( $obj -> date_approve );
$this -> date_approve2 = $this -> db -> jdate ( $obj -> date_approve2 );
$this -> date_commande = $this -> db -> jdate ( $obj -> date_commande ); // date we make the order to supplier
2021-09-26 19:09:09 +02:00
if ( isset ( $obj -> date_commande )) {
$this -> date = $this -> date_commande ;
2021-09-23 13:23:16 +02:00
} else {
2021-09-26 19:09:09 +02:00
$this -> date = $this -> date_creation ;
2021-09-23 13:23:16 +02:00
}
2020-12-01 02:41:19 +01:00
$this -> date_livraison = $this -> db -> jdate ( $obj -> delivery_date ); // deprecated
2020-11-11 18:08:40 +01:00
$this -> delivery_date = $this -> db -> jdate ( $obj -> delivery_date );
2020-09-07 10:18:17 +02:00
$this -> remise_percent = $obj -> remise_percent ;
$this -> methode_commande_id = $obj -> fk_input_method ;
$this -> methode_commande = $obj -> methode_commande ;
$this -> source = $obj -> source ;
$this -> fk_project = $obj -> fk_project ;
$this -> cond_reglement_id = $obj -> fk_cond_reglement ;
$this -> cond_reglement_code = $obj -> cond_reglement_code ;
2021-02-11 14:53:29 +01:00
$this -> cond_reglement = $obj -> cond_reglement_label ; // deprecated
$this -> cond_reglement_label = $obj -> cond_reglement_label ;
$this -> cond_reglement_doc = $obj -> cond_reglement_doc ;
2020-09-07 10:18:17 +02:00
$this -> fk_account = $obj -> fk_account ;
$this -> mode_reglement_id = $obj -> fk_mode_reglement ;
$this -> mode_reglement_code = $obj -> mode_reglement_code ;
$this -> mode_reglement = $obj -> mode_reglement_libelle ;
$this -> note = $obj -> note_private ; // deprecated
$this -> note_private = $obj -> note_private ;
$this -> note_public = $obj -> note_public ;
$this -> model_pdf = $obj -> model_pdf ;
2020-10-31 14:32:18 +01:00
$this -> modelpdf = $obj -> model_pdf ; // deprecated
2012-04-11 14:37:36 +02:00
2015-02-23 09:16:14 +01:00
//Incoterms
$this -> fk_incoterms = $obj -> fk_incoterms ;
2015-04-01 21:00:51 +02:00
$this -> location_incoterms = $obj -> location_incoterms ;
2019-06-25 13:00:02 +02:00
$this -> label_incoterms = $obj -> label_incoterms ;
2015-04-01 21:00:51 +02:00
2016-02-16 23:58:21 +01:00
// Multicurrency
$this -> fk_multicurrency = $obj -> fk_multicurrency ;
2019-11-13 19:35:39 +01:00
$this -> multicurrency_code = $obj -> multicurrency_code ;
2016-02-16 23:58:21 +01:00
$this -> multicurrency_tx = $obj -> multicurrency_tx ;
2019-11-13 19:35:39 +01:00
$this -> multicurrency_total_ht = $obj -> multicurrency_total_ht ;
2016-02-16 23:58:21 +01:00
$this -> multicurrency_total_tva = $obj -> multicurrency_total_tva ;
$this -> multicurrency_total_ttc = $obj -> multicurrency_total_ttc ;
2016-08-05 09:46:17 +02:00
2020-09-07 10:18:17 +02:00
$this -> extraparams = ( array ) json_decode ( $obj -> extraparams , true );
2011-09-11 20:35:38 +02:00
2020-09-07 10:18:17 +02:00
$this -> db -> free ( $resql );
2014-08-30 18:27:34 +02:00
2020-10-23 20:08:35 +02:00
// Retrieve all extrafield
2020-09-07 10:18:17 +02:00
// fetch optionals attributes and labels
$this -> fetch_optionals ();
2011-09-11 20:35:38 +02:00
2021-02-25 23:21:30 +01:00
if ( $this -> statut == 0 ) {
$this -> brouillon = 1 ;
}
2011-09-11 20:35:38 +02:00
2020-09-07 10:18:17 +02:00
/*
2021-02-25 23:21:30 +01:00
* Lines
*/
2020-09-07 10:18:17 +02:00
$result = $this -> fetch_lines ();
2022-03-17 18:53:50 +01:00
2021-02-25 23:21:30 +01:00
if ( $result < 0 ) {
2020-09-07 10:18:17 +02:00
return - 1 ;
} else {
return 1 ;
}
} else {
$this -> error = $this -> db -> error () . " sql= " . $sql ;
return - 1 ;
}
}
2011-09-11 20:35:38 +02:00
2020-09-07 10:18:17 +02:00
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
/**
* Load array lines
*
* @ param int $only_product Return only physical products
* @ return int < 0 if KO , > 0 if OK
*/
public function fetch_lines ( $only_product = 0 )
{
global $conf ;
// phpcs:enable
2022-03-17 18:53:50 +01:00
2020-09-07 10:18:17 +02:00
$this -> lines = array ();
$sql = " SELECT l.rowid, l.ref as ref_supplier, l.fk_product, l.product_type, l.label, l.description, l.qty, " ;
$sql .= " l.vat_src_code, l.tva_tx, l.remise_percent, l.subprice, " ;
$sql .= " l.localtax1_tx, l. localtax2_tx, l.localtax1_type, l. localtax2_type, l.total_localtax1, l.total_localtax2, " ;
$sql .= " l.total_ht, l.total_tva, l.total_ttc, l.special_code, l.fk_parent_line, l.rang, " ;
2021-07-20 07:07:01 +02:00
$sql .= " p.rowid as product_id, p.ref as product_ref, p.label as product_label, p.description as product_desc, p.tobatch as product_tobatch, p.barcode as product_barcode, " ;
2020-09-07 10:18:17 +02:00
$sql .= " l.fk_unit, " ;
$sql .= " l.date_start, l.date_end, " ;
$sql .= ' l.fk_multicurrency, l.multicurrency_code, l.multicurrency_subprice, l.multicurrency_total_ht, l.multicurrency_total_tva, l.multicurrency_total_ttc' ;
2021-02-21 21:47:26 +01:00
$sql .= " FROM " . MAIN_DB_PREFIX . " commande_fournisseurdet as l " ;
2020-09-07 10:18:17 +02:00
$sql .= ' LEFT JOIN ' . MAIN_DB_PREFIX . 'product as p ON l.fk_product = p.rowid' ;
2021-08-27 18:18:50 +02:00
$sql .= " WHERE l.fk_commande = " . (( int ) $this -> id );
2021-02-25 23:21:30 +01:00
if ( $only_product ) {
$sql .= ' AND p.fk_product_type = 0' ;
}
2020-09-07 10:18:17 +02:00
$sql .= " ORDER BY l.rang, l.rowid " ;
//print $sql;
2022-03-28 13:50:47 +02:00
dol_syslog ( get_class ( $this ) . " ::fetch_lines " , LOG_DEBUG );
2020-09-07 10:18:17 +02:00
$result = $this -> db -> query ( $sql );
2021-02-25 23:21:30 +01:00
if ( $result ) {
2020-09-07 10:18:17 +02:00
$num = $this -> db -> num_rows ( $result );
$i = 0 ;
2021-02-25 23:21:30 +01:00
while ( $i < $num ) {
2020-09-07 10:18:17 +02:00
$objp = $this -> db -> fetch_object ( $result );
$line = new CommandeFournisseurLigne ( $this -> db );
$line -> id = $objp -> rowid ;
$line -> desc = $objp -> description ;
$line -> description = $objp -> description ;
$line -> qty = $objp -> qty ;
$line -> tva_tx = $objp -> tva_tx ;
$line -> localtax1_tx = $objp -> localtax1_tx ;
$line -> localtax2_tx = $objp -> localtax2_tx ;
$line -> localtax1_type = $objp -> localtax1_type ;
$line -> localtax2_type = $objp -> localtax2_type ;
$line -> subprice = $objp -> subprice ;
$line -> pu_ht = $objp -> subprice ;
$line -> remise_percent = $objp -> remise_percent ;
$line -> vat_src_code = $objp -> vat_src_code ;
$line -> total_ht = $objp -> total_ht ;
$line -> total_tva = $objp -> total_tva ;
$line -> total_localtax1 = $objp -> total_localtax1 ;
$line -> total_localtax2 = $objp -> total_localtax2 ;
$line -> total_ttc = $objp -> total_ttc ;
$line -> product_type = $objp -> product_type ;
$line -> fk_product = $objp -> fk_product ;
$line -> libelle = $objp -> product_label ; // deprecated
$line -> product_label = $objp -> product_label ;
$line -> product_desc = $objp -> product_desc ;
2021-07-20 07:07:01 +02:00
$line -> product_tobatch = $objp -> product_tobatch ;
$line -> product_barcode = $objp -> product_barcode ;
2020-09-07 10:18:17 +02:00
$line -> ref = $objp -> product_ref ; // Ref of product
$line -> product_ref = $objp -> product_ref ; // Ref of product
$line -> ref_fourn = $objp -> ref_supplier ; // The supplier ref of price when product was added. May have change since
$line -> ref_supplier = $objp -> ref_supplier ; // The supplier ref of price when product was added. May have change since
2018-04-14 17:04:38 +02:00
2021-02-25 23:21:30 +01:00
if ( ! empty ( $conf -> global -> PRODUCT_USE_SUPPLIER_PACKAGING )) {
2022-03-17 18:53:50 +01:00
// TODO We should not fetch this properties into the fetch_lines. This is NOT properties of a line.
// Move this into another method and call it when required.
// Take better packaging for $objp->qty (first supplier ref quantity <= $objp->qty)
$sqlsearchpackage = 'SELECT rowid, packaging FROM ' . MAIN_DB_PREFIX . " product_fournisseur_price " ;
$sqlsearchpackage .= ' WHERE entity IN (' . getEntity ( 'product_fournisseur_price' ) . " ) " ;
$sqlsearchpackage .= " AND fk_product = " . (( int ) $objp -> fk_product );
$sqlsearchpackage .= " AND ref_fourn = ' " . $this -> db -> escape ( $objp -> ref_supplier ) . " ' " ;
$sqlsearchpackage .= " AND quantity <= " . (( float ) $objp -> qty ); // required to be qualified
$sqlsearchpackage .= " AND (packaging IS NULL OR packaging = 0 OR packaging <= " . (( float ) $objp -> qty ) . " ) " ; // required to be qualified
$sqlsearchpackage .= " AND fk_soc = " . (( int ) $this -> socid );
$sqlsearchpackage .= " ORDER BY packaging ASC " ; // Take the smaller package first
$sqlsearchpackage .= " LIMIT 1 " ;
$resqlsearchpackage = $this -> db -> query ( $sqlsearchpackage );
if ( $resqlsearchpackage ) {
$objsearchpackage = $this -> db -> fetch_object ( $resqlsearchpackage );
if ( $objsearchpackage ) {
$line -> fk_fournprice = $objsearchpackage -> rowid ;
$line -> packaging = $objsearchpackage -> packaging ;
}
} else {
$this -> error = $this -> db -> lasterror ();
return - 1 ;
}
2019-11-23 19:05:49 +01:00
}
2022-03-17 18:53:50 +01:00
$line -> date_start = $this -> db -> jdate ( $objp -> date_start );
2020-09-08 21:27:28 +02:00
$line -> date_end = $this -> db -> jdate ( $objp -> date_end );
$line -> fk_unit = $objp -> fk_unit ;
// Multicurrency
$line -> fk_multicurrency = $objp -> fk_multicurrency ;
$line -> multicurrency_code = $objp -> multicurrency_code ;
$line -> multicurrency_subprice = $objp -> multicurrency_subprice ;
$line -> multicurrency_total_ht = $objp -> multicurrency_total_ht ;
$line -> multicurrency_total_tva = $objp -> multicurrency_total_tva ;
$line -> multicurrency_total_ttc = $objp -> multicurrency_total_ttc ;
$line -> special_code = $objp -> special_code ;
$line -> fk_parent_line = $objp -> fk_parent_line ;
$line -> rang = $objp -> rang ;
2020-10-23 20:08:35 +02:00
// Retrieve all extrafield
2020-09-08 21:27:28 +02:00
// fetch optionals attributes and labels
$line -> fetch_optionals ();
$this -> lines [ $i ] = $line ;
$i ++ ;
}
$this -> db -> free ( $result );
return $num ;
} else {
$this -> error = $this -> db -> error () . " sql= " . $sql ;
return - 1 ;
}
}
/**
* Validate an order
*
* @ param User $user Validator User
* @ param int $idwarehouse Id of warehouse to use for stock decrease
* @ param int $notrigger 1 = Does not execute triggers , 0 = execute triggers
* @ return int < 0 if KO , > 0 if OK
*/
public function valid ( $user , $idwarehouse = 0 , $notrigger = 0 )
{
global $langs , $conf ;
require_once DOL_DOCUMENT_ROOT . '/core/lib/files.lib.php' ;
$error = 0 ;
dol_syslog ( get_class ( $this ) . " ::valid " );
$result = 0 ;
2021-04-12 09:59:03 +02:00
if (( empty ( $conf -> global -> MAIN_USE_ADVANCED_PERMS ) && ( ! empty ( $user -> rights -> fournisseur -> commande -> creer ) || ! empty ( $user -> rights -> supplier_order -> creer )))
2021-04-13 20:28:25 +02:00
|| ( ! empty ( $conf -> global -> MAIN_USE_ADVANCED_PERMS ) && ! empty ( $user -> rights -> fournisseur -> supplier_order_advance -> validate ))) {
$this -> db -> begin ();
2020-09-08 21:27:28 +02:00
2021-04-13 20:28:25 +02:00
// Definition of supplier order numbering model name
$soc = new Societe ( $this -> db );
$soc -> fetch ( $this -> fourn_id );
2020-09-08 21:27:28 +02:00
2021-04-13 20:28:25 +02:00
// Check if object has a temporary ref
2021-04-13 22:12:47 +02:00
if ( preg_match ( '/^[\(]?PROV/i' , $this -> ref ) || empty ( $this -> ref )) { // empty should not happened, but when it occurs, the test save life
$num = $this -> getNextNumRef ( $soc );
} else {
$num = $this -> ref ;
}
2021-04-13 20:28:25 +02:00
$this -> newref = dol_sanitizeFileName ( $num );
2020-09-08 21:27:28 +02:00
2021-04-13 20:28:25 +02:00
$sql = 'UPDATE ' . MAIN_DB_PREFIX . " commande_fournisseur " ;
$sql .= " SET ref=' " . $this -> db -> escape ( $num ) . " ', " ;
$sql .= " fk_statut = " . self :: STATUS_VALIDATED . " , " ;
$sql .= " date_valid=' " . $this -> db -> idate ( dol_now ()) . " ', " ;
2021-08-23 19:33:24 +02:00
$sql .= " fk_user_valid = " . (( int ) $user -> id );
$sql .= " WHERE rowid = " . (( int ) $this -> id );
2021-04-13 20:28:25 +02:00
$sql .= " AND fk_statut = " . self :: STATUS_DRAFT ;
2020-09-08 21:27:28 +02:00
2021-04-13 20:28:25 +02:00
$resql = $this -> db -> query ( $sql );
2021-04-13 22:12:47 +02:00
if ( ! $resql ) {
dol_print_error ( $this -> db );
$error ++ ;
}
if ( ! $error && ! $notrigger ) {
// Call trigger
$result = $this -> call_trigger ( 'ORDER_SUPPLIER_VALIDATE' , $user );
if ( $result < 0 ) {
2021-02-25 23:21:30 +01:00
$error ++ ;
}
2021-04-13 22:12:47 +02:00
// End call triggers
}
2020-09-08 21:27:28 +02:00
2021-04-13 22:12:47 +02:00
if ( ! $error ) {
$this -> oldref = $this -> ref ;
// Rename directory if dir was a temporary ref
if ( preg_match ( '/^[\(]?PROV/i' , $this -> ref )) {
// 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 = 'fournisseur/commande/ " . $this -> db -> escape ( $this -> newref ) . " ' " ;
2021-08-27 18:18:50 +02:00
$sql .= " WHERE filename LIKE ' " . $this -> db -> escape ( $this -> ref ) . " %' AND filepath = 'fournisseur/commande/ " . $this -> db -> escape ( $this -> ref ) . " ' and entity = " . (( int ) $conf -> entity );
2021-04-13 22:12:47 +02:00
$resql = $this -> db -> query ( $sql );
if ( ! $resql ) {
$error ++ ; $this -> error = $this -> db -> lasterror ();
2021-02-25 23:21:30 +01:00
}
2021-04-13 20:28:25 +02:00
2021-04-13 22:12:47 +02: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 -> fournisseur -> commande -> dir_output . '/' . $oldref ;
$dirdest = $conf -> fournisseur -> commande -> dir_output . '/' . $newref ;
if ( ! $error && file_exists ( $dirsource )) {
dol_syslog ( get_class ( $this ) . " ::valid rename dir " . $dirsource . " into " . $dirdest );
if ( @ rename ( $dirsource , $dirdest )) {
dol_syslog ( " Rename ok " );
// Rename docs starting with $oldref with $newref
$listoffiles = dol_dir_list ( $conf -> fournisseur -> commande -> dir_output . '/' . $newref , 'files' , 1 , '^' . preg_quote ( $oldref , '/' ));
foreach ( $listoffiles as $fileentry ) {
$dirsource = $fileentry [ 'name' ];
$dirdest = preg_replace ( '/^' . preg_quote ( $oldref , '/' ) . '/' , $newref , $dirsource );
$dirsource = $fileentry [ 'path' ] . '/' . $dirsource ;
$dirdest = $fileentry [ 'path' ] . '/' . $dirdest ;
@ rename ( $dirsource , $dirdest );
2020-09-08 21:27:28 +02:00
}
}
}
}
2021-04-13 22:12:47 +02:00
}
2020-09-08 21:27:28 +02:00
2021-04-13 22:12:47 +02:00
if ( ! $error ) {
$result = 1 ;
$this -> statut = self :: STATUS_VALIDATED ;
$this -> ref = $num ;
}
2020-09-08 21:27:28 +02:00
2021-04-13 22:12:47 +02:00
if ( ! $error ) {
$this -> db -> commit ();
return 1 ;
2020-09-08 21:27:28 +02:00
} else {
2021-04-13 22:12:47 +02:00
$this -> db -> rollback ();
2020-09-08 21:27:28 +02:00
return - 1 ;
}
2021-04-13 22:12:47 +02:00
} else {
$this -> error = 'NotAuthorized' ;
dol_syslog ( get_class ( $this ) . " ::valid " . $this -> error , LOG_ERR );
return - 1 ;
}
2020-09-08 21:27:28 +02:00
}
/**
* Return label of the status of object
*
2014-09-04 22:37:33 +02:00
* @ param int $mode 0 = long label , 1 = short label , 2 = Picto + short label , 3 = Picto , 4 = Picto + long label , 5 = short label + picto
2020-09-08 21:27:28 +02:00
* @ return string Label
*/
public function getLibStatut ( $mode = 0 )
{
return $this -> LibStatut ( $this -> statut , $mode , $this -> billed );
}
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
/**
* Return label of a status
*
* @ param int $status Id statut
2020-03-24 19:06:37 +01:00
* @ 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
2020-09-08 21:27:28 +02:00
* @ param int $billed 1 = Billed
* @ return string Label of status
*/
public function LibStatut ( $status , $mode = 0 , $billed = 0 )
{
// phpcs:enable
2021-05-12 16:55:03 +02:00
global $conf , $langs , $hookmanager ;
2020-09-08 21:27:28 +02:00
if ( empty ( $this -> statuts ) || empty ( $this -> statutshort )) {
$langs -> load ( 'orders' );
$this -> statuts [ 0 ] = 'StatusSupplierOrderDraft' ;
$this -> statuts [ 1 ] = 'StatusSupplierOrderValidated' ;
$this -> statuts [ 2 ] = 'StatusSupplierOrderApproved' ;
2021-02-25 23:21:30 +01:00
if ( empty ( $conf -> global -> SUPPLIER_ORDER_USE_DISPATCH_STATUS )) {
$this -> statuts [ 3 ] = 'StatusSupplierOrderOnProcess' ;
} else {
$this -> statuts [ 3 ] = 'StatusSupplierOrderOnProcessWithValidation' ;
}
2020-09-08 21:27:28 +02:00
$this -> statuts [ 4 ] = 'StatusSupplierOrderReceivedPartially' ;
$this -> statuts [ 5 ] = 'StatusSupplierOrderReceivedAll' ;
$this -> statuts [ 6 ] = 'StatusSupplierOrderCanceled' ; // Approved->Canceled
$this -> statuts [ 7 ] = 'StatusSupplierOrderCanceled' ; // Process running->canceled
$this -> statuts [ 9 ] = 'StatusSupplierOrderRefused' ;
// List of language codes for status
$this -> statutshort [ 0 ] = 'StatusSupplierOrderDraftShort' ;
$this -> statutshort [ 1 ] = 'StatusSupplierOrderValidatedShort' ;
$this -> statutshort [ 2 ] = 'StatusSupplierOrderApprovedShort' ;
$this -> statutshort [ 3 ] = 'StatusSupplierOrderOnProcessShort' ;
$this -> statutshort [ 4 ] = 'StatusSupplierOrderReceivedPartiallyShort' ;
$this -> statutshort [ 5 ] = 'StatusSupplierOrderReceivedAllShort' ;
$this -> statutshort [ 6 ] = 'StatusSupplierOrderCanceledShort' ;
$this -> statutshort [ 7 ] = 'StatusSupplierOrderCanceledShort' ;
$this -> statutshort [ 9 ] = 'StatusSupplierOrderRefusedShort' ;
}
$statustrans = array (
0 => 'status0' ,
1 => 'status1b' ,
2 => 'status1' ,
3 => 'status4' ,
4 => 'status4b' ,
5 => 'status6' ,
6 => 'status9' ,
7 => 'status9' ,
9 => 'status9' ,
);
$statusClass = 'status0' ;
if ( ! empty ( $statustrans [ $status ])) {
$statusClass = $statustrans [ $status ];
}
$billedtext = '' ;
if ( $billed ) {
$billedtext = ' - ' . $langs -> trans ( " Billed " );
}
2021-02-25 23:21:30 +01:00
if ( $status == 5 && $billed ) {
$statusClass = 'status6' ;
}
2020-09-08 21:27:28 +02:00
2021-02-11 15:36:11 +01:00
$statusLong = $langs -> transnoentitiesnoconv ( $this -> statuts [ $status ]) . $billedtext ;
$statusShort = $langs -> transnoentitiesnoconv ( $this -> statutshort [ $status ]);
2020-09-08 21:27:28 +02:00
2021-06-05 01:04:09 +02:00
$parameters = array ( 'status' => $status , 'mode' => $mode , 'billed' => $billed );
$reshook = $hookmanager -> executeHooks ( 'LibStatut' , $parameters , $this ); // Note that $action and $object may have been modified by hook
2021-05-12 16:55:03 +02:00
if ( $reshook > 0 ) {
return $hookmanager -> resPrint ;
2021-05-12 16:55:32 +02:00
}
2021-11-19 22:28:20 +01:00
2020-09-08 21:27:28 +02:00
return dolGetStatus ( $statusLong , $statusShort , '' , $statusClass , $mode );
}
/**
* Return clicable name ( with picto eventually )
*
* @ param int $withpicto 0 = No picto , 1 = Include picto into link , 2 = Only picto
* @ param string $option On what the link points
* @ param int $notooltip 1 = Disable tooltip
* @ param int $save_lastsearch_value - 1 = Auto , 0 = No save of lastsearch_values when clicking , 1 = Save lastsearch_values whenclicking
* @ param int $addlinktonotes Add link to show notes
* @ return string Chain with URL
*/
public function getNomUrl ( $withpicto = 0 , $option = '' , $notooltip = 0 , $save_lastsearch_value = - 1 , $addlinktonotes = 0 )
{
2022-02-15 18:14:44 +01:00
global $langs , $conf , $user , $hookmanager ;
2020-09-08 21:27:28 +02:00
$result = '' ;
2020-11-02 11:41:07 +01:00
$label = '' ;
if ( $user -> rights -> fournisseur -> commande -> lire ) {
$label = '<u class="paddingrightonly">' . $langs -> trans ( " SupplierOrder " ) . '</u>' ;
if ( isset ( $this -> statut )) {
$label .= ' ' . $this -> getLibStatut ( 5 );
}
2020-11-16 12:20:18 +01:00
if ( ! empty ( $this -> ref )) {
2020-11-02 11:41:07 +01:00
$label .= '<br><b>' . $langs -> trans ( 'Ref' ) . ':</b> ' . $this -> ref ;
2020-11-16 12:20:18 +01:00
}
if ( ! empty ( $this -> ref_supplier )) {
2020-11-02 11:41:07 +01:00
$label .= '<br><b>' . $langs -> trans ( 'RefSupplier' ) . ':</b> ' . $this -> ref_supplier ;
2020-11-16 12:20:18 +01:00
}
if ( ! empty ( $this -> total_ht )) {
2020-11-02 11:41:07 +01:00
$label .= '<br><b>' . $langs -> trans ( 'AmountHT' ) . ':</b> ' . price ( $this -> total_ht , 0 , $langs , 0 , - 1 , - 1 , $conf -> currency );
2020-11-16 12:20:18 +01:00
}
if ( ! empty ( $this -> total_tva )) {
2020-11-02 11:41:07 +01:00
$label .= '<br><b>' . $langs -> trans ( 'VAT' ) . ':</b> ' . price ( $this -> total_tva , 0 , $langs , 0 , - 1 , - 1 , $conf -> currency );
2020-11-16 12:20:18 +01:00
}
if ( ! empty ( $this -> total_ttc )) {
2020-11-02 11:41:07 +01:00
$label .= '<br><b>' . $langs -> trans ( 'AmountTTC' ) . ':</b> ' . price ( $this -> total_ttc , 0 , $langs , 0 , - 1 , - 1 , $conf -> currency );
2020-11-16 12:20:18 +01:00
}
2022-06-28 12:26:49 +02:00
if ( ! empty ( $this -> date )) {
$label .= '<br><b>' . $langs -> trans ( 'Date' ) . ':</b> ' . dol_print_date ( $this -> date , 'day' );
}
2020-11-16 12:20:18 +01:00
if ( ! empty ( $this -> delivery_date )) {
$label .= '<br><b>' . $langs -> trans ( 'DeliveryDate' ) . ':</b> ' . dol_print_date ( $this -> delivery_date , 'dayhour' );
}
2020-11-02 11:41:07 +01:00
}
2020-09-08 21:27:28 +02:00
$picto = 'order' ;
$url = DOL_URL_ROOT . '/fourn/commande/card.php?id=' . $this -> id ;
2021-02-25 23:21:30 +01:00
if ( $option !== 'nolink' ) {
2020-09-08 21:27:28 +02:00
// Add param to save lastsearch_values or not
$add_save_lastsearch_values = ( $save_lastsearch_value == 1 ? 1 : 0 );
2021-02-25 23:21:30 +01:00
if ( $save_lastsearch_value == - 1 && preg_match ( '/list\.php/' , $_SERVER [ " PHP_SELF " ])) {
$add_save_lastsearch_values = 1 ;
}
if ( $add_save_lastsearch_values ) {
$url .= '&save_lastsearch_values=1' ;
}
2020-09-08 21:27:28 +02:00
}
$linkclose = '' ;
2021-02-25 23:21:30 +01:00
if ( empty ( $notooltip )) {
if ( ! empty ( $conf -> global -> MAIN_OPTIMIZEFORTEXTBROWSER )) {
2020-09-08 21:27:28 +02:00
$label = $langs -> trans ( " ShowOrder " );
$linkclose .= ' alt="' . dol_escape_htmltag ( $label , 1 ) . '"' ;
}
$linkclose .= ' title="' . dol_escape_htmltag ( $label , 1 ) . '"' ;
$linkclose .= ' class="classfortooltip"' ;
}
$linkstart = '<a href="' . $url . '"' ;
$linkstart .= $linkclose . '>' ;
$linkend = '</a>' ;
$result .= $linkstart ;
2021-02-25 23:21:30 +01:00
if ( $withpicto ) {
$result .= img_object (( $notooltip ? '' : $label ), $this -> picto , ( $notooltip ? (( $withpicto != 2 ) ? 'class="paddingright"' : '' ) : 'class="' . (( $withpicto != 2 ) ? 'paddingright ' : '' ) . 'classfortooltip"' ), 0 , 0 , $notooltip ? 0 : 1 );
}
if ( $withpicto != 2 ) {
$result .= $this -> ref ;
}
2020-09-08 21:27:28 +02:00
$result .= $linkend ;
2021-02-25 23:21:30 +01:00
if ( $addlinktonotes ) {
2020-09-08 21:27:28 +02:00
$txttoshow = ( $user -> socid > 0 ? $this -> note_public : $this -> note_private );
2021-02-25 23:21:30 +01:00
if ( $txttoshow ) {
2020-09-08 21:27:28 +02:00
$notetoshow = $langs -> trans ( " ViewPrivateNote " ) . ':<br>' . dol_string_nohtmltag ( $txttoshow , 1 );
$result .= ' <span class="note inline-block">' ;
$result .= '<a href="' . DOL_URL_ROOT . '/fourn/commande/note.php?id=' . $this -> id . '" class="classfortooltip" title="' . dol_escape_htmltag ( $notetoshow ) . '">' ;
$result .= img_picto ( '' , 'note' );
$result .= '</a>' ;
//$result.=img_picto($langs->trans("ViewNote"),'object_generic');
//$result.='</a>';
$result .= '</span>' ;
}
}
2022-02-15 11:00:05 +01:00
global $action ;
$hookmanager -> initHooks ( array ( $this -> element . 'dao' ));
2021-11-22 19:57:26 +01:00
$parameters = array ( 'id' => $this -> id , 'getnomurl' => & $result );
2022-02-15 11:00:05 +01:00
$reshook = $hookmanager -> executeHooks ( 'getNomUrl' , $parameters , $this , $action ); // Note that $action and $object may have been modified by some hooks
if ( $reshook > 0 ) {
$result = $hookmanager -> resPrint ;
} else {
$result .= $hookmanager -> resPrint ;
}
2020-09-08 21:27:28 +02:00
return $result ;
}
/**
* Returns the following order reference not used depending on the numbering model activated
* defined within COMMANDE_SUPPLIER_ADDON_NUMBER
*
* @ param Societe $soc company object
* @ return string free reference for the invoice
*/
public function getNextNumRef ( $soc )
{
global $db , $langs , $conf ;
$langs -> load ( " orders " );
2021-02-25 23:21:30 +01:00
if ( ! empty ( $conf -> global -> COMMANDE_SUPPLIER_ADDON_NUMBER )) {
2020-09-08 21:27:28 +02:00
$mybool = false ;
$file = $conf -> global -> COMMANDE_SUPPLIER_ADDON_NUMBER . '.php' ;
$classname = $conf -> global -> COMMANDE_SUPPLIER_ADDON_NUMBER ;
// Include file with class
$dirmodels = array_merge ( array ( '/' ), ( array ) $conf -> modules_parts [ 'models' ]);
foreach ( $dirmodels as $reldir ) {
$dir = dol_buildpath ( $reldir . " core/modules/supplier_order/ " );
// Load file with numbering class (if found)
$mybool |= @ include_once $dir . $file ;
}
if ( $mybool === false ) {
dol_print_error ( '' , " Failed to include file " . $file );
return '' ;
}
$obj = new $classname ();
$numref = $obj -> getNextValue ( $soc , $this );
2021-02-25 23:21:30 +01:00
if ( $numref != " " ) {
2020-09-08 21:27:28 +02:00
return $numref ;
} else {
$this -> error = $obj -> error ;
return - 1 ;
}
} else {
$this -> error = " Error_COMMANDE_SUPPLIER_ADDON_NotDefined " ;
return - 2 ;
}
}
2015-11-16 14:55:46 +01:00
/**
2020-09-08 21:27:28 +02:00
* Class invoiced the supplier order
*
* @ param User $user Object user making the change
2021-01-14 19:09:57 +01:00
* @ return int < 0 if KO , 0 if already billed , > 0 if OK
2020-09-08 21:27:28 +02:00
*/
public function classifyBilled ( User $user )
{
$error = 0 ;
2021-01-14 19:09:57 +01:00
2021-02-25 23:21:30 +01:00
if ( $this -> billed ) {
2021-01-14 19:09:57 +01:00
return 0 ;
}
2020-09-08 21:27:28 +02:00
$this -> db -> begin ();
$sql = 'UPDATE ' . MAIN_DB_PREFIX . 'commande_fournisseur SET billed = 1' ;
2021-08-27 23:36:06 +02:00
$sql .= " WHERE rowid = " . (( int ) $this -> id ) . ' AND fk_statut > ' . self :: STATUS_DRAFT ;
2020-09-08 21:27:28 +02:00
2021-02-25 23:21:30 +01:00
if ( $this -> db -> query ( $sql )) {
if ( ! $error ) {
2020-09-08 21:27:28 +02:00
// Call trigger
$result = $this -> call_trigger ( 'ORDER_SUPPLIER_CLASSIFY_BILLED' , $user );
2021-02-25 23:21:30 +01:00
if ( $result < 0 ) {
$error ++ ;
}
2020-09-08 21:27:28 +02:00
// End call triggers
}
2021-02-25 23:21:30 +01:00
if ( ! $error ) {
2020-09-08 21:27:28 +02:00
$this -> billed = 1 ;
$this -> db -> commit ();
return 1 ;
} else {
$this -> db -> rollback ();
return - 1 ;
}
} else {
dol_print_error ( $this -> db );
$this -> db -> rollback ();
2015-11-16 14:55:46 +01:00
return - 1 ;
2020-09-08 21:27:28 +02:00
}
}
/**
* Approve a supplier order
*
* @ param User $user Object user
* @ param int $idwarehouse Id of warhouse for stock change
* @ param int $secondlevel 0 = Standard approval , 1 = Second level approval ( used when option SUPPLIER_ORDER_3_STEPS_TO_BE_APPROVED is set )
* @ return int < 0 if KO , > 0 if OK
*/
public function approve ( $user , $idwarehouse = 0 , $secondlevel = 0 )
{
global $langs , $conf ;
2012-08-22 23:11:24 +02:00
require_once DOL_DOCUMENT_ROOT . '/core/lib/files.lib.php' ;
2011-09-11 20:35:38 +02:00
2020-09-08 21:27:28 +02:00
$error = 0 ;
2011-09-11 20:35:38 +02:00
2020-09-08 21:27:28 +02:00
dol_syslog ( get_class ( $this ) . " ::approve " );
2011-09-11 20:35:38 +02:00
2021-02-25 23:21:30 +01:00
if ( $user -> rights -> fournisseur -> commande -> approuver ) {
2020-09-08 21:27:28 +02:00
$now = dol_now ();
2015-04-01 21:00:51 +02:00
2020-09-08 21:27:28 +02:00
$this -> db -> begin ();
2011-09-11 20:35:38 +02:00
2016-02-20 11:18:02 +01:00
// Definition of order numbering model name
2020-09-08 21:27:28 +02:00
$soc = new Societe ( $this -> db );
$soc -> fetch ( $this -> fourn_id );
// Check if object has a temporary ref
2021-02-25 23:21:30 +01:00
if ( preg_match ( '/^[\(]?PROV/i' , $this -> ref ) || empty ( $this -> ref )) { // empty should not happened, but when it occurs, the test save life
2020-09-08 21:27:28 +02:00
$num = $this -> getNextNumRef ( $soc );
} else {
$num = $this -> ref ;
}
$this -> newref = dol_sanitizeFileName ( $num );
// Do we have to change status now ? (If double approval is required and first approval, we keep status to 1 = validated)
2019-11-13 19:35:39 +01:00
$movetoapprovestatus = true ;
$comment = '' ;
2016-08-05 09:46:17 +02:00
2020-09-08 21:27:28 +02:00
$sql = " UPDATE " . MAIN_DB_PREFIX . " commande_fournisseur " ;
2019-11-13 19:35:39 +01:00
$sql .= " SET ref=' " . $this -> db -> escape ( $num ) . " ', " ;
2021-02-25 23:21:30 +01:00
if ( empty ( $secondlevel )) { // standard or first level approval
2020-09-08 21:27:28 +02:00
$sql .= " date_approve=' " . $this -> db -> idate ( $now ) . " ', " ;
$sql .= " fk_user_approve = " . $user -> id ;
2021-11-02 15:21:14 +01:00
if ( ! empty ( $conf -> global -> SUPPLIER_ORDER_3_STEPS_TO_BE_APPROVED ) && $this -> total_ht >= $conf -> global -> SUPPLIER_ORDER_3_STEPS_TO_BE_APPROVED ) {
2021-02-25 23:21:30 +01:00
if ( empty ( $this -> user_approve_id2 )) {
2020-09-08 21:27:28 +02:00
$movetoapprovestatus = false ; // second level approval not done
$comment = ' (first level)' ;
}
}
2020-05-21 15:05:19 +02:00
} else // request a second level approval
2015-04-01 21:00:51 +02:00
{
2020-09-08 21:27:28 +02:00
$sql .= " date_approve2=' " . $this -> db -> idate ( $now ) . " ', " ;
2021-08-23 19:33:24 +02:00
$sql .= " fk_user_approve2 = " . (( int ) $user -> id );
2021-02-25 23:21:30 +01:00
if ( empty ( $this -> user_approve_id )) {
$movetoapprovestatus = false ; // first level approval not done
}
2020-09-08 21:27:28 +02:00
$comment = ' (second level)' ;
2015-04-01 21:00:51 +02:00
}
// If double approval is required and first approval, we keep status to 1 = validated
2021-02-25 23:21:30 +01:00
if ( $movetoapprovestatus ) {
$sql .= " , fk_statut = " . self :: STATUS_ACCEPTED ;
} else {
$sql .= " , fk_statut = " . self :: STATUS_VALIDATED ;
}
2021-08-23 19:33:24 +02:00
$sql .= " WHERE rowid = " . (( int ) $this -> id );
2020-09-08 21:27:28 +02:00
$sql .= " AND fk_statut = " . self :: STATUS_VALIDATED ;
2011-09-11 20:35:38 +02:00
2021-02-25 23:21:30 +01:00
if ( $this -> db -> query ( $sql )) {
if ( ! empty ( $conf -> global -> SUPPLIER_ORDER_AUTOADD_USER_CONTACT )) {
2019-11-13 19:35:39 +01:00
$result = $this -> add_contact ( $user -> id , 'SALESREPFOLL' , 'internal' , 1 );
2021-02-25 23:21:30 +01:00
if ( $result < 0 && $result != - 2 ) { // -2 means already exists
2015-02-17 19:49:17 +01:00
$error ++ ;
}
2020-09-08 21:27:28 +02:00
}
// If stock is incremented on validate order, we must increment it
2021-02-25 23:21:30 +01:00
if ( ! $error && $movetoapprovestatus && ! empty ( $conf -> stock -> enabled ) && ! empty ( $conf -> global -> STOCK_CALCULATE_ON_SUPPLIER_VALIDATE_ORDER )) {
2020-09-08 21:27:28 +02:00
require_once DOL_DOCUMENT_ROOT . '/product/stock/class/mouvementstock.class.php' ;
$langs -> load ( " agenda " );
$cpt = count ( $this -> lines );
2021-02-25 23:21:30 +01:00
for ( $i = 0 ; $i < $cpt ; $i ++ ) {
2020-09-08 21:27:28 +02:00
// Product with reference
2021-02-25 23:21:30 +01:00
if ( $this -> lines [ $i ] -> fk_product > 0 ) {
2020-09-08 21:27:28 +02:00
$this -> line = $this -> lines [ $i ];
$mouvP = new MouvementStock ( $this -> db );
$mouvP -> origin = & $this ;
2022-03-22 13:46:55 +01:00
$mouvP -> setOrigin ( $this -> element , $this -> id );
2020-09-08 21:27:28 +02:00
// We decrement stock of product (and sub-products)
$up_ht_disc = $this -> lines [ $i ] -> subprice ;
2021-02-25 23:21:30 +01:00
if ( ! empty ( $this -> lines [ $i ] -> remise_percent ) && empty ( $conf -> global -> STOCK_EXCLUDE_DISCOUNT_FOR_PMP )) {
$up_ht_disc = price2num ( $up_ht_disc * ( 100 - $this -> lines [ $i ] -> remise_percent ) / 100 , 'MU' );
}
2020-09-08 21:27:28 +02:00
$result = $mouvP -> reception ( $user , $this -> lines [ $i ] -> fk_product , $idwarehouse , $this -> lines [ $i ] -> qty , $up_ht_disc , $langs -> trans ( " OrderApprovedInDolibarr " , $this -> ref ));
2021-02-25 23:21:30 +01:00
if ( $result < 0 ) {
$error ++ ;
}
2020-09-08 21:27:28 +02:00
unset ( $this -> line );
}
}
}
2021-02-25 23:21:30 +01:00
if ( ! $error ) {
2014-07-11 15:32:23 +02:00
// Call trigger
2019-11-13 19:35:39 +01:00
$result = $this -> call_trigger ( 'ORDER_SUPPLIER_APPROVE' , $user );
2021-02-25 23:21:30 +01:00
if ( $result < 0 ) {
$error ++ ;
}
2014-07-11 15:32:23 +02:00
// End call triggers
2020-09-08 21:27:28 +02:00
}
2011-09-11 20:35:38 +02:00
2021-02-25 23:21:30 +01:00
if ( ! $error ) {
2020-09-08 21:27:28 +02:00
$this -> ref = $this -> newref ;
2016-08-05 09:46:17 +02:00
2021-02-25 23:21:30 +01:00
if ( $movetoapprovestatus ) {
$this -> statut = self :: STATUS_ACCEPTED ;
} else {
$this -> statut = self :: STATUS_VALIDATED ;
}
if ( empty ( $secondlevel )) { // standard or first level approval
2020-09-08 21:27:28 +02:00
$this -> date_approve = $now ;
$this -> user_approve_id = $user -> id ;
2020-05-21 15:05:19 +02:00
} else // request a second level approval
2015-04-01 21:00:51 +02:00
{
2020-09-08 21:27:28 +02:00
$this -> date_approve2 = $now ;
$this -> user_approve_id2 = $user -> id ;
2015-04-01 21:00:51 +02:00
}
2020-09-08 21:27:28 +02:00
$this -> db -> commit ();
return 1 ;
} else {
$this -> db -> rollback ();
return - 1 ;
}
} else {
$this -> db -> rollback ();
$this -> error = $this -> db -> lasterror ();
return - 1 ;
}
} else {
dol_syslog ( get_class ( $this ) . " ::approve Not Authorized " , LOG_ERR );
}
return - 1 ;
}
/**
* Refuse an order
*
* @ param User $user User making action
* @ return int 0 if Ok , < 0 if Ko
*/
public function refuse ( $user )
{
global $conf , $langs ;
2011-09-11 20:35:38 +02:00
2019-11-13 19:35:39 +01:00
$error = 0 ;
2012-01-19 09:53:27 +01:00
2020-09-08 21:27:28 +02:00
dol_syslog ( get_class ( $this ) . " ::refuse " );
$result = 0 ;
2021-02-25 23:21:30 +01:00
if ( $user -> rights -> fournisseur -> commande -> approuver ) {
2020-09-08 21:27:28 +02:00
$this -> db -> begin ();
2014-06-28 14:53:28 +02:00
2020-09-08 21:27:28 +02:00
$sql = " UPDATE " . MAIN_DB_PREFIX . " commande_fournisseur SET fk_statut = " . self :: STATUS_REFUSED ;
2021-08-23 19:33:24 +02:00
$sql .= " WHERE rowid = " . (( int ) $this -> id );
2011-09-11 20:35:38 +02:00
2021-02-25 23:21:30 +01:00
if ( $this -> db -> query ( $sql )) {
2020-09-08 21:27:28 +02:00
$result = 0 ;
2011-09-11 20:35:38 +02:00
2021-02-25 23:21:30 +01:00
if ( $error == 0 ) {
2014-07-11 15:32:23 +02:00
// Call trigger
2019-11-13 19:35:39 +01:00
$result = $this -> call_trigger ( 'ORDER_SUPPLIER_REFUSE' , $user );
2021-02-25 23:21:30 +01:00
if ( $result < 0 ) {
2020-09-08 21:27:28 +02:00
$error ++ ;
$this -> db -> rollback ();
2021-02-25 23:21:30 +01:00
} else {
$this -> db -> commit ();
}
2014-07-11 15:32:23 +02:00
// End call triggers
2020-09-08 21:27:28 +02:00
}
} else {
$this -> db -> rollback ();
$this -> error = $this -> db -> lasterror ();
dol_syslog ( get_class ( $this ) . " ::refuse Error -1 " );
$result = - 1 ;
}
} else {
dol_syslog ( get_class ( $this ) . " ::refuse Not Authorized " );
}
return $result ;
}
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
/**
* Cancel an approved order .
* The cancellation is done after approval
*
* @ param User $user User making action
* @ param int $idwarehouse Id warehouse to use for stock change ( not used for supplier orders ) .
* @ return int > 0 if Ok , < 0 if Ko
*/
public function Cancel ( $user , $idwarehouse = - 1 )
{
// phpcs:enable
global $langs , $conf ;
$error = 0 ;
//dol_syslog("CommandeFournisseur::Cancel");
$result = 0 ;
2021-02-25 23:21:30 +01:00
if ( $user -> rights -> fournisseur -> commande -> commander ) {
2020-09-08 21:27:28 +02:00
$statut = self :: STATUS_CANCELED ;
$this -> db -> begin ();
2021-03-30 03:37:54 +02:00
$sql = " UPDATE " . MAIN_DB_PREFIX . " commande_fournisseur SET fk_statut = " . (( int ) $statut );
2021-08-23 19:33:24 +02:00
$sql .= " WHERE rowid = " . (( int ) $this -> id );
2020-09-08 21:27:28 +02:00
dol_syslog ( get_class ( $this ) . " ::cancel " , LOG_DEBUG );
2021-02-25 23:21:30 +01:00
if ( $this -> db -> query ( $sql )) {
2020-09-08 21:27:28 +02:00
$result = 0 ;
2011-09-11 20:35:38 +02:00
2014-07-11 15:32:23 +02:00
// Call trigger
2019-11-13 19:35:39 +01:00
$result = $this -> call_trigger ( 'ORDER_SUPPLIER_CANCEL' , $user );
2021-02-25 23:21:30 +01:00
if ( $result < 0 ) {
$error ++ ;
}
2014-07-11 15:32:23 +02:00
// End call triggers
2011-09-11 20:35:38 +02:00
2021-02-25 23:21:30 +01:00
if ( $error == 0 ) {
2020-09-08 21:27:28 +02:00
$this -> db -> commit ();
return 1 ;
} else {
$this -> db -> rollback ();
return - 1 ;
}
} else {
$this -> db -> rollback ();
$this -> error = $this -> db -> lasterror ();
dol_syslog ( get_class ( $this ) . " ::cancel " . $this -> error );
return - 1 ;
}
} else {
dol_syslog ( get_class ( $this ) . " ::cancel Not Authorized " );
return - 1 ;
}
}
/**
* Submit a supplier order to supplier
*
* @ param User $user User making change
* @ param integer $date Date
* @ param int $methode Method
* @ param string $comment Comment
* @ return int < 0 if KO , > 0 if OK
*/
public function commande ( $user , $date , $methode , $comment = '' )
{
global $langs ;
dol_syslog ( get_class ( $this ) . " ::commande " );
$error = 0 ;
2021-02-25 23:21:30 +01:00
if ( $user -> rights -> fournisseur -> commande -> commander ) {
2020-09-08 21:27:28 +02:00
$this -> db -> begin ();
$newnoteprivate = $this -> note_private ;
2021-02-25 23:21:30 +01:00
if ( $comment ) {
$newnoteprivate = dol_concatdesc ( $newnoteprivate , $langs -> trans ( " Comment " ) . ': ' . $comment );
}
2020-09-08 21:27:28 +02:00
$sql = " UPDATE " . MAIN_DB_PREFIX . " commande_fournisseur " ;
$sql .= " SET fk_statut= " . self :: STATUS_ORDERSENT . " , fk_input_method= " . $methode . " , date_commande=' " . $this -> db -> idate ( $date ) . " ', " ;
$sql .= " note_private=' " . $this -> db -> escape ( $newnoteprivate ) . " ' " ;
2021-03-14 12:20:23 +01:00
$sql .= " WHERE rowid= " . (( int ) $this -> id );
2020-09-08 21:27:28 +02:00
dol_syslog ( get_class ( $this ) . " ::commande " , LOG_DEBUG );
2021-02-25 23:21:30 +01:00
if ( $this -> db -> query ( $sql )) {
2020-09-08 21:27:28 +02:00
$this -> statut = self :: STATUS_ORDERSENT ;
$this -> methode_commande_id = $methode ;
$this -> date_commande = $date ;
$this -> context = array ( 'comments' => $comment );
// Call trigger
$result = $this -> call_trigger ( 'ORDER_SUPPLIER_SUBMIT' , $user );
2021-02-25 23:21:30 +01:00
if ( $result < 0 ) {
$error ++ ;
}
2020-09-08 21:27:28 +02:00
// End call triggers
} else {
$error ++ ;
$this -> error = $this -> db -> lasterror ();
$this -> errors [] = $this -> db -> lasterror ();
}
2021-02-25 23:21:30 +01:00
if ( ! $error ) {
2020-09-08 21:27:28 +02:00
$this -> db -> commit ();
} else {
$this -> db -> rollback ();
}
} else {
$error ++ ;
$this -> error = $langs -> trans ( 'NotAuthorized' );
$this -> errors [] = $langs -> trans ( 'NotAuthorized' );
dol_syslog ( get_class ( $this ) . " ::commande User not Authorized " , LOG_WARNING );
}
return ( $error ? - 1 : 1 );
}
/**
* Create order with draft status
*
* @ param User $user User making creation
* @ param int $notrigger Disable all triggers
* @ return int < 0 if KO , Id of supplier order if OK
*/
public function create ( $user , $notrigger = 0 )
{
global $langs , $conf , $hookmanager ;
$this -> db -> begin ();
2012-01-19 09:53:27 +01:00
2019-11-13 19:35:39 +01:00
$error = 0 ;
2020-09-08 21:27:28 +02:00
$now = dol_now ();
2013-09-08 23:38:40 +02:00
2020-11-16 12:20:18 +01:00
// set tmp vars
2021-09-23 13:23:16 +02:00
$date = ( $this -> date_commande ? $this -> date_commande : $this -> date ); // in case of date is set
2021-02-25 23:21:30 +01:00
if ( empty ( $date )) {
$date = $now ;
}
2020-11-16 12:20:18 +01:00
$delivery_date = empty ( $this -> delivery_date ) ? $this -> date_livraison : $this -> delivery_date ;
2020-07-23 11:10:18 +02:00
2020-09-08 21:27:28 +02:00
// Clean parameters
2021-02-25 23:21:30 +01:00
if ( empty ( $this -> source )) {
$this -> source = 0 ;
}
2011-09-11 20:35:38 +02:00
2017-11-02 18:14:55 +01:00
// Multicurrency (test on $this->multicurrency_tx because we should take the default rate only if not using origin rate)
2021-02-25 23:21:30 +01:00
if ( ! empty ( $this -> multicurrency_code ) && empty ( $this -> multicurrency_tx )) {
list ( $this -> fk_multicurrency , $this -> multicurrency_tx ) = MultiCurrency :: getIdAndTxFromCode ( $this -> db , $this -> multicurrency_code , $date );
} else {
$this -> fk_multicurrency = MultiCurrency :: getIdFromCode ( $this -> db , $this -> multicurrency_code );
}
if ( empty ( $this -> fk_multicurrency )) {
2016-02-16 23:58:21 +01:00
$this -> multicurrency_code = $conf -> currency ;
$this -> fk_multicurrency = 0 ;
$this -> multicurrency_tx = 1 ;
}
2016-08-05 09:46:17 +02:00
2020-09-08 21:27:28 +02:00
// We set order into draft status
$this -> brouillon = 1 ;
$sql = " INSERT INTO " . MAIN_DB_PREFIX . " commande_fournisseur ( " ;
$sql .= " ref " ;
$sql .= " , ref_supplier " ;
$sql .= " , note_private " ;
$sql .= " , note_public " ;
$sql .= " , entity " ;
$sql .= " , fk_soc " ;
$sql .= " , fk_projet " ;
$sql .= " , date_creation " ;
2019-11-13 19:35:39 +01:00
$sql .= " , date_livraison " ;
2020-09-08 21:27:28 +02:00
$sql .= " , fk_user_author " ;
$sql .= " , fk_statut " ;
$sql .= " , source " ;
$sql .= " , model_pdf " ;
$sql .= " , fk_mode_reglement " ;
2019-11-13 19:35:39 +01:00
$sql .= " , fk_cond_reglement " ;
2020-09-08 21:27:28 +02:00
$sql .= " , fk_account " ;
2019-11-13 19:35:39 +01:00
$sql .= " , fk_incoterms, location_incoterms " ;
2020-09-08 21:27:28 +02:00
$sql .= " , fk_multicurrency " ;
$sql .= " , multicurrency_code " ;
$sql .= " , multicurrency_tx " ;
$sql .= " ) " ;
$sql .= " VALUES ( " ;
2021-03-16 10:19:56 +01:00
$sql .= " '(PROV)' " ;
2020-09-08 21:27:28 +02:00
$sql .= " , ' " . $this -> db -> escape ( $this -> ref_supplier ) . " ' " ;
$sql .= " , ' " . $this -> db -> escape ( $this -> note_private ) . " ' " ;
$sql .= " , ' " . $this -> db -> escape ( $this -> note_public ) . " ' " ;
2021-09-03 21:25:17 +02:00
$sql .= " , " . (( int ) $conf -> entity );
$sql .= " , " . (( int ) $this -> socid );
$sql .= " , " . ( $this -> fk_project > 0 ? (( int ) $this -> fk_project ) : " null " );
2020-10-15 20:51:30 +02:00
$sql .= " , ' " . $this -> db -> idate ( $date ) . " ' " ;
2020-11-16 12:20:18 +01:00
$sql .= " , " . ( $delivery_date ? " ' " . $this -> db -> idate ( $delivery_date ) . " ' " : " null " );
2021-09-03 21:25:17 +02:00
$sql .= " , " . (( int ) $user -> id );
2020-09-08 21:27:28 +02:00
$sql .= " , " . self :: STATUS_DRAFT ;
2021-09-03 21:25:17 +02:00
$sql .= " , " . (( int ) $this -> source );
2020-09-20 02:30:53 +02:00
$sql .= " , ' " . $this -> db -> escape ( $conf -> global -> COMMANDE_SUPPLIER_ADDON_PDF ) . " ' " ;
2020-09-08 21:27:28 +02:00
$sql .= " , " . ( $this -> mode_reglement_id > 0 ? $this -> mode_reglement_id : 'null' );
$sql .= " , " . ( $this -> cond_reglement_id > 0 ? $this -> cond_reglement_id : 'null' );
$sql .= " , " . ( $this -> fk_account > 0 ? $this -> fk_account : 'NULL' );
$sql .= " , " . ( int ) $this -> fk_incoterms ;
$sql .= " , ' " . $this -> db -> escape ( $this -> location_incoterms ) . " ' " ;
2019-11-13 19:35:39 +01:00
$sql .= " , " . ( int ) $this -> fk_multicurrency ;
$sql .= " , ' " . $this -> db -> escape ( $this -> multicurrency_code ) . " ' " ;
$sql .= " , " . ( double ) $this -> multicurrency_tx ;
2020-09-08 21:27:28 +02:00
$sql .= " ) " ;
2011-09-11 20:35:38 +02:00
2020-09-08 21:27:28 +02:00
dol_syslog ( get_class ( $this ) . " ::create " , LOG_DEBUG );
2021-02-25 23:21:30 +01:00
if ( $this -> db -> query ( $sql )) {
2020-09-08 21:27:28 +02:00
$this -> id = $this -> db -> last_insert_id ( MAIN_DB_PREFIX . " commande_fournisseur " );
2011-09-11 20:35:38 +02:00
2012-12-01 15:45:05 +01:00
if ( $this -> id ) {
2019-11-13 19:35:39 +01:00
$num = count ( $this -> lines );
2012-12-01 15:45:05 +01:00
2020-09-08 21:27:28 +02:00
// insert products details into database
2021-02-25 23:21:30 +01:00
for ( $i = 0 ; $i < $num ; $i ++ ) {
2022-01-20 01:09:52 +01:00
$line = $this -> lines [ $i ];
if ( ! is_object ( $line )) {
2022-01-20 00:55:52 +01:00
$line = ( object ) $line ;
}
2020-09-08 21:27:28 +02:00
2022-01-20 01:09:52 +01:00
2022-01-20 00:55:52 +01:00
$this -> special_code = $line -> special_code ; // TODO : remove this in 9.0 and add special_code param to addline()
2020-09-08 21:27:28 +02:00
// This include test on qty if option SUPPLIER_ORDER_WITH_NOPRICEDEFINED is not set
$result = $this -> addline (
2022-01-20 00:55:52 +01:00
$line -> desc ,
$line -> subprice ,
$line -> qty ,
$line -> tva_tx ,
$line -> localtax1_tx ,
$line -> localtax2_tx ,
$line -> fk_product ,
2020-09-08 21:27:28 +02:00
0 ,
2022-01-20 00:55:52 +01:00
$line -> ref_fourn , // $line->ref_fourn comes from field ref into table of lines. Value may ba a ref that does not exists anymore, so we first try with value of product
$line -> remise_percent ,
2020-09-08 21:27:28 +02:00
'HT' ,
0 ,
2022-01-20 00:55:52 +01:00
$line -> product_type ,
$line -> info_bits ,
2020-09-08 21:27:28 +02:00
false ,
2022-01-20 00:55:52 +01:00
$line -> date_start ,
$line -> date_end ,
$line -> array_options ,
$line -> fk_unit
2021-04-13 20:28:25 +02:00
);
2021-02-25 23:21:30 +01:00
if ( $result < 0 ) {
2020-09-08 21:27:28 +02:00
dol_syslog ( get_class ( $this ) . " ::create " . $this -> error , LOG_WARNING ); // do not use dol_print_error here as it may be a functionnal error
$this -> db -> rollback ();
return - 1 ;
}
}
$sql = " UPDATE " . MAIN_DB_PREFIX . " commande_fournisseur " ;
$sql .= " SET ref='(PROV " . $this -> id . " )' " ;
2021-03-14 12:20:23 +01:00
$sql .= " WHERE rowid= " . (( int ) $this -> id );
2020-09-08 21:27:28 +02:00
dol_syslog ( get_class ( $this ) . " ::create " , LOG_DEBUG );
2021-02-25 23:21:30 +01:00
if ( $this -> db -> query ( $sql )) {
2015-03-04 17:54:43 +01:00
// Add link with price request and supplier order
2021-02-25 23:21:30 +01:00
if ( $this -> id ) {
2019-11-13 19:35:39 +01:00
$this -> ref = " (PROV " . $this -> id . " ) " ;
2017-10-19 19:06:48 +02:00
2021-02-25 23:21:30 +01:00
if ( ! empty ( $this -> linkedObjectsIds ) && empty ( $this -> linked_objects )) { // To use new linkedObjectsIds instead of old linked_objects
2019-11-13 19:35:39 +01:00
$this -> linked_objects = $this -> linkedObjectsIds ; // TODO Replace linked_objects with linkedObjectsIds
2017-10-19 19:06:48 +02:00
}
// Add object linked
2021-02-25 23:21:30 +01:00
if ( ! $error && $this -> id && ! empty ( $this -> linked_objects ) && is_array ( $this -> linked_objects )) {
foreach ( $this -> linked_objects as $origin => $tmp_origin_id ) {
if ( is_array ( $tmp_origin_id )) { // New behaviour, if linked_object can have several links per type, so is something like array('contract'=>array(id1, id2, ...))
foreach ( $tmp_origin_id as $origin_id ) {
2020-09-08 21:27:28 +02:00
$ret = $this -> add_object_linked ( $origin , $origin_id );
2021-02-25 23:21:30 +01:00
if ( ! $ret ) {
2020-09-08 21:27:28 +02:00
dol_print_error ( $this -> db );
$error ++ ;
}
}
} else // Old behaviour, if linked_object has only one link per type, so is something like array('contract'=>id1))
{
$origin_id = $tmp_origin_id ;
2017-10-19 19:06:48 +02:00
$ret = $this -> add_object_linked ( $origin , $origin_id );
2021-02-25 23:21:30 +01:00
if ( ! $ret ) {
2017-10-19 19:06:48 +02:00
dol_print_error ( $this -> db );
$error ++ ;
}
2020-09-08 21:27:28 +02:00
}
2017-10-19 19:06:48 +02:00
}
}
}
2013-06-09 16:15:49 +02:00
2021-02-25 23:21:30 +01:00
if ( ! $error ) {
2020-09-08 21:27:28 +02:00
$result = $this -> insertExtraFields ();
2021-02-25 23:21:30 +01:00
if ( $result < 0 ) {
$error ++ ;
}
2020-09-08 21:27:28 +02:00
}
2015-04-03 11:00:52 +02:00
2021-02-25 23:21:30 +01:00
if ( ! $error && ! $notrigger ) {
2014-07-11 15:32:23 +02:00
// Call trigger
2019-11-13 19:35:39 +01:00
$result = $this -> call_trigger ( 'ORDER_SUPPLIER_CREATE' , $user );
2021-02-25 23:21:30 +01:00
if ( $result < 0 ) {
2020-09-08 21:27:28 +02:00
$this -> db -> rollback ();
return - 1 ;
}
2014-07-11 15:32:23 +02:00
// End call triggers
2020-09-08 21:27:28 +02:00
}
$this -> db -> commit ();
return $this -> id ;
} else {
$this -> error = $this -> db -> lasterror ();
$this -> db -> rollback ();
return - 2 ;
}
}
} else {
$this -> error = $this -> db -> lasterror ();
$this -> db -> rollback ();
return - 1 ;
}
}
2021-02-27 10:10:28 +01:00
/**
* Update Supplier Order
*
* @ param User $user User that modify
* @ param int $notrigger 0 = launch triggers after , 1 = disable triggers
* @ return int < 0 if KO , > 0 if OK
*/
public function update ( User $user , $notrigger = 0 )
{
global $conf ;
$error = 0 ;
// Clean parameters
if ( isset ( $this -> ref )) {
$this -> ref = trim ( $this -> ref );
}
if ( isset ( $this -> ref_supplier )) {
$this -> ref_supplier = trim ( $this -> ref_supplier );
}
if ( isset ( $this -> note_private )) {
$this -> note_private = trim ( $this -> note_private );
}
if ( isset ( $this -> note_public )) {
$this -> note_public = trim ( $this -> note_public );
}
if ( isset ( $this -> model_pdf )) {
$this -> model_pdf = trim ( $this -> model_pdf );
}
if ( isset ( $this -> import_key )) {
$this -> import_key = trim ( $this -> import_key );
}
// Update request
$sql = " UPDATE " . MAIN_DB_PREFIX . $this -> table_element . " SET " ;
$sql .= " ref= " . ( isset ( $this -> ref ) ? " ' " . $this -> db -> escape ( $this -> ref ) . " ' " : " null " ) . " , " ;
$sql .= " ref_supplier= " . ( isset ( $this -> ref_supplier ) ? " ' " . $this -> db -> escape ( $this -> ref_supplier ) . " ' " : " null " ) . " , " ;
$sql .= " ref_ext= " . ( isset ( $this -> ref_ext ) ? " ' " . $this -> db -> escape ( $this -> ref_ext ) . " ' " : " null " ) . " , " ;
$sql .= " fk_soc= " . ( isset ( $this -> socid ) ? $this -> socid : " null " ) . " , " ;
$sql .= " date_commande= " . ( strval ( $this -> date_commande ) != '' ? " ' " . $this -> db -> idate ( $this -> date_commande ) . " ' " : 'null' ) . " , " ;
$sql .= " date_valid= " . ( strval ( $this -> date_validation ) != '' ? " ' " . $this -> db -> idate ( $this -> date_validation ) . " ' " : 'null' ) . " , " ;
$sql .= " total_tva= " . ( isset ( $this -> total_tva ) ? $this -> total_tva : " null " ) . " , " ;
$sql .= " localtax1= " . ( isset ( $this -> total_localtax1 ) ? $this -> total_localtax1 : " null " ) . " , " ;
$sql .= " localtax2= " . ( isset ( $this -> total_localtax2 ) ? $this -> total_localtax2 : " null " ) . " , " ;
$sql .= " total_ht= " . ( isset ( $this -> total_ht ) ? $this -> total_ht : " null " ) . " , " ;
$sql .= " total_ttc= " . ( isset ( $this -> total_ttc ) ? $this -> total_ttc : " null " ) . " , " ;
$sql .= " fk_statut= " . ( isset ( $this -> statut ) ? $this -> statut : " null " ) . " , " ;
$sql .= " fk_user_author= " . ( isset ( $this -> user_author_id ) ? $this -> user_author_id : " null " ) . " , " ;
2022-07-03 12:54:58 +02:00
$sql .= " fk_user_valid= " . ( isset ( $this -> user_valid ) && $this -> user_valid > 0 ? $this -> user_valid : " null " ) . " , " ;
2021-02-27 10:10:28 +01:00
$sql .= " fk_projet= " . ( isset ( $this -> fk_project ) ? $this -> fk_project : " null " ) . " , " ;
$sql .= " fk_cond_reglement= " . ( isset ( $this -> cond_reglement_id ) ? $this -> cond_reglement_id : " null " ) . " , " ;
$sql .= " fk_mode_reglement= " . ( isset ( $this -> mode_reglement_id ) ? $this -> mode_reglement_id : " null " ) . " , " ;
$sql .= " date_livraison= " . ( strval ( $this -> delivery_date ) != '' ? " ' " . $this -> db -> idate ( $this -> delivery_date ) . " ' " : 'null' ) . " , " ;
//$sql .= " fk_shipping_method=".(isset($this->shipping_method_id) ? $this->shipping_method_id : "null").",";
$sql .= " fk_account= " . ( $this -> fk_account > 0 ? $this -> fk_account : " null " ) . " , " ;
//$sql .= " fk_input_reason=".($this->demand_reason_id > 0 ? $this->demand_reason_id : "null").",";
$sql .= " note_private= " . ( isset ( $this -> note_private ) ? " ' " . $this -> db -> escape ( $this -> note_private ) . " ' " : " null " ) . " , " ;
$sql .= " note_public= " . ( isset ( $this -> note_public ) ? " ' " . $this -> db -> escape ( $this -> note_public ) . " ' " : " null " ) . " , " ;
$sql .= " model_pdf= " . ( isset ( $this -> model_pdf ) ? " ' " . $this -> db -> escape ( $this -> model_pdf ) . " ' " : " null " ) . " , " ;
$sql .= " import_key= " . ( isset ( $this -> import_key ) ? " ' " . $this -> db -> escape ( $this -> import_key ) . " ' " : " null " ) . " " ;
2021-03-14 12:20:23 +01:00
$sql .= " WHERE rowid= " . (( int ) $this -> id );
2021-02-27 10:10:28 +01:00
$this -> db -> begin ();
dol_syslog ( get_class ( $this ) . " ::update " , LOG_DEBUG );
$resql = $this -> db -> query ( $sql );
if ( ! $resql ) {
$error ++ ;
$this -> errors [] = " Error " . $this -> db -> lasterror ();
}
if ( ! $error ) {
$result = $this -> insertExtraFields ();
if ( $result < 0 ) {
$error ++ ;
}
}
if ( ! $error && ! $notrigger ) {
// Call trigger
$result = $this -> call_trigger ( 'ORDER_SUPPLIER_MODIFY' , $user );
if ( $result < 0 ) {
$error ++ ;
}
// End call triggers
}
// Commit or rollback
if ( $error ) {
foreach ( $this -> errors as $errmsg ) {
dol_syslog ( get_class ( $this ) . " ::update " . $errmsg , LOG_ERR );
$this -> error .= ( $this -> error ? ', ' . $errmsg : $errmsg );
}
$this -> db -> rollback ();
return - 1 * $error ;
} else {
$this -> db -> commit ();
return 1 ;
}
}
2020-09-08 21:27:28 +02:00
/**
* Load an object from its id and create a new one in database
*
2019-04-25 12:11:32 +02:00
* @ param User $user User making the clone
2019-11-02 20:50:25 +01:00
* @ param int $socid Id of thirdparty
2021-04-13 20:24:18 +02:00
* @ param int $notrigger Disable all triggers
2020-09-08 21:27:28 +02:00
* @ return int New id of clone
*/
2021-04-13 20:19:02 +02:00
public function createFromClone ( User $user , $socid = 0 , $notrigger = 0 )
2020-09-08 21:27:28 +02:00
{
global $conf , $user , $hookmanager ;
2011-09-11 20:35:38 +02:00
2020-09-08 21:27:28 +02:00
$error = 0 ;
2012-12-01 15:45:05 +01:00
2015-02-26 13:03:17 +01:00
$this -> db -> begin ();
2012-12-01 15:45:05 +01:00
2020-09-08 21:27:28 +02:00
// get extrafields so they will be clone
2021-02-25 23:21:30 +01:00
foreach ( $this -> lines as $line ) {
2020-09-08 21:27:28 +02:00
$line -> fetch_optionals ();
2021-02-25 23:21:30 +01:00
}
2019-11-02 20:50:25 +01:00
2015-09-24 16:32:48 +02:00
// Load source object
$objFrom = clone $this ;
2012-12-01 15:45:05 +01:00
2019-11-02 20:50:25 +01:00
// Change socid if needed
2021-02-25 23:21:30 +01:00
if ( ! empty ( $socid ) && $socid != $this -> socid ) {
2019-11-02 20:50:25 +01:00
$objsoc = new Societe ( $this -> db );
2021-02-25 23:21:30 +01:00
if ( $objsoc -> fetch ( $socid ) > 0 ) {
2020-01-30 01:48:28 +01:00
$this -> socid = $objsoc -> id ;
$this -> cond_reglement_id = ( ! empty ( $objsoc -> cond_reglement_id ) ? $objsoc -> cond_reglement_id : 0 );
$this -> mode_reglement_id = ( ! empty ( $objsoc -> mode_reglement_id ) ? $objsoc -> mode_reglement_id : 0 );
$this -> fk_project = 0 ;
$this -> fk_delivery_address = 0 ;
2019-11-02 20:50:25 +01:00
}
// TODO Change product price if multi-prices
}
2020-09-08 21:27:28 +02:00
$this -> id = 0 ;
$this -> statut = self :: STATUS_DRAFT ;
// Clear fields
$this -> user_author_id = $user -> id ;
2022-07-03 12:54:58 +02:00
$this -> user_valid = 0 ;
2020-09-08 21:27:28 +02:00
$this -> date_creation = '' ;
$this -> date_validation = '' ;
$this -> ref_supplier = '' ;
$this -> user_approve_id = '' ;
$this -> user_approve_id2 = '' ;
$this -> date_approve = '' ;
$this -> date_approve2 = '' ;
// Create clone
$this -> context [ 'createfromclone' ] = 'createfromclone' ;
2021-04-13 20:19:02 +02:00
$result = $this -> create ( $user , $notrigger );
2021-02-25 23:21:30 +01:00
if ( $result < 0 ) {
$error ++ ;
}
2020-09-08 21:27:28 +02:00
2021-02-25 23:21:30 +01:00
if ( ! $error ) {
2020-09-08 21:27:28 +02:00
// Hook of thirdparty module
2021-02-25 23:21:30 +01:00
if ( is_object ( $hookmanager )) {
2020-09-08 21:27:28 +02:00
$parameters = array ( 'objFrom' => $objFrom );
$action = '' ;
$reshook = $hookmanager -> executeHooks ( 'createFrom' , $parameters , $this , $action ); // Note that $action and $object may have been modified by some hooks
2021-02-25 23:21:30 +01:00
if ( $reshook < 0 ) {
2023-01-18 09:53:28 +01:00
$this -> errors += $hookmanager -> errors ;
$this -> error = $hookmanager -> error ;
2021-02-25 23:21:30 +01:00
$error ++ ;
}
2020-09-08 21:27:28 +02:00
}
}
2012-12-01 15:45:05 +01:00
2015-02-26 13:03:17 +01:00
unset ( $this -> context [ 'createfromclone' ]);
// End
2021-02-25 23:21:30 +01:00
if ( ! $error ) {
2020-09-08 21:27:28 +02:00
$this -> db -> commit ();
return $this -> id ;
} else {
$this -> db -> rollback ();
return - 1 ;
}
}
/**
* Add order line
*
* @ param string $desc Description
2022-03-26 11:22:54 +01:00
* @ param float $pu_ht Unit price ( used if $price_base_type is 'HT' )
2020-09-08 21:27:28 +02:00
* @ param float $qty Quantity
* @ param float $txtva Taux tva
* @ param float $txlocaltax1 Localtax1 tax
* @ param float $txlocaltax2 Localtax2 tax
* @ param int $fk_product Id product
* @ param int $fk_prod_fourn_price Id supplier price
* @ param string $ref_supplier Supplier reference price
* @ param float $remise_percent Remise
* @ param string $price_base_type HT or TTC
2022-03-26 11:22:54 +01:00
* @ param float $pu_ttc Unit price TTC ( used if $price_base_type is 'TTC' )
2020-09-08 21:27:28 +02:00
* @ param int $type Type of line ( 0 = product , 1 = service )
* @ param int $info_bits More information
* @ param bool $notrigger Disable triggers
* @ param int $date_start Date start of service
* @ param int $date_end Date end of service
2015-02-28 04:59:27 +01:00
* @ param array $array_options extrafields array
2020-09-08 21:27:28 +02:00
* @ param string $fk_unit Code of the unit to use . Null to use the default one
2016-12-11 02:09:57 +01:00
* @ param string $pu_ht_devise Amount in currency
2017-03-23 12:35:43 +01:00
* @ param string $origin 'order' , ...
* @ param int $origin_id Id of origin object
2022-04-09 00:59:19 +02:00
* @ param int $rang Rank
2020-09-08 21:27:28 +02:00
* @ return int <= 0 if KO , > 0 if OK
*/
2021-11-16 14:20:24 +01:00
public function addline ( $desc , $pu_ht , $qty , $txtva , $txlocaltax1 = 0.0 , $txlocaltax2 = 0.0 , $fk_product = 0 , $fk_prod_fourn_price = 0 , $ref_supplier = '' , $remise_percent = 0.0 , $price_base_type = 'HT' , $pu_ttc = 0.0 , $type = 0 , $info_bits = 0 , $notrigger = false , $date_start = null , $date_end = null , $array_options = 0 , $fk_unit = null , $pu_ht_devise = 0 , $origin = '' , $origin_id = 0 , $rang = - 1 )
2020-09-08 21:27:28 +02:00
{
global $langs , $mysoc , $conf ;
2015-11-16 13:24:11 +01:00
2020-09-08 21:27:28 +02:00
dol_syslog ( get_class ( $this ) . " ::addline $desc , $pu_ht , $qty , $txtva , $txlocaltax1 , $txlocaltax2 , $fk_product , $fk_prod_fourn_price , $ref_supplier , $remise_percent , $price_base_type , $pu_ttc , $type , $info_bits , $notrigger , $date_start , $date_end , $fk_unit , $pu_ht_devise , $origin , $origin_id " );
include_once DOL_DOCUMENT_ROOT . '/core/lib/price.lib.php' ;
2011-09-11 20:35:38 +02:00
2021-02-25 23:21:30 +01:00
if ( $this -> statut == self :: STATUS_DRAFT ) {
2018-12-03 12:28:17 +01:00
include_once DOL_DOCUMENT_ROOT . '/core/lib/price.lib.php' ;
// Clean parameters
2021-02-25 23:21:30 +01:00
if ( empty ( $qty )) {
$qty = 0 ;
}
if ( ! $info_bits ) {
$info_bits = 0 ;
}
if ( empty ( $txtva )) {
$txtva = 0 ;
}
2021-11-16 14:20:24 +01:00
if ( empty ( $rang )) {
$rang = 0 ;
}
2021-02-25 23:21:30 +01:00
if ( empty ( $txlocaltax1 )) {
$txlocaltax1 = 0 ;
}
if ( empty ( $txlocaltax2 )) {
$txlocaltax2 = 0 ;
}
if ( empty ( $remise_percent )) {
$remise_percent = 0 ;
}
2019-11-13 19:35:39 +01:00
$remise_percent = price2num ( $remise_percent );
$qty = price2num ( $qty );
$pu_ht = price2num ( $pu_ht );
$pu_ht_devise = price2num ( $pu_ht_devise );
$pu_ttc = price2num ( $pu_ttc );
2018-12-03 12:28:17 +01:00
if ( ! preg_match ( '/\((.*)\)/' , $txtva )) {
2019-11-13 19:35:39 +01:00
$txtva = price2num ( $txtva ); // $txtva can have format '5.0(XXX)' or '5'
2018-12-03 12:28:17 +01:00
}
$txlocaltax1 = price2num ( $txlocaltax1 );
$txlocaltax2 = price2num ( $txlocaltax2 );
2021-02-25 23:21:30 +01:00
if ( $price_base_type == 'HT' ) {
2019-11-13 19:35:39 +01:00
$pu = $pu_ht ;
2020-05-21 15:05:19 +02:00
} else {
2019-11-13 19:35:39 +01:00
$pu = $pu_ttc ;
2018-12-03 12:28:17 +01:00
}
2019-11-13 19:35:39 +01:00
$desc = trim ( $desc );
2018-11-27 11:36:31 +01:00
2018-12-03 12:28:17 +01:00
// Check parameters
2021-02-25 23:21:30 +01:00
if ( $qty < 0 && ! $fk_product ) {
2019-11-13 19:35:39 +01:00
$this -> error = $langs -> trans ( " ErrorFieldRequired " , $langs -> transnoentitiesnoconv ( " Product " ));
2018-12-03 12:28:17 +01:00
return - 1 ;
}
2021-02-25 23:21:30 +01:00
if ( $type < 0 ) {
return - 1 ;
}
2019-03-24 14:30:00 +01:00
if ( $date_start && $date_end && $date_start > $date_end ) {
$langs -> load ( " errors " );
2019-11-13 19:35:39 +01:00
$this -> error = $langs -> trans ( 'ErrorStartDateGreaterEnd' );
2019-03-24 14:30:00 +01:00
return - 1 ;
}
2017-06-30 11:40:26 +02:00
2011-09-11 20:35:38 +02:00
2020-09-07 10:18:17 +02:00
$this -> db -> begin ();
2011-09-11 20:35:38 +02:00
2020-12-17 18:08:56 +01:00
$product_type = $type ;
$label = '' ; // deprecated
if ( $fk_product > 0 ) {
if ( ! empty ( $conf -> global -> SUPPLIER_ORDER_WITH_PREDEFINED_PRICES_ONLY )) {
2020-09-07 10:18:17 +02:00
// Check quantity is enough
dol_syslog ( get_class ( $this ) . " ::addline we check supplier prices fk_product= " . $fk_product . " fk_prod_fourn_price= " . $fk_prod_fourn_price . " qty= " . $qty . " ref_supplier= " . $ref_supplier );
$prod = new Product ( $this -> db );
2020-12-17 18:08:56 +01:00
if ( $prod -> fetch ( $fk_product ) > 0 ) {
2020-09-07 10:18:17 +02:00
$product_type = $prod -> type ;
$label = $prod -> label ;
// We use 'none' instead of $ref_supplier, because fourn_ref may not exists anymore. So we will take the first supplier price ok.
// If we want a dedicated supplier price, we must provide $fk_prod_fourn_price.
2020-12-17 17:04:42 +01:00
$result = $prod -> get_buyprice ( $fk_prod_fourn_price , $qty , $fk_product , 'none' , ( isset ( $this -> fk_soc ) ? $this -> fk_soc : $this -> socid )); // Search on couple $fk_prod_fourn_price/$qty first, then on triplet $qty/$fk_product/$ref_supplier/$this->fk_soc
2020-09-07 10:18:17 +02:00
// If supplier order created from customer order, we take best supplier price
// If $pu (defined previously from pu_ht or pu_ttc) is not defined at all, we also take the best supplier price
2021-02-25 23:21:30 +01:00
if ( $result > 0 && ( $origin == 'commande' || $pu === '' )) {
2020-09-07 10:18:17 +02:00
$pu = $prod -> fourn_pu ; // Unit price supplier price set by get_buyprice
$ref_supplier = $prod -> ref_supplier ; // Ref supplier price set by get_buyprice
// is remise percent not keyed but present for the product we add it
2021-02-25 23:21:30 +01:00
if ( $remise_percent == 0 && $prod -> remise_percent != 0 ) {
$remise_percent = $prod -> remise_percent ;
}
2020-09-07 10:18:17 +02:00
}
2021-02-25 23:21:30 +01:00
if ( $result == 0 ) { // If result == 0, we failed to found the supplier reference price
2020-09-07 10:18:17 +02:00
$langs -> load ( " errors " );
$this -> error = " Ref " . $prod -> ref . " " . $langs -> trans ( " ErrorQtyTooLowForThisSupplier " );
$this -> db -> rollback ();
dol_syslog ( get_class ( $this ) . " ::addline we did not found supplier price, so we can't guess unit price " );
//$pu = $prod->fourn_pu; // We do not overwrite unit price
//$ref = $prod->ref_fourn; // We do not overwrite ref supplier price
return - 1 ;
}
2021-02-25 23:21:30 +01:00
if ( $result == - 1 ) {
2020-09-07 10:18:17 +02:00
$langs -> load ( " errors " );
$this -> error = " Ref " . $prod -> ref . " " . $langs -> trans ( " ErrorQtyTooLowForThisSupplier " );
$this -> db -> rollback ();
dol_syslog ( get_class ( $this ) . " ::addline result= " . $result . " - " . $this -> error , LOG_DEBUG );
return - 1 ;
}
2021-02-25 23:21:30 +01:00
if ( $result < - 1 ) {
2020-09-07 10:18:17 +02:00
$this -> error = $prod -> error ;
$this -> db -> rollback ();
dol_syslog ( get_class ( $this ) . " ::addline result= " . $result . " - " . $this -> error , LOG_ERR );
return - 1 ;
}
} else {
$this -> error = $prod -> error ;
$this -> db -> rollback ();
return - 1 ;
}
}
2019-11-23 19:05:49 +01:00
2020-12-17 18:08:56 +01:00
// Predefine quantity according to packaging
if ( ! empty ( $conf -> global -> PRODUCT_USE_SUPPLIER_PACKAGING )) {
2022-07-23 23:55:57 +02:00
$prod = new Product ( $this -> db );
2020-02-21 17:53:37 +01:00
$prod -> get_buyprice ( $fk_prod_fourn_price , $qty , $fk_product , 'none' , ( $this -> fk_soc ? $this -> fk_soc : $this -> socid ));
2022-03-17 18:53:50 +01:00
2020-12-17 18:08:56 +01:00
if ( $qty < $prod -> packaging ) {
2019-11-23 19:05:49 +01:00
$qty = $prod -> packaging ;
2020-05-21 15:05:19 +02:00
} else {
2020-12-17 18:08:56 +01:00
if ( ! empty ( $prod -> packaging ) && ( $qty % $prod -> packaging ) > 0 ) {
2020-02-21 17:53:37 +01:00
$coeff = intval ( $qty / $prod -> packaging ) + 1 ;
2019-11-23 19:05:49 +01:00
$qty = $prod -> packaging * $coeff ;
2022-07-22 10:51:28 +02:00
setEventMessage ( $langs -> trans ( 'QtyRecalculatedWithPackaging' ), 'mesgs' );
2019-11-23 19:05:49 +01:00
}
}
}
2020-09-07 10:18:17 +02:00
}
2011-09-11 20:35:38 +02:00
2020-11-22 11:36:07 +01:00
if ( ! empty ( $conf -> multicurrency -> enabled ) && $pu_ht_devise > 0 ) {
2020-09-07 10:18:17 +02:00
$pu = 0 ;
}
2013-11-19 21:08:02 +01:00
2020-09-07 10:18:17 +02:00
$localtaxes_type = getLocalTaxesFromRate ( $txtva , 0 , $mysoc , $this -> thirdparty );
2016-08-05 09:46:17 +02:00
2020-09-07 10:18:17 +02:00
// Clean vat code
$vat_src_code = '' ;
2021-02-25 23:21:30 +01:00
if ( preg_match ( '/\((.*)\)/' , $txtva , $reg )) {
2020-09-07 10:18:17 +02:00
$vat_src_code = $reg [ 1 ];
$txtva = preg_replace ( '/\s*\(.*\)/' , '' , $txtva ); // Remove code into vatrate.
}
2017-06-30 11:40:26 +02:00
2020-09-07 10:18:17 +02:00
// Calcul du total TTC et de la TVA pour la ligne a partir de
// qty, pu, remise_percent et txtva
// TRES IMPORTANT: C'est au moment de l'insertion ligne qu'on doit stocker
// la part ht, tva et ttc, et ce au niveau de la ligne qui a son propre taux tva.
2018-02-23 11:06:07 +01:00
2020-09-07 10:18:17 +02:00
$tabprice = calcul_price_total ( $qty , $pu , $remise_percent , $txtva , $txlocaltax1 , $txlocaltax2 , 0 , $price_base_type , $info_bits , $product_type , $this -> thirdparty , $localtaxes_type , 100 , $this -> multicurrency_tx , $pu_ht_devise );
2018-06-16 13:49:28 +02:00
2020-09-07 10:18:17 +02:00
$total_ht = $tabprice [ 0 ];
$total_tva = $tabprice [ 1 ];
$total_ttc = $tabprice [ 2 ];
$total_localtax1 = $tabprice [ 9 ];
$total_localtax2 = $tabprice [ 10 ];
$pu = $pu_ht = $tabprice [ 3 ];
2011-09-11 20:35:38 +02:00
2016-02-16 23:58:21 +01:00
// MultiCurrency
2019-11-13 19:35:39 +01:00
$multicurrency_total_ht = $tabprice [ 16 ];
2020-09-07 10:18:17 +02:00
$multicurrency_total_tva = $tabprice [ 17 ];
$multicurrency_total_ttc = $tabprice [ 18 ];
2016-12-11 02:09:57 +01:00
$pu_ht_devise = $tabprice [ 19 ];
2016-08-05 09:46:17 +02:00
2020-12-22 17:33:17 +01:00
$localtax1_type = empty ( $localtaxes_type [ 0 ]) ? '' : $localtaxes_type [ 0 ];
$localtax2_type = empty ( $localtaxes_type [ 2 ]) ? '' : $localtaxes_type [ 2 ];
2011-09-11 20:35:38 +02:00
2021-11-16 16:15:55 +01:00
if ( $rang < 0 ) {
2021-11-16 14:20:24 +01:00
$rangmax = $this -> line_max ();
$rang = $rangmax + 1 ;
}
2015-02-28 04:59:27 +01:00
2020-09-07 10:18:17 +02:00
// Insert line
$this -> line = new CommandeFournisseurLigne ( $this -> db );
2011-09-11 20:35:38 +02:00
2020-09-07 10:18:17 +02:00
$this -> line -> context = $this -> context ;
2011-09-11 20:35:38 +02:00
2020-09-07 10:18:17 +02:00
$this -> line -> fk_commande = $this -> id ;
$this -> line -> label = $label ;
$this -> line -> ref_fourn = $ref_supplier ;
$this -> line -> ref_supplier = $ref_supplier ;
$this -> line -> desc = $desc ;
$this -> line -> qty = $qty ;
$this -> line -> tva_tx = $txtva ;
$this -> line -> localtax1_tx = ( $total_localtax1 ? $localtaxes_type [ 1 ] : 0 );
$this -> line -> localtax2_tx = ( $total_localtax2 ? $localtaxes_type [ 3 ] : 0 );
2020-12-22 17:33:17 +01:00
$this -> line -> localtax1_type = $localtax1_type ;
$this -> line -> localtax2_type = $localtax2_type ;
2020-09-07 10:18:17 +02:00
$this -> line -> fk_product = $fk_product ;
$this -> line -> product_type = $product_type ;
$this -> line -> remise_percent = $remise_percent ;
$this -> line -> subprice = $pu_ht ;
$this -> line -> rang = $rang ;
$this -> line -> info_bits = $info_bits ;
$this -> line -> vat_src_code = $vat_src_code ;
$this -> line -> total_ht = $total_ht ;
$this -> line -> total_tva = $total_tva ;
$this -> line -> total_localtax1 = $total_localtax1 ;
$this -> line -> total_localtax2 = $total_localtax2 ;
$this -> line -> total_ttc = $total_ttc ;
$this -> line -> product_type = $type ;
$this -> line -> special_code = $this -> special_code ;
$this -> line -> origin = $origin ;
$this -> line -> origin_id = $origin_id ;
$this -> line -> fk_unit = $fk_unit ;
$this -> line -> date_start = $date_start ;
$this -> line -> date_end = $date_end ;
// Multicurrency
$this -> line -> fk_multicurrency = $this -> fk_multicurrency ;
$this -> line -> multicurrency_code = $this -> multicurrency_code ;
$this -> line -> multicurrency_subprice = $pu_ht_devise ;
$this -> line -> multicurrency_total_ht = $multicurrency_total_ht ;
$this -> line -> multicurrency_total_tva = $multicurrency_total_tva ;
$this -> line -> multicurrency_total_ttc = $multicurrency_total_ttc ;
$this -> line -> subprice = $pu_ht ;
$this -> line -> price = $this -> line -> subprice ;
$this -> line -> remise_percent = $remise_percent ;
if ( is_array ( $array_options ) && count ( $array_options ) > 0 ) {
$this -> line -> array_options = $array_options ;
}
$result = $this -> line -> insert ( $notrigger );
2021-02-25 23:21:30 +01:00
if ( $result > 0 ) {
2020-09-07 10:18:17 +02:00
// Reorder if child line
2021-02-25 23:21:30 +01:00
if ( ! empty ( $fk_parent_line )) {
$this -> line_order ( true , 'DESC' );
2021-11-16 16:15:55 +01:00
} elseif ( $rang > 0 && $rang <= count ( $this -> lines )) { // Update all rank of all other lines
2021-11-23 11:10:01 +01:00
$linecount = count ( $this -> lines );
for ( $ii = $rang ; $ii <= $linecount ; $ii ++ ) {
2021-11-16 14:20:24 +01:00
$this -> updateRangOfLine ( $this -> lines [ $ii - 1 ] -> id , $ii + 1 );
}
2021-02-25 23:21:30 +01:00
}
2020-09-07 10:18:17 +02:00
// Mise a jour informations denormalisees au niveau de la commande meme
$result = $this -> update_price ( 1 , 'auto' , 0 , $this -> thirdparty ); // This method is designed to add line from user input so total calculation must be done using 'auto' mode.
2021-02-25 23:21:30 +01:00
if ( $result > 0 ) {
2020-09-07 10:18:17 +02:00
$this -> db -> commit ();
return $this -> line -> id ;
} else {
$this -> db -> rollback ();
return - 1 ;
}
} else {
$this -> error = $this -> line -> error ;
$this -> errors = $this -> line -> errors ;
dol_syslog ( get_class ( $this ) . " ::addline error= " . $this -> error , LOG_ERR );
$this -> db -> rollback ();
return - 1 ;
}
}
}
/**
* Save a receiving into the tracking table of receiving ( commande_fournisseur_dispatch ) and add product into stock warehouse .
*
* @ param User $user User object making change
* @ param int $product Id of product to dispatch
* @ param double $qty Qty to dispatch
* @ param int $entrepot Id of warehouse to add product
* @ param double $price Unit Price for PMP value calculation ( Unit price without Tax and taking into account discount )
* @ param string $comment Comment for stock movement
2019-04-04 18:33:12 +02:00
* @ param integer $eatby eat - by date
* @ param integer $sellby sell - by date
2015-02-12 13:20:03 +01:00
* @ param string $batch Lot number
* @ param int $fk_commandefourndet Id of supplier order line
2020-09-07 10:18:17 +02:00
* @ param int $notrigger 1 = notrigger
* @ return int < 0 if KO , > 0 if OK
*/
public function dispatchProduct ( $user , $product , $qty , $entrepot , $price = 0 , $comment = '' , $eatby = '' , $sellby = '' , $batch = '' , $fk_commandefourndet = 0 , $notrigger = 0 )
{
global $conf , $langs ;
2015-04-09 15:14:50 +02:00
2020-09-07 10:18:17 +02:00
$error = 0 ;
require_once DOL_DOCUMENT_ROOT . '/product/stock/class/mouvementstock.class.php' ;
2011-09-11 20:35:38 +02:00
2020-09-07 10:18:17 +02:00
// Check parameters (if test are wrong here, there is bug into caller)
2021-02-25 23:21:30 +01:00
if ( $entrepot <= 0 ) {
2020-09-07 10:18:17 +02:00
$this -> error = 'ErrorBadValueForParameterWarehouse' ;
return - 1 ;
}
2021-02-25 23:21:30 +01:00
if ( $qty == 0 ) {
2020-09-07 10:18:17 +02:00
$this -> error = 'ErrorBadValueForParameterQty' ;
return - 1 ;
}
2011-09-11 20:35:38 +02:00
2020-09-07 10:18:17 +02:00
$dispatchstatus = 1 ;
2021-02-25 23:21:30 +01:00
if ( ! empty ( $conf -> global -> SUPPLIER_ORDER_USE_DISPATCH_STATUS )) {
$dispatchstatus = 0 ; // Setting dispatch status (a validation step after receiving products) will be done manually to 1 or 2 if this option is on
}
2015-02-11 15:03:33 +01:00
2020-09-07 10:18:17 +02:00
$now = dol_now ();
2011-09-11 20:35:38 +02:00
2022-09-12 13:25:07 +02:00
$inventorycode = dol_print_date ( dol_now (), 'dayhourlog' );
2022-09-12 13:09:21 +02:00
2021-02-25 23:21:30 +01:00
if (( $this -> statut == self :: STATUS_ORDERSENT || $this -> statut == self :: STATUS_RECEIVED_PARTIALLY || $this -> statut == self :: STATUS_RECEIVED_COMPLETELY )) {
2020-09-07 10:18:17 +02:00
$this -> db -> begin ();
2011-09-11 20:35:38 +02:00
2020-09-07 10:18:17 +02:00
$sql = " INSERT INTO " . MAIN_DB_PREFIX . " commande_fournisseur_dispatch " ;
$sql .= " (fk_commande, fk_product, qty, fk_entrepot, fk_user, datec, fk_commandefourndet, status, comment, eatby, sellby, batch) VALUES " ;
$sql .= " (' " . $this -> id . " ',' " . $product . " ',' " . $qty . " ', " . ( $entrepot > 0 ? " ' " . $entrepot . " ' " : " null " ) . " ,' " . $user -> id . " ',' " . $this -> db -> idate ( $now ) . " ',' " . $fk_commandefourndet . " ', " . $dispatchstatus . " , ' " . $this -> db -> escape ( $comment ) . " ', " ;
2020-09-20 02:30:53 +02:00
$sql .= ( $eatby ? " ' " . $this -> db -> idate ( $eatby ) . " ' " : " null " ) . " , " . ( $sellby ? " ' " . $this -> db -> idate ( $sellby ) . " ' " : " null " ) . " , " . ( $batch ? " ' " . $this -> db -> escape ( $batch ) . " ' " : " null " );
2020-09-07 10:18:17 +02:00
$sql .= " ) " ;
2011-09-11 20:35:38 +02:00
2020-09-07 10:18:17 +02:00
dol_syslog ( get_class ( $this ) . " ::dispatchProduct " , LOG_DEBUG );
$resql = $this -> db -> query ( $sql );
2021-02-25 23:21:30 +01:00
if ( $resql ) {
if ( ! $notrigger ) {
2020-09-07 10:18:17 +02:00
global $conf , $langs , $user ;
2014-07-11 15:32:23 +02:00
// Call trigger
2019-11-13 19:35:39 +01:00
$result = $this -> call_trigger ( 'LINEORDER_SUPPLIER_DISPATCH' , $user );
2021-02-25 23:21:30 +01:00
if ( $result < 0 ) {
2020-09-07 10:18:17 +02:00
$error ++ ;
}
2014-07-11 15:32:23 +02:00
// End call triggers
2020-09-07 10:18:17 +02:00
}
} else {
$this -> error = $this -> db -> lasterror ();
$error ++ ;
}
2011-09-11 20:35:38 +02:00
2020-09-07 10:18:17 +02:00
// If module stock is enabled and the stock increase is done on purchase order dispatching
2021-02-25 23:21:30 +01:00
if ( ! $error && $entrepot > 0 && ! empty ( $conf -> stock -> enabled ) && ! empty ( $conf -> global -> STOCK_CALCULATE_ON_SUPPLIER_DISPATCH_ORDER )) {
2020-09-07 10:18:17 +02:00
$mouv = new MouvementStock ( $this -> db );
2021-02-25 23:21:30 +01:00
if ( $product > 0 ) {
2020-09-07 10:18:17 +02:00
// $price should take into account discount (except if option STOCK_EXCLUDE_DISCOUNT_FOR_PMP is on)
$mouv -> origin = & $this ;
2022-03-22 13:46:55 +01:00
$mouv -> setOrigin ( $this -> element , $this -> id );
2022-09-15 18:30:42 +02:00
2022-05-09 20:13:06 +02:00
// Method change if qty < 0
if ( ! empty ( $conf -> global -> SUPPLIER_ORDER_ALLOW_NEGATIVE_QTY_FOR_SUPPLIER_ORDER_RETURN ) && $qty < 0 ) {
2022-09-24 11:40:41 +02:00
$result = $mouv -> livraison ( $user , $product , $entrepot , $qty * ( - 1 ), $price , $comment , $now , $eatby , $sellby , $batch , 0 , $inventorycode );
2022-05-09 20:13:06 +02:00
} else {
2022-09-20 18:24:26 +02:00
$result = $mouv -> reception ( $user , $product , $entrepot , $qty , $price , $comment , $eatby , $sellby , $batch , '' , 0 , $inventorycode );
2022-05-09 20:13:06 +02:00
}
2022-09-15 18:30:42 +02:00
2021-02-25 23:21:30 +01:00
if ( $result < 0 ) {
2020-09-07 10:18:17 +02:00
$this -> error = $mouv -> error ;
$this -> errors = $mouv -> errors ;
dol_syslog ( get_class ( $this ) . " ::dispatchProduct " . $this -> error . " " . join ( ',' , $this -> errors ), LOG_ERR );
$error ++ ;
}
}
}
2011-09-11 20:35:38 +02:00
2021-02-25 23:21:30 +01:00
if ( $error == 0 ) {
2020-09-07 10:18:17 +02:00
$this -> db -> commit ();
return 1 ;
} else {
$this -> db -> rollback ();
return - 1 ;
}
} else {
$this -> error = 'BadStatusForObject' ;
return - 2 ;
}
}
2014-06-28 14:53:28 +02:00
2020-09-07 10:18:17 +02:00
/**
* Delete line
*
* @ param int $idline Id of line to delete
* @ param int $notrigger 1 = Disable call to triggers
* @ return int < 0 if KO , > 0 if OK
*/
public function deleteline ( $idline , $notrigger = 0 )
{
2021-02-25 23:21:30 +01:00
if ( $this -> statut == 0 ) {
2020-09-07 10:18:17 +02:00
$line = new CommandeFournisseurLigne ( $this -> db );
2014-06-28 14:53:28 +02:00
2021-02-25 23:21:30 +01:00
if ( $line -> fetch ( $idline ) <= 0 ) {
2020-09-07 10:18:17 +02:00
return 0 ;
}
2011-09-11 20:35:38 +02:00
2021-02-25 23:21:30 +01:00
if ( $line -> delete ( $notrigger ) > 0 ) {
2020-09-07 10:18:17 +02:00
$this -> update_price ();
return 1 ;
} else {
$this -> error = $line -> error ;
$this -> errors = $line -> errors ;
return - 1 ;
}
} else {
return - 2 ;
}
}
2011-09-11 20:35:38 +02:00
2020-09-07 10:18:17 +02:00
/**
* Delete an order
*
* @ param User $user Object user
* @ param int $notrigger 1 = Does not execute triggers , 0 = execute triggers
* @ return int < 0 if KO , > 0 if OK
*/
public function delete ( User $user , $notrigger = 0 )
{
global $langs , $conf ;
require_once DOL_DOCUMENT_ROOT . '/core/lib/files.lib.php' ;
2011-09-11 20:35:38 +02:00
2020-09-07 10:18:17 +02:00
$error = 0 ;
2017-04-07 14:09:19 +02:00
2020-09-07 10:18:17 +02:00
$this -> db -> begin ();
2011-09-11 20:35:38 +02:00
2021-02-25 23:21:30 +01:00
if ( empty ( $notrigger )) {
2020-09-07 10:18:17 +02:00
// Call trigger
$result = $this -> call_trigger ( 'ORDER_SUPPLIER_DELETE' , $user );
2021-02-25 23:21:30 +01:00
if ( $result < 0 ) {
2020-09-07 10:18:17 +02:00
$this -> errors [] = 'ErrorWhenRunningTrigger' ;
dol_syslog ( get_class ( $this ) . " ::delete " . $this -> error , LOG_ERR );
$this -> db -> rollback ();
return - 1 ;
}
// End call triggers
}
2020-04-23 18:27:06 +02:00
2021-05-17 12:00:56 +02:00
// Test we can delete
$this -> fetchObjectLinked ( null , 'order_supplier' );
2021-10-28 17:37:30 +02:00
if ( ! empty ( $this -> linkedObjects ) && array_key_exists ( 'reception' , $this -> linkedObjects )) {
2021-05-17 12:00:56 +02:00
foreach ( $this -> linkedObjects [ 'reception' ] as $element ) {
if ( $element -> statut >= 0 ) {
$this -> errors [] = $langs -> trans ( 'ReceptionExist' );
$error ++ ;
break ;
}
}
}
2020-09-07 10:18:17 +02:00
$main = MAIN_DB_PREFIX . 'commande_fournisseurdet' ;
$ef = $main . " _extrafields " ;
2021-08-23 19:33:24 +02:00
$sql = " DELETE FROM $ef WHERE fk_object IN (SELECT rowid FROM $main WHERE fk_commande = " . (( int ) $this -> id ) . " ) " ;
2020-09-07 10:18:17 +02:00
dol_syslog ( get_class ( $this ) . " ::delete extrafields lines " , LOG_DEBUG );
2021-02-25 23:21:30 +01:00
if ( ! $this -> db -> query ( $sql )) {
2020-09-07 10:18:17 +02:00
$this -> error = $this -> db -> lasterror ();
$this -> errors [] = $this -> db -> lasterror ();
$error ++ ;
}
2011-09-11 20:35:38 +02:00
2021-08-23 19:33:24 +02:00
$sql = " DELETE FROM " . MAIN_DB_PREFIX . " commande_fournisseurdet WHERE fk_commande = " . (( int ) $this -> id );
2020-09-07 10:18:17 +02:00
dol_syslog ( get_class ( $this ) . " ::delete " , LOG_DEBUG );
2021-02-25 23:21:30 +01:00
if ( ! $this -> db -> query ( $sql )) {
2020-09-07 10:18:17 +02:00
$this -> error = $this -> db -> lasterror ();
$this -> errors [] = $this -> db -> lasterror ();
$error ++ ;
}
2013-06-09 16:15:49 +02:00
2021-08-23 19:33:24 +02:00
$sql = " DELETE FROM " . MAIN_DB_PREFIX . " commande_fournisseur WHERE rowid = " . (( int ) $this -> id );
2020-09-07 10:18:17 +02:00
dol_syslog ( get_class ( $this ) . " ::delete " , LOG_DEBUG );
2021-02-25 23:21:30 +01:00
if ( $resql = $this -> db -> query ( $sql )) {
if ( $this -> db -> affected_rows ( $resql ) < 1 ) {
2020-09-07 10:18:17 +02:00
$this -> error = $this -> db -> lasterror ();
$this -> errors [] = $this -> db -> lasterror ();
$error ++ ;
}
} else {
$this -> error = $this -> db -> lasterror ();
$this -> errors [] = $this -> db -> lasterror ();
$error ++ ;
}
// Remove extrafields
2021-02-25 23:21:30 +01:00
if ( ! $error ) {
2020-09-07 10:18:17 +02:00
$result = $this -> deleteExtraFields ();
2021-02-25 23:21:30 +01:00
if ( $result < 0 ) {
2020-09-07 10:18:17 +02:00
$this -> error = 'FailToDeleteExtraFields' ;
$this -> errors [] = 'FailToDeleteExtraFields' ;
$error ++ ;
dol_syslog ( get_class ( $this ) . " ::delete error -4 " . $this -> error , LOG_ERR );
}
}
2012-07-11 18:13:41 +02:00
2015-02-03 16:54:04 +01:00
// Delete linked object
2020-09-07 10:18:17 +02:00
$res = $this -> deleteObjectLinked ();
if ( $res < 0 ) {
$this -> error = 'FailToDeleteObjectLinked' ;
$this -> errors [] = 'FailToDeleteObjectLinked' ;
$error ++ ;
}
2015-03-04 17:54:43 +01:00
2021-02-25 23:21:30 +01:00
if ( ! $error ) {
2020-10-31 14:32:18 +01:00
// Delete record into ECM index (Note that delete is also done when deleting files with the dol_delete_dir_recursive
$this -> deleteEcmFiles ();
2020-09-12 04:42:59 +02:00
2020-09-07 10:18:17 +02:00
// We remove directory
$ref = dol_sanitizeFileName ( $this -> ref );
2021-02-25 23:21:30 +01:00
if ( $conf -> fournisseur -> commande -> dir_output ) {
2020-09-07 10:18:17 +02:00
$dir = $conf -> fournisseur -> commande -> dir_output . " / " . $ref ;
$file = $dir . " / " . $ref . " .pdf " ;
2021-02-25 23:21:30 +01:00
if ( file_exists ( $file )) {
if ( ! dol_delete_file ( $file , 0 , 0 , 0 , $this )) { // For triggers
2020-09-07 10:18:17 +02:00
$this -> error = 'ErrorFailToDeleteFile' ;
$this -> errors [] = 'ErrorFailToDeleteFile' ;
$error ++ ;
}
}
2021-02-25 23:21:30 +01:00
if ( file_exists ( $dir )) {
2020-09-07 10:18:17 +02:00
$res = @ dol_delete_dir_recursive ( $dir );
2021-02-25 23:21:30 +01:00
if ( ! $res ) {
2020-09-07 10:18:17 +02:00
$this -> error = 'ErrorFailToDeleteDir' ;
$this -> errors [] = 'ErrorFailToDeleteDir' ;
$error ++ ;
}
}
}
}
2012-07-11 18:13:41 +02:00
2021-02-25 23:21:30 +01:00
if ( ! $error ) {
2012-06-11 21:45:59 +02:00
dol_syslog ( get_class ( $this ) . " ::delete $this->id by $user->id " , LOG_DEBUG );
$this -> db -> commit ();
return 1 ;
2020-05-21 15:05:19 +02:00
} else {
2012-06-11 21:45:59 +02:00
dol_syslog ( get_class ( $this ) . " ::delete " . $this -> error , LOG_ERR );
$this -> db -> rollback ();
return - $error ;
}
2020-09-07 10:18:17 +02:00
}
2011-09-11 20:35:38 +02:00
2020-09-07 10:18:17 +02:00
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
/**
* Get list of order methods
*
* @ return int 0 if OK , < 0 if KO
*/
public function get_methodes_commande ()
{
// phpcs:enable
$sql = " SELECT rowid, libelle " ;
$sql .= " FROM " . MAIN_DB_PREFIX . " c_input_method " ;
$sql .= " WHERE active = 1 " ;
2011-09-11 20:35:38 +02:00
2020-09-07 10:18:17 +02:00
$resql = $this -> db -> query ( $sql );
2021-02-25 23:21:30 +01:00
if ( $resql ) {
2020-09-07 10:18:17 +02:00
$i = 0 ;
$num = $this -> db -> num_rows ( $resql );
$this -> methodes_commande = array ();
2021-02-25 23:21:30 +01:00
while ( $i < $num ) {
2020-09-07 10:18:17 +02:00
$row = $this -> db -> fetch_row ( $resql );
2011-09-11 20:35:38 +02:00
2020-09-07 10:18:17 +02:00
$this -> methodes_commande [ $row [ 0 ]] = $row [ 1 ];
2011-09-11 20:35:38 +02:00
2020-09-07 10:18:17 +02:00
$i ++ ;
}
return 0 ;
} else {
return - 1 ;
}
}
2011-09-11 20:35:38 +02:00
2020-09-07 10:18:17 +02:00
/**
2018-11-19 23:56:20 +01:00
* Return array of dispatched lines waiting to be approved for this order
2020-09-07 10:18:17 +02:00
*
* @ since 8.0 Return dispatched quantity ( qty ) .
2015-04-01 21:00:51 +02:00
*
2015-03-08 02:08:26 +01:00
* @ param int $status Filter on stats ( - 1 = no filter , 0 = lines draft to be approved , 1 = approved lines )
* @ return array Array of lines
2020-09-07 10:18:17 +02:00
*/
public function getDispachedLines ( $status = - 1 )
{
$ret = array ();
2015-04-01 21:00:51 +02:00
2020-09-07 10:18:17 +02:00
// List of already dispatched lines
2015-03-08 02:08:26 +01:00
$sql = " SELECT p.ref, p.label, " ;
2019-11-13 19:35:39 +01:00
$sql .= " e.rowid as warehouse_id, e.ref as entrepot, " ;
$sql .= " cfd.rowid as dispatchedlineid, cfd.fk_product, cfd.qty, cfd.eatby, cfd.sellby, cfd.batch, cfd.comment, cfd.status " ;
$sql .= " FROM " . MAIN_DB_PREFIX . " product as p, " ;
$sql .= " " . MAIN_DB_PREFIX . " commande_fournisseur_dispatch as cfd " ;
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . " entrepot as e ON cfd.fk_entrepot = e.rowid " ;
2021-08-27 18:18:50 +02:00
$sql .= " WHERE cfd.fk_commande = " . (( int ) $this -> id );
2019-11-13 19:35:39 +01:00
$sql .= " AND cfd.fk_product = p.rowid " ;
2021-02-25 23:21:30 +01:00
if ( $status >= 0 ) {
2021-08-23 18:56:46 +02:00
$sql .= " AND cfd.status = " . (( int ) $status );
2021-02-25 23:21:30 +01:00
}
2019-11-13 19:35:39 +01:00
$sql .= " ORDER BY cfd.rowid ASC " ;
2015-03-08 02:08:26 +01:00
$resql = $this -> db -> query ( $sql );
2021-02-25 23:21:30 +01:00
if ( $resql ) {
2015-03-08 02:08:26 +01:00
$num = $this -> db -> num_rows ( $resql );
$i = 0 ;
2021-02-25 23:21:30 +01:00
while ( $i < $num ) {
2015-03-08 02:08:26 +01:00
$objp = $this -> db -> fetch_object ( $resql );
2021-02-25 23:21:30 +01:00
if ( $objp ) {
2018-04-04 12:32:49 +02:00
$ret [] = array (
'id' => $objp -> dispatchedlineid ,
'productid' => $objp -> fk_product ,
'warehouseid' => $objp -> warehouse_id ,
'qty' => $objp -> qty ,
);
}
2015-04-01 21:00:51 +02:00
2015-03-08 02:08:26 +01:00
$i ++ ;
}
2021-02-25 23:21:30 +01:00
} else {
dol_print_error ( $this -> db , 'Failed to execute request to get dispatched lines' );
}
2015-04-01 21:00:51 +02:00
2015-03-08 02:08:26 +01:00
return $ret ;
2020-09-07 10:18:17 +02:00
}
2015-04-01 21:00:51 +02:00
2020-09-07 10:18:17 +02:00
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
/**
* Set a delivery in database for this supplier order
*
* @ param User $user User that input data
* @ param integer $date Date of reception
* @ param string $type Type of receipt ( 'tot' = total / done , 'par' = partial , 'nev' = never , 'can' = cancel )
* @ param string $comment Comment
* @ return int < 0 if KO , > 0 if OK
*/
public function Livraison ( $user , $date , $type , $comment )
{
// phpcs:enable
global $conf , $langs ;
2015-04-01 21:00:51 +02:00
2020-09-07 10:18:17 +02:00
$result = 0 ;
2015-03-08 02:08:26 +01:00
$error = 0 ;
2015-04-01 21:00:51 +02:00
2020-09-07 10:18:17 +02:00
dol_syslog ( get_class ( $this ) . " ::Livraison " );
2011-09-11 20:35:38 +02:00
2021-11-20 15:41:31 +01:00
$usercanreceive = 0 ;
if ( empty ( $conf -> reception -> enabled )) {
$usercanreceive = $user -> rights -> fournisseur -> commande -> receptionner ;
} else {
$usercanreceive = $user -> rights -> reception -> creer ;
}
if ( $usercanreceive ) {
2020-09-07 10:18:17 +02:00
// Define the new status
2021-02-25 23:21:30 +01:00
if ( $type == 'par' ) {
$statut = self :: STATUS_RECEIVED_PARTIALLY ;
} elseif ( $type == 'tot' ) {
$statut = self :: STATUS_RECEIVED_COMPLETELY ;
} elseif ( $type == 'nev' ) {
$statut = self :: STATUS_CANCELED_AFTER_ORDER ;
} elseif ( $type == 'can' ) {
$statut = self :: STATUS_CANCELED_AFTER_ORDER ;
} else {
2020-09-07 10:18:17 +02:00
$error ++ ;
dol_syslog ( get_class ( $this ) . " ::Livraison Error -2 " , LOG_ERR );
return - 2 ;
2017-10-07 20:21:47 +02:00
}
2011-09-11 20:35:38 +02:00
2020-09-07 10:18:17 +02:00
// Some checks to accept the record
2021-02-25 23:21:30 +01:00
if ( ! empty ( $conf -> global -> SUPPLIER_ORDER_USE_DISPATCH_STATUS )) {
2015-04-09 16:15:52 +02:00
// If option SUPPLIER_ORDER_USE_DISPATCH_STATUS is on, we check all reception are approved to allow status "total/done"
2021-02-25 23:21:30 +01:00
if ( ! $error && ( $type == 'tot' )) {
2020-09-07 10:18:17 +02:00
$dispatchedlinearray = $this -> getDispachedLines ( 0 );
2021-02-25 23:21:30 +01:00
if ( count ( $dispatchedlinearray ) > 0 ) {
2020-09-07 10:18:17 +02:00
$result = - 1 ;
$error ++ ;
$this -> errors [] = 'ErrorCantSetReceptionToTotalDoneWithReceptionToApprove' ;
dol_syslog ( 'ErrorCantSetReceptionToTotalDoneWithReceptionToApprove' , LOG_DEBUG );
}
}
2021-02-25 23:21:30 +01:00
if ( ! $error && ! empty ( $conf -> global -> SUPPLIER_ORDER_USE_DISPATCH_STATUS_NEED_APPROVE ) && ( $type == 'tot' )) { // Accept to move to reception done, only if status of all line are ok (refuse denied)
2020-09-07 10:18:17 +02:00
$dispatcheddenied = $this -> getDispachedLines ( 2 );
2021-02-25 23:21:30 +01:00
if ( count ( $dispatchedlinearray ) > 0 ) {
2020-09-07 10:18:17 +02:00
$result = - 1 ;
$error ++ ;
$this -> errors [] = 'ErrorCantSetReceptionToTotalDoneWithReceptionDenied' ;
dol_syslog ( 'ErrorCantSetReceptionToTotalDoneWithReceptionDenied' , LOG_DEBUG );
}
}
}
2015-04-09 16:15:52 +02:00
2020-09-07 10:18:17 +02:00
// TODO LDR01 Add a control test to accept only if ALL predefined products are received (same qty).
2015-04-09 16:15:52 +02:00
2021-02-25 23:21:30 +01:00
if ( empty ( $error )) {
2020-10-31 14:32:18 +01:00
$this -> db -> begin ();
2011-09-11 20:35:38 +02:00
2020-09-07 10:18:17 +02:00
$sql = " UPDATE " . MAIN_DB_PREFIX . " commande_fournisseur " ;
2021-03-30 03:37:54 +02:00
$sql .= " SET fk_statut = " . (( int ) $statut );
2021-08-23 19:33:24 +02:00
$sql .= " WHERE rowid = " . (( int ) $this -> id );
2020-09-07 10:18:17 +02:00
$sql .= " AND fk_statut IN ( " . self :: STATUS_ORDERSENT . " , " . self :: STATUS_RECEIVED_PARTIALLY . " ) " ; // Process running or Partially received
2011-09-11 20:35:38 +02:00
2020-09-07 10:18:17 +02:00
dol_syslog ( get_class ( $this ) . " ::Livraison " , LOG_DEBUG );
$resql = $this -> db -> query ( $sql );
2021-02-25 23:21:30 +01:00
if ( $resql ) {
2020-10-22 17:55:38 +02:00
$result = 1 ;
2020-09-07 10:18:17 +02:00
$old_statut = $this -> statut ;
$this -> statut = $statut ;
2017-03-25 03:53:11 +01:00
$this -> actionmsg2 = $comment ;
2017-06-30 11:40:26 +02:00
2020-10-31 14:32:18 +01:00
// Call trigger
$result_trigger = $this -> call_trigger ( 'ORDER_SUPPLIER_RECEIVE' , $user );
2021-02-25 23:21:30 +01:00
if ( $result_trigger < 0 ) {
$error ++ ;
}
2020-10-31 14:32:18 +01:00
// End call triggers
2016-08-05 09:46:17 +02:00
2021-02-25 23:21:30 +01:00
if ( empty ( $error )) {
2020-09-07 10:18:17 +02:00
$this -> db -> commit ();
} else {
$this -> statut = $old_statut ;
$this -> db -> rollback ();
$this -> error = $this -> db -> lasterror ();
$result = - 1 ;
}
} else {
$this -> db -> rollback ();
$this -> error = $this -> db -> lasterror ();
$result = - 1 ;
}
}
} else {
$this -> error = $langs -> trans ( 'NotAuthorized' );
$this -> errors [] = $langs -> trans ( 'NotAuthorized' );
dol_syslog ( get_class ( $this ) . " ::Livraison Not Authorized " );
$result = - 3 ;
}
return $result ;
}
2011-09-11 20:35:38 +02:00
2020-09-07 10:18:17 +02:00
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
2020-10-26 16:50:52 +01:00
/**
* Set delivery date
2020-10-26 17:06:05 +01:00
*
2020-10-26 16:50:52 +01:00
* @ param User $user Object user that modify
* @ param int $delivery_date Delivery date
* @ param int $notrigger 1 = Does not execute triggers , 0 = execute triggers
* @ return int < 0 if ko , > 0 if ok
* @ deprecated Use setDeliveryDate
*/
2020-10-26 18:21:47 +01:00
public function set_date_livraison ( $user , $delivery_date , $notrigger = 0 )
2020-10-26 16:50:52 +01:00
{
2020-10-26 18:13:25 +01:00
// phpcs:enable
2020-10-26 16:50:52 +01:00
return $this -> setDeliveryDate ( $user , $delivery_date , $notrigger );
}
2020-09-07 10:18:17 +02:00
/**
* Set the planned delivery date
*
* @ param User $user Objet user making change
2020-10-06 11:37:55 +02:00
* @ param integer $delivery_date Planned delivery date
2020-09-07 10:18:17 +02:00
* @ param int $notrigger 1 = Does not execute triggers , 0 = execute triggers
* @ return int < 0 if KO , > 0 if OK
*/
2020-10-26 16:50:52 +01:00
public function setDeliveryDate ( $user , $delivery_date , $notrigger = 0 )
2020-09-07 10:18:17 +02:00
{
2021-04-12 09:47:16 +02:00
if ( $user -> rights -> fournisseur -> commande -> creer || $user -> rights -> supplier_order -> creer ) {
2020-09-07 10:18:17 +02:00
$error = 0 ;
2016-08-25 14:38:16 +02:00
2020-09-07 10:18:17 +02:00
$this -> db -> begin ();
2016-08-25 14:38:16 +02:00
2020-09-07 10:18:17 +02:00
$sql = " UPDATE " . MAIN_DB_PREFIX . " commande_fournisseur " ;
2020-10-06 11:37:55 +02:00
$sql .= " SET date_livraison = " . ( $delivery_date ? " ' " . $this -> db -> idate ( $delivery_date ) . " ' " : 'null' );
2021-08-23 19:33:24 +02:00
$sql .= " WHERE rowid = " . (( int ) $this -> id );
2012-04-10 17:21:28 +02:00
2020-09-07 10:18:17 +02:00
dol_syslog ( __METHOD__ , LOG_DEBUG );
$resql = $this -> db -> query ( $sql );
2021-02-25 23:21:30 +01:00
if ( ! $resql ) {
2020-09-07 10:18:17 +02:00
$this -> errors [] = $this -> db -> error ();
$error ++ ;
}
2016-08-25 14:38:16 +02:00
2021-02-25 23:21:30 +01:00
if ( ! $error ) {
2020-09-07 10:18:17 +02:00
$this -> oldcopy = clone $this ;
2020-10-06 11:37:55 +02:00
$this -> date_livraison = $delivery_date ;
2020-11-11 18:08:40 +01:00
$this -> delivery_date = $delivery_date ;
2020-09-07 10:18:17 +02:00
}
2016-08-25 14:38:16 +02:00
2021-02-25 23:21:30 +01:00
if ( ! $notrigger && empty ( $error )) {
2020-09-07 10:18:17 +02:00
// Call trigger
$result = $this -> call_trigger ( 'ORDER_SUPPLIER_MODIFY' , $user );
2021-02-25 23:21:30 +01:00
if ( $result < 0 ) {
$error ++ ;
}
2020-09-07 10:18:17 +02:00
// End call triggers
}
2016-08-25 14:38:16 +02:00
2021-02-25 23:21:30 +01:00
if ( ! $error ) {
2020-09-07 10:18:17 +02:00
$this -> db -> commit ();
return 1 ;
} else {
2021-02-25 23:21:30 +01:00
foreach ( $this -> errors as $errmsg ) {
2020-09-07 10:18:17 +02:00
dol_syslog ( __METHOD__ . ' Error: ' . $errmsg , LOG_ERR );
$this -> error .= ( $this -> error ? ', ' . $errmsg : $errmsg );
}
$this -> db -> rollback ();
return - 1 * $error ;
}
} else {
return - 2 ;
}
}
2012-04-10 17:21:28 +02:00
2020-09-07 10:18:17 +02:00
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
2015-02-03 15:22:03 +01:00
/**
2020-09-07 10:18:17 +02:00
* Set the id projet
*
* @ param User $user Objet utilisateur qui modifie
2020-10-06 11:37:55 +02:00
* @ param int $id_projet Delivery date
2020-09-07 10:18:17 +02:00
* @ param int $notrigger 1 = Does not execute triggers , 0 = execute triggers
* @ return int < 0 si ko , > 0 si ok
*/
public function set_id_projet ( $user , $id_projet , $notrigger = 0 )
{
// phpcs:enable
2021-04-12 09:47:16 +02:00
if ( $user -> rights -> fournisseur -> commande -> creer || $user -> rights -> supplier_order -> creer ) {
2020-09-07 10:18:17 +02:00
$error = 0 ;
2016-08-25 14:38:16 +02:00
2020-09-07 10:18:17 +02:00
$this -> db -> begin ();
2016-08-25 14:38:16 +02:00
2020-09-07 10:18:17 +02:00
$sql = " UPDATE " . MAIN_DB_PREFIX . " commande_fournisseur " ;
$sql .= " SET fk_projet = " . ( $id_projet > 0 ? ( int ) $id_projet : 'null' );
2021-08-23 19:33:24 +02:00
$sql .= " WHERE rowid = " . (( int ) $this -> id );
2015-02-03 15:22:03 +01:00
2020-09-07 10:18:17 +02:00
dol_syslog ( __METHOD__ , LOG_DEBUG );
$resql = $this -> db -> query ( $sql );
2021-02-25 23:21:30 +01:00
if ( ! $resql ) {
2020-09-07 10:18:17 +02:00
$this -> errors [] = $this -> db -> error ();
$error ++ ;
}
2016-08-25 14:38:16 +02:00
2021-02-25 23:21:30 +01:00
if ( ! $error ) {
2020-09-07 10:18:17 +02:00
$this -> oldcopy = clone $this ;
$this -> fk_projet = $id_projet ;
$this -> fk_project = $id_projet ;
}
2016-08-25 14:38:16 +02:00
2021-02-25 23:21:30 +01:00
if ( ! $notrigger && empty ( $error )) {
2020-09-07 10:18:17 +02:00
// Call trigger
$result = $this -> call_trigger ( 'ORDER_SUPPLIER_MODIFY' , $user );
2021-02-25 23:21:30 +01:00
if ( $result < 0 ) {
$error ++ ;
}
2020-09-07 10:18:17 +02:00
// End call triggers
}
2016-08-25 14:38:16 +02:00
2021-02-25 23:21:30 +01:00
if ( ! $error ) {
2020-09-07 10:18:17 +02:00
$this -> db -> commit ();
return 1 ;
} else {
2021-02-25 23:21:30 +01:00
foreach ( $this -> errors as $errmsg ) {
2020-09-07 10:18:17 +02:00
dol_syslog ( __METHOD__ . ' Error: ' . $errmsg , LOG_ERR );
$this -> error .= ( $this -> error ? ', ' . $errmsg : $errmsg );
}
$this -> db -> rollback ();
return - 1 * $error ;
}
} else {
return - 2 ;
}
}
2012-04-10 17:21:28 +02:00
2020-09-07 10:18:17 +02:00
/**
* Update a supplier order from a customer order
*
* @ param User $user User that create
* @ param int $idc Id of supplier order to update
* @ param int $comclientid Id of customer order to use as template
* @ return int < 0 if KO , > 0 if OK
*/
public function updateFromCommandeClient ( $user , $idc , $comclientid )
{
$comclient = new Commande ( $this -> db );
$comclient -> fetch ( $comclientid );
2011-09-11 20:35:38 +02:00
2020-09-07 10:18:17 +02:00
$this -> id = $idc ;
2011-09-11 20:35:38 +02:00
2020-09-07 10:18:17 +02:00
$this -> lines = array ();
2011-09-11 20:35:38 +02:00
2020-09-07 10:18:17 +02:00
$num = count ( $comclient -> lines );
2021-02-25 23:21:30 +01:00
for ( $i = 0 ; $i < $num ; $i ++ ) {
2020-09-07 10:18:17 +02:00
$prod = new Product ( $this -> db );
$label = '' ;
$ref = '' ;
2021-02-25 23:21:30 +01:00
if ( $prod -> fetch ( $comclient -> lines [ $i ] -> fk_product ) > 0 ) {
2020-09-07 10:18:17 +02:00
$label = $prod -> label ;
$ref = $prod -> ref ;
}
2011-09-11 20:35:38 +02:00
2020-09-07 10:18:17 +02:00
$sql = " INSERT INTO " . MAIN_DB_PREFIX . " commande_fournisseurdet " ;
$sql .= " (fk_commande, label, description, fk_product, price, qty, tva_tx, localtax1_tx, localtax2_tx, remise_percent, subprice, remise, ref) " ;
2021-08-27 22:42:04 +02:00
$sql .= " VALUES ( " . (( int ) $idc ) . " , ' " . $this -> db -> escape ( $label ) . " ', ' " . $this -> db -> escape ( $comclient -> lines [ $i ] -> desc ) . " ' " ;
$sql .= " , " . $comclient -> lines [ $i ] -> fk_product . " , " . price2num ( $comclient -> lines [ $i ] -> price , 'MU' );
$sql .= " , " . price2num ( $comclient -> lines [ $i ] -> qty , 'MS' ) . " , " . price2num ( $comclient -> lines [ $i ] -> tva_tx , 5 ) . " , " . price2num ( $comclient -> lines [ $i ] -> localtax1_tx , 5 ) . " , " . price2num ( $comclient -> lines [ $i ] -> localtax2_tx , 5 ) . " , " . price2num ( $comclient -> lines [ $i ] -> remise_percent , 3 );
$sql .= " , ' " . price2num ( $comclient -> lines [ $i ] -> subprice , 'MT' ) . " ','0', ' " . $this -> db -> escape ( $ref ) . " '); " ;
2021-02-25 23:21:30 +01:00
if ( $this -> db -> query ( $sql )) {
2020-09-07 10:18:17 +02:00
$this -> update_price ();
}
}
2011-09-11 20:35:38 +02:00
2020-09-07 10:18:17 +02:00
return 1 ;
}
2011-09-11 20:35:38 +02:00
2020-09-07 10:18:17 +02:00
/**
* Tag order with a particular status
*
* @ param User $user Object user that change status
* @ param int $status New status
* @ return int < 0 if KO , > 0 if OK
*/
public function setStatus ( $user , $status )
{
global $conf , $langs ;
$error = 0 ;
2011-09-11 20:35:38 +02:00
2020-09-07 10:18:17 +02:00
$this -> db -> begin ();
2011-09-11 20:35:38 +02:00
2020-09-07 10:18:17 +02:00
$sql = 'UPDATE ' . MAIN_DB_PREFIX . 'commande_fournisseur' ;
2021-08-27 22:42:04 +02:00
$sql .= " SET fk_statut = " . $status ;
$sql .= " WHERE rowid = " . (( int ) $this -> id );
2011-09-11 20:35:38 +02:00
2020-09-07 10:18:17 +02:00
dol_syslog ( get_class ( $this ) . " ::setStatus " , LOG_DEBUG );
$resql = $this -> db -> query ( $sql );
2021-02-25 23:21:30 +01:00
if ( $resql ) {
2020-09-07 10:18:17 +02:00
// Trigger names for each status
$triggerName = array ();
$triggerName [ 0 ] = 'DRAFT' ;
$triggerName [ 1 ] = 'VALIDATED' ;
$triggerName [ 2 ] = 'APPROVED' ;
$triggerName [ 3 ] = 'ORDERED' ; // Ordered
$triggerName [ 4 ] = 'RECEIVED_PARTIALLY' ;
$triggerName [ 5 ] = 'RECEIVED_COMPLETELY' ;
$triggerName [ 6 ] = 'CANCELED' ;
$triggerName [ 7 ] = 'CANCELED' ;
$triggerName [ 9 ] = 'REFUSED' ;
// Call trigger
$result = $this -> call_trigger ( " ORDER_SUPPLIER_STATUS_ " . $triggerName [ $status ], $user );
2021-02-25 23:21:30 +01:00
if ( $result < 0 ) {
$error ++ ;
}
2020-09-07 10:18:17 +02:00
// End call triggers
} else {
$error ++ ;
$this -> error = $this -> db -> lasterror ();
dol_syslog ( get_class ( $this ) . " ::setStatus " . $this -> error );
}
2011-09-11 20:35:38 +02:00
2021-02-25 23:21:30 +01:00
if ( ! $error ) {
2020-09-07 10:18:17 +02:00
$this -> statut = $status ;
$this -> db -> commit ();
return 1 ;
} else {
$this -> db -> rollback ();
return - 1 ;
}
}
2011-09-11 20:35:38 +02:00
2020-09-07 10:18:17 +02:00
/**
* Update line
*
* @ param int $rowid Id de la ligne de facture
* @ param string $desc Description de la ligne
* @ param double $pu Prix unitaire
* @ param double $qty Quantity
* @ param double $remise_percent Percent discount on line
* @ param double $txtva VAT rate
* @ param double $txlocaltax1 Localtax1 tax
* @ param double $txlocaltax2 Localtax2 tax
* @ param double $price_base_type Type of price base
* @ param int $info_bits Miscellaneous informations
* @ param int $type Type of line ( 0 = product , 1 = service )
* @ param int $notrigger Disable triggers
* @ param integer $date_start Date start of service
* @ param integer $date_end Date end of service
2015-04-21 15:49:58 +02:00
* @ param array $array_options Extrafields array
2020-09-07 10:18:17 +02:00
* @ param string $fk_unit Code of the unit to use . Null to use the default one
2016-12-11 02:09:57 +01:00
* @ param double $pu_ht_devise Unit price in currency
2017-11-12 16:06:08 +01:00
* @ param string $ref_supplier Supplier ref
2020-09-07 10:18:17 +02:00
* @ return int < 0 if error , > 0 if ok
*/
public function updateline ( $rowid , $desc , $pu , $qty , $remise_percent , $txtva , $txlocaltax1 = 0 , $txlocaltax2 = 0 , $price_base_type = 'HT' , $info_bits = 0 , $type = 0 , $notrigger = 0 , $date_start = '' , $date_end = '' , $array_options = 0 , $fk_unit = null , $pu_ht_devise = 0 , $ref_supplier = '' )
{
global $mysoc , $conf , $langs ;
dol_syslog ( get_class ( $this ) . " ::updateline $rowid , $desc , $pu , $qty , $remise_percent , $txtva , $price_base_type , $info_bits , $type , $fk_unit " );
include_once DOL_DOCUMENT_ROOT . '/core/lib/price.lib.php' ;
2011-09-11 20:35:38 +02:00
2020-09-07 10:18:17 +02:00
$error = 0 ;
2016-07-19 12:57:23 +02:00
2021-02-25 23:21:30 +01:00
if ( $this -> brouillon ) {
2020-09-07 10:18:17 +02:00
// Clean parameters
2021-02-25 23:21:30 +01:00
if ( empty ( $qty )) {
$qty = 0 ;
}
if ( empty ( $info_bits )) {
$info_bits = 0 ;
}
if ( empty ( $txtva )) {
$txtva = 0 ;
}
if ( empty ( $txlocaltax1 )) {
$txlocaltax1 = 0 ;
}
if ( empty ( $txlocaltax2 )) {
$txlocaltax2 = 0 ;
}
if ( empty ( $remise )) {
$remise = 0 ;
}
if ( empty ( $remise_percent )) {
$remise_percent = 0 ;
}
2019-04-04 18:33:12 +02:00
2020-09-07 10:18:17 +02:00
$remise_percent = price2num ( $remise_percent );
$qty = price2num ( $qty );
2021-02-25 23:21:30 +01:00
if ( ! $qty ) {
$qty = 1 ;
}
2020-09-07 10:18:17 +02:00
$pu = price2num ( $pu );
$pu_ht_devise = price2num ( $pu_ht_devise );
2021-02-25 23:21:30 +01:00
if ( ! preg_match ( '/\((.*)\)/' , $txtva )) {
$txtva = price2num ( $txtva ); // $txtva can have format '5.0(XXX)' or '5'
}
2020-09-07 10:18:17 +02:00
$txlocaltax1 = price2num ( $txlocaltax1 );
$txlocaltax2 = price2num ( $txlocaltax2 );
2011-09-11 20:35:38 +02:00
2020-09-07 10:18:17 +02:00
// Check parameters
2021-02-25 23:21:30 +01:00
if ( $type < 0 ) {
return - 1 ;
}
2020-09-07 10:18:17 +02:00
if ( $date_start && $date_end && $date_start > $date_end ) {
$langs -> load ( " errors " );
$this -> error = $langs -> trans ( 'ErrorStartDateGreaterEnd' );
return - 1 ;
}
2013-11-19 21:08:02 +01:00
2020-09-07 10:18:17 +02:00
$this -> db -> begin ();
2016-08-05 09:46:17 +02:00
2020-09-07 10:18:17 +02:00
// Calcul du total TTC et de la TVA pour la ligne a partir de
// qty, pu, remise_percent et txtva
// TRES IMPORTANT: C'est au moment de l'insertion ligne qu'on doit stocker
// la part ht, tva et ttc, et ce au niveau de la ligne qui a son propre taux tva.
$localtaxes_type = getLocalTaxesFromRate ( $txtva , 0 , $mysoc , $this -> thirdparty );
// Clean vat code
2020-11-27 15:45:12 +01:00
$reg = array ();
2020-09-07 10:18:17 +02:00
$vat_src_code = '' ;
2021-02-25 23:21:30 +01:00
if ( preg_match ( '/\((.*)\)/' , $txtva , $reg )) {
2020-09-07 10:18:17 +02:00
$vat_src_code = $reg [ 1 ];
$txtva = preg_replace ( '/\s*\(.*\)/' , '' , $txtva ); // Remove code into vatrate.
}
2017-06-30 11:40:26 +02:00
2020-09-07 10:18:17 +02:00
$tabprice = calcul_price_total ( $qty , $pu , $remise_percent , $txtva , $txlocaltax1 , $txlocaltax2 , 0 , $price_base_type , $info_bits , $type , $this -> thirdparty , $localtaxes_type , 100 , $this -> multicurrency_tx , $pu_ht_devise );
$total_ht = $tabprice [ 0 ];
$total_tva = $tabprice [ 1 ];
$total_ttc = $tabprice [ 2 ];
$total_localtax1 = $tabprice [ 9 ];
$total_localtax2 = $tabprice [ 10 ];
2016-12-11 02:09:57 +01:00
$pu_ht = $tabprice [ 3 ];
$pu_tva = $tabprice [ 4 ];
$pu_ttc = $tabprice [ 5 ];
2011-09-11 20:35:38 +02:00
2016-02-16 23:58:21 +01:00
// MultiCurrency
2019-11-13 19:35:39 +01:00
$multicurrency_total_ht = $tabprice [ 16 ];
2020-09-07 10:18:17 +02:00
$multicurrency_total_tva = $tabprice [ 17 ];
$multicurrency_total_ttc = $tabprice [ 18 ];
2016-12-11 02:09:57 +01:00
$pu_ht_devise = $tabprice [ 19 ];
2016-08-05 09:46:17 +02:00
2020-12-22 17:33:17 +01:00
$localtax1_type = empty ( $localtaxes_type [ 0 ]) ? '' : $localtaxes_type [ 0 ];
$localtax2_type = empty ( $localtaxes_type [ 2 ]) ? '' : $localtaxes_type [ 2 ];
2011-09-11 20:35:38 +02:00
2020-09-07 10:18:17 +02:00
//Fetch current line from the database and then clone the object and set it in $oldline property
$this -> line = new CommandeFournisseurLigne ( $this -> db );
$this -> line -> fetch ( $rowid );
2020-01-25 14:03:24 +01:00
2020-09-07 10:18:17 +02:00
$oldline = clone $this -> line ;
$this -> line -> oldline = $oldline ;
2016-07-19 12:57:23 +02:00
2020-09-07 10:18:17 +02:00
$this -> line -> context = $this -> context ;
2016-07-19 12:57:23 +02:00
2020-09-07 10:18:17 +02:00
$this -> line -> fk_commande = $this -> id ;
//$this->line->label=$label;
$this -> line -> desc = $desc ;
2019-11-25 07:40:29 +01:00
// redefine quantity according to packaging
2021-02-25 23:21:30 +01:00
if ( ! empty ( $conf -> global -> PRODUCT_USE_SUPPLIER_PACKAGING )) {
if ( $qty < $this -> line -> packaging ) {
2019-11-25 07:40:29 +01:00
$qty = $this -> line -> packaging ;
2020-05-21 15:05:19 +02:00
} else {
2021-04-13 20:28:25 +02:00
if ( ! empty ( $this -> line -> packaging ) && ( $qty % $this -> line -> packaging ) > 0 ) {
2020-02-21 17:53:37 +01:00
$coeff = intval ( $qty / $this -> line -> packaging ) + 1 ;
2019-11-25 07:40:29 +01:00
$qty = $this -> line -> packaging * $coeff ;
setEventMessage ( $langs -> trans ( 'QtyRecalculatedWithPackaging' ), 'mesgs' );
}
}
}
2020-09-07 10:18:17 +02:00
$this -> line -> qty = $qty ;
2019-11-13 19:35:39 +01:00
$this -> line -> ref_supplier = $ref_supplier ;
2016-10-29 21:02:08 +02:00
2020-09-07 10:18:17 +02:00
$this -> line -> vat_src_code = $vat_src_code ;
$this -> line -> tva_tx = $txtva ;
$this -> line -> localtax1_tx = $txlocaltax1 ;
$this -> line -> localtax2_tx = $txlocaltax2 ;
2020-12-22 17:33:17 +01:00
$this -> line -> localtax1_type = empty ( $localtaxes_type [ 0 ]) ? '' : $localtaxes_type [ 0 ];
$this -> line -> localtax2_type = empty ( $localtaxes_type [ 2 ]) ? '' : $localtaxes_type [ 2 ];
2020-09-07 10:18:17 +02:00
$this -> line -> remise_percent = $remise_percent ;
$this -> line -> subprice = $pu_ht ;
$this -> line -> rang = $this -> rang ;
$this -> line -> info_bits = $info_bits ;
$this -> line -> total_ht = $total_ht ;
$this -> line -> total_tva = $total_tva ;
$this -> line -> total_localtax1 = $total_localtax1 ;
$this -> line -> total_localtax2 = $total_localtax2 ;
$this -> line -> total_ttc = $total_ttc ;
$this -> line -> product_type = $type ;
$this -> line -> special_code = $this -> special_code ;
$this -> line -> origin = $this -> origin ;
$this -> line -> fk_unit = $fk_unit ;
$this -> line -> date_start = $date_start ;
$this -> line -> date_end = $date_end ;
Add: hooks and triggers for a lot of core modules (action/calendrier, deplacement, dons, tva, contact/tiers, contrat, product lines, expedition, fournisseur commandes et factures, fiche intervention, projet et taches)
Signed-off-by: Stephen L. <lrq3000@gmail.com>
2012-08-14 15:50:45 +02:00
2020-09-07 10:18:17 +02:00
// Multicurrency
$this -> line -> fk_multicurrency = $this -> fk_multicurrency ;
$this -> line -> multicurrency_code = $this -> multicurrency_code ;
$this -> line -> multicurrency_subprice = $pu_ht_devise ;
$this -> line -> multicurrency_total_ht = $multicurrency_total_ht ;
$this -> line -> multicurrency_total_tva = $multicurrency_total_tva ;
$this -> line -> multicurrency_total_ttc = $multicurrency_total_ttc ;
$this -> line -> subprice = $pu_ht ;
$this -> line -> price = $this -> line -> subprice ;
$this -> line -> remise_percent = $remise_percent ;
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 ) {
$this -> line -> array_options [ $key ] = $array_options [ $key ];
}
}
Add: hooks and triggers for a lot of core modules (action/calendrier, deplacement, dons, tva, contact/tiers, contrat, product lines, expedition, fournisseur commandes et factures, fiche intervention, projet et taches)
Signed-off-by: Stephen L. <lrq3000@gmail.com>
2012-08-14 15:50:45 +02:00
2020-09-07 10:18:17 +02:00
$result = $this -> line -> update ( $notrigger );
2011-09-11 20:35:38 +02:00
2020-09-07 10:18:17 +02:00
// Mise a jour info denormalisees au niveau facture
2021-02-25 23:21:30 +01:00
if ( $result >= 0 ) {
2020-09-07 10:18:17 +02:00
$this -> update_price ( '' , 'auto' );
2016-12-11 02:50:31 +01:00
$this -> db -> commit ();
return $result ;
2020-09-07 10:18:17 +02:00
} else {
$this -> error = $this -> db -> lasterror ();
$this -> db -> rollback ();
return - 1 ;
}
} else {
$this -> error = " Order status makes operation forbidden " ;
dol_syslog ( get_class ( $this ) . " ::updateline " . $this -> error , LOG_ERR );
return - 2 ;
}
}
2011-09-11 20:35:38 +02:00
2020-09-07 10:18:17 +02:00
/**
* Initialise an instance with random values .
* Used to build previews or test instances .
* id must be 0 if object instance is a specimen .
*
* @ return void
*/
public function initAsSpecimen ()
{
global $user , $langs , $conf ;
2011-09-11 20:35:38 +02:00
2020-09-07 10:18:17 +02:00
include_once DOL_DOCUMENT_ROOT . '/fourn/class/fournisseur.product.class.php' ;
2019-05-09 17:16:35 +02:00
2020-09-07 10:18:17 +02:00
dol_syslog ( get_class ( $this ) . " ::initAsSpecimen " );
2011-09-11 20:35:38 +02:00
2020-09-07 10:18:17 +02:00
$now = dol_now ();
2011-09-11 20:35:38 +02:00
2020-09-07 10:18:17 +02:00
// Find first product
$prodid = 0 ;
$product = new ProductFournisseur ( $this -> db );
$sql = " SELECT rowid " ;
$sql .= " FROM " . MAIN_DB_PREFIX . " product " ;
$sql .= " WHERE entity IN ( " . getEntity ( 'product' ) . " ) " ;
$sql .= $this -> db -> order ( " rowid " , " ASC " );
$sql .= $this -> db -> plimit ( 1 );
$resql = $this -> db -> query ( $sql );
2021-02-25 23:21:30 +01:00
if ( $resql ) {
2020-09-07 10:18:17 +02:00
$obj = $this -> db -> fetch_object ( $resql );
$prodid = $obj -> rowid ;
}
2011-09-11 20:35:38 +02:00
2020-09-07 10:18:17 +02:00
// Initialise parametres
$this -> id = 0 ;
$this -> ref = 'SPECIMEN' ;
$this -> specimen = 1 ;
$this -> socid = 1 ;
2021-09-23 13:23:16 +02:00
$this -> date = $now ;
2020-09-07 10:18:17 +02:00
$this -> date_commande = $now ;
2021-09-23 13:23:16 +02:00
$this -> date_lim_reglement = $this -> date + 3600 * 24 * 30 ;
2020-09-07 10:18:17 +02:00
$this -> cond_reglement_code = 'RECEP' ;
$this -> mode_reglement_code = 'CHQ' ;
$this -> note_public = 'This is a comment (public)' ;
$this -> note_private = 'This is a comment (private)' ;
$this -> multicurrency_tx = 1 ;
$this -> multicurrency_code = $conf -> currency ;
$this -> statut = 0 ;
// Lines
$nbp = 5 ;
$xnbp = 0 ;
2021-02-25 23:21:30 +01:00
while ( $xnbp < $nbp ) {
2020-09-07 10:18:17 +02:00
$line = new CommandeFournisseurLigne ( $this -> db );
$line -> desc = $langs -> trans ( " Description " ) . " " . $xnbp ;
$line -> qty = 1 ;
$line -> subprice = 100 ;
$line -> price = 100 ;
$line -> tva_tx = 19.6 ;
$line -> localtax1_tx = 0 ;
$line -> localtax2_tx = 0 ;
2021-02-25 23:21:30 +01:00
if ( $xnbp == 2 ) {
2020-09-07 10:18:17 +02:00
$line -> total_ht = 50 ;
$line -> total_ttc = 59.8 ;
$line -> total_tva = 9.8 ;
$line -> remise_percent = 50 ;
} else {
$line -> total_ht = 100 ;
$line -> total_ttc = 119.6 ;
$line -> total_tva = 19.6 ;
$line -> remise_percent = 00 ;
}
$line -> fk_product = $prodid ;
2011-09-11 20:35:38 +02:00
2020-09-07 10:18:17 +02:00
$this -> lines [ $xnbp ] = $line ;
2011-09-11 20:35:38 +02:00
2020-09-07 10:18:17 +02:00
$this -> total_ht += $line -> total_ht ;
$this -> total_tva += $line -> total_tva ;
$this -> total_ttc += $line -> total_ttc ;
2011-09-11 20:35:38 +02:00
2020-09-07 10:18:17 +02:00
$xnbp ++ ;
}
}
2011-09-11 20:35:38 +02:00
2020-09-07 10:18:17 +02:00
/**
* Charge les informations d 'ordre info dans l' objet facture
*
* @ param int $id Id de la facture a charger
* @ return void
*/
public function info ( $id )
{
$sql = 'SELECT c.rowid, date_creation as datec, tms as datem, date_valid as date_validation, date_approve as datea, date_approve2 as datea2,' ;
$sql .= ' fk_user_author, fk_user_modif, fk_user_valid, fk_user_approve, fk_user_approve2' ;
$sql .= ' FROM ' . MAIN_DB_PREFIX . 'commande_fournisseur as c' ;
2021-03-14 11:48:39 +01:00
$sql .= ' WHERE c.rowid = ' . (( int ) $id );
2016-04-08 17:28:48 +02:00
2020-09-07 10:18:17 +02:00
$result = $this -> db -> query ( $sql );
2021-02-25 23:21:30 +01:00
if ( $result ) {
if ( $this -> db -> num_rows ( $result )) {
2020-09-07 10:18:17 +02:00
$obj = $this -> db -> fetch_object ( $result );
$this -> id = $obj -> rowid ;
2021-02-25 23:21:30 +01:00
if ( $obj -> fk_user_author ) {
$this -> user_creation_id = $obj -> fk_user_author ;
}
if ( $obj -> fk_user_valid ) {
$this -> user_validation_id = $obj -> fk_user_valid ;
}
if ( $obj -> fk_user_modif ) {
$this -> user_modification_id = $obj -> fk_user_modif ;
}
if ( $obj -> fk_user_approve ) {
$this -> user_approve_id = $obj -> fk_user_approve ;
}
if ( $obj -> fk_user_approve2 ) {
$this -> user_approve_id2 = $obj -> fk_user_approve2 ;
}
2020-09-07 10:18:17 +02:00
2021-10-11 11:04:21 +02:00
$this -> date_creation = $this -> db -> jdate ( $obj -> datec );
$this -> date_modification = $this -> db -> jdate ( $obj -> datem );
$this -> date_approve = $this -> db -> jdate ( $obj -> datea );
$this -> date_approve2 = $this -> db -> jdate ( $obj -> datea2 );
$this -> date_validation = $this -> db -> jdate ( $obj -> date_validation );
2020-09-07 10:18:17 +02:00
}
$this -> db -> free ( $result );
} else {
dol_print_error ( $this -> db );
}
}
2016-08-05 09:46:17 +02:00
2020-09-07 10:18:17 +02:00
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
/**
* Charge indicateurs this -> nb de tableau de bord
*
* @ return int < 0 si ko , > 0 si ok
*/
public function load_state_board ()
{
// phpcs:enable
global $conf , $user ;
2014-10-25 17:22:03 +02:00
2020-09-07 10:18:17 +02:00
$this -> nb = array ();
$clause = " WHERE " ;
2014-10-25 17:22:03 +02:00
2020-09-07 10:18:17 +02:00
$sql = " SELECT count(co.rowid) as nb " ;
$sql .= " FROM " . MAIN_DB_PREFIX . " commande_fournisseur as co " ;
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . " societe as s ON co.fk_soc = s.rowid " ;
2021-10-22 22:15:59 +02:00
if ( empty ( $user -> rights -> societe -> client -> voir ) && ! $user -> socid ) {
2020-09-07 10:18:17 +02:00
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . " societe_commerciaux as sc ON s.rowid = sc.fk_soc " ;
2021-08-23 17:41:11 +02:00
$sql .= " WHERE sc.fk_user = " . (( int ) $user -> id );
2020-09-07 10:18:17 +02:00
$clause = " AND " ;
}
2021-08-23 18:56:46 +02:00
$sql .= " " . $clause . " co.entity IN ( " . getEntity ( 'supplier_order' ) . " ) " ;
2014-10-25 17:22:03 +02:00
2020-09-07 10:18:17 +02:00
$resql = $this -> db -> query ( $sql );
2021-02-25 23:21:30 +01:00
if ( $resql ) {
while ( $obj = $this -> db -> fetch_object ( $resql )) {
2020-09-07 10:18:17 +02:00
$this -> nb [ " supplier_orders " ] = $obj -> nb ;
}
$this -> db -> free ( $resql );
return 1 ;
} else {
dol_print_error ( $this -> db );
$this -> error = $this -> db -> error ();
return - 1 ;
}
}
2014-10-25 17:22:03 +02:00
2020-09-07 10:18:17 +02:00
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
/**
* Load indicators for dashboard ( this -> nbtodo and this -> nbtodolate )
*
* @ param User $user Objet user
* @ param int $mode " opened " , " awaiting " for orders awaiting reception
* @ return WorkboardResponse | int < 0 if KO , WorkboardResponse if OK
*/
public function load_board ( $user , $mode = 'opened' )
{
// phpcs:enable
global $conf , $langs ;
2011-09-11 20:35:38 +02:00
2022-01-09 19:48:38 +01:00
$sql = " SELECT c.rowid, c.date_creation as datec, c.date_commande, c.fk_statut, c.date_livraison as delivery_date, c.total_ht " ;
2020-09-07 10:18:17 +02:00
$sql .= " FROM " . MAIN_DB_PREFIX . " commande_fournisseur as c " ;
2021-10-22 22:15:59 +02:00
if ( empty ( $user -> rights -> societe -> client -> voir ) && ! $user -> socid ) {
2022-02-10 19:36:33 +01:00
$sql .= " JOIN " . MAIN_DB_PREFIX . " societe_commerciaux as sc ON c.fk_soc = sc.fk_soc AND sc.fk_user = " . (( int ) $user -> id );
2020-09-07 10:18:17 +02:00
}
2022-02-10 19:36:33 +01:00
$sql .= " WHERE c.entity = " . $conf -> entity ;
2020-09-07 10:18:17 +02:00
if ( $mode === 'awaiting' ) {
2020-11-15 17:29:19 +01:00
$sql .= " AND c.fk_statut IN ( " . self :: STATUS_ORDERSENT . " , " . self :: STATUS_RECEIVED_PARTIALLY . " ) " ;
2020-09-07 10:18:17 +02:00
} else {
$sql .= " AND c.fk_statut IN ( " . self :: STATUS_VALIDATED . " , " . self :: STATUS_ACCEPTED . " ) " ;
}
2021-02-25 23:21:30 +01:00
if ( $user -> socid ) {
2021-08-23 17:41:11 +02:00
$sql .= " AND c.fk_soc = " . (( int ) $user -> socid );
2021-02-25 23:21:30 +01:00
}
2011-09-11 20:35:38 +02:00
2020-09-07 10:18:17 +02:00
$resql = $this -> db -> query ( $sql );
2021-02-25 23:21:30 +01:00
if ( $resql ) {
2020-09-07 10:18:17 +02:00
$commandestatic = new CommandeFournisseur ( $this -> db );
$response = new WorkboardResponse ();
$response -> warning_delay = $conf -> commande -> fournisseur -> warning_delay / 60 / 60 / 24 ;
$response -> label = $langs -> trans ( " SuppliersOrdersToProcess " );
$response -> labelShort = $langs -> trans ( " Opened " );
2021-07-02 12:47:42 +02:00
$response -> url = DOL_URL_ROOT . '/fourn/commande/list.php?search_status=1,2&mainmenu=commercial&leftmenu=orders_suppliers' ;
2020-09-07 10:18:17 +02:00
$response -> img = img_object ( '' , " order " );
if ( $mode === 'awaiting' ) {
$response -> label = $langs -> trans ( " SuppliersOrdersAwaitingReception " );
$response -> labelShort = $langs -> trans ( " AwaitingReception " );
2021-07-02 12:47:42 +02:00
$response -> url = DOL_URL_ROOT . '/fourn/commande/list.php?search_status=3,4&mainmenu=commercial&leftmenu=orders_suppliers' ;
2020-09-07 10:18:17 +02:00
}
2019-09-10 22:10:20 +02:00
2021-02-25 23:21:30 +01:00
while ( $obj = $this -> db -> fetch_object ( $resql )) {
2020-11-11 18:08:40 +01:00
$commandestatic -> delivery_date = $this -> db -> jdate ( $obj -> delivery_date );
2020-09-07 10:18:17 +02:00
$commandestatic -> date_commande = $this -> db -> jdate ( $obj -> date_commande );
$commandestatic -> statut = $obj -> fk_statut ;
2015-09-06 19:23:46 +02:00
2022-01-09 19:48:38 +01:00
$response -> nbtodo ++ ;
$response -> total += $obj -> total_ht ;
2020-09-07 10:18:17 +02:00
if ( $commandestatic -> hasDelay ()) {
$response -> nbtodolate ++ ;
}
}
2015-02-15 15:01:28 +01:00
2020-09-07 10:18:17 +02:00
return $response ;
} else {
$this -> error = $this -> db -> error ();
return - 1 ;
}
}
2012-08-24 19:55:31 +02:00
2020-09-07 10:18:17 +02:00
/**
* Returns the translated input method of object ( defined if $this -> methode_commande_id > 0 ) .
* This function make a sql request to get translation . No cache yet , try to not use it inside a loop .
*
* @ return string
*/
public function getInputMethod ()
{
global $db , $langs ;
2012-08-24 19:55:31 +02:00
2021-02-25 23:21:30 +01:00
if ( $this -> methode_commande_id > 0 ) {
2020-09-07 10:18:17 +02:00
$sql = " SELECT rowid, code, libelle as label " ;
$sql .= " FROM " . MAIN_DB_PREFIX . 'c_input_method' ;
2021-06-09 15:36:47 +02:00
$sql .= " WHERE active=1 AND rowid = " . (( int ) $this -> methode_commande_id );
2012-08-24 19:55:31 +02:00
2020-09-20 02:30:53 +02:00
$resql = $this -> db -> query ( $sql );
2021-02-25 23:21:30 +01:00
if ( $resql ) {
if ( $this -> db -> num_rows ( $resql )) {
2020-09-20 02:30:53 +02:00
$obj = $this -> db -> fetch_object ( $resql );
2017-09-20 16:57:38 +02:00
2020-09-07 10:18:17 +02:00
$string = $langs -> trans ( $obj -> code );
2021-02-25 23:21:30 +01:00
if ( $string == $obj -> code ) {
2020-09-07 10:18:17 +02:00
$string = $obj -> label != '-' ? $obj -> label : '' ;
}
return $string ;
}
2021-02-25 23:21:30 +01:00
} else {
dol_print_error ( $this -> db );
}
2020-09-07 10:18:17 +02:00
}
2012-08-24 19:55:31 +02:00
2020-09-07 10:18:17 +02:00
return '' ;
}
Created a method generateDocument for several classes
Which are: Commande, Contrat, Livraison, Facture, Projet, Propal, Task, Expedition, CommandeFournisseur, FactureFournisseur and therefore deprecated the following methods supplier_order_pdf_create, supplier_invoice_pdf_create, delivery_order_pdf_create, task_pdf_create, propale_pdf_create, project_pdf_create, facture_pdf_create, expedition_pdf_create, commande_pdf_create
2014-09-16 12:30:37 +02:00
/**
* Create a document onto disk according to template model .
*
* @ param string $modele Force template to use ( '' to not force )
* @ param Translate $outputlangs Object lang to use for traduction
* @ param int $hidedetails Hide details of lines
* @ param int $hidedesc Hide description
* @ param int $hideref Hide ref
2020-09-07 10:18:17 +02:00
* @ param null | array $moreparams Array to provide more information
Created a method generateDocument for several classes
Which are: Commande, Contrat, Livraison, Facture, Projet, Propal, Task, Expedition, CommandeFournisseur, FactureFournisseur and therefore deprecated the following methods supplier_order_pdf_create, supplier_invoice_pdf_create, delivery_order_pdf_create, task_pdf_create, propale_pdf_create, project_pdf_create, facture_pdf_create, expedition_pdf_create, commande_pdf_create
2014-09-16 12:30:37 +02:00
* @ return int 0 if KO , 1 if OK
*/
2019-01-27 15:20:16 +01:00
public function generateDocument ( $modele , $outputlangs , $hidedetails = 0 , $hidedesc = 0 , $hideref = 0 , $moreparams = null )
Created a method generateDocument for several classes
Which are: Commande, Contrat, Livraison, Facture, Projet, Propal, Task, Expedition, CommandeFournisseur, FactureFournisseur and therefore deprecated the following methods supplier_order_pdf_create, supplier_invoice_pdf_create, delivery_order_pdf_create, task_pdf_create, propale_pdf_create, project_pdf_create, facture_pdf_create, expedition_pdf_create, commande_pdf_create
2014-09-16 12:30:37 +02:00
{
2017-01-16 21:16:05 +01:00
global $conf , $langs ;
Created a method generateDocument for several classes
Which are: Commande, Contrat, Livraison, Facture, Projet, Propal, Task, Expedition, CommandeFournisseur, FactureFournisseur and therefore deprecated the following methods supplier_order_pdf_create, supplier_invoice_pdf_create, delivery_order_pdf_create, task_pdf_create, propale_pdf_create, project_pdf_create, facture_pdf_create, expedition_pdf_create, commande_pdf_create
2014-09-16 12:30:37 +02:00
2014-09-22 00:15:32 +02:00
$langs -> load ( " suppliers " );
2020-08-04 11:02:16 +02:00
$outputlangs -> load ( " products " );
Created a method generateDocument for several classes
Which are: Commande, Contrat, Livraison, Facture, Projet, Propal, Task, Expedition, CommandeFournisseur, FactureFournisseur and therefore deprecated the following methods supplier_order_pdf_create, supplier_invoice_pdf_create, delivery_order_pdf_create, task_pdf_create, propale_pdf_create, project_pdf_create, facture_pdf_create, expedition_pdf_create, commande_pdf_create
2014-09-16 12:30:37 +02:00
2020-01-30 01:48:28 +01:00
if ( ! dol_strlen ( $modele )) {
2022-02-17 11:34:23 +01:00
$modele = '' ;
2020-09-10 01:49:09 +02:00
if ( $this -> model_pdf ) {
$modele = $this -> model_pdf ;
2020-01-30 01:48:28 +01:00
} elseif ( ! empty ( $conf -> global -> COMMANDE_SUPPLIER_ADDON_PDF )) {
Created a method generateDocument for several classes
Which are: Commande, Contrat, Livraison, Facture, Projet, Propal, Task, Expedition, CommandeFournisseur, FactureFournisseur and therefore deprecated the following methods supplier_order_pdf_create, supplier_invoice_pdf_create, delivery_order_pdf_create, task_pdf_create, propale_pdf_create, project_pdf_create, facture_pdf_create, expedition_pdf_create, commande_pdf_create
2014-09-16 12:30:37 +02:00
$modele = $conf -> global -> COMMANDE_SUPPLIER_ADDON_PDF ;
}
}
2022-02-17 11:34:23 +01:00
if ( empty ( $modele )) {
return 0 ;
} else {
$modelpath = " core/modules/supplier_order/doc/ " ;
return $this -> commonGenerateDocument ( $modelpath , $modele , $outputlangs , $hidedetails , $hidedesc , $hideref , $moreparams );
}
Created a method generateDocument for several classes
Which are: Commande, Contrat, Livraison, Facture, Projet, Propal, Task, Expedition, CommandeFournisseur, FactureFournisseur and therefore deprecated the following methods supplier_order_pdf_create, supplier_invoice_pdf_create, delivery_order_pdf_create, task_pdf_create, propale_pdf_create, project_pdf_create, facture_pdf_create, expedition_pdf_create, commande_pdf_create
2014-09-16 12:30:37 +02:00
}
2015-02-06 16:07:22 +01:00
/**
2020-09-07 10:18:17 +02:00
* Return the max number delivery delay in day
*
* @ param Translate $langs Language object
* @ return string Translated string
*/
public function getMaxDeliveryTimeDay ( $langs )
{
2021-02-25 23:21:30 +01:00
if ( empty ( $this -> lines )) {
return '' ;
}
2015-02-28 18:10:31 +01:00
$obj = new ProductFournisseur ( $this -> db );
2015-02-08 00:39:51 +01:00
2015-02-06 16:07:22 +01:00
$nb = 0 ;
2021-02-25 23:21:30 +01:00
foreach ( $this -> lines as $line ) {
if ( $line -> fk_product > 0 ) {
2015-02-28 18:10:31 +01:00
$idp = $obj -> find_min_price_product_fournisseur ( $line -> fk_product , $line -> qty );
2021-02-25 23:21:30 +01:00
if ( $idp ) {
2015-02-28 18:10:31 +01:00
$obj -> fetch ( $idp );
2021-02-25 23:21:30 +01:00
if ( $obj -> delivery_time_days > $nb ) {
$nb = $obj -> delivery_time_days ;
}
2015-02-28 18:10:31 +01:00
}
2015-02-06 16:07:22 +01:00
}
}
2015-02-08 00:39:51 +01:00
2021-02-25 23:21:30 +01:00
if ( $nb === 0 ) {
return '' ;
} else {
return $nb . ' ' . $langs -> trans ( 'Days' );
}
2015-02-06 16:07:22 +01:00
}
2015-03-23 01:39:12 +01:00
/**
* Returns the rights used for this class
* @ return stdClass
*/
public function getRights ()
{
global $user ;
return $user -> rights -> fournisseur -> commande ;
}
2015-04-18 18:11:01 +02:00
/**
* Function used to replace a thirdparty id with another one .
*
* @ param DoliDB $db Database handler
* @ param int $origin_id Old thirdparty id
* @ param int $dest_id New thirdparty id
* @ return bool
*/
public static function replaceThirdparty ( DoliDB $db , $origin_id , $dest_id )
{
$tables = array (
'commande_fournisseur'
);
return CommonObject :: commonReplaceThirdparty ( $db , $origin_id , $dest_id , $tables );
}
2015-09-06 19:23:46 +02:00
2021-11-23 21:38:29 +01:00
/**
* Function used to replace a product id with another one .
*
* @ param DoliDB $db Database handler
* @ param int $origin_id Old product id
* @ param int $dest_id New product id
* @ return bool
*/
public static function replaceProduct ( DoliDB $db , $origin_id , $dest_id )
{
$tables = array (
'commande_fournisseurdet'
);
return CommonObject :: commonReplaceProduct ( $db , $origin_id , $dest_id , $tables );
}
2020-09-07 10:18:17 +02:00
/**
* Is the supplier order delayed ?
2021-02-09 20:46:17 +01:00
* We suppose a purchase ordered as late if a the purchase order has been sent and the delivery date is set and before the delay .
* If order has not been sent , we use the order date .
2020-09-07 10:18:17 +02:00
*
2021-02-09 20:46:17 +01:00
* @ return bool True if object is delayed
2020-09-07 10:18:17 +02:00
*/
public function hasDelay ()
{
global $conf ;
2016-08-05 09:46:17 +02:00
2021-02-25 23:21:30 +01:00
if ( empty ( $this -> delivery_date ) && ! empty ( $this -> date_livraison )) {
$this -> delivery_date = $this -> date_livraison ; // For backward compatibility
}
2016-08-05 09:46:17 +02:00
2021-02-09 20:46:17 +01:00
if ( $this -> statut == self :: STATUS_ORDERSENT || $this -> statut == self :: STATUS_RECEIVED_PARTIALLY ) {
$now = dol_now ();
if ( ! empty ( $this -> delivery_date )) {
$date_to_test = $this -> delivery_date ;
return $date_to_test && $date_to_test < ( $now - $conf -> commande -> fournisseur -> warning_delay );
} else {
//$date_to_test = $this->date_commande;
//return $date_to_test && $date_to_test < ($now - $conf->commande->fournisseur->warning_delay);
return false ;
}
} else {
$now = dol_now ();
$date_to_test = $this -> date_commande ;
2016-08-05 09:46:17 +02:00
2021-02-09 20:46:17 +01:00
return ( $this -> statut > 0 && $this -> statut < 5 ) && $date_to_test && $date_to_test < ( $now - $conf -> commande -> fournisseur -> warning_delay );
}
2020-09-07 10:18:17 +02:00
}
2016-08-05 09:46:17 +02:00
2020-09-07 10:18:17 +02:00
/**
2021-02-09 20:46:17 +01:00
* Show the customer delayed info .
* We suppose a purchase ordered as late if a the purchase order has been sent and the delivery date is set and before the delay .
* If order has not been sent , we use the order date .
2020-09-07 10:18:17 +02:00
*
* @ return string Show delayed information
*/
public function showDelay ()
{
global $conf , $langs ;
2016-08-05 09:46:17 +02:00
2021-02-25 23:21:30 +01:00
if ( empty ( $this -> delivery_date ) && ! empty ( $this -> date_livraison )) {
$this -> delivery_date = $this -> date_livraison ; // For backward compatibility
}
2016-08-05 09:46:17 +02:00
2021-02-09 20:46:17 +01:00
$text = '' ;
if ( $this -> statut == self :: STATUS_ORDERSENT || $this -> statut == self :: STATUS_RECEIVED_PARTIALLY ) {
if ( ! empty ( $this -> delivery_date )) {
$text = $langs -> trans ( " DeliveryDate " ) . ' ' . dol_print_date ( $this -> delivery_date , 'day' );
} else {
$text = $langs -> trans ( " OrderDate " ) . ' ' . dol_print_date ( $this -> date_commande , 'day' );
}
2020-11-16 13:52:35 +01:00
} else {
2021-02-09 20:46:17 +01:00
$text = $langs -> trans ( " OrderDate " ) . ' ' . dol_print_date ( $this -> date_commande , 'day' );
}
if ( $text ) {
$text .= ' ' . ( $conf -> commande -> fournisseur -> warning_delay > 0 ? '+' : '-' ) . ' ' . round ( abs ( $conf -> commande -> fournisseur -> warning_delay ) / 3600 / 24 , 1 ) . ' ' . $langs -> trans ( " days " ) . ' < ' . $langs -> trans ( " Today " );
2020-11-16 13:52:35 +01:00
}
2016-08-05 09:46:17 +02:00
2020-09-07 10:18:17 +02:00
return $text ;
}
2016-08-05 10:02:36 +02:00
2017-06-30 11:40:26 +02:00
2020-09-07 10:18:17 +02:00
/**
* Calc status regarding to dispatched stock
*
* @ param User $user User action
* @ param int $closeopenorder Close if received
* @ param string $comment Comment
* @ return int < 0 if KO , 0 if not applicable , > 0 if OK
*/
public function calcAndSetStatusDispatch ( User $user , $closeopenorder = 1 , $comment = '' )
{
global $conf , $langs ;
2016-08-05 10:02:36 +02:00
2021-04-12 06:15:47 +02:00
if (( ! empty ( $conf -> fournisseur -> enabled ) && empty ( $conf -> global -> MAIN_USE_NEW_SUPPLIERMOD )) || ! empty ( $conf -> supplier_order -> enabled )) {
2020-09-07 10:18:17 +02:00
require_once DOL_DOCUMENT_ROOT . '/fourn/class/fournisseur.commande.dispatch.class.php' ;
2016-08-05 10:02:36 +02:00
2020-09-07 10:18:17 +02:00
$qtydelivered = array ();
$qtywished = array ();
2016-08-05 10:02:36 +02:00
2020-09-07 10:18:17 +02:00
$supplierorderdispatch = new CommandeFournisseurDispatch ( $this -> db );
$filter = array ( 't.fk_commande' => $this -> id );
if ( ! empty ( $conf -> global -> SUPPLIER_ORDER_USE_DISPATCH_STATUS )) {
$filter [ 't.status' ] = 1 ; // Restrict to lines with status validated
}
$ret = $supplierorderdispatch -> fetchAll ( '' , '' , 0 , 0 , $filter );
2021-01-31 19:02:57 +01:00
if ( $ret < 0 ) {
2020-09-07 10:18:17 +02:00
$this -> error = $supplierorderdispatch -> error ; $this -> errors = $supplierorderdispatch -> errors ;
return $ret ;
} else {
2021-01-31 19:02:57 +01:00
if ( is_array ( $supplierorderdispatch -> lines ) && count ( $supplierorderdispatch -> lines ) > 0 ) {
2021-02-03 17:09:26 +01:00
require_once DOL_DOCUMENT_ROOT . '/product/class/product.class.php' ;
2020-09-07 10:18:17 +02:00
$date_liv = dol_now ();
2017-08-23 16:07:11 +02:00
2020-09-07 10:18:17 +02:00
// Build array with quantity deliverd by product
foreach ( $supplierorderdispatch -> lines as $line ) {
$qtydelivered [ $line -> fk_product ] += $line -> qty ;
}
foreach ( $this -> lines as $line ) {
2021-01-31 19:02:57 +01:00
// Exclude lines not qualified for shipment, similar code is found into interface_20_modWrokflow for customers
2021-02-25 23:21:30 +01:00
if ( empty ( $conf -> global -> STOCK_SUPPORTS_SERVICES ) && $line -> product_type > 0 ) {
continue ;
}
2020-09-07 10:18:17 +02:00
$qtywished [ $line -> fk_product ] += $line -> qty ;
}
2021-01-31 19:02:57 +01:00
2020-09-07 10:18:17 +02:00
//Compare array
$diff_array = array_diff_assoc ( $qtydelivered , $qtywished ); // Warning: $diff_array is done only on common keys.
$keysinwishednotindelivered = array_diff ( array_keys ( $qtywished ), array_keys ( $qtydelivered )); // To check we also have same number of keys
$keysindeliverednotinwished = array_diff ( array_keys ( $qtydelivered ), array_keys ( $qtywished )); // To check we also have same number of keys
2022-05-17 14:55:38 +02:00
//var_dump(array_keys($qtydelivered));
//var_dump(array_keys($qtywished));
//var_dump($diff_array);
//var_dump($keysinwishednotindelivered);
//var_dump($keysindeliverednotinwished);
//exit;
2017-08-23 16:07:11 +02:00
2021-02-25 23:21:30 +01:00
if ( count ( $diff_array ) == 0 && count ( $keysinwishednotindelivered ) == 0 && count ( $keysindeliverednotinwished ) == 0 ) { //No diff => mean everythings is received
if ( $closeopenorder ) {
2020-09-07 10:18:17 +02:00
//$ret=$this->setStatus($user,5);
$ret = $this -> Livraison ( $user , $date_liv , 'tot' , $comment ); // GETPOST("type") is 'tot', 'par', 'nev', 'can'
if ( $ret < 0 ) {
return - 1 ;
}
return 5 ;
} else {
//Diff => received partially
//$ret=$this->setStatus($user,4);
$ret = $this -> Livraison ( $user , $date_liv , 'par' , $comment ); // GETPOST("type") is 'tot', 'par', 'nev', 'can'
if ( $ret < 0 ) {
return - 1 ;
}
return 4 ;
}
} elseif ( ! empty ( $conf -> global -> SUPPLIER_ORDER_MORE_THAN_WISHED )) {
//set livraison to 'tot' if more products received than wished. (and if $closeopenorder is set to 1 of course...)
2019-02-03 14:29:45 +01:00
2020-09-07 10:18:17 +02:00
$close = 0 ;
2021-02-25 23:21:30 +01:00
if ( count ( $diff_array ) > 0 ) {
2020-09-07 10:18:17 +02:00
//there are some difference between the two arrays
//scan the array of results
2021-02-25 23:21:30 +01:00
foreach ( $diff_array as $key => $value ) {
2020-09-07 10:18:17 +02:00
//if the quantity delivered is greater or equal to wish quantity
2021-02-25 23:21:30 +01:00
if ( $qtydelivered [ $key ] >= $qtywished [ $key ]) {
2020-09-07 10:18:17 +02:00
$close ++ ;
}
}
}
if ( $close == count ( $diff_array )) {
//all the products are received equal or more than the wished quantity
if ( $closeopenorder ) {
$ret = $this -> Livraison ( $user , $date_liv , 'tot' , $comment ); // GETPOST("type") is 'tot', 'par', 'nev', 'can'
if ( $ret < 0 ) {
return - 1 ;
}
return 5 ;
} else {
//Diff => received partially
$ret = $this -> Livraison ( $user , $date_liv , 'par' , $comment ); // GETPOST("type") is 'tot', 'par', 'nev', 'can'
if ( $ret < 0 ) {
return - 1 ;
}
return 4 ;
}
} else {
//all the products are not received
$ret = $this -> Livraison ( $user , $date_liv , 'par' , $comment ); // GETPOST("type") is 'tot', 'par', 'nev', 'can'
if ( $ret < 0 ) {
return - 1 ;
}
return 4 ;
}
} else {
//Diff => received partially
$ret = $this -> Livraison ( $user , $date_liv , 'par' , $comment ); // GETPOST("type") is 'tot', 'par', 'nev', 'can'
if ( $ret < 0 ) {
return - 1 ;
}
return 4 ;
}
}
return 1 ;
}
}
return 0 ;
}
/**
* Load array this -> receptions of lines of shipments with nb of products sent for each order line
* Note : For a dedicated shipment , the fetch_lines can be used to load the qty_asked and qty_shipped . This function is use to return qty_shipped cumulated for the order
*
* @ param int $filtre_statut Filter on shipment status
* @ return int < 0 if KO , Nb of lines found if OK
*/
public function loadReceptions ( $filtre_statut = - 1 )
{
$this -> receptions = array ();
2022-05-17 20:08:59 +02:00
dol_syslog ( get_class ( $this ) . " ::loadReceptions " , LOG_DEBUG );
2020-09-07 10:18:17 +02:00
$sql = 'SELECT cd.rowid, cd.fk_product,' ;
$sql .= ' sum(cfd.qty) as qty' ;
$sql .= ' FROM ' . MAIN_DB_PREFIX . 'commande_fournisseur_dispatch as cfd,' ;
2021-02-25 23:21:30 +01:00
if ( $filtre_statut >= 0 ) {
$sql .= ' ' . MAIN_DB_PREFIX . 'reception as e,' ;
}
2020-09-07 10:18:17 +02:00
$sql .= ' ' . MAIN_DB_PREFIX . 'commande_fournisseurdet as cd' ;
$sql .= ' WHERE' ;
2021-02-25 23:21:30 +01:00
if ( $filtre_statut >= 0 ) {
$sql .= ' cfd.fk_reception = e.rowid AND' ;
}
2020-09-07 10:18:17 +02:00
$sql .= ' cfd.fk_commandefourndet = cd.rowid' ;
2021-08-27 23:36:06 +02:00
$sql .= ' AND cd.fk_commande =' . (( int ) $this -> id );
2021-02-25 23:21:30 +01:00
if ( $this -> fk_product > 0 ) {
2021-08-27 23:36:06 +02:00
$sql .= ' AND cd.fk_product = ' . (( int ) $this -> fk_product );
2021-02-25 23:21:30 +01:00
}
if ( $filtre_statut >= 0 ) {
2021-08-27 23:36:06 +02:00
$sql .= ' AND e.fk_statut >= ' . (( int ) $filtre_statut );
2021-02-25 23:21:30 +01:00
}
2020-09-07 10:18:17 +02:00
$sql .= ' GROUP BY cd.rowid, cd.fk_product' ;
2022-05-17 20:08:59 +02:00
$resql = $this -> db -> query ( $sql );
if ( $resql ) {
$num = $this -> db -> num_rows ( $resql );
2020-09-07 10:18:17 +02:00
$i = 0 ;
2021-02-25 23:21:30 +01:00
while ( $i < $num ) {
2022-05-17 20:08:59 +02:00
$obj = $this -> db -> fetch_object ( $resql );
2020-09-07 10:18:17 +02:00
empty ( $this -> receptions [ $obj -> rowid ]) ? $this -> receptions [ $obj -> rowid ] = $obj -> qty : $this -> receptions [ $obj -> rowid ] += $obj -> qty ;
$i ++ ;
}
2022-05-15 22:29:19 +02:00
$this -> db -> free ( $resql );
2019-02-03 14:29:45 +01:00
2020-09-07 10:18:17 +02:00
return $num ;
} else {
$this -> error = $this -> db -> lasterror ();
return - 1 ;
}
}
2004-11-30 20:25:48 +01:00
}
2006-02-17 18:59:43 +01:00
2007-03-23 00:20:21 +01:00
2010-11-13 18:37:22 +01:00
2007-03-23 00:20:21 +01:00
/**
2015-02-08 00:39:51 +01:00
* Class to manage line orders
2007-03-23 00:20:21 +01:00
*/
2014-08-18 23:02:04 +02:00
class CommandeFournisseurLigne extends CommonOrderLine
2006-02-17 18:59:43 +01:00
{
2020-09-07 10:18:17 +02:00
/**
2018-08-23 18:35:45 +02:00
* @ var string ID to identify managed object
*/
2019-11-13 19:35:39 +01:00
public $element = 'commande_fournisseurdet' ;
2018-08-29 15:37:35 +02:00
2018-08-22 18:48:53 +02:00
/**
* @ var string Name of table without prefix where object is stored
*/
2019-11-13 19:35:39 +01:00
public $table_element = 'commande_fournisseurdet' ;
2015-04-01 21:00:51 +02:00
2020-09-07 10:18:17 +02:00
public $oldline ;
2016-07-19 12:57:23 +02:00
2020-09-07 10:18:17 +02:00
/**
* Id of parent order
* @ var int
*/
public $fk_commande ;
2016-07-19 12:57:23 +02:00
2020-09-07 10:18:17 +02:00
// From llx_commande_fournisseurdet
/**
* @ var int ID
*/
public $fk_parent_line ;
2018-10-10 12:16:20 +02:00
2020-09-07 10:18:17 +02:00
/**
* @ var int ID
*/
public $fk_facture ;
2018-09-28 14:49:34 +02:00
2020-09-07 10:18:17 +02:00
public $rang = 0 ;
public $special_code = 0 ;
2016-07-19 12:57:23 +02:00
2015-03-23 01:39:12 +01:00
/**
* Unit price without taxes
* @ var float
*/
public $pu_ht ;
2015-02-28 03:11:15 +01:00
2020-09-07 10:18:17 +02:00
public $date_start ;
public $date_end ;
2011-09-11 20:35:38 +02:00
2020-09-07 10:18:17 +02:00
// From llx_product_fournisseur_price
2015-03-23 01:39:12 +01:00
/**
2016-12-13 13:22:24 +01:00
* Supplier reference of price when we added the line . May have been changed after line was added .
2015-03-23 01:39:12 +01:00
* @ var string
*/
2020-09-07 10:18:17 +02:00
public $ref_supplier ;
public $remise ;
2011-09-11 20:35:38 +02:00
2020-09-07 10:18:17 +02:00
/**
* Constructor
*
* @ param DoliDB $db Database handler
*/
public function __construct ( $db )
{
$this -> db = $db ;
}
2011-09-11 20:35:38 +02:00
2020-09-07 10:18:17 +02:00
/**
* Load line order
*
* @ param int $rowid Id line order
* @ return int < 0 if KO , > 0 if OK
*/
public function fetch ( $rowid )
{
global $conf ;
$sql = 'SELECT cd.rowid, cd.fk_commande, cd.fk_product, cd.product_type, cd.description, cd.qty, cd.tva_tx, cd.special_code,' ;
2022-03-17 18:53:50 +01:00
$sql .= ' cd.localtax1_tx, cd.localtax2_tx, cd.localtax1_type, cd.localtax2_type, cd.ref as ref_supplier,' ;
2020-09-07 10:18:17 +02:00
$sql .= ' cd.remise, cd.remise_percent, cd.subprice,' ;
$sql .= ' cd.info_bits, cd.total_ht, cd.total_tva, cd.total_ttc,' ;
$sql .= ' cd.total_localtax1, cd.total_localtax2,' ;
2020-10-12 19:33:00 +02:00
$sql .= ' p.ref as product_ref, p.label as product_label, p.description as product_desc,' ;
2020-09-07 10:18:17 +02:00
$sql .= ' cd.date_start, cd.date_end, cd.fk_unit,' ;
2022-03-17 18:53:50 +01:00
$sql .= ' cd.multicurrency_subprice, cd.multicurrency_total_ht, cd.multicurrency_total_tva, cd.multicurrency_total_ttc,' ;
$sql .= ' c.fk_soc as socid' ;
$sql .= ' FROM ' . MAIN_DB_PREFIX . 'commande_fournisseur as c, ' . MAIN_DB_PREFIX . 'commande_fournisseurdet as cd' ;
2020-09-07 10:18:17 +02:00
$sql .= ' LEFT JOIN ' . MAIN_DB_PREFIX . 'product as p ON cd.fk_product = p.rowid' ;
2022-03-17 18:53:50 +01:00
$sql .= ' WHERE cd.fk_commande = c.rowid AND cd.rowid = ' . (( int ) $rowid );
2020-09-07 10:18:17 +02:00
$result = $this -> db -> query ( $sql );
2021-02-25 23:21:30 +01:00
if ( $result ) {
2020-09-07 10:18:17 +02:00
$objp = $this -> db -> fetch_object ( $result );
2017-03-10 12:35:33 +01:00
2021-02-25 23:21:30 +01:00
if ( ! empty ( $objp )) {
2020-09-07 10:18:17 +02:00
$this -> rowid = $objp -> rowid ;
$this -> id = $objp -> rowid ;
$this -> fk_commande = $objp -> fk_commande ;
$this -> desc = $objp -> description ;
$this -> qty = $objp -> qty ;
2022-03-17 18:53:50 +01:00
$this -> ref_fourn = $objp -> ref_supplier ;
$this -> ref_supplier = $objp -> ref_supplier ;
2020-09-07 10:18:17 +02:00
$this -> subprice = $objp -> subprice ;
$this -> tva_tx = $objp -> tva_tx ;
$this -> localtax1_tx = $objp -> localtax1_tx ;
$this -> localtax2_tx = $objp -> localtax2_tx ;
$this -> localtax1_type = $objp -> localtax1_type ;
$this -> localtax2_type = $objp -> localtax2_type ;
$this -> remise = $objp -> remise ;
$this -> remise_percent = $objp -> remise_percent ;
$this -> fk_product = $objp -> fk_product ;
$this -> info_bits = $objp -> info_bits ;
$this -> total_ht = $objp -> total_ht ;
$this -> total_tva = $objp -> total_tva ;
$this -> total_localtax1 = $objp -> total_localtax1 ;
$this -> total_localtax2 = $objp -> total_localtax2 ;
$this -> total_ttc = $objp -> total_ttc ;
$this -> product_type = $objp -> product_type ;
$this -> special_code = $objp -> special_code ;
$this -> ref = $objp -> product_ref ;
2020-10-12 19:33:00 +02:00
2020-09-07 10:18:17 +02:00
$this -> product_ref = $objp -> product_ref ;
2020-10-12 19:33:00 +02:00
$this -> product_label = $objp -> product_label ;
2020-09-07 10:18:17 +02:00
$this -> product_desc = $objp -> product_desc ;
2022-03-17 18:53:50 +01:00
2021-02-25 23:21:30 +01:00
if ( ! empty ( $conf -> global -> PRODUCT_USE_SUPPLIER_PACKAGING )) {
2022-03-17 18:53:50 +01:00
// TODO We should not fetch this properties into the fetch_lines. This is NOT properties of a line.
// Move this into another method and call it when required.
// Take better packaging for $objp->qty (first supplier ref quantity <= $objp->qty)
$sqlsearchpackage = 'SELECT rowid, packaging FROM ' . MAIN_DB_PREFIX . " product_fournisseur_price " ;
$sqlsearchpackage .= ' WHERE entity IN (' . getEntity ( 'product_fournisseur_price' ) . " ) " ;
$sqlsearchpackage .= " AND fk_product = " . (( int ) $objp -> fk_product );
$sqlsearchpackage .= " AND ref_fourn = ' " . $this -> db -> escape ( $objp -> ref_supplier ) . " ' " ;
$sqlsearchpackage .= " AND quantity <= " . (( float ) $objp -> qty ); // required to be qualified
$sqlsearchpackage .= " AND (packaging IS NULL OR packaging = 0 OR packaging <= " . (( float ) $objp -> qty ) . " ) " ; // required to be qualified
$sqlsearchpackage .= " AND fk_soc = " . (( int ) $objp -> socid );
$sqlsearchpackage .= " ORDER BY packaging ASC " ; // Take the smaller package first
$sqlsearchpackage .= " LIMIT 1 " ;
$resqlsearchpackage = $this -> db -> query ( $sqlsearchpackage );
if ( $resqlsearchpackage ) {
$objsearchpackage = $this -> db -> fetch_object ( $resqlsearchpackage );
if ( $objsearchpackage ) {
$this -> fk_fournprice = $objsearchpackage -> rowid ;
$this -> packaging = $objsearchpackage -> packaging ;
}
} else {
$this -> error = $this -> db -> lasterror ();
return - 1 ;
}
2019-11-25 07:40:29 +01:00
}
2019-02-01 16:01:18 +01:00
2020-09-07 10:18:17 +02:00
$this -> date_start = $this -> db -> jdate ( $objp -> date_start );
$this -> date_end = $this -> db -> jdate ( $objp -> date_end );
$this -> fk_unit = $objp -> fk_unit ;
2019-02-01 16:01:18 +01:00
$this -> multicurrency_subprice = $objp -> multicurrency_subprice ;
$this -> multicurrency_total_ht = $objp -> multicurrency_total_ht ;
$this -> multicurrency_total_tva = $objp -> multicurrency_total_tva ;
$this -> multicurrency_total_ttc = $objp -> multicurrency_total_ttc ;
$this -> fetch_optionals ();
2020-09-07 10:18:17 +02:00
$this -> db -> free ( $result );
return 1 ;
} else {
$this -> error = 'Supplier order line with id=' . $rowid . ' not found' ;
dol_syslog ( get_class ( $this ) . " ::fetch Error " . $this -> error , LOG_ERR );
return 0 ;
}
} else {
dol_print_error ( $this -> db );
return - 1 ;
}
}
2016-07-19 12:57:23 +02:00
2020-09-07 10:18:17 +02:00
/**
* Insert line into database
*
* @ param int $notrigger 1 = disable triggers
* @ return int < 0 if KO , > 0 if OK
*/
public function insert ( $notrigger = 0 )
{
global $conf , $user ;
2016-07-19 12:57:23 +02:00
2020-09-07 10:18:17 +02:00
$error = 0 ;
2016-07-19 12:57:23 +02:00
2020-09-07 10:18:17 +02:00
dol_syslog ( get_class ( $this ) . " ::insert rang= " . $this -> rang );
// Clean parameters
2021-02-25 23:21:30 +01:00
if ( empty ( $this -> tva_tx )) {
$this -> tva_tx = 0 ;
}
if ( empty ( $this -> localtax1_tx )) {
$this -> localtax1_tx = 0 ;
}
if ( empty ( $this -> localtax2_tx )) {
$this -> localtax2_tx = 0 ;
}
if ( empty ( $this -> localtax1_type )) {
$this -> localtax1_type = '0' ;
}
if ( empty ( $this -> localtax2_type )) {
$this -> localtax2_type = '0' ;
}
if ( empty ( $this -> total_localtax1 )) {
$this -> total_localtax1 = 0 ;
}
if ( empty ( $this -> total_localtax2 )) {
$this -> total_localtax2 = 0 ;
}
if ( empty ( $this -> rang )) {
$this -> rang = 0 ;
}
if ( empty ( $this -> remise_percent )) {
$this -> remise_percent = 0 ;
}
if ( empty ( $this -> info_bits )) {
$this -> info_bits = 0 ;
}
if ( empty ( $this -> special_code )) {
$this -> special_code = 0 ;
}
if ( empty ( $this -> fk_parent_line )) {
$this -> fk_parent_line = 0 ;
}
if ( empty ( $this -> pa_ht )) {
$this -> pa_ht = 0 ;
}
2020-09-07 10:18:17 +02:00
// Multicurrency
2021-02-25 23:21:30 +01:00
if ( ! empty ( $this -> multicurrency_code )) {
list ( $this -> fk_multicurrency , $this -> multicurrency_tx ) = MultiCurrency :: getIdAndTxFromCode ( $this -> db , $this -> multicurrency_code );
}
if ( empty ( $this -> fk_multicurrency )) {
2020-09-07 10:18:17 +02:00
$this -> multicurrency_code = $conf -> currency ;
$this -> fk_multicurrency = 0 ;
$this -> multicurrency_tx = 1 ;
}
2016-08-05 09:46:17 +02:00
2020-09-07 10:18:17 +02:00
// Check parameters
2021-02-25 23:21:30 +01:00
if ( $this -> product_type < 0 ) {
return - 1 ;
}
2016-07-19 12:57:23 +02:00
2020-09-07 10:18:17 +02:00
$this -> db -> begin ();
2016-07-19 12:57:23 +02:00
2020-09-07 10:18:17 +02:00
// Insertion dans base de la ligne
$sql = 'INSERT INTO ' . MAIN_DB_PREFIX . $this -> table_element ;
$sql .= " (fk_commande, label, description, date_start, date_end, " ;
$sql .= " fk_product, product_type, special_code, rang, " ;
$sql .= " qty, vat_src_code, tva_tx, localtax1_tx, localtax2_tx, localtax1_type, localtax2_type, remise_percent, subprice, ref, " ;
$sql .= " total_ht, total_tva, total_localtax1, total_localtax2, total_ttc, fk_unit, " ;
$sql .= " fk_multicurrency, multicurrency_code, multicurrency_subprice, multicurrency_total_ht, multicurrency_total_tva, multicurrency_total_ttc " ;
$sql .= " ) " ;
$sql .= " VALUES ( " . $this -> fk_commande . " , ' " . $this -> db -> escape ( $this -> label ) . " ',' " . $this -> db -> escape ( $this -> desc ) . " ', " ;
$sql .= " " . ( $this -> date_start ? " ' " . $this -> db -> idate ( $this -> date_start ) . " ' " : " null " ) . " , " ;
$sql .= " " . ( $this -> date_end ? " ' " . $this -> db -> idate ( $this -> date_end ) . " ' " : " null " ) . " , " ;
2021-02-25 23:21:30 +01:00
if ( $this -> fk_product ) {
$sql .= $this -> fk_product . " , " ;
} else {
$sql .= " null, " ;
}
2020-09-07 10:18:17 +02:00
$sql .= " ' " . $this -> db -> escape ( $this -> product_type ) . " ', " ;
$sql .= " ' " . $this -> db -> escape ( $this -> special_code ) . " ', " ;
$sql .= " ' " . $this -> db -> escape ( $this -> rang ) . " ', " ;
$sql .= " ' " . $this -> db -> escape ( $this -> qty ) . " ', " ;
$sql .= " " . ( empty ( $this -> vat_src_code ) ? " '' " : " ' " . $this -> db -> escape ( $this -> vat_src_code ) . " ' " ) . " , " ;
2021-06-14 13:51:09 +02:00
$sql .= " " . price2num ( $this -> tva_tx ) . " , " ;
$sql .= " " . price2num ( $this -> localtax1_tx ) . " , " ;
$sql .= " " . price2num ( $this -> localtax2_tx ) . " , " ;
2020-09-07 10:18:17 +02:00
$sql .= " ' " . $this -> db -> escape ( $this -> localtax1_type ) . " ', " ;
$sql .= " ' " . $this -> db -> escape ( $this -> localtax2_type ) . " ', " ;
2021-06-14 13:51:09 +02:00
$sql .= " " . (( float ) $this -> remise_percent ) . " , " . price2num ( $this -> subprice , 'MU' ) . " , ' " . $this -> db -> escape ( $this -> ref_supplier ) . " ', " ;
2020-09-07 10:18:17 +02:00
$sql .= " " . price2num ( $this -> total_ht ) . " , " ;
$sql .= " " . price2num ( $this -> total_tva ) . " , " ;
$sql .= " " . price2num ( $this -> total_localtax1 ) . " , " ;
$sql .= " " . price2num ( $this -> total_localtax2 ) . " , " ;
$sql .= " " . price2num ( $this -> total_ttc ) . " , " ;
$sql .= ( $this -> fk_unit ? " ' " . $this -> db -> escape ( $this -> fk_unit ) . " ' " : " null " );
2021-06-14 13:51:09 +02:00
$sql .= " , " . ( $this -> fk_multicurrency ? (( int ) $this -> fk_multicurrency ) : " null " );
2020-09-07 10:18:17 +02:00
$sql .= " , ' " . $this -> db -> escape ( $this -> multicurrency_code ) . " ' " ;
$sql .= " , " . ( $this -> multicurrency_subprice ? price2num ( $this -> multicurrency_subprice ) : '0' );
$sql .= " , " . ( $this -> multicurrency_total_ht ? price2num ( $this -> multicurrency_total_ht ) : '0' );
$sql .= " , " . ( $this -> multicurrency_total_tva ? price2num ( $this -> multicurrency_total_tva ) : '0' );
$sql .= " , " . ( $this -> multicurrency_total_ttc ? price2num ( $this -> multicurrency_total_ttc ) : '0' );
$sql .= " ) " ;
2016-07-19 12:57:23 +02:00
2020-09-07 10:18:17 +02:00
dol_syslog ( get_class ( $this ) . " ::insert " , LOG_DEBUG );
$resql = $this -> db -> query ( $sql );
2021-02-25 23:21:30 +01:00
if ( $resql ) {
2020-09-07 10:18:17 +02:00
$this -> id = $this -> db -> last_insert_id ( MAIN_DB_PREFIX . $this -> table_element );
$this -> rowid = $this -> id ;
2016-07-19 12:57:23 +02:00
2021-02-25 23:21:30 +01:00
if ( ! $error ) {
2020-09-07 10:18:17 +02:00
$result = $this -> insertExtraFields ();
2021-02-25 23:21:30 +01:00
if ( $result < 0 ) {
2020-09-07 10:18:17 +02:00
$error ++ ;
}
}
2016-07-19 12:57:23 +02:00
2021-02-25 23:21:30 +01:00
if ( ! $error && ! $notrigger ) {
2020-09-07 10:18:17 +02:00
// Call trigger
$result = $this -> call_trigger ( 'LINEORDER_SUPPLIER_CREATE' , $user );
2021-02-25 23:21:30 +01:00
if ( $result < 0 ) {
$error ++ ;
}
2020-09-07 10:18:17 +02:00
// End call triggers
}
2016-07-19 12:57:23 +02:00
2020-09-07 10:18:17 +02:00
if ( ! $error ) {
$this -> db -> commit ();
return 1 ;
}
2016-07-19 12:57:23 +02:00
2021-02-25 23:21:30 +01:00
foreach ( $this -> errors as $errmsg ) {
2020-09-07 10:18:17 +02:00
dol_syslog ( get_class ( $this ) . " ::delete " . $errmsg , LOG_ERR );
$this -> errors [] = ( $this -> errors ? ', ' . $errmsg : $errmsg );
}
$this -> db -> rollback ();
return - 1 * $error ;
} else {
$this -> errors [] = $this -> db -> error ();
$this -> db -> rollback ();
return - 2 ;
}
}
/**
* Update the line object into db
*
* @ param int $notrigger 1 = disable triggers
* @ return int < 0 si ko , > 0 si ok
*/
public function update ( $notrigger = 0 )
{
global $conf , $user ;
2016-07-19 12:57:23 +02:00
2020-09-07 10:18:17 +02:00
$error = 0 ;
2016-07-19 12:57:23 +02:00
2020-09-07 10:18:17 +02:00
$this -> db -> begin ();
2019-10-03 17:23:16 +02:00
2020-09-07 10:18:17 +02:00
// Mise a jour ligne en base
$sql = " UPDATE " . MAIN_DB_PREFIX . $this -> table_element . " SET " ;
$sql .= " description=' " . $this -> db -> escape ( $this -> desc ) . " ' " ;
$sql .= " , ref=' " . $this -> db -> escape ( $this -> ref_supplier ) . " ' " ;
$sql .= " , subprice=' " . price2num ( $this -> subprice ) . " ' " ;
//$sql.= ",remise='".price2num($remise)."'";
$sql .= " , remise_percent=' " . price2num ( $this -> remise_percent ) . " ' " ;
2019-11-13 19:35:39 +01:00
$sql .= " , vat_src_code = ' " . ( empty ( $this -> vat_src_code ) ? '' : $this -> vat_src_code ) . " ' " ;
2020-09-07 10:18:17 +02:00
$sql .= " , tva_tx=' " . price2num ( $this -> tva_tx ) . " ' " ;
2023-01-06 12:08:40 +01:00
$sql .= " , localtax1_tx=' " . price2num ( $this -> localtax1_tx ) . " ' " ;
$sql .= " , localtax2_tx=' " . price2num ( $this -> localtax2_tx ) . " ' " ;
2020-09-07 10:18:17 +02:00
$sql .= " , localtax1_type=' " . $this -> db -> escape ( $this -> localtax1_type ) . " ' " ;
$sql .= " , localtax2_type=' " . $this -> db -> escape ( $this -> localtax2_type ) . " ' " ;
$sql .= " , qty=' " . price2num ( $this -> qty ) . " ' " ;
$sql .= " , date_start= " . ( ! empty ( $this -> date_start ) ? " ' " . $this -> db -> idate ( $this -> date_start ) . " ' " : " null " );
$sql .= " , date_end= " . ( ! empty ( $this -> date_end ) ? " ' " . $this -> db -> idate ( $this -> date_end ) . " ' " : " null " );
$sql .= " , info_bits=' " . $this -> db -> escape ( $this -> info_bits ) . " ' " ;
$sql .= " , total_ht=' " . price2num ( $this -> total_ht ) . " ' " ;
$sql .= " , total_tva=' " . price2num ( $this -> total_tva ) . " ' " ;
$sql .= " , total_localtax1=' " . price2num ( $this -> total_localtax1 ) . " ' " ;
$sql .= " , total_localtax2=' " . price2num ( $this -> total_localtax2 ) . " ' " ;
$sql .= " , total_ttc=' " . price2num ( $this -> total_ttc ) . " ' " ;
$sql .= " , product_type= " . $this -> product_type ;
$sql .= " , special_code= " . ( ! empty ( $this -> special_code ) ? $this -> special_code : 0 );
$sql .= ( $this -> fk_unit ? " , fk_unit=' " . $this -> db -> escape ( $this -> fk_unit ) . " ' " : " , fk_unit=null " );
// Multicurrency
$sql .= " , multicurrency_subprice= " . price2num ( $this -> multicurrency_subprice ) . " " ;
$sql .= " , multicurrency_total_ht= " . price2num ( $this -> multicurrency_total_ht ) . " " ;
$sql .= " , multicurrency_total_tva= " . price2num ( $this -> multicurrency_total_tva ) . " " ;
$sql .= " , multicurrency_total_ttc= " . price2num ( $this -> multicurrency_total_ttc ) . " " ;
2021-08-23 19:33:24 +02:00
$sql .= " WHERE rowid = " . (( int ) $this -> id );
2020-09-07 10:18:17 +02:00
dol_syslog ( get_class ( $this ) . " ::updateline " , LOG_DEBUG );
$result = $this -> db -> query ( $sql );
2021-02-25 23:21:30 +01:00
if ( $result > 0 ) {
if ( ! $error ) {
2020-09-07 10:18:17 +02:00
$result = $this -> insertExtraFields ();
2021-02-25 23:21:30 +01:00
if ( $result < 0 ) {
2020-09-07 10:18:17 +02:00
$error ++ ;
}
}
2016-07-19 12:57:23 +02:00
2021-02-25 23:21:30 +01:00
if ( ! $error && ! $notrigger ) {
2020-09-07 10:18:17 +02:00
global $user ;
// Call trigger
2022-04-02 10:31:58 +02:00
$result = $this -> call_trigger ( 'LINEORDER_SUPPLIER_MODIFY' , $user );
2021-02-25 23:21:30 +01:00
if ( $result < 0 ) {
2020-09-07 10:18:17 +02:00
$this -> db -> rollback ();
return - 1 ;
}
// End call triggers
}
2016-07-19 12:57:23 +02:00
2021-02-25 23:21:30 +01:00
if ( ! $error ) {
2020-09-07 10:18:17 +02:00
$this -> db -> commit ();
return 1 ;
} else {
$this -> db -> rollback ();
return - 1 ;
}
} else {
$this -> error = $this -> db -> lasterror ();
$this -> db -> rollback ();
return - 1 ;
}
}
2016-09-17 02:35:02 +02:00
2020-09-07 10:18:17 +02:00
/**
* Delete line in database
*
* @ param int $notrigger 1 = Disable call to triggers
* @ return int < 0 if KO , > 0 if OK
*/
public function delete ( $notrigger = 0 )
{
global $user ;
2016-09-17 02:35:02 +02:00
2020-09-07 10:18:17 +02:00
$error = 0 ;
2016-09-17 02:35:02 +02:00
2020-09-07 10:18:17 +02:00
$this -> db -> begin ();
2016-09-17 02:35:02 +02:00
2020-04-23 18:29:36 +02:00
// extrafields
2020-09-07 10:18:17 +02:00
$result = $this -> deleteExtraFields ();
2021-02-25 23:21:30 +01:00
if ( $result < 0 ) {
2020-09-07 10:18:17 +02:00
$this -> db -> rollback ();
return - 1 ;
}
2020-04-23 18:27:06 +02:00
2021-03-14 12:20:23 +01:00
$sql = 'DELETE FROM ' . MAIN_DB_PREFIX . " commande_fournisseurdet WHERE rowid= " . (( int ) $this -> id );
2016-09-17 02:35:02 +02:00
2020-09-07 10:18:17 +02:00
dol_syslog ( __METHOD__ , LOG_DEBUG );
$resql = $this -> db -> query ( $sql );
2021-02-25 23:21:30 +01:00
if ( $resql ) {
if ( ! $notrigger ) {
2020-09-07 10:18:17 +02:00
// Call trigger
$result = $this -> call_trigger ( 'LINEORDER_SUPPLIER_DELETE' , $user );
2021-02-25 23:21:30 +01:00
if ( $result < 0 ) {
$error ++ ;
}
2020-09-07 10:18:17 +02:00
// End call triggers
}
2016-09-17 02:35:02 +02:00
2021-02-25 23:21:30 +01:00
if ( ! $error ) {
2020-09-07 10:18:17 +02:00
$this -> db -> commit ();
return 1 ;
}
2016-09-17 02:35:02 +02:00
2021-02-25 23:21:30 +01:00
foreach ( $this -> errors as $errmsg ) {
2020-09-07 10:18:17 +02:00
dol_syslog ( get_class ( $this ) . " ::delete " . $errmsg , LOG_ERR );
$this -> error .= ( $this -> error ? ', ' . $errmsg : $errmsg );
}
$this -> db -> rollback ();
return - 1 * $error ;
} else {
$this -> error = $this -> db -> lasterror ();
return - 1 ;
}
}
2006-02-17 18:59:43 +01:00
}