2004-10-20 23:06:45 +02:00
< ? php
2022-01-26 08:50:57 +01:00
/* Copyright ( C ) 2002 - 2004 Rodolphe Quiedeville < rodolphe @ quiedeville . org >
* Copyright ( C ) 2004 Eric Seigne < eric . seigne @ ryxeo . com >
* Copyright ( C ) 2004 - 2011 Laurent Destailleur < eldy @ users . sourceforge . net >
* Copyright ( C ) 2005 Marc Barilley < marc @ ocebo . com >
* Copyright ( C ) 2005 - 2013 Regis Houssin < regis . houssin @ inodbox . com >
* Copyright ( C ) 2006 Andre Cianfarani < acianfa @ free . fr >
* Copyright ( C ) 2008 Raphael Bertrand < raphael . bertrand @ resultic . fr >
* Copyright ( C ) 2010 - 2020 Juanjo Menent < jmenent @ 2 byte . es >
* Copyright ( C ) 2010 - 2017 Philippe Grand < philippe . grand @ atoo - net . com >
* Copyright ( C ) 2012 - 2014 Christophe Battarel < christophe . battarel @ altairis . fr >
* Copyright ( C ) 2012 Cedric Salvador < csalvador @ gpcsolutions . fr >
* Copyright ( C ) 2013 Florian Henry < florian . henry @ open - concept . pro >
* Copyright ( C ) 2014 - 2015 Marcos García < marcosgdf @ gmail . com >
* Copyright ( C ) 2018 Nicolas ZABOURI < info @ inovea - conseil . com >
* Copyright ( C ) 2018 - 2021 Frédéric France < frederic . france @ netlogic . fr >
* Copyright ( C ) 2018 Ferran Marcet < fmarcet @ 2 byte . es >
* Copyright ( C ) 2022 ATM Consulting < contact @ atm - consulting . fr >
* Copyright ( C ) 2022 OpenDSI < support @ open - dsi . fr >
2022-01-28 15:08:02 +01:00
* Copyright ( C ) 2022 Gauthier VERDOL < gauthier . verdol @ atm - consulting . fr >
2012-03-19 17:18:11 +01:00
*
2012-03-18 20:45:01 +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
2012-03-18 20:45:01 +01:00
* ( at your option ) any later version .
2012-03-19 17:18:11 +01:00
*
2012-03-18 20:45:01 +01:00
* 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 .
2012-03-19 17:18:11 +01:00
*
2012-03-18 20:45:01 +01:00
* 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 />.
2012-03-18 20:45:01 +01:00
*/
2003-09-11 18:00:49 +02:00
2005-02-26 19:33:10 +01:00
/**
2010-04-28 19:30:59 +02:00
* \file htdocs / comm / propal / class / propal . class . php
2013-08-27 11:54:07 +02:00
* \brief File of class to manage proposals
2012-03-18 20:45:01 +01:00
*/
2004-08-07 17:35:08 +02:00
2019-11-08 15:51:54 +01:00
require_once DOL_DOCUMENT_ROOT . '/core/class/commonobject.class.php' ;
require_once DOL_DOCUMENT_ROOT . " /core/class/commonobjectline.class.php " ;
require_once DOL_DOCUMENT_ROOT . '/product/class/product.class.php' ;
require_once DOL_DOCUMENT_ROOT . '/contact/class/contact.class.php' ;
require_once DOL_DOCUMENT_ROOT . '/margin/lib/margins.lib.php' ;
require_once DOL_DOCUMENT_ROOT . '/multicurrency/class/multicurrency.class.php' ;
2020-09-16 02:50:18 +02:00
require_once DOL_DOCUMENT_ROOT . '/core/class/commonincoterm.class.php' ;
2004-08-07 17:35:08 +02:00
2005-02-26 19:33:10 +01:00
/**
2013-08-27 11:54:07 +02:00
* Class to manage proposals
2008-08-28 01:00:37 +02:00
*/
2006-06-18 16:18:41 +02:00
class Propal extends CommonObject
2003-09-11 18:00:49 +02:00
{
2020-09-16 02:50:18 +02:00
use CommonIncoterm ;
2018-08-23 17:07:27 +02:00
/**
* @ var string ID to identify managed object
*/
2019-11-08 15:51:54 +01:00
public $element = 'propal' ;
2018-08-31 13:50:58 +02:00
2018-08-22 18:12:44 +02:00
/**
* @ var string Name of table without prefix where object is stored
*/
2019-11-08 15:51:54 +01:00
public $table_element = 'propal' ;
2018-08-31 13:50:58 +02:00
2018-09-02 11:08:41 +02:00
/**
* @ var int Name of subtable line
*/
2019-11-08 15:51:54 +01:00
public $table_element_line = 'propaldet' ;
2018-09-01 15:13:59 +02:00
/**
2020-12-05 23:53:55 +01:00
* @ var string Fieldname with ID of parent key if this field has a parent
2018-09-01 15:13:59 +02:00
*/
2019-11-08 15:51:54 +01:00
public $fk_element = 'fk_propal' ;
2018-09-01 15:13:59 +02:00
2018-09-04 14:46:10 +02:00
/**
* @ var string String with name of icon for myobject . Must be the part after the 'object_' into object_myobject . png
*/
2019-11-08 15:51:54 +01:00
public $picto = 'propal' ;
2018-08-31 13:50:58 +02:00
2017-12-18 15:39:40 +01:00
/**
* 0 = No test on entity , 1 = Test with field entity , 2 = Test with link by societe
* @ var int
*/
public $ismultientitymanaged = 1 ;
2018-08-31 13:50:58 +02:00
2017-12-18 15:39:40 +01: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 ;
2016-12-10 12:21:48 +01:00
2017-10-07 13:09:31 +02:00
/**
* { @ inheritdoc }
*/
protected $table_ref_field = 'ref' ;
2014-12-25 21:47:39 +01:00
2015-04-03 05:18:47 +02:00
/**
* ID of the client
* @ var int
*/
2017-10-07 13:09:31 +02:00
public $socid ;
2012-03-18 19:23:01 +01:00
2019-11-01 20:26:55 +01:00
/**
* ID of the contact
* @ var int
*/
2017-10-07 13:09:31 +02:00
public $contactid ;
public $author ;
2019-11-01 20:26:55 +01:00
/**
* Ref from thirdparty
* @ var string
*/
2017-10-07 13:09:31 +02:00
public $ref_client ;
2015-04-03 05:18:47 +02:00
/**
* Status of the quote
* @ var int
2015-04-23 23:21:06 +02:00
* @ see Propal :: STATUS_DRAFT , Propal :: STATUS_VALIDATED , Propal :: STATUS_SIGNED , Propal :: STATUS_NOTSIGNED , Propal :: STATUS_BILLED
2015-04-03 05:18:47 +02:00
*/
2017-10-07 13:09:31 +02:00
public $statut ;
2015-04-03 05:18:47 +02:00
2021-04-13 19:38:55 +02:00
/**
* Status of the quote
* @ var int
* @ see Propal :: STATUS_DRAFT , Propal :: STATUS_VALIDATED , Propal :: STATUS_SIGNED , Propal :: STATUS_NOTSIGNED , Propal :: STATUS_BILLED
*/
public $status ;
2015-04-03 05:18:47 +02:00
/**
2015-04-23 23:21:06 +02:00
* @ deprecated
2019-03-11 21:03:23 +01:00
* @ see $date_creation
2015-04-03 05:18:47 +02:00
*/
2017-10-07 13:09:31 +02:00
public $datec ;
2015-04-23 23:21:06 +02:00
2020-10-28 17:49:52 +01:00
/**
* @ var integer | string $date_creation ;
*/
2015-04-23 23:21:06 +02:00
public $date_creation ;
/**
* @ deprecated
2019-03-11 21:03:23 +01:00
* @ see $date_validation
2015-04-03 05:18:47 +02:00
*/
2017-10-07 13:09:31 +02:00
public $datev ;
2015-04-23 23:21:06 +02:00
/**
2020-10-28 17:49:52 +01:00
* @ var integer | string $date_validation ;
*/
2015-04-23 23:21:06 +02:00
public $date_validation ;
2021-03-26 17:44:41 +01:00
/**
* @ var integer | string $date_signature ;
*/
public $date_signature ;
/**
* @ var User $user_signature
*/
public $user_signature ;
2015-04-03 05:18:47 +02:00
/**
2020-10-28 17:49:52 +01:00
* @ var integer | string date of the quote ;
*/
2017-10-07 13:09:31 +02:00
public $date ;
2015-04-03 05:18:47 +02:00
/**
2015-04-23 23:21:06 +02:00
* @ deprecated
2019-03-11 21:03:23 +01:00
* @ see $date
2015-04-03 05:18:47 +02:00
*/
2017-10-07 13:09:31 +02:00
public $datep ;
2019-11-10 11:00:07 +01:00
2019-11-10 10:59:44 +01:00
/**
2020-11-11 18:08:40 +01:00
* @ var int Date expected for delivery
* @ deprecated
2019-11-10 10:59:44 +01:00
*/
2020-12-01 02:41:19 +01:00
public $date_livraison ; // deprecated; Use delivery_date instead.
2020-11-11 18:08:40 +01:00
/**
* @ var integer | string $delivery_date ;
2019-11-10 10:59:44 +01:00
*/
2020-11-11 18:08:40 +01:00
public $delivery_date ; // Date expected of shipment (date starting shipment, not the reception that occurs some days after)
2019-11-10 11:00:07 +01:00
2017-10-07 13:09:31 +02:00
public $fin_validite ;
2012-03-18 19:23:01 +01:00
2017-10-07 13:09:31 +02:00
public $user_author_id ;
public $user_valid_id ;
public $user_close_id ;
2012-03-18 19:23:01 +01:00
2015-04-03 05:18:47 +02:00
/**
* @ deprecated
2019-03-11 21:03:23 +01:00
* @ see $total_ht
2015-04-03 05:18:47 +02:00
*/
2017-10-07 13:09:31 +02:00
public $price ;
2015-04-03 05:18:47 +02:00
/**
* @ deprecated
2019-03-11 21:03:23 +01:00
* @ see $total_tva
2015-04-03 05:18:47 +02:00
*/
2017-10-07 13:09:31 +02:00
public $tva ;
2015-04-03 05:18:47 +02:00
/**
* @ deprecated
2019-03-11 21:03:23 +01:00
* @ see $total_ttc
2015-04-03 05:18:47 +02:00
*/
2017-10-07 13:09:31 +02:00
public $total ;
public $cond_reglement_code ;
2021-09-29 12:05:38 +02:00
public $deposit_percent ;
2017-10-07 13:09:31 +02:00
public $mode_reglement_code ;
2021-12-19 20:55:24 +01:00
public $remise_percent ;
/**
* @ deprecated
*/
public $remise ;
/**
* @ deprecated
*/
public $remise_absolue ;
2018-10-09 09:40:00 +02:00
/**
2020-10-28 17:49:52 +01:00
* @ var int ID
* @ deprecated
*/
2017-10-07 13:09:31 +02:00
public $fk_address ;
2018-10-09 09:40:00 +02:00
2017-10-07 13:09:31 +02:00
public $address_type ;
public $address ;
2020-10-17 16:01:43 +02:00
2017-10-07 13:09:31 +02:00
public $availability_id ;
public $availability_code ;
2020-10-17 16:01:43 +02:00
public $duree_validite ;
2017-10-07 13:09:31 +02:00
public $demand_reason_id ;
public $demand_reason_code ;
2021-01-12 10:34:15 +01:00
public $warehouse_id ;
2019-11-08 15:51:54 +01:00
public $extraparams = array ();
2012-03-18 19:23:01 +01:00
2015-03-23 01:39:12 +01:00
/**
* @ var PropaleLigne []
*/
2017-10-07 13:09:31 +02:00
public $lines = array ();
public $line ;
2012-03-18 19:23:01 +01:00
2019-11-08 15:51:54 +01:00
public $labelStatus = array ();
public $labelStatusShort = array ();
2012-03-18 19:23:01 +01:00
2016-01-18 19:45:27 +01:00
// Multicurrency
2018-10-09 09:40:00 +02:00
/**
2020-10-28 17:49:52 +01:00
* @ var int ID
*/
2016-07-08 21:28:21 +02:00
public $fk_multicurrency ;
2018-10-09 09:40:00 +02:00
2016-07-08 21:28:21 +02:00
public $multicurrency_code ;
public $multicurrency_tx ;
public $multicurrency_total_ht ;
public $multicurrency_total_tva ;
public $multicurrency_total_ttc ;
2020-03-04 00:47:03 +01:00
/**
* 'type' if the field format ( 'integer' , 'integer:ObjectClass:PathToClass[:AddCreateButtonOrNot[:Filter]]' , 'varchar(x)' , 'double(24,8)' , 'real' , 'price' , 'text' , '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 .
* 'enabled' is a condition when the field must be managed .
* '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 if you want to have a total on list for this field . Field type must be summable like integer or double ( 24 , 8 ) .
* 'css' is the CSS style to use on field . For example : 'maxwidth200'
* 'help' is a string visible as a tooltip on field
* '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 .
2021-04-29 12:10:55 +02:00
* 'arrayofkeyval' to set list of value if type is a list of predefined values . For example : array ( " 0 " => " Draft " , " 1 " => " Active " , " -1 " => " Cancel " )
2020-03-04 00:47:03 +01:00
* 'comment' is not used . You can store here any text of your choice . It is not used by application .
*
* Note : To have value dynamic , you can set value to 0 in definition and edit the value on the fly into the constructor .
*/
// BEGIN MODULEBUILDER PROPERTIES
/**
* @ var array Array with all fields and their property . Do not use it as a static var . It may be modified by constructor .
*/
2020-03-12 12:45:44 +01:00
public $fields = array (
2020-03-04 00:47:03 +01:00
'rowid' => array ( 'type' => 'integer' , 'label' => 'TechnicalID' , 'enabled' => 1 , 'visible' =>- 1 , 'notnull' => 1 , 'position' => 10 ),
2020-03-08 19:25:00 +01:00
'entity' => array ( 'type' => 'integer' , 'label' => 'Entity' , 'default' => 1 , 'enabled' => 1 , 'visible' =>- 2 , 'notnull' => 1 , 'position' => 15 , 'index' => 1 ),
'ref' => array ( 'type' => 'varchar(30)' , 'label' => 'Ref' , 'enabled' => 1 , 'visible' =>- 1 , 'notnull' => 1 , 'showoncombobox' => 1 , 'position' => 20 ),
'ref_client' => array ( 'type' => 'varchar(255)' , 'label' => 'RefCustomer' , 'enabled' => 1 , 'visible' =>- 1 , 'position' => 22 ),
'ref_ext' => array ( 'type' => 'varchar(255)' , 'label' => 'RefExt' , 'enabled' => 1 , 'visible' => 0 , 'position' => 40 ),
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 , 'position' => 23 ),
2022-06-14 17:53:17 +02:00
'fk_projet' => array ( 'type' => 'integer:Project:projet/class/project.class.php:1:fk_statut=1' , 'label' => 'Fk projet' , 'enabled' => '$conf->project->enabled' , 'visible' =>- 1 , 'position' => 24 ),
2020-03-04 00:47:03 +01:00
'tms' => array ( 'type' => 'timestamp' , 'label' => 'DateModification' , 'enabled' => 1 , 'visible' =>- 1 , 'notnull' => 1 , 'position' => 25 ),
'datec' => array ( 'type' => 'datetime' , 'label' => 'DateCreation' , 'enabled' => 1 , 'visible' =>- 1 , 'position' => 55 ),
2020-03-08 19:25:00 +01:00
'datep' => array ( 'type' => 'date' , 'label' => 'Date' , 'enabled' => 1 , 'visible' =>- 1 , 'position' => 60 ),
'fin_validite' => array ( 'type' => 'datetime' , 'label' => 'DateEnd' , 'enabled' => 1 , 'visible' =>- 1 , 'position' => 65 ),
2020-03-04 00:47:03 +01:00
'date_valid' => array ( 'type' => 'datetime' , 'label' => 'DateValidation' , 'enabled' => 1 , 'visible' =>- 1 , 'position' => 70 ),
2020-03-08 19:25:00 +01:00
'date_cloture' => array ( 'type' => 'datetime' , 'label' => 'DateClosing' , 'enabled' => 1 , 'visible' =>- 1 , 'position' => 75 ),
2020-03-04 00:47:03 +01:00
'fk_user_author' => array ( 'type' => 'integer:User:user/class/user.class.php' , 'label' => 'Fk user author' , 'enabled' => 1 , 'visible' =>- 1 , 'position' => 80 ),
'fk_user_modif' => array ( 'type' => 'integer:User:user/class/user.class.php' , 'label' => 'UserModif' , 'enabled' => 1 , 'visible' =>- 2 , 'notnull' =>- 1 , 'position' => 85 ),
'fk_user_valid' => array ( 'type' => 'integer:User:user/class/user.class.php' , 'label' => 'UserValidation' , 'enabled' => 1 , 'visible' =>- 1 , 'position' => 90 ),
'fk_user_cloture' => array ( 'type' => 'integer:User:user/class/user.class.php' , 'label' => 'Fk user cloture' , 'enabled' => 1 , 'visible' =>- 1 , 'position' => 95 ),
'price' => array ( 'type' => 'double' , 'label' => 'Price' , 'enabled' => 1 , 'visible' =>- 1 , 'position' => 105 ),
2020-03-08 19:25:00 +01:00
'remise_percent' => array ( 'type' => 'double' , 'label' => 'RelativeDiscount' , 'enabled' => 1 , 'visible' =>- 1 , 'position' => 110 ),
2021-12-19 20:55:24 +01:00
//'remise_absolue' =>array('type'=>'double', 'label'=>'CustomerRelativeDiscount', 'enabled'=>1, 'visible'=>-1, 'position'=>115),
2020-03-08 20:10:31 +01:00
//'remise' =>array('type'=>'double', 'label'=>'Remise', 'enabled'=>1, 'visible'=>-1, 'position'=>120),
'total_ht' => array ( 'type' => 'double(24,8)' , 'label' => 'TotalHT' , 'enabled' => 1 , 'visible' =>- 1 , 'position' => 125 , 'isameasure' => 1 ),
2021-02-18 22:42:55 +01:00
'total_tva' => array ( 'type' => 'double(24,8)' , 'label' => 'VAT' , 'enabled' => 1 , 'visible' =>- 1 , 'position' => 130 , 'isameasure' => 1 ),
2020-03-08 20:10:31 +01:00
'localtax1' => array ( 'type' => 'double(24,8)' , 'label' => 'LocalTax1' , 'enabled' => 1 , 'visible' =>- 1 , 'position' => 135 , 'isameasure' => 1 ),
'localtax2' => array ( 'type' => 'double(24,8)' , 'label' => 'LocalTax2' , 'enabled' => 1 , 'visible' =>- 1 , 'position' => 140 , 'isameasure' => 1 ),
2021-02-21 22:07:58 +01:00
'total_ttc' => array ( 'type' => 'double(24,8)' , 'label' => 'TotalTTC' , 'enabled' => 1 , 'visible' =>- 1 , 'position' => 145 , 'isameasure' => 1 ),
2022-05-21 00:08:18 +02:00
'fk_account' => array ( 'type' => 'integer' , 'label' => 'BankAccount' , 'enabled' => '$conf->banque->enabled' , 'visible' =>- 1 , 'position' => 150 ),
2020-03-08 19:25:00 +01:00
'fk_currency' => array ( 'type' => 'varchar(3)' , 'label' => 'Currency' , 'enabled' => 1 , 'visible' =>- 1 , 'position' => 155 ),
'fk_cond_reglement' => array ( 'type' => 'integer' , 'label' => 'PaymentTerm' , 'enabled' => 1 , 'visible' =>- 1 , 'position' => 160 ),
2021-10-28 16:53:28 +02:00
'deposit_percent' => array ( 'type' => 'varchar(63)' , 'label' => 'DepositPercent' , 'enabled' => 1 , 'visible' =>- 1 , 'position' => 161 ),
2020-03-08 19:25:00 +01:00
'fk_mode_reglement' => array ( 'type' => 'integer' , 'label' => 'PaymentMode' , 'enabled' => 1 , 'visible' =>- 1 , 'position' => 165 ),
2022-09-06 05:30:35 +02:00
'note_private' => array ( 'type' => 'text' , 'label' => 'NotePrivate' , 'enabled' => 1 , 'visible' => 0 , 'position' => 170 ),
'note_public' => array ( 'type' => 'text' , 'label' => 'NotePublic' , 'enabled' => 1 , 'visible' => 0 , 'position' => 175 ),
2020-03-08 19:25:00 +01:00
'model_pdf' => array ( 'type' => 'varchar(255)' , 'label' => 'PDFTemplate' , 'enabled' => 1 , 'visible' => 0 , 'position' => 180 ),
2020-03-08 20:10:31 +01:00
'date_livraison' => array ( 'type' => 'date' , 'label' => 'DateDeliveryPlanned' , 'enabled' => 1 , 'visible' =>- 1 , 'position' => 185 ),
2020-03-08 19:25:00 +01:00
'fk_shipping_method' => array ( 'type' => 'integer' , 'label' => 'ShippingMethod' , 'enabled' => 1 , 'visible' =>- 1 , 'position' => 190 ),
2022-05-21 00:08:18 +02:00
'fk_warehouse' => array ( 'type' => 'integer:Entrepot:product/stock/class/entrepot.class.php' , 'label' => 'Fk warehouse' , 'enabled' => '$conf->stock->enabled' , 'visible' =>- 1 , 'position' => 191 ),
2020-03-08 19:25:00 +01:00
'fk_availability' => array ( 'type' => 'integer' , 'label' => 'Availability' , 'enabled' => 1 , 'visible' =>- 1 , 'position' => 195 ),
2020-03-12 12:45:44 +01:00
'fk_delivery_address' => array ( 'type' => 'integer' , 'label' => 'DeliveryAddress' , 'enabled' => 1 , 'visible' => 0 , 'position' => 200 ), // deprecated
2020-03-08 19:25:00 +01:00
'fk_input_reason' => array ( 'type' => 'integer' , 'label' => 'InputReason' , 'enabled' => 1 , 'visible' =>- 1 , 'position' => 205 ),
2020-03-04 00:47:03 +01:00
'extraparams' => array ( 'type' => 'varchar(255)' , 'label' => 'Extraparams' , 'enabled' => 1 , 'visible' =>- 1 , 'position' => 215 ),
2020-03-08 20:10:31 +01:00
'fk_incoterms' => array ( 'type' => 'integer' , 'label' => 'IncotermCode' , 'enabled' => '$conf->incoterm->enabled' , 'visible' =>- 1 , 'position' => 220 ),
'location_incoterms' => array ( 'type' => 'varchar(255)' , 'label' => 'IncotermLabel' , 'enabled' => '$conf->incoterm->enabled' , 'visible' =>- 1 , 'position' => 225 ),
2020-03-08 19:25:00 +01:00
'fk_multicurrency' => array ( 'type' => 'integer' , 'label' => 'MulticurrencyID' , 'enabled' => 1 , 'visible' =>- 1 , 'position' => 230 ),
2020-03-08 20:10:31 +01:00
'multicurrency_code' => array ( 'type' => 'varchar(255)' , 'label' => 'MulticurrencyCurrency' , 'enabled' => '$conf->multicurrency->enabled' , 'visible' =>- 1 , 'position' => 235 ),
'multicurrency_tx' => array ( 'type' => 'double(24,8)' , 'label' => 'MulticurrencyRate' , 'enabled' => '$conf->multicurrency->enabled' , 'visible' =>- 1 , 'position' => 240 , 'isameasure' => 1 ),
'multicurrency_total_ht' => array ( 'type' => 'double(24,8)' , 'label' => 'MulticurrencyAmountHT' , 'enabled' => '$conf->multicurrency->enabled' , 'visible' =>- 1 , 'position' => 245 , 'isameasure' => 1 ),
'multicurrency_total_tva' => array ( 'type' => 'double(24,8)' , 'label' => 'MulticurrencyAmountVAT' , 'enabled' => '$conf->multicurrency->enabled' , 'visible' =>- 1 , 'position' => 250 , 'isameasure' => 1 ),
'multicurrency_total_ttc' => array ( 'type' => 'double(24,8)' , 'label' => 'MulticurrencyAmountTTC' , 'enabled' => '$conf->multicurrency->enabled' , 'visible' =>- 1 , 'position' => 255 , 'isameasure' => 1 ),
2020-03-08 19:25:00 +01:00
'last_main_doc' => array ( 'type' => 'varchar(255)' , 'label' => 'LastMainDoc' , 'enabled' => 1 , 'visible' =>- 1 , 'position' => 260 ),
'fk_statut' => array ( 'type' => 'smallint(6)' , 'label' => 'Status' , 'enabled' => 1 , 'visible' =>- 1 , 'notnull' => 1 , 'position' => 500 ),
'import_key' => array ( 'type' => 'varchar(14)' , 'label' => 'ImportId' , 'enabled' => 1 , 'visible' =>- 2 , 'position' => 900 ),
2020-03-04 00:47:03 +01:00
);
// END MODULEBUILDER PROPERTIES
2015-04-03 05:18:47 +02:00
/**
* Draft status
*/
const STATUS_DRAFT = 0 ;
/**
* Validated status
*/
const STATUS_VALIDATED = 1 ;
/**
* Signed quote
*/
const STATUS_SIGNED = 2 ;
/**
* Not signed quote
*/
const STATUS_NOTSIGNED = 3 ;
/**
2016-03-04 16:14:23 +01:00
* Billed or processed quote
2015-04-03 05:18:47 +02:00
*/
2019-11-08 15:51:54 +01:00
const STATUS_BILLED = 4 ; // Todo rename into STATUS_CLOSE ?
2012-03-18 19:23:01 +01:00
2018-04-21 15:46:55 +02:00
2017-10-07 13:09:31 +02:00
/**
* Constructor
*
* @ param DoliDB $db Database handler
* @ param int $socid Id third party
* @ param int $propalid Id proposal
*/
2020-10-28 17:49:52 +01:00
public function __construct ( $db , $socid = 0 , $propalid = 0 )
2017-10-07 13:09:31 +02:00
{
2019-11-08 15:51:54 +01:00
global $conf , $langs ;
2017-10-07 13:09:31 +02:00
$this -> db = $db ;
2018-04-21 15:46:55 +02:00
2017-10-07 13:09:31 +02:00
$this -> socid = $socid ;
$this -> id = $propalid ;
2018-04-21 15:46:55 +02:00
2022-09-07 16:27:31 +02:00
$this -> duree_validite = getDolGlobalInt ( 'PROPALE_VALIDITY_DURATION' , 0 );
2017-10-07 13:09:31 +02:00
}
2020-10-28 17:49:52 +01:00
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
2017-10-07 13:09:31 +02:00
/**
2020-11-28 14:47:39 +01:00
* Add line into array -> lines
2018-09-01 23:46:13 +02:00
* $this -> thirdparty should be loaded
2017-10-07 13:09:31 +02:00
*
* @ param int $idproduct Product Id to add
* @ param int $qty Quantity
* @ param int $remise_percent Discount effected on Product
* @ return int < 0 if KO , > 0 if OK
*
* TODO Replace calls to this function by generation objet Ligne
*/
2020-10-28 17:49:52 +01:00
public function add_product ( $idproduct , $qty , $remise_percent = 0 )
2017-10-07 13:09:31 +02:00
{
2020-10-28 17:49:52 +01:00
// phpcs:enable
2017-10-07 13:09:31 +02:00
global $conf , $mysoc ;
2021-02-23 18:59:19 +01:00
if ( ! $qty ) {
$qty = 1 ;
}
2017-10-07 13:09:31 +02:00
dol_syslog ( get_class ( $this ) . " ::add_product $idproduct , $qty , $remise_percent " );
2021-02-23 18:59:19 +01:00
if ( $idproduct > 0 ) {
2019-11-08 15:51:54 +01:00
$prod = new Product ( $this -> db );
2017-10-07 13:09:31 +02:00
$prod -> fetch ( $idproduct );
$productdesc = $prod -> description ;
2019-01-27 11:55:16 +01:00
$tva_tx = get_default_tva ( $mysoc , $this -> thirdparty , $prod -> id );
$tva_npr = get_default_npr ( $mysoc , $this -> thirdparty , $prod -> id );
2021-02-23 18:59:19 +01:00
if ( empty ( $tva_tx )) {
$tva_npr = 0 ;
}
2019-11-08 15:51:54 +01:00
$vat_src_code = '' ; // May be defined into tva_tx
2017-10-07 13:09:31 +02:00
2019-01-27 11:55:16 +01:00
$localtax1_tx = get_localtax ( $tva_tx , 1 , $mysoc , $this -> thirdparty , $tva_npr );
$localtax2_tx = get_localtax ( $tva_tx , 2 , $mysoc , $this -> thirdparty , $tva_npr );
2017-10-07 13:09:31 +02:00
// multiprices
2021-02-23 18:59:19 +01:00
if ( $conf -> global -> PRODUIT_MULTIPRICES && $this -> thirdparty -> price_level ) {
2017-10-07 13:09:31 +02:00
$price = $prod -> multiprices [ $this -> thirdparty -> price_level ];
2020-05-21 15:05:19 +02:00
} else {
2017-10-07 13:09:31 +02:00
$price = $prod -> price ;
}
$line = new PropaleLigne ( $this -> db );
2019-11-08 15:51:54 +01:00
$line -> fk_product = $idproduct ;
$line -> desc = $productdesc ;
$line -> qty = $qty ;
$line -> subprice = $price ;
$line -> remise_percent = $remise_percent ;
$line -> vat_src_code = $vat_src_code ;
$line -> tva_tx = $tva_tx ;
$line -> fk_unit = $prod -> fk_unit ;
2021-02-23 18:59:19 +01:00
if ( $tva_npr ) {
$line -> info_bits = 1 ;
}
2016-07-08 20:40:25 +02:00
2019-11-08 15:51:54 +01:00
$this -> lines [] = $line ;
2017-10-07 13:09:31 +02:00
}
}
2020-10-28 17:49:52 +01:00
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
2017-10-07 13:09:31 +02:00
/**
* Adding line of fixed discount in the proposal in DB
*
* @ param int $idremise Id of fixed discount
* @ return int > 0 if OK , < 0 if KO
*/
2020-10-28 17:49:52 +01:00
public function insert_discount ( $idremise )
2017-10-07 13:09:31 +02:00
{
2020-10-28 17:49:52 +01:00
// phpcs:enable
2017-10-07 13:09:31 +02:00
global $langs ;
include_once DOL_DOCUMENT_ROOT . '/core/lib/price.lib.php' ;
include_once DOL_DOCUMENT_ROOT . '/core/class/discount.class.php' ;
$this -> db -> begin ();
2019-11-08 15:51:54 +01:00
$remise = new DiscountAbsolute ( $this -> db );
$result = $remise -> fetch ( $idremise );
2017-10-07 13:09:31 +02:00
2021-02-23 18:59:19 +01:00
if ( $result > 0 ) {
if ( $remise -> fk_facture ) { // Protection against multiple submission
2019-11-08 15:51:54 +01:00
$this -> error = $langs -> trans ( " ErrorDiscountAlreadyUsed " );
2017-10-07 13:09:31 +02:00
$this -> db -> rollback ();
return - 5 ;
}
2019-11-08 15:51:54 +01:00
$line = new PropaleLigne ( $this -> db );
2017-10-07 13:09:31 +02:00
$this -> line -> context = $this -> context ;
2019-11-08 15:51:54 +01:00
$line -> fk_propal = $this -> id ;
$line -> fk_remise_except = $remise -> id ;
$line -> desc = $remise -> description ; // Description ligne
$line -> vat_src_code = $remise -> vat_src_code ;
$line -> tva_tx = $remise -> tva_tx ;
$line -> subprice = - $remise -> amount_ht ;
$line -> fk_product = 0 ; // Id produit predefined
$line -> qty = 1 ;
$line -> remise_percent = 0 ;
$line -> rang = - 1 ;
$line -> info_bits = 2 ;
2017-10-07 13:09:31 +02:00
// TODO deprecated
2019-11-08 15:51:54 +01:00
$line -> price = - $remise -> amount_ht ;
2017-10-07 13:09:31 +02:00
$line -> total_ht = - $remise -> amount_ht ;
$line -> total_tva = - $remise -> amount_tva ;
$line -> total_ttc = - $remise -> amount_ttc ;
2019-11-08 15:51:54 +01:00
$result = $line -> insert ();
2021-02-23 18:59:19 +01:00
if ( $result > 0 ) {
2019-11-08 15:51:54 +01:00
$result = $this -> update_price ( 1 );
2021-02-23 18:59:19 +01:00
if ( $result > 0 ) {
2017-10-07 13:09:31 +02:00
$this -> db -> commit ();
return 1 ;
2020-05-21 15:05:19 +02:00
} else {
2017-10-07 13:09:31 +02:00
$this -> db -> rollback ();
return - 1 ;
}
2020-05-21 15:05:19 +02:00
} else {
2019-11-08 15:51:54 +01:00
$this -> error = $line -> error ;
2021-02-08 20:44:40 +01:00
$this -> errors = $line -> errors ;
2017-10-07 13:09:31 +02:00
$this -> db -> rollback ();
return - 2 ;
}
2020-05-21 15:05:19 +02:00
} else {
2017-10-07 13:09:31 +02:00
$this -> db -> rollback ();
return - 2 ;
}
}
2020-10-28 17:49:52 +01:00
/**
* Add a proposal line into database ( linked to product / service or not )
* The parameters are already supposed to be appropriate and with final values to the call
* of this method . Also , for the VAT rate , it must have already been defined
* by whose calling the method get_default_tva ( societe_vendeuse , societe_acheteuse , '' product )
* and desc must already have the right value ( it ' s up to the caller to manage multilanguage )
*
* @ param string $desc Description of line
* @ param float $pu_ht Unit price
* @ param float $qty Quantity
* @ param float $txtva Force Vat rate , - 1 for auto ( Can contain the vat_src_code too with syntax '9.9 (CODE)' )
* @ param float $txlocaltax1 Local tax 1 rate ( deprecated , use instead txtva with code inside )
* @ param float $txlocaltax2 Local tax 2 rate ( deprecated , use instead txtva with code inside )
* @ param int $fk_product Product / Service ID predefined
* @ param float $remise_percent Pourcentage de remise de la ligne
* @ param string $price_base_type HT or TTC
* @ param float $pu_ttc Prix unitaire TTC
* @ param int $info_bits Bits for type of lines
* @ param int $type Type of line ( 0 = product , 1 = service ) . Not used if fk_product is defined , the type of product is used .
* @ param int $rang Position of line
* @ param int $special_code Special code ( also used by externals modules ! )
* @ param int $fk_parent_line Id of parent line
* @ param int $fk_fournprice Id supplier price
* @ param int $pa_ht Buying price without tax
* @ param string $label ? ? ?
* @ param int $date_start Start date of the line
* @ param int $date_end End date of the line
* @ param array $array_options extrafields array
* @ param string $fk_unit Code of the unit to use . Null to use the default one
* @ param string $origin Depend on global conf MAIN_CREATEFROM_KEEP_LINE_ORIGIN_INFORMATION can be 'orderdet' , 'propaldet' ... , else 'order' , 'propal,' ....
* @ param int $origin_id Depend on global conf MAIN_CREATEFROM_KEEP_LINE_ORIGIN_INFORMATION can be Id of origin object ( aka line id ), else object id
* @ param double $pu_ht_devise Unit price in currency
* @ param int $fk_remise_except Id discount if line is from a discount
2022-03-01 14:52:47 +01:00
* @ param int $noupdateafterinsertline No update after insert of line
2020-10-28 17:49:52 +01:00
* @ return int > 0 if OK , < 0 if KO
* @ see add_product ()
*/
2022-03-01 14:52:47 +01:00
public function addline ( $desc , $pu_ht , $qty , $txtva , $txlocaltax1 = 0.0 , $txlocaltax2 = 0.0 , $fk_product = 0 , $remise_percent = 0.0 , $price_base_type = 'HT' , $pu_ttc = 0.0 , $info_bits = 0 , $type = 0 , $rang = - 1 , $special_code = 0 , $fk_parent_line = 0 , $fk_fournprice = 0 , $pa_ht = 0 , $label = '' , $date_start = '' , $date_end = '' , $array_options = 0 , $fk_unit = null , $origin = '' , $origin_id = 0 , $pu_ht_devise = 0 , $fk_remise_except = 0 , $noupdateafterinsertline = 0 )
2017-10-07 13:09:31 +02:00
{
global $mysoc , $conf , $langs ;
dol_syslog ( get_class ( $this ) . " ::addline propalid= $this->id , desc= $desc , pu_ht= $pu_ht , qty= $qty , txtva= $txtva , fk_product= $fk_product , remise_except= $remise_percent , price_base_type= $price_base_type , pu_ttc= $pu_ttc , info_bits= $info_bits , type= $type , fk_remise_except= " . $fk_remise_except );
2019-03-21 21:00:06 +01:00
2021-02-23 18:59:19 +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-23 18:59:19 +01:00
if ( empty ( $remise_percent )) {
$remise_percent = 0 ;
}
if ( empty ( $qty )) {
$qty = 0 ;
}
if ( empty ( $info_bits )) {
$info_bits = 0 ;
}
if ( empty ( $rang )) {
$rang = 0 ;
}
if ( empty ( $fk_parent_line ) || $fk_parent_line < 0 ) {
$fk_parent_line = 0 ;
}
2019-11-08 15:51:54 +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-08 15:51:54 +01:00
$txtva = price2num ( $txtva ); // $txtva can have format '5,1' or '5.1' or '5.1(XXX)', we must clean only if '5,1'
2018-12-03 12:28:17 +01:00
}
2019-11-08 15:51:54 +01:00
$txlocaltax1 = price2num ( $txlocaltax1 );
$txlocaltax2 = price2num ( $txlocaltax2 );
$pa_ht = price2num ( $pa_ht );
2021-02-23 18:59:19 +01:00
if ( $price_base_type == 'HT' ) {
2019-11-08 15:51:54 +01:00
$pu = $pu_ht ;
2020-05-21 15:05:19 +02:00
} else {
2019-11-08 15:51:54 +01:00
$pu = $pu_ttc ;
2018-12-03 12:28:17 +01:00
}
2017-10-07 13:09:31 +02:00
2018-12-03 12:28:17 +01:00
// Check parameters
2021-02-23 18:59:19 +01:00
if ( $type < 0 ) {
return - 1 ;
}
2019-04-25 12:11:32 +02:00
2019-03-24 14:30:00 +01:00
if ( $date_start && $date_end && $date_start > $date_end ) {
$langs -> load ( " errors " );
2019-11-08 15:51:54 +01:00
$this -> error = $langs -> trans ( 'ErrorStartDateGreaterEnd' );
2019-03-24 14:30:00 +01:00
return - 1 ;
}
2017-10-07 13:09:31 +02:00
$this -> db -> begin ();
2019-11-08 15:51:54 +01:00
$product_type = $type ;
2021-07-04 21:02:02 +02:00
if ( ! empty ( $fk_product ) && $fk_product > 0 ) {
2019-11-08 15:51:54 +01:00
$product = new Product ( $this -> db );
$result = $product -> fetch ( $fk_product );
$product_type = $product -> type ;
2015-10-03 18:33:46 +02:00
2019-11-08 15:51:54 +01:00
if ( ! empty ( $conf -> global -> STOCK_MUST_BE_ENOUGH_FOR_PROPOSAL ) && $product_type == 0 && $product -> stock_reel < $qty ) {
2017-10-07 13:09:31 +02:00
$langs -> load ( " errors " );
2019-11-08 15:51:54 +01:00
$this -> error = $langs -> trans ( 'ErrorStockIsNotEnoughToAddProductOnProposal' , $product -> ref );
2015-10-03 18:33:46 +02:00
$this -> db -> rollback ();
return - 3 ;
}
}
2016-07-08 20:40:25 +02:00
2015-10-03 18:33:46 +02:00
// Calcul du total TTC et de la TVA pour la ligne a partir de
2017-10-07 13:09:31 +02:00
// 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.
2019-11-08 15:51:54 +01:00
$localtaxes_type = getLocalTaxesFromRate ( $txtva , 0 , $this -> thirdparty , $mysoc );
2017-10-07 13:09:31 +02:00
// Clean vat code
2020-12-16 00:28:57 +01:00
$reg = array ();
2019-11-08 15:51:54 +01:00
$vat_src_code = '' ;
2021-01-02 16:51:34 +01:00
$reg = array ();
2021-02-23 18:59:19 +01:00
if ( preg_match ( '/\((.*)\)/' , $txtva , $reg )) {
2017-10-07 13:09:31 +02:00
$vat_src_code = $reg [ 1 ];
2019-11-08 15:51:54 +01:00
$txtva = preg_replace ( '/\s*\(.*\)/' , '' , $txtva ); // Remove code into vatrate.
2017-10-07 13:09:31 +02:00
}
2019-11-08 15:51:54 +01:00
$tabprice = calcul_price_total ( $qty , $pu , $remise_percent , $txtva , $txlocaltax1 , $txlocaltax2 , 0 , $price_base_type , $info_bits , $product_type , $mysoc , $localtaxes_type , 100 , $this -> multicurrency_tx , $pu_ht_devise );
2017-10-07 13:09:31 +02:00
$total_ht = $tabprice [ 0 ];
$total_tva = $tabprice [ 1 ];
$total_ttc = $tabprice [ 2 ];
$total_localtax1 = $tabprice [ 9 ];
$total_localtax2 = $tabprice [ 10 ];
2016-12-11 00:42:52 +01:00
$pu_ht = $tabprice [ 3 ];
$pu_tva = $tabprice [ 4 ];
$pu_ttc = $tabprice [ 5 ];
2012-03-18 19:23:01 +01:00
2016-01-18 19:45:27 +01:00
// MultiCurrency
$multicurrency_total_ht = $tabprice [ 16 ];
2017-10-07 13:09:31 +02:00
$multicurrency_total_tva = $tabprice [ 17 ];
$multicurrency_total_ttc = $tabprice [ 18 ];
2016-12-11 00:42:52 +01:00
$pu_ht_devise = $tabprice [ 19 ];
2016-01-18 19:45:27 +01:00
2017-10-07 13:09:31 +02:00
// Rang to use
2019-08-10 00:46:20 +02:00
$ranktouse = $rang ;
2021-02-23 18:59:19 +01:00
if ( $ranktouse == - 1 ) {
2017-10-07 13:09:31 +02:00
$rangmax = $this -> line_max ( $fk_parent_line );
2019-08-10 00:46:20 +02:00
$ranktouse = $rangmax + 1 ;
2017-10-07 13:09:31 +02:00
}
// TODO A virer
// Anciens indicateurs: $price, $remise (a ne plus utiliser)
$price = $pu ;
$remise = 0 ;
2021-02-23 18:59:19 +01:00
if ( $remise_percent > 0 ) {
2017-10-07 13:09:31 +02:00
$remise = round (( $pu * $remise_percent / 100 ), 2 );
$price = $pu - $remise ;
}
// Insert line
2019-11-08 15:51:54 +01:00
$this -> line = new PropaleLigne ( $this -> db );
2017-10-07 13:09:31 +02:00
$this -> line -> context = $this -> context ;
2019-11-08 15:51:54 +01:00
$this -> line -> fk_propal = $this -> id ;
$this -> line -> label = $label ;
$this -> line -> desc = $desc ;
$this -> line -> qty = $qty ;
2016-12-10 12:21:48 +01:00
2019-11-08 15:51:54 +01:00
$this -> line -> vat_src_code = $vat_src_code ;
$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-13 13:29:47 +01:00
$this -> line -> localtax1_type = empty ( $localtaxes_type [ 0 ]) ? '' : $localtaxes_type [ 0 ];
$this -> line -> localtax2_type = empty ( $localtaxes_type [ 2 ]) ? '' : $localtaxes_type [ 2 ];
2019-11-08 15:51:54 +01:00
$this -> line -> fk_product = $fk_product ;
$this -> line -> product_type = $type ;
$this -> line -> fk_remise_except = $fk_remise_except ;
$this -> line -> remise_percent = $remise_percent ;
$this -> line -> subprice = $pu_ht ;
$this -> line -> rang = $ranktouse ;
$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 -> special_code = $special_code ;
$this -> line -> fk_parent_line = $fk_parent_line ;
$this -> line -> fk_unit = $fk_unit ;
$this -> line -> date_start = $date_start ;
$this -> line -> date_end = $date_end ;
2012-03-18 19:23:01 +01:00
2015-10-26 20:33:42 +01:00
$this -> line -> fk_fournprice = $fk_fournprice ;
2012-08-01 17:36:15 +02:00
$this -> line -> pa_ht = $pa_ht ;
2012-07-20 09:57:50 +02:00
2017-10-07 13:09:31 +02:00
$this -> line -> origin_id = $origin_id ;
$this -> line -> origin = $origin ;
2015-11-06 01:53:20 +01:00
2016-01-18 19:45:27 +01:00
// Multicurrency
2019-11-08 15:51:54 +01:00
$this -> line -> fk_multicurrency = $this -> fk_multicurrency ;
$this -> line -> multicurrency_code = $this -> multicurrency_code ;
2016-12-11 00:42:52 +01:00
$this -> line -> multicurrency_subprice = $pu_ht_devise ;
2016-01-18 19:45:27 +01:00
$this -> line -> multicurrency_total_ht = $multicurrency_total_ht ;
2017-10-07 13:09:31 +02:00
$this -> line -> multicurrency_total_tva = $multicurrency_total_tva ;
$this -> line -> multicurrency_total_ttc = $multicurrency_total_ttc ;
2016-07-08 20:40:25 +02:00
2017-10-07 13:09:31 +02:00
// Mise en option de la ligne
2021-02-23 18:59:19 +01:00
if ( empty ( $qty ) && empty ( $special_code )) {
$this -> line -> special_code = 3 ;
}
2012-03-18 19:23:01 +01:00
2017-10-07 13:09:31 +02:00
// TODO deprecated
2019-11-08 15:51:54 +01:00
$this -> line -> price = $price ;
2012-03-18 19:23:01 +01:00
2019-11-08 15:51:54 +01:00
if ( is_array ( $array_options ) && count ( $array_options ) > 0 ) {
$this -> line -> array_options = $array_options ;
2017-10-07 13:09:31 +02:00
}
2013-06-10 16:05:41 +02:00
2019-11-08 15:51:54 +01:00
$result = $this -> line -> insert ();
2021-02-23 18:59:19 +01:00
if ( $result > 0 ) {
2017-10-07 13:09:31 +02:00
// Reorder if child line
2021-02-23 18:59:19 +01:00
if ( ! empty ( $fk_parent_line )) {
$this -> line_order ( true , 'DESC' );
2021-11-16 16:15:55 +01:00
} elseif ( $ranktouse > 0 && $ranktouse <= count ( $this -> lines )) { // Update all rank of all other lines
2021-11-23 10:44:43 +01:00
$linecount = count ( $this -> lines );
for ( $ii = $ranktouse ; $ii <= $linecount ; $ii ++ ) {
2021-11-16 14:09:18 +01:00
$this -> updateRangOfLine ( $this -> lines [ $ii - 1 ] -> id , $ii + 1 );
}
2021-02-23 18:59:19 +01:00
}
2012-03-18 19:23:01 +01:00
2020-10-28 17:49:52 +01:00
// Mise a jour informations denormalisees au niveau de la propale meme
2022-03-01 14:52:47 +01:00
if ( empty ( $noupdateafterinsertline )) {
$result = $this -> update_price ( 1 , 'auto' , 0 , $mysoc ); // This method is designed to add line from user input so total calculation must be done using 'auto' mode.
}
2021-02-09 14:08:49 +01:00
if ( $result > 0 ) {
2020-10-28 17:49:52 +01:00
$this -> db -> commit ();
return $this -> line -> id ;
} else {
$this -> error = $this -> db -> error ();
$this -> db -> rollback ();
return - 1 ;
}
} else {
$this -> error = $this -> line -> error ;
2021-02-08 20:44:40 +01:00
$this -> errors = $this -> line -> errors ;
2020-10-28 17:49:52 +01:00
$this -> db -> rollback ();
return - 2 ;
}
} else {
2019-03-21 21:00:06 +01:00
dol_syslog ( get_class ( $this ) . " ::addline status of proposal must be Draft to allow use of ->addline() " , LOG_ERR );
2017-10-19 12:30:36 +02:00
return - 3 ;
2017-10-07 13:09:31 +02:00
}
2020-10-28 17:49:52 +01:00
}
2017-10-07 13:09:31 +02:00
/**
* Update a proposal line
*
2020-07-06 22:48:22 +02:00
* @ param int $rowid Id of line
* @ param float $pu Unit price ( HT or TTC depending on price_base_type )
2017-10-07 13:09:31 +02:00
* @ param float $qty Quantity
2020-07-06 22:48:22 +02:00
* @ param float $remise_percent Discount on line
* @ param float $txtva VAT Rate ( Can be '1.23' or '1.23 (ABC)' )
2017-10-07 13:09:31 +02:00
* @ param float $txlocaltax1 Local tax 1 rate
* @ param float $txlocaltax2 Local tax 2 rate
* @ param string $desc Description
2020-07-06 22:48:22 +02:00
* @ param string $price_base_type HT or TTC
2017-10-07 13:09:31 +02:00
* @ param int $info_bits Miscellaneous informations
* @ param int $special_code Special code ( also used by externals modules ! )
* @ param int $fk_parent_line Id of parent line ( 0 in most cases , used by modules adding sublevels into lines ) .
* @ param int $skip_update_total Keep fields total_xxx to 0 ( used for special lines by some modules )
* @ param int $fk_fournprice Id of origin supplier price
* @ param int $pa_ht Price ( without tax ) of product when it was bought
* @ param string $label ? ? ?
* @ param int $type 0 / 1 = Product / service
* @ param int $date_start Start date of the line
* @ param int $date_end End date of the line
2015-02-28 04:59:27 +01:00
* @ param array $array_options extrafields array
2017-10-07 13:09:31 +02:00
* @ param string $fk_unit Code of the unit to use . Null to use the default one
2016-12-11 00:42:52 +01:00
* @ param double $pu_ht_devise Unit price in currency
2017-06-22 16:00:12 +02:00
* @ param int $notrigger disable line update trigger
2022-05-11 14:38:16 +02:00
* @ param integer $rang line rank
2017-10-07 13:09:31 +02:00
* @ return int 0 if OK , < 0 if KO
*/
2022-05-11 15:42:27 +02:00
public function updateline ( $rowid , $pu , $qty , $remise_percent , $txtva , $txlocaltax1 = 0.0 , $txlocaltax2 = 0.0 , $desc = '' , $price_base_type = 'HT' , $info_bits = 0 , $special_code = 0 , $fk_parent_line = 0 , $skip_update_total = 0 , $fk_fournprice = 0 , $pa_ht = 0 , $label = '' , $type = 0 , $date_start = '' , $date_end = '' , $array_options = 0 , $fk_unit = null , $pu_ht_devise = 0 , $notrigger = 0 , $rang = 0 )
2017-10-07 13:09:31 +02:00
{
2019-03-24 14:30:00 +01:00
global $mysoc , $langs ;
2012-03-18 19:23:01 +01:00
2020-10-28 17:49:52 +01:00
dol_syslog ( get_class ( $this ) . " ::updateLine rowid= $rowid , pu= $pu , qty= $qty , remise_percent= $remise_percent ,
2015-11-06 01:53:20 +01:00
txtva = $txtva , desc = $desc , price_base_type = $price_base_type , info_bits = $info_bits , special_code = $special_code , fk_parent_line = $fk_parent_line , pa_ht = $pa_ht , type = $type , date_start = $date_start , date_end = $date_end " );
2017-10-07 13:09:31 +02:00
include_once DOL_DOCUMENT_ROOT . '/core/lib/price.lib.php' ;
// Clean parameters
2019-11-08 15:51:54 +01:00
$remise_percent = price2num ( $remise_percent );
$qty = price2num ( $qty );
2017-10-07 13:09:31 +02:00
$pu = price2num ( $pu );
2019-11-08 15:51:54 +01:00
$pu_ht_devise = price2num ( $pu_ht_devise );
2021-01-02 16:51:34 +01:00
if ( ! preg_match ( '/\((.*)\)/' , $txtva )) {
$txtva = price2num ( $txtva ); // $txtva can have format '5.0(XXX)' or '5'
}
2019-11-08 15:51:54 +01:00
$txlocaltax1 = price2num ( $txlocaltax1 );
$txlocaltax2 = price2num ( $txlocaltax2 );
$pa_ht = price2num ( $pa_ht );
2021-02-23 18:59:19 +01:00
if ( empty ( $qty ) && empty ( $special_code )) {
$special_code = 3 ; // Set option tag
}
if ( ! empty ( $qty ) && $special_code == 3 ) {
$special_code = 0 ; // Remove option tag
}
if ( empty ( $type )) {
$type = 0 ;
}
2019-04-25 12:11:32 +02:00
2020-10-28 17:49:52 +01:00
if ( $date_start && $date_end && $date_start > $date_end ) {
$langs -> load ( " errors " );
$this -> error = $langs -> trans ( 'ErrorStartDateGreaterEnd' );
return - 1 ;
}
2017-10-07 13:09:31 +02:00
2021-02-23 18:59:19 +01:00
if ( $this -> statut == self :: STATUS_DRAFT ) {
2017-10-07 13:09:31 +02:00
$this -> db -> begin ();
// 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.
2019-11-08 15:51:54 +01:00
$localtaxes_type = getLocalTaxesFromRate ( $txtva , 0 , $this -> thirdparty , $mysoc );
2017-10-07 13:09:31 +02:00
// Clean vat code
2020-01-25 14:03:24 +01:00
$reg = array ();
2019-11-08 15:51:54 +01:00
$vat_src_code = '' ;
2021-02-23 18:59:19 +01:00
if ( preg_match ( '/\((.*)\)/' , $txtva , $reg )) {
2017-10-07 13:09:31 +02:00
$vat_src_code = $reg [ 1 ];
2019-11-08 15:51:54 +01:00
$txtva = preg_replace ( '/\s*\(.*\)/' , '' , $txtva ); // Remove code into vatrate.
2017-10-07 13:09:31 +02:00
}
2019-11-08 15:51:54 +01:00
$tabprice = calcul_price_total ( $qty , $pu , $remise_percent , $txtva , $txlocaltax1 , $txlocaltax2 , 0 , $price_base_type , $info_bits , $type , $mysoc , $localtaxes_type , 100 , $this -> multicurrency_tx , $pu_ht_devise );
2017-10-07 13:09:31 +02:00
$total_ht = $tabprice [ 0 ];
$total_tva = $tabprice [ 1 ];
$total_ttc = $tabprice [ 2 ];
$total_localtax1 = $tabprice [ 9 ];
$total_localtax2 = $tabprice [ 10 ];
2016-12-11 00:42:52 +01:00
$pu_ht = $tabprice [ 3 ];
$pu_tva = $tabprice [ 4 ];
$pu_ttc = $tabprice [ 5 ];
2012-03-18 19:23:01 +01:00
2016-01-21 22:40:07 +01:00
// MultiCurrency
$multicurrency_total_ht = $tabprice [ 16 ];
2017-10-07 13:09:31 +02:00
$multicurrency_total_tva = $tabprice [ 17 ];
$multicurrency_total_ttc = $tabprice [ 18 ];
2016-12-11 00:42:52 +01:00
$pu_ht_devise = $tabprice [ 19 ];
2016-07-08 20:40:25 +02:00
2017-10-07 13:09:31 +02:00
// Anciens indicateurs: $price, $remise (a ne plus utiliser)
$price = $pu ;
2017-12-06 23:21:58 +01:00
$remise = 0 ;
2021-02-23 18:59:19 +01:00
if ( $remise_percent > 0 ) {
2017-10-07 13:09:31 +02:00
$remise = round (( $pu * $remise_percent / 100 ), 2 );
$price = $pu - $remise ;
}
//Fetch current line from the database and then clone the object and set it in $oldline property
$line = new PropaleLigne ( $this -> db );
$line -> fetch ( $rowid );
2012-03-18 19:23:01 +01:00
2015-09-24 16:32:48 +02:00
$staticline = clone $line ;
2015-02-26 13:19:19 +01:00
2017-10-07 13:09:31 +02:00
$line -> oldline = $staticline ;
$this -> line = $line ;
$this -> line -> context = $this -> context ;
2022-05-11 14:26:21 +02:00
$this -> line -> rang = $rang ;
2017-10-07 13:09:31 +02:00
// Reorder if fk_parent_line change
2021-02-23 18:59:19 +01:00
if ( ! empty ( $fk_parent_line ) && ! empty ( $staticline -> fk_parent_line ) && $fk_parent_line != $staticline -> fk_parent_line ) {
2017-10-07 13:09:31 +02:00
$rangmax = $this -> line_max ( $fk_parent_line );
$this -> line -> rang = $rangmax + 1 ;
}
2019-12-18 15:20:36 +01:00
$this -> line -> id = $rowid ;
$this -> line -> label = $label ;
2019-11-08 15:51:54 +01:00
$this -> line -> desc = $desc ;
$this -> line -> qty = $qty ;
2017-10-07 13:09:31 +02:00
$this -> line -> product_type = $type ;
$this -> line -> vat_src_code = $vat_src_code ;
2019-11-08 15:51:54 +01:00
$this -> line -> tva_tx = $txtva ;
2017-10-07 13:09:31 +02:00
$this -> line -> localtax1_tx = $txlocaltax1 ;
$this -> line -> localtax2_tx = $txlocaltax2 ;
2013-09-12 09:59:23 +02:00
$this -> line -> localtax1_type = $localtaxes_type [ 0 ];
2013-11-19 21:08:02 +01:00
$this -> line -> localtax2_type = $localtaxes_type [ 2 ];
2017-10-07 13:09:31 +02:00
$this -> line -> remise_percent = $remise_percent ;
$this -> line -> subprice = $pu_ht ;
$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 ;
2019-11-08 15:51:54 +01:00
$this -> line -> special_code = $special_code ;
2017-10-07 13:09:31 +02:00
$this -> line -> fk_parent_line = $fk_parent_line ;
2019-11-08 15:51:54 +01:00
$this -> line -> skip_update_total = $skip_update_total ;
$this -> line -> fk_unit = $fk_unit ;
2012-03-18 19:23:01 +01:00
2015-10-26 20:33:42 +01:00
$this -> line -> fk_fournprice = $fk_fournprice ;
2017-10-07 13:09:31 +02:00
$this -> line -> pa_ht = $pa_ht ;
2013-04-27 15:08:35 +02:00
2019-11-08 15:51:54 +01:00
$this -> line -> date_start = $date_start ;
$this -> line -> date_end = $date_end ;
2012-07-20 09:57:50 +02:00
2017-10-07 13:09:31 +02:00
// TODO deprecated
2019-11-08 15:51:54 +01:00
$this -> line -> price = $price ;
2012-03-18 19:23:01 +01:00
2019-11-08 15:51:54 +01:00
if ( is_array ( $array_options ) && count ( $array_options ) > 0 ) {
2020-01-25 14:03:24 +01:00
// We replace values in this->line->array_options only for entries defined into $array_options
2020-01-30 01:48:28 +01:00
foreach ( $array_options as $key => $value ) {
2020-01-25 14:03:24 +01:00
$this -> line -> array_options [ $key ] = $array_options [ $key ];
}
2017-10-07 13:09:31 +02:00
}
2013-06-10 16:05:41 +02:00
2016-01-21 22:40:07 +01:00
// Multicurrency
2016-12-11 00:42:52 +01:00
$this -> line -> multicurrency_subprice = $pu_ht_devise ;
2016-01-21 22:40:07 +01:00
$this -> line -> multicurrency_total_ht = $multicurrency_total_ht ;
2017-10-07 13:09:31 +02:00
$this -> line -> multicurrency_total_tva = $multicurrency_total_tva ;
$this -> line -> multicurrency_total_ttc = $multicurrency_total_ttc ;
2019-11-08 15:51:54 +01:00
$result = $this -> line -> update ( $notrigger );
2021-02-23 18:59:19 +01:00
if ( $result > 0 ) {
2017-10-07 13:09:31 +02:00
// Reorder if child line
2021-02-23 18:59:19 +01:00
if ( ! empty ( $fk_parent_line )) {
$this -> line_order ( true , 'DESC' );
}
2017-10-07 13:09:31 +02:00
2023-06-29 16:50:21 +02:00
$this -> update_price ( 1 , 'auto' );
2017-10-07 13:09:31 +02:00
$this -> fk_propal = $this -> id ;
$this -> rowid = $rowid ;
$this -> db -> commit ();
return $result ;
2020-05-21 15:05:19 +02:00
} else {
2019-11-08 15:51:54 +01:00
$this -> error = $this -> line -> error ;
2021-02-08 20:44:40 +01:00
$this -> errors = $this -> line -> errors ;
2017-10-07 13:09:31 +02:00
$this -> db -> rollback ();
return - 1 ;
}
2020-05-21 15:05:19 +02:00
} else {
2017-10-07 13:09:31 +02:00
dol_syslog ( get_class ( $this ) . " ::updateline Erreur -2 Propal en mode incompatible pour cette action " );
return - 2 ;
}
}
/**
* Delete detail line
*
* @ param int $lineid Id of line to delete
* @ return int > 0 if OK , < 0 if KO
*/
2020-10-28 17:49:52 +01:00
public function deleteline ( $lineid )
2017-10-07 13:09:31 +02:00
{
2017-12-03 20:51:26 +01:00
global $user ;
2021-02-23 18:59:19 +01:00
if ( $this -> statut == self :: STATUS_DRAFT ) {
2017-12-21 16:50:18 +01:00
$this -> db -> begin ();
2019-11-08 15:51:54 +01:00
$line = new PropaleLigne ( $this -> db );
2017-10-07 13:09:31 +02:00
// For triggers
$line -> fetch ( $lineid );
2021-02-23 18:59:19 +01:00
if ( $line -> delete ( $user ) > 0 ) {
2017-10-07 13:09:31 +02:00
$this -> update_price ( 1 );
2017-12-21 16:50:18 +01:00
$this -> db -> commit ();
2017-10-07 13:09:31 +02:00
return 1 ;
2020-05-21 15:05:19 +02:00
} else {
2022-03-09 11:32:07 +01:00
$this -> error = $line -> error ;
$this -> errors = $line -> errors ;
2017-12-21 16:50:18 +01:00
$this -> db -> rollback ();
2017-10-07 13:09:31 +02:00
return - 1 ;
}
2020-05-21 15:05:19 +02:00
} else {
2019-11-08 15:51:54 +01:00
$this -> error = 'ErrorDeleteLineNotAllowedByObjectStatus' ;
2017-10-07 13:09:31 +02:00
return - 2 ;
}
}
/**
* Create commercial proposal into database
* this -> ref can be set or empty . If empty , we will use " (PROVid) "
*
* @ param User $user User that create
* @ param int $notrigger 1 = Does not execute triggers , 0 = execute triggers
* @ return int < 0 if KO , >= 0 if OK
*/
2020-10-28 17:49:52 +01:00
public function create ( $user , $notrigger = 0 )
2017-10-07 13:09:31 +02:00
{
2022-03-01 14:52:47 +01:00
global $conf , $hookmanager , $mysoc ;
2019-11-08 15:51:54 +01:00
$error = 0 ;
2017-10-07 13:09:31 +02:00
2019-11-08 15:51:54 +01:00
$now = dol_now ();
2017-10-07 13:09:31 +02:00
// Clean parameters
2021-02-23 18:59:19 +01:00
if ( empty ( $this -> date )) {
$this -> date = $this -> datep ;
}
2017-10-07 13:09:31 +02:00
$this -> fin_validite = $this -> date + ( $this -> duree_validite * 24 * 3600 );
2021-02-23 18:59:19 +01:00
if ( empty ( $this -> availability_id )) {
$this -> availability_id = 0 ;
}
if ( empty ( $this -> demand_reason_id )) {
$this -> demand_reason_id = 0 ;
}
2009-09-13 22:19:59 +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-23 18:59:19 +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 , $this -> date );
} else {
$this -> fk_multicurrency = MultiCurrency :: getIdFromCode ( $this -> db , $this -> multicurrency_code );
}
if ( empty ( $this -> fk_multicurrency )) {
2016-01-22 22:35:32 +01:00
$this -> multicurrency_code = $conf -> currency ;
2016-01-18 19:45:27 +01:00
$this -> fk_multicurrency = 0 ;
$this -> multicurrency_tx = 1 ;
}
2016-07-08 20:40:25 +02:00
2020-11-16 12:20:18 +01:00
// Set tmp vars
$delivery_date = empty ( $this -> delivery_date ) ? $this -> date_livraison : $this -> delivery_date ;
2017-10-07 13:09:31 +02:00
dol_syslog ( get_class ( $this ) . " ::create " );
2012-03-18 19:23:01 +01:00
2017-10-07 13:09:31 +02:00
// Check parameters
2019-11-08 15:51:54 +01:00
$result = $this -> fetch_thirdparty ();
2021-02-23 18:59:19 +01:00
if ( $result < 0 ) {
2019-11-08 15:51:54 +01:00
$this -> error = " Failed to fetch company " ;
2017-10-07 13:09:31 +02:00
dol_syslog ( get_class ( $this ) . " ::create " . $this -> error , LOG_ERR );
return - 3 ;
}
2014-05-13 10:12:45 +02:00
2017-10-07 13:09:31 +02:00
// Check parameters
2021-02-23 18:59:19 +01:00
if ( ! empty ( $this -> ref )) { // We check that ref is not already used
2019-11-08 15:51:54 +01:00
$result = self :: isExistingObject ( $this -> element , 0 , $this -> ref ); // Check ref is not yet used
2021-02-23 18:59:19 +01:00
if ( $result > 0 ) {
2019-11-08 15:51:54 +01:00
$this -> error = 'ErrorRefAlreadyExists' ;
2019-01-27 11:55:16 +01:00
dol_syslog ( get_class ( $this ) . " ::create " . $this -> error , LOG_WARNING );
2014-05-13 10:12:45 +02:00
$this -> db -> rollback ();
return - 1 ;
}
}
2021-02-23 18:59:19 +01:00
if ( empty ( $this -> date )) {
2019-11-08 15:51:54 +01:00
$this -> error = " Date of proposal is required " ;
2017-10-07 13:09:31 +02:00
dol_syslog ( get_class ( $this ) . " ::create " . $this -> error , LOG_ERR );
return - 4 ;
}
$this -> db -> begin ();
// Insert into database
$sql = " INSERT INTO " . MAIN_DB_PREFIX . " propal ( " ;
2019-11-08 15:51:54 +01:00
$sql .= " fk_soc " ;
$sql .= " , price " ;
$sql .= " , remise " ;
$sql .= " , remise_percent " ;
$sql .= " , remise_absolue " ;
2021-02-19 06:49:24 +01:00
$sql .= " , total_tva " ;
2021-02-21 22:07:58 +01:00
$sql .= " , total_ttc " ;
2019-11-08 15:51:54 +01:00
$sql .= " , datep " ;
$sql .= " , datec " ;
$sql .= " , ref " ;
$sql .= " , fk_user_author " ;
$sql .= " , note_private " ;
$sql .= " , note_public " ;
$sql .= " , model_pdf " ;
$sql .= " , fin_validite " ;
$sql .= " , fk_cond_reglement " ;
2021-09-29 12:05:38 +02:00
$sql .= " , deposit_percent " ;
2019-11-08 15:51:54 +01:00
$sql .= " , fk_mode_reglement " ;
$sql .= " , fk_account " ;
$sql .= " , ref_client " ;
$sql .= " , date_livraison " ;
$sql .= " , fk_shipping_method " ;
2021-01-09 02:45:46 +01:00
$sql .= " , fk_warehouse " ;
2019-11-08 15:51:54 +01:00
$sql .= " , fk_availability " ;
$sql .= " , fk_input_reason " ;
$sql .= " , fk_projet " ;
$sql .= " , fk_incoterms " ;
$sql .= " , location_incoterms " ;
$sql .= " , entity " ;
$sql .= " , fk_multicurrency " ;
$sql .= " , multicurrency_code " ;
$sql .= " , multicurrency_tx " ;
$sql .= " ) " ;
$sql .= " VALUES ( " ;
$sql .= $this -> socid ;
$sql .= " , 0 " ;
2021-12-19 20:55:24 +01:00
$sql .= " , " . (( float ) $this -> remise ); // deprecated
2021-09-03 21:25:17 +02:00
$sql .= " , " . ( $this -> remise_percent ? (( float ) $this -> remise_percent ) : 'NULL' );
2021-12-19 20:55:24 +01:00
$sql .= " , " . ( $this -> remise_absolue ? (( float ) $this -> remise_absolue ) : 'NULL' ); // deprecated
2019-11-08 15:51:54 +01:00
$sql .= " , 0 " ;
$sql .= " , 0 " ;
$sql .= " , ' " . $this -> db -> idate ( $this -> date ) . " ' " ;
$sql .= " , ' " . $this -> db -> idate ( $now ) . " ' " ;
$sql .= " , '(PROV)' " ;
2021-09-03 21:25:17 +02:00
$sql .= " , " . ( $user -> id > 0 ? (( int ) $user -> id ) : " NULL " );
2019-11-08 15:51:54 +01:00
$sql .= " , ' " . $this -> db -> escape ( $this -> note_private ) . " ' " ;
$sql .= " , ' " . $this -> db -> escape ( $this -> note_public ) . " ' " ;
2020-09-10 01:49:09 +02:00
$sql .= " , ' " . $this -> db -> escape ( $this -> model_pdf ) . " ' " ;
2019-11-08 15:51:54 +01:00
$sql .= " , " . ( $this -> fin_validite != '' ? " ' " . $this -> db -> idate ( $this -> fin_validite ) . " ' " : " NULL " );
2021-09-03 21:25:17 +02:00
$sql .= " , " . ( $this -> cond_reglement_id > 0 ? (( int ) $this -> cond_reglement_id ) : 'NULL' );
2021-10-28 16:53:28 +02:00
$sql .= " , " . ( ! empty ( $this -> deposit_percent ) ? " ' " . $this -> db -> escape ( $this -> deposit_percent ) . " ' " : 'NULL' );
2021-09-03 21:25:17 +02:00
$sql .= " , " . ( $this -> mode_reglement_id > 0 ? (( int ) $this -> mode_reglement_id ) : 'NULL' );
$sql .= " , " . ( $this -> fk_account > 0 ? (( int ) $this -> fk_account ) : 'NULL' );
2019-11-08 15:51:54 +01:00
$sql .= " , ' " . $this -> db -> escape ( $this -> ref_client ) . " ' " ;
2020-11-16 12:20:18 +01:00
$sql .= " , " . ( empty ( $delivery_date ) ? " NULL " : " ' " . $this -> db -> idate ( $delivery_date ) . " ' " );
2019-11-08 15:51:54 +01:00
$sql .= " , " . ( $this -> shipping_method_id > 0 ? $this -> shipping_method_id : 'NULL' );
2021-01-09 02:45:46 +01:00
$sql .= " , " . ( $this -> warehouse_id > 0 ? $this -> warehouse_id : 'NULL' );
2019-11-08 15:51:54 +01:00
$sql .= " , " . $this -> availability_id ;
$sql .= " , " . $this -> demand_reason_id ;
$sql .= " , " . ( $this -> fk_project ? $this -> fk_project : " null " );
$sql .= " , " . ( int ) $this -> fk_incoterms ;
$sql .= " , ' " . $this -> db -> escape ( $this -> location_incoterms ) . " ' " ;
$sql .= " , " . setEntity ( $this );
$sql .= " , " . ( int ) $this -> fk_multicurrency ;
$sql .= " , ' " . $this -> db -> escape ( $this -> multicurrency_code ) . " ' " ;
$sql .= " , " . ( double ) $this -> multicurrency_tx ;
$sql .= " ) " ;
2017-09-15 15:41:07 +02:00
2017-10-07 13:09:31 +02:00
dol_syslog ( get_class ( $this ) . " ::create " , LOG_DEBUG );
2019-11-08 15:51:54 +01:00
$resql = $this -> db -> query ( $sql );
2021-02-23 18:59:19 +01:00
if ( $resql ) {
2017-10-07 13:09:31 +02:00
$this -> id = $this -> db -> last_insert_id ( MAIN_DB_PREFIX . " propal " );
2012-03-18 19:23:01 +01:00
2021-02-23 18:59:19 +01:00
if ( $this -> id ) {
2019-11-08 15:51:54 +01:00
$this -> ref = '(PROV' . $this -> id . ')' ;
2020-12-07 18:29:14 +01:00
$sql = 'UPDATE ' . MAIN_DB_PREFIX . " propal SET ref=' " . $this -> db -> escape ( $this -> ref ) . " ' WHERE rowid= " . (( int ) $this -> id );
2012-03-18 19:23:01 +01:00
2017-10-07 13:09:31 +02:00
dol_syslog ( get_class ( $this ) . " ::create " , LOG_DEBUG );
2019-11-08 15:51:54 +01:00
$resql = $this -> db -> query ( $sql );
2021-02-23 18:59:19 +01:00
if ( ! $resql ) {
$error ++ ;
}
2012-03-18 19:23:01 +01:00
2021-02-23 18:59:19 +01:00
if ( ! empty ( $this -> linkedObjectsIds ) && empty ( $this -> linked_objects )) { // To use new linkedObjectsIds instead of old linked_objects
2020-10-28 17:49:52 +01:00
$this -> linked_objects = $this -> linkedObjectsIds ; // TODO Replace linked_objects with linkedObjectsIds
}
2017-10-19 19:06:48 +02:00
2020-10-28 17:49:52 +01:00
// Add object linked
2021-02-23 18:59:19 +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-10-28 17:49:52 +01:00
$ret = $this -> add_object_linked ( $origin , $origin_id );
2021-02-23 18:59:19 +01:00
if ( ! $ret ) {
2020-10-28 17:49:52 +01:00
$this -> error = $this -> db -> lasterror ();
$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 ;
$ret = $this -> add_object_linked ( $origin , $origin_id );
2021-02-23 18:59:19 +01:00
if ( ! $ret ) {
2020-10-28 17:49:52 +01:00
$this -> error = $this -> db -> lasterror ();
$error ++ ;
}
}
}
}
2017-10-19 19:06:48 +02:00
2020-10-28 17:49:52 +01:00
/*
2021-02-23 18:59:19 +01:00
* Insertion du detail des produits dans la base
* Insert products detail in database
*/
if ( ! $error ) {
2020-10-28 17:49:52 +01:00
$fk_parent_line = 0 ;
$num = count ( $this -> lines );
2012-03-18 19:23:01 +01:00
2021-02-23 18:59:19 +01:00
for ( $i = 0 ; $i < $num ; $i ++ ) {
if ( ! is_object ( $this -> lines [ $i ])) { // If this->lines is not array of objects, coming from REST API
// Convert into object this->lines[$i].
2020-10-28 17:49:52 +01:00
$line = ( object ) $this -> lines [ $i ];
} else {
$line = $this -> lines [ $i ];
}
2017-10-07 13:09:31 +02:00
// Reset fk_parent_line for line that are not child lines or special product
2017-11-18 16:21:54 +01:00
if (( $line -> product_type != 9 && empty ( $line -> fk_parent_line )) || $line -> product_type == 9 ) {
2017-10-07 13:09:31 +02:00
$fk_parent_line = 0 ;
}
2020-10-28 17:49:52 +01:00
// Complete vat rate with code
2017-11-18 16:21:54 +01:00
$vatrate = $line -> tva_tx ;
2021-02-23 18:59:19 +01:00
if ( $line -> vat_src_code && ! preg_match ( '/\(.*\)/' , $vatrate )) {
$vatrate .= ' (' . $line -> vat_src_code . ')' ;
}
2017-11-13 13:07:31 +01:00
2020-04-10 10:59:32 +02:00
if ( ! empty ( $conf -> global -> MAIN_CREATEFROM_KEEP_LINE_ORIGIN_INFORMATION )) {
$originid = $line -> origin_id ;
$origintype = $line -> origin ;
2020-03-12 09:44:43 +01:00
} else {
2020-04-10 10:59:32 +02:00
$originid = $line -> id ;
$origintype = $this -> element ;
2020-03-12 09:44:43 +01:00
}
2019-06-03 11:37:04 +02:00
$result = $this -> addline (
2017-11-18 16:21:54 +01:00
$line -> desc ,
$line -> subprice ,
$line -> qty ,
2017-11-13 13:07:31 +01:00
$vatrate ,
2017-11-18 16:21:54 +01:00
$line -> localtax1_tx ,
$line -> localtax2_tx ,
$line -> fk_product ,
$line -> remise_percent ,
2012-08-26 23:15:26 +02:00
'HT' ,
0 ,
2017-11-18 16:21:54 +01:00
$line -> info_bits ,
$line -> product_type ,
$line -> rang ,
$line -> special_code ,
2012-08-26 23:15:26 +02:00
$fk_parent_line ,
2017-11-18 16:21:54 +01:00
$line -> fk_fournprice ,
$line -> pa_ht ,
$line -> label ,
$line -> date_start ,
$line -> date_end ,
$line -> array_options ,
$line -> fk_unit ,
2020-03-12 09:44:43 +01:00
$origintype ,
2022-03-01 14:52:47 +01:00
$originid ,
0 ,
0 ,
1
2012-08-22 17:42:40 +02:00
);
2012-03-18 19:23:01 +01:00
2021-02-23 18:59:19 +01:00
if ( $result < 0 ) {
2017-10-07 13:09:31 +02:00
$error ++ ;
2019-11-08 15:51:54 +01:00
$this -> error = $this -> db -> error ;
2017-10-07 13:09:31 +02:00
dol_print_error ( $this -> db );
break ;
}
2023-05-16 16:57:46 +02:00
// Set the id on created row
$line -> id = $result ;
2017-10-07 13:09:31 +02:00
// Defined the new fk_parent_line
2022-09-13 15:12:31 +02:00
if ( $result > 0 && $line -> product_type == 9 ) {
2017-10-07 13:09:31 +02:00
$fk_parent_line = $result ;
}
}
}
2012-03-18 19:23:01 +01:00
2017-10-07 13:09:31 +02:00
// Set delivery address
2019-10-01 16:19:54 +02:00
/* if ( ! $error && $this -> fk_delivery_address )
2017-10-07 13:09:31 +02:00
{
$sql = " UPDATE " . MAIN_DB_PREFIX . " propal " ;
2021-03-30 03:37:54 +02:00
$sql .= " SET fk_delivery_address = " . (( int ) $this -> fk_delivery_address );
2017-10-07 13:09:31 +02:00
$sql .= " WHERE ref = ' " . $this -> db -> escape ( $this -> ref ) . " ' " ;
2019-06-03 11:37:04 +02:00
$sql .= " AND entity = " . setEntity ( $this );
2012-03-18 19:23:01 +01:00
2017-10-07 13:09:31 +02:00
$result = $this -> db -> query ( $sql );
2019-10-01 16:19:54 +02:00
} */
2012-03-18 19:23:01 +01:00
2021-02-23 18:59:19 +01:00
if ( ! $error ) {
2017-10-07 13:09:31 +02:00
// Mise a jour infos denormalisees
2022-03-01 14:52:47 +01:00
$resql = $this -> update_price ( 1 , 'auto' , 0 , $mysoc );
2021-02-23 18:59:19 +01:00
if ( $resql ) {
2019-11-08 15:51:54 +01:00
$action = 'update' ;
2017-10-07 13:09:31 +02:00
2018-04-10 12:03:01 +02:00
// Actions on extra fields
2021-02-23 18:59:19 +01:00
if ( ! $error ) {
2020-04-23 13:21:39 +02:00
$result = $this -> insertExtraFields ();
2021-02-23 18:59:19 +01:00
if ( $result < 0 ) {
2020-04-23 13:21:39 +02:00
$error ++ ;
2017-10-07 13:09:31 +02:00
}
}
2021-02-23 18:59:19 +01:00
if ( ! $error && ! $notrigger ) {
2017-10-07 13:09:31 +02:00
// Call trigger
2019-11-08 15:51:54 +01:00
$result = $this -> call_trigger ( 'PROPAL_CREATE' , $user );
2021-02-23 18:59:19 +01:00
if ( $result < 0 ) {
$error ++ ;
}
2017-10-07 13:09:31 +02:00
// End call triggers
}
2020-05-21 15:05:19 +02:00
} else {
2019-11-08 15:51:54 +01:00
$this -> error = $this -> db -> lasterror ();
2017-10-07 13:09:31 +02:00
$error ++ ;
}
}
2020-05-21 15:05:19 +02:00
} else {
2019-11-08 15:51:54 +01:00
$this -> error = $this -> db -> lasterror ();
2017-10-07 13:09:31 +02:00
$error ++ ;
}
2021-02-23 18:59:19 +01:00
if ( ! $error ) {
2017-10-07 13:09:31 +02:00
$this -> db -> commit ();
dol_syslog ( get_class ( $this ) . " ::create done id= " . $this -> id );
return $this -> id ;
2020-05-21 15:05:19 +02:00
} else {
2017-10-07 13:09:31 +02:00
$this -> db -> rollback ();
return - 2 ;
}
2020-05-21 15:05:19 +02:00
} else {
2019-11-08 15:51:54 +01:00
$this -> error = $this -> db -> lasterror ();
2017-10-07 13:09:31 +02:00
$this -> db -> rollback ();
return - 1 ;
}
}
/**
* 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
* @ param int $socid Id of thirdparty
2020-07-02 10:16:20 +02:00
* @ param int $forceentity Entity id to force
2022-03-03 11:58:29 +01:00
* @ param bool $update_prices [ = false ] Update prices if true
2019-04-25 12:11:32 +02:00
* @ return int New id of clone
2017-10-07 13:09:31 +02:00
*/
2022-03-03 11:58:29 +01:00
public function createFromClone ( User $user , $socid = 0 , $forceentity = null , $update_prices = false )
2017-10-07 13:09:31 +02:00
{
2022-03-03 11:58:29 +01:00
global $conf , $hookmanager , $mysoc ;
2015-08-13 03:58:32 +02:00
2015-10-13 09:37:33 +02:00
dol_include_once ( '/projet/class/project.class.php' );
2015-08-13 03:58:32 +02:00
2019-11-08 15:51:54 +01:00
$error = 0 ;
$now = dol_now ();
2012-03-18 19:23:01 +01:00
2019-01-19 13:17:07 +01:00
dol_syslog ( __METHOD__ , LOG_DEBUG );
2012-03-18 19:23:01 +01:00
2019-01-19 13:17:07 +01:00
$object = new self ( $this -> db );
2014-09-24 11:47:34 +02:00
2019-01-19 13:17:07 +01:00
$this -> db -> begin ();
2014-09-24 11:47:34 +02:00
2019-01-19 13:17:07 +01:00
// Load source object
$object -> fetch ( $this -> id );
2012-03-18 19:23:01 +01:00
2019-11-08 15:51:54 +01:00
$objsoc = new Societe ( $this -> db );
2012-03-18 19:23:01 +01:00
2017-10-07 13:09:31 +02:00
// Change socid if needed
2021-02-23 18:59:19 +01:00
if ( ! empty ( $socid ) && $socid != $object -> socid ) {
if ( $objsoc -> fetch ( $socid ) > 0 ) {
2020-10-28 17:49:52 +01:00
$object -> socid = $objsoc -> id ;
$object -> cond_reglement_id = ( ! empty ( $objsoc -> cond_reglement_id ) ? $objsoc -> cond_reglement_id : 0 );
2021-09-29 12:05:38 +02:00
$object -> deposit_percent = ( ! empty ( $objsoc -> deposit_percent ) ? $objsoc -> deposit_percent : null );
2020-10-28 17:49:52 +01:00
$object -> mode_reglement_id = ( ! empty ( $objsoc -> mode_reglement_id ) ? $objsoc -> mode_reglement_id : 0 );
$object -> fk_delivery_address = '' ;
2016-07-08 20:40:25 +02:00
2022-06-14 17:53:17 +02:00
/* if ( ! empty ( $conf -> project -> enabled ))
2021-02-23 18:59:19 +01:00
{
$project = new Project ( $db );
if ( $this -> fk_project > 0 && $project -> fetch ( $this -> fk_project )) {
if ( $project -> socid <= 0 ) $clonedObj -> fk_project = $this -> fk_project ;
else $clonedObj -> fk_project = '' ;
} else {
$clonedObj -> fk_project = '' ;
}
} */
2020-10-28 17:49:52 +01:00
$object -> fk_project = '' ; // A cloned proposal is set by default to no project.
2017-10-07 13:09:31 +02:00
}
2014-01-16 11:43:59 +01:00
2017-10-07 13:09:31 +02:00
// reset ref_client
2019-11-08 15:51:54 +01:00
$object -> ref_client = '' ;
2017-10-07 13:09:31 +02:00
// TODO Change product price if multi-prices
2020-05-21 15:05:19 +02:00
} else {
2020-10-28 17:49:52 +01:00
$objsoc -> fetch ( $object -> socid );
2017-10-07 13:09:31 +02:00
}
2022-03-03 11:58:29 +01:00
// update prices
if ( $update_prices === true ) {
if ( $objsoc -> id > 0 && ! empty ( $object -> lines )) {
if ( ! empty ( $conf -> global -> PRODUIT_CUSTOMER_PRICES )) {
// If price per customer
require_once DOL_DOCUMENT_ROOT . '/product/class/productcustomerprice.class.php' ;
}
foreach ( $object -> lines as $line ) {
2023-05-16 16:57:46 +02:00
$line -> id = 0 ;
2022-03-03 11:58:29 +01:00
if ( $line -> fk_product > 0 ) {
$prod = new Product ( $this -> db );
$res = $prod -> fetch ( $line -> fk_product );
if ( $res > 0 ) {
$pu_ht = $prod -> price ;
$tva_tx = get_default_tva ( $mysoc , $objsoc , $prod -> id );
$remise_percent = $objsoc -> remise_percent ;
if ( ! empty ( $conf -> global -> PRODUIT_MULTIPRICES ) && $objsoc -> price_level > 0 ) {
$pu_ht = $prod -> multiprices [ $objsoc -> price_level ];
if ( ! empty ( $conf -> global -> PRODUIT_MULTIPRICES_USE_VAT_PER_LEVEL )) { // using this option is a bug. kept for backward compatibility
if ( isset ( $prod -> multiprices_tva_tx [ $objsoc -> price_level ])) {
$tva_tx = $prod -> multiprices_tva_tx [ $objsoc -> price_level ];
}
}
} elseif ( ! empty ( $conf -> global -> PRODUIT_CUSTOMER_PRICES )) {
$prodcustprice = new Productcustomerprice ( $this -> db );
$filter = array ( 't.fk_product' => $prod -> id , 't.fk_soc' => $objsoc -> id );
$result = $prodcustprice -> fetch_all ( '' , '' , 0 , 0 , $filter );
if ( $result ) {
// If there is some prices specific to the customer
if ( count ( $prodcustprice -> lines ) > 0 ) {
$pu_ht = price ( $prodcustprice -> lines [ 0 ] -> price );
$tva_tx = ( $prodcustprice -> lines [ 0 ] -> default_vat_code ? $prodcustprice -> lines [ 0 ] -> tva_tx . ' (' . $prodcustprice -> lines [ 0 ] -> default_vat_code . ' )' : $prodcustprice -> lines [ 0 ] -> tva_tx );
if ( $prodcustprice -> lines [ 0 ] -> default_vat_code && ! preg_match ( '/\(.*\)/' , $tva_tx )) {
$tva_tx .= ' (' . $prodcustprice -> lines [ 0 ] -> default_vat_code . ')' ;
}
}
}
}
$line -> subprice = $pu_ht ;
$line -> tva_tx = $tva_tx ;
$line -> remise_percent = $remise_percent ;
}
}
}
}
}
2019-11-08 15:51:54 +01:00
$object -> id = 0 ;
$object -> ref = '' ;
2020-10-31 14:32:18 +01:00
$object -> entity = ( ! empty ( $forceentity ) ? $forceentity : $object -> entity );
2019-11-08 15:51:54 +01:00
$object -> statut = self :: STATUS_DRAFT ;
2017-10-07 13:09:31 +02:00
// Clear fields
2019-11-08 15:51:54 +01:00
$object -> user_author = $user -> id ;
2022-07-03 12:54:58 +02:00
$object -> user_valid = 0 ;
2019-11-08 15:51:54 +01:00
$object -> date = $now ;
$object -> datep = $now ; // deprecated
$object -> fin_validite = $object -> date + ( $object -> duree_validite * 24 * 3600 );
2021-02-23 18:59:19 +01:00
if ( empty ( $conf -> global -> MAIN_KEEP_REF_CUSTOMER_ON_CLONING )) {
$object -> ref_client = '' ;
}
if ( $conf -> global -> MAIN_DONT_KEEP_NOTE_ON_CLONING == 1 ) {
2019-11-12 10:13:22 +01:00
$object -> note_private = '' ;
$object -> note_public = '' ;
}
2017-10-07 13:09:31 +02:00
// Create clone
2019-11-08 15:51:54 +01:00
$object -> context [ 'createfromclone' ] = 'createfromclone' ;
$result = $object -> create ( $user );
2021-02-23 18:59:19 +01:00
if ( $result < 0 ) {
2020-10-28 17:49:52 +01:00
$this -> error = $object -> error ;
$this -> errors = array_merge ( $this -> errors , $object -> errors );
$error ++ ;
2019-02-01 19:19:23 +01:00
}
2019-01-19 13:17:07 +01:00
2021-02-23 18:59:19 +01:00
if ( ! $error ) {
2017-10-07 13:09:31 +02:00
// copy internal contacts
2021-02-23 18:59:19 +01:00
if ( $object -> copy_linked_contact ( $this , 'internal' ) < 0 ) {
2017-10-07 13:09:31 +02:00
$error ++ ;
2020-10-28 17:49:52 +01:00
}
2019-01-19 13:17:07 +01:00
}
2017-10-07 13:09:31 +02:00
2021-02-23 18:59:19 +01:00
if ( ! $error ) {
2017-10-07 13:09:31 +02:00
// copy external contacts if same company
2021-02-23 18:59:19 +01:00
if ( $this -> socid == $object -> socid ) {
if ( $object -> copy_linked_contact ( $this , 'external' ) < 0 ) {
2017-10-07 13:09:31 +02:00
$error ++ ;
2021-02-23 18:59:19 +01:00
}
2017-10-07 13:09:31 +02:00
}
}
2021-02-23 18:59:19 +01:00
if ( ! $error ) {
2017-10-07 13:09:31 +02:00
// Hook of thirdparty module
2021-02-23 18:59:19 +01:00
if ( is_object ( $hookmanager )) {
2019-11-08 15:51:54 +01:00
$parameters = array ( 'objFrom' => $this , 'clonedObj' => $object );
$action = '' ;
$reshook = $hookmanager -> executeHooks ( 'createFrom' , $parameters , $object , $action ); // Note that $action and $object may have been modified by some hooks
2021-02-23 18:59:19 +01:00
if ( $reshook < 0 ) {
2023-01-18 09:53:28 +01:00
$this -> errors += $hookmanager -> errors ;
$this -> error = $hookmanager -> error ;
2021-02-23 18:59:19 +01:00
$error ++ ;
}
2017-10-07 13:09:31 +02:00
}
}
2019-01-19 13:17:07 +01:00
unset ( $object -> context [ 'createfromclone' ]);
2017-10-07 13:09:31 +02:00
// End
2021-02-23 18:59:19 +01:00
if ( ! $error ) {
2017-10-07 13:09:31 +02:00
$this -> db -> commit ();
2019-01-19 13:17:07 +01:00
return $object -> id ;
2020-05-21 15:05:19 +02:00
} else {
2017-10-07 13:09:31 +02:00
$this -> db -> rollback ();
return - 1 ;
}
}
/**
2020-02-10 00:22:53 +01:00
* Load a proposal from database . Get also lines .
2017-10-07 13:09:31 +02:00
*
2022-08-14 21:41:25 +02:00
* @ param int $rowid Id of object to load
2022-07-18 19:26:13 +02:00
* @ param string $ref Ref of proposal
* @ param string $ref_ext Ref ext of proposal
2022-08-14 21:41:25 +02:00
* @ param int $forceentity Entity id to force when searching on ref or ref_ext
2022-07-18 19:26:13 +02:00
* @ return int > 0 if OK , < 0 if KO
2017-10-07 13:09:31 +02:00
*/
2022-07-18 19:26:13 +02:00
public function fetch ( $rowid , $ref = '' , $ref_ext = '' , $forceentity = 0 )
2017-10-07 13:09:31 +02:00
{
2018-02-24 16:21:16 +01:00
$sql = " SELECT p.rowid, p.ref, p.entity, p.remise, p.remise_percent, p.remise_absolue, p.fk_soc " ;
2021-02-21 22:07:58 +01:00
$sql .= " , p.total_ttc, p.total_tva, p.localtax1, p.localtax2, p.total_ht " ;
2019-11-08 15:51:54 +01:00
$sql .= " , p.datec " ;
2022-05-17 16:26:43 +02:00
$sql .= " , p.date_signature as dates " ;
2019-11-08 15:51:54 +01:00
$sql .= " , p.date_valid as datev " ;
$sql .= " , p.datep as dp " ;
$sql .= " , p.fin_validite as dfv " ;
2020-11-16 12:20:18 +01:00
$sql .= " , p.date_livraison as delivery_date " ;
2019-11-08 15:51:54 +01:00
$sql .= " , p.model_pdf, p.last_main_doc, p.ref_client, p.extraparams " ;
$sql .= " , p.note_private, p.note_public " ;
$sql .= " , p.fk_projet as fk_project, p.fk_statut " ;
$sql .= " , p.fk_user_author, p.fk_user_valid, p.fk_user_cloture " ;
$sql .= " , p.fk_delivery_address " ;
$sql .= " , p.fk_availability " ;
$sql .= " , p.fk_input_reason " ;
$sql .= " , p.fk_cond_reglement " ;
$sql .= " , p.fk_mode_reglement " ;
$sql .= ', p.fk_account' ;
$sql .= " , p.fk_shipping_method " ;
2021-01-09 02:45:46 +01:00
$sql .= " , p.fk_warehouse " ;
2019-11-08 15:51:54 +01:00
$sql .= " , p.fk_incoterms, p.location_incoterms " ;
$sql .= " , p.fk_multicurrency, p.multicurrency_code, p.multicurrency_tx, p.multicurrency_total_ht, p.multicurrency_total_tva, p.multicurrency_total_ttc " ;
$sql .= " , p.tms as date_modification " ;
$sql .= " , i.libelle as label_incoterms " ;
$sql .= " , c.label as statut_label " ;
$sql .= " , ca.code as availability_code, ca.label as availability " ;
$sql .= " , dr.code as demand_reason_code, dr.label as demand_reason " ;
2021-09-29 12:05:38 +02:00
$sql .= " , cr.code as cond_reglement_code, cr.libelle as cond_reglement, cr.libelle_facture as cond_reglement_libelle_doc, p.deposit_percent " ;
2019-11-08 15:51:54 +01:00
$sql .= " , cp.code as mode_reglement_code, cp.libelle as mode_reglement " ;
$sql .= " FROM " . MAIN_DB_PREFIX . " propal as p " ;
$sql .= ' LEFT JOIN ' . MAIN_DB_PREFIX . 'c_propalst as c ON p.fk_statut = c.id' ;
$sql .= ' LEFT JOIN ' . MAIN_DB_PREFIX . 'c_paiement as cp ON p.fk_mode_reglement = cp.id AND cp.entity IN (' . getEntity ( 'c_paiement' ) . ')' ;
$sql .= ' LEFT JOIN ' . MAIN_DB_PREFIX . 'c_payment_term as cr ON p.fk_cond_reglement = cr.rowid AND cr.entity IN (' . getEntity ( 'c_payment_term' ) . ')' ;
$sql .= ' LEFT JOIN ' . MAIN_DB_PREFIX . 'c_availability as ca ON p.fk_availability = ca.rowid' ;
$sql .= ' LEFT JOIN ' . MAIN_DB_PREFIX . 'c_input_reason as dr ON p.fk_input_reason = dr.rowid' ;
$sql .= ' LEFT JOIN ' . MAIN_DB_PREFIX . 'c_incoterms as i ON p.fk_incoterms = i.rowid' ;
2018-07-01 18:49:37 +02:00
2022-07-18 19:26:13 +02:00
if ( ! empty ( $ref )) {
if ( ! empty ( $forceentity )) {
$sql .= " WHERE p.entity = " . ( int ) $forceentity ; // Check only the current entity because we may have the same reference in several entities
} else {
$sql .= " WHERE p.entity IN ( " . getEntity ( 'propal' ) . " ) " ;
}
2019-11-08 15:51:54 +01:00
$sql .= " AND p.ref=' " . $this -> db -> escape ( $ref ) . " ' " ;
2021-02-22 21:00:24 +01:00
} else {
2022-07-18 16:48:53 +02:00
// Dont't use entity if you use rowid
2021-04-24 20:18:11 +02:00
$sql .= " WHERE p.rowid = " . (( int ) $rowid );
2021-02-22 21:00:24 +01:00
}
2017-10-07 13:09:31 +02:00
dol_syslog ( get_class ( $this ) . " ::fetch " , LOG_DEBUG );
2019-11-08 15:51:54 +01:00
$resql = $this -> db -> query ( $sql );
2021-02-22 18:21:12 +01:00
if ( $resql ) {
if ( $this -> db -> num_rows ( $resql )) {
2017-10-07 13:09:31 +02:00
$obj = $this -> db -> fetch_object ( $resql );
$this -> id = $obj -> rowid ;
2018-02-24 16:21:16 +01:00
$this -> entity = $obj -> entity ;
2017-10-07 13:09:31 +02:00
$this -> ref = $obj -> ref ;
$this -> ref_client = $obj -> ref_client ;
$this -> remise = $obj -> remise ;
$this -> remise_percent = $obj -> remise_percent ;
$this -> remise_absolue = $obj -> remise_absolue ;
2021-02-22 18:21:12 +01:00
$this -> total = $obj -> total_ttc ; // TODO deprecated
2021-02-22 21:00:24 +01:00
$this -> total_ttc = $obj -> total_ttc ;
2017-10-07 13:09:31 +02:00
$this -> total_ht = $obj -> total_ht ;
2021-02-19 06:49:24 +01:00
$this -> total_tva = $obj -> total_tva ;
2017-10-07 13:09:31 +02:00
$this -> total_localtax1 = $obj -> localtax1 ;
$this -> total_localtax2 = $obj -> localtax2 ;
2020-02-10 00:22:53 +01:00
$this -> socid = $obj -> fk_soc ;
2020-02-13 12:36:05 +01:00
$this -> thirdparty = null ; // Clear if another value was already set by fetch_thirdparty
2020-02-10 00:22:53 +01:00
$this -> fk_project = $obj -> fk_project ;
2020-02-13 12:36:05 +01:00
$this -> project = null ; // Clear if another value was already set by fetch_projet
2020-02-10 00:22:53 +01:00
2020-08-18 14:48:38 +02:00
$this -> model_pdf = $obj -> model_pdf ;
2020-10-31 14:32:18 +01:00
$this -> modelpdf = $obj -> model_pdf ; // deprecated
2019-11-08 15:51:54 +01:00
$this -> last_main_doc = $obj -> last_main_doc ;
2017-10-07 13:09:31 +02:00
$this -> note = $obj -> note_private ; // TODO deprecated
$this -> note_private = $obj -> note_private ;
$this -> note_public = $obj -> note_public ;
2020-06-24 12:58:10 +02:00
$this -> status = ( int ) $obj -> fk_statut ;
2020-10-31 14:32:18 +01:00
$this -> statut = $this -> status ; // deprecated
2017-10-07 13:09:31 +02:00
$this -> statut_libelle = $obj -> statut_label ;
$this -> datec = $this -> db -> jdate ( $obj -> datec ); // TODO deprecated
$this -> datev = $this -> db -> jdate ( $obj -> datev ); // TODO deprecated
2019-11-08 15:51:54 +01:00
$this -> date_creation = $this -> db -> jdate ( $obj -> datec ); //Creation date
$this -> date_validation = $this -> db -> jdate ( $obj -> datev ); //Validation date
$this -> date_modification = $this -> db -> jdate ( $obj -> date_modification ); // tms
2022-05-17 16:26:43 +02:00
$this -> date_signature = $this -> db -> jdate ( $obj -> dates ); // Signature date
2019-11-08 15:51:54 +01:00
$this -> date = $this -> db -> jdate ( $obj -> dp ); // Proposal date
$this -> datep = $this -> db -> jdate ( $obj -> dp ); // deprecated
2017-10-07 13:09:31 +02:00
$this -> fin_validite = $this -> db -> jdate ( $obj -> dfv );
2020-12-01 02:41:19 +01:00
$this -> date_livraison = $this -> db -> jdate ( $obj -> delivery_date ); // deprecated
2020-11-16 12:20:18 +01:00
$this -> delivery_date = $this -> db -> jdate ( $obj -> delivery_date );
2019-11-08 15:51:54 +01:00
$this -> shipping_method_id = ( $obj -> fk_shipping_method > 0 ) ? $obj -> fk_shipping_method : null ;
2021-01-09 02:45:46 +01:00
$this -> warehouse_id = ( $obj -> fk_warehouse > 0 ) ? $obj -> fk_warehouse : null ;
2017-10-07 13:09:31 +02:00
$this -> availability_id = $obj -> fk_availability ;
$this -> availability_code = $obj -> availability_code ;
$this -> availability = $obj -> availability ;
$this -> demand_reason_id = $obj -> fk_input_reason ;
$this -> demand_reason_code = $obj -> demand_reason_code ;
$this -> demand_reason = $obj -> demand_reason ;
2019-11-08 15:51:54 +01:00
$this -> fk_address = $obj -> fk_delivery_address ;
2017-10-07 13:09:31 +02:00
$this -> mode_reglement_id = $obj -> fk_mode_reglement ;
$this -> mode_reglement_code = $obj -> mode_reglement_code ;
$this -> mode_reglement = $obj -> mode_reglement ;
2019-11-08 15:51:54 +01:00
$this -> fk_account = ( $obj -> fk_account > 0 ) ? $obj -> fk_account : null ;
2017-10-07 13:09:31 +02:00
$this -> cond_reglement_id = $obj -> fk_cond_reglement ;
$this -> cond_reglement_code = $obj -> cond_reglement_code ;
$this -> cond_reglement = $obj -> cond_reglement ;
$this -> cond_reglement_doc = $obj -> cond_reglement_libelle_doc ;
2021-09-29 12:05:38 +02:00
$this -> deposit_percent = $obj -> deposit_percent ;
2017-10-07 13:09:31 +02:00
2019-11-08 15:51:54 +01:00
$this -> extraparams = ( array ) json_decode ( $obj -> extraparams , true );
2017-10-07 13:09:31 +02:00
$this -> user_author_id = $obj -> fk_user_author ;
2021-02-22 21:00:24 +01:00
$this -> user_valid_id = $obj -> fk_user_valid ;
$this -> user_close_id = $obj -> fk_user_cloture ;
2012-03-18 19:23:01 +01:00
2015-02-10 11:46:35 +01:00
//Incoterms
$this -> fk_incoterms = $obj -> fk_incoterms ;
2015-04-12 04:01:28 +02:00
$this -> location_incoterms = $obj -> location_incoterms ;
2019-06-25 13:00:02 +02:00
$this -> label_incoterms = $obj -> label_incoterms ;
2015-04-12 04:01:28 +02:00
2016-01-18 19:45:27 +01:00
// Multicurrency
$this -> fk_multicurrency = $obj -> fk_multicurrency ;
2019-11-08 15:51:54 +01:00
$this -> multicurrency_code = $obj -> multicurrency_code ;
2016-01-18 19:45:27 +01:00
$this -> multicurrency_tx = $obj -> multicurrency_tx ;
2019-11-08 15:51:54 +01:00
$this -> multicurrency_total_ht = $obj -> multicurrency_total_ht ;
2021-02-22 21:00:24 +01:00
$this -> multicurrency_total_tva = $obj -> multicurrency_total_tva ;
$this -> multicurrency_total_ttc = $obj -> multicurrency_total_ttc ;
2016-01-18 19:45:27 +01:00
2021-02-22 18:21:12 +01:00
if ( $obj -> fk_statut == self :: STATUS_DRAFT ) {
2017-10-07 13:09:31 +02:00
$this -> brouillon = 1 ;
}
2012-03-18 19:23:01 +01:00
2020-10-23 20:08:35 +02:00
// Retrieve all extrafield
2017-10-07 13:09:31 +02:00
// fetch optionals attributes and labels
2018-02-20 19:38:18 +01:00
$this -> fetch_optionals ();
2012-03-18 19:23:01 +01:00
2017-10-07 13:09:31 +02:00
$this -> db -> free ( $resql );
2012-03-18 19:23:01 +01:00
2017-10-07 13:09:31 +02:00
$this -> lines = array ();
2012-03-18 19:23:01 +01:00
2020-02-10 00:22:53 +01:00
// Lines
2019-11-08 15:51:54 +01:00
$result = $this -> fetch_lines ();
2021-02-22 21:00:24 +01:00
if ( $result < 0 ) {
2017-10-07 13:09:31 +02:00
return - 3 ;
}
2012-03-18 19:23:01 +01:00
2017-10-07 13:09:31 +02:00
return 1 ;
}
2012-03-18 19:23:01 +01:00
2019-11-08 15:51:54 +01:00
$this -> error = " Record Not Found " ;
2017-10-07 13:09:31 +02:00
return 0 ;
2020-05-21 15:05:19 +02:00
} else {
2019-11-08 15:51:54 +01:00
$this -> error = $this -> db -> lasterror ();
2017-10-07 13:09:31 +02:00
return - 1 ;
}
}
2017-06-09 09:25:15 +02:00
2017-12-01 15:39:18 +01:00
/**
* Update database
*
* @ param User $user User that modify
* @ param int $notrigger 0 = launch triggers after , 1 = disable triggers
* @ return int < 0 if KO , > 0 if OK
*/
2020-10-28 17:49:52 +01:00
public function update ( User $user , $notrigger = 0 )
2017-12-01 15:39:18 +01:00
{
2018-08-12 16:29:26 +02:00
global $conf ;
2019-11-08 15:51:54 +01:00
$error = 0 ;
2017-12-01 15:39:18 +01:00
// Clean parameters
2021-02-23 18:59:19 +01:00
if ( isset ( $this -> ref )) {
$this -> ref = trim ( $this -> ref );
}
if ( isset ( $this -> ref_client )) {
$this -> ref_client = trim ( $this -> ref_client );
}
if ( isset ( $this -> note ) || isset ( $this -> note_private )) {
$this -> note_private = ( isset ( $this -> note_private ) ? trim ( $this -> note_private ) : trim ( $this -> note ));
}
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 );
}
if ( ! empty ( $this -> duree_validite ) && is_numeric ( $this -> duree_validite )) {
$this -> fin_validite = $this -> date + ( $this -> duree_validite * 24 * 3600 );
}
2017-12-01 15:39:18 +01:00
// Check parameters
// Put here code to add control on parameters values
// Update request
$sql = " UPDATE " . MAIN_DB_PREFIX . " propal SET " ;
2019-11-08 15:51:54 +01:00
$sql .= " ref= " . ( isset ( $this -> ref ) ? " ' " . $this -> db -> escape ( $this -> ref ) . " ' " : " null " ) . " , " ;
$sql .= " ref_client= " . ( isset ( $this -> ref_client ) ? " ' " . $this -> db -> escape ( $this -> ref_client ) . " ' " : " null " ) . " , " ;
$sql .= " ref_ext= " . ( isset ( $this -> ref_ext ) ? " ' " . $this -> db -> escape ( $this -> ref_ext ) . " ' " : " null " ) . " , " ;
$sql .= " fk_soc= " . ( isset ( $this -> socid ) ? $this -> socid : " null " ) . " , " ;
2019-12-10 16:16:33 +01:00
$sql .= " datep= " . ( strval ( $this -> date ) != '' ? " ' " . $this -> db -> idate ( $this -> date ) . " ' " : 'null' ) . " , " ;
2021-02-23 18:59:19 +01:00
if ( ! empty ( $this -> fin_validite )) {
$sql .= " fin_validite= " . ( strval ( $this -> fin_validite ) != '' ? " ' " . $this -> db -> idate ( $this -> fin_validite ) . " ' " : 'null' ) . " , " ;
}
2019-11-08 15:51:54 +01:00
$sql .= " date_valid= " . ( strval ( $this -> date_validation ) != '' ? " ' " . $this -> db -> idate ( $this -> date_validation ) . " ' " : 'null' ) . " , " ;
2021-02-19 06:49:24 +01:00
$sql .= " total_tva= " . ( isset ( $this -> total_tva ) ? $this -> total_tva : " null " ) . " , " ;
2019-11-08 15:51:54 +01:00
$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 " ) . " , " ;
2021-02-21 22:07:58 +01:00
$sql .= " total_ttc= " . ( isset ( $this -> total_ttc ) ? $this -> total_ttc : " null " ) . " , " ;
2019-11-08 15:51:54 +01:00
$sql .= " fk_statut= " . ( isset ( $this -> statut ) ? $this -> statut : " null " ) . " , " ;
$sql .= " fk_user_author= " . ( isset ( $this -> user_author_id ) ? $this -> user_author_id : " null " ) . " , " ;
$sql .= " fk_user_valid= " . ( isset ( $this -> user_valid ) ? $this -> user_valid : " null " ) . " , " ;
$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 " ) . " , " ;
2021-10-28 16:53:28 +02:00
$sql .= " deposit_percent= " . ( ! empty ( $this -> deposit_percent ) ? " ' " . $this -> db -> escape ( $this -> deposit_percent ) . " ' " : " null " ) . " , " ;
2019-11-08 15:51:54 +01:00
$sql .= " fk_mode_reglement= " . ( isset ( $this -> mode_reglement_id ) ? $this -> mode_reglement_id : " null " ) . " , " ;
2020-10-22 15:53:55 +02:00
$sql .= " fk_input_reason= " . ( isset ( $this -> demand_reason_id ) ? $this -> demand_reason_id : " null " ) . " , " ;
2019-11-08 15:51:54 +01:00
$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 " ) . " , " ;
2021-02-08 18:30:35 +01:00
$sql .= " model_pdf= " . ( isset ( $this -> model_pdf ) ? " ' " . $this -> db -> escape ( $this -> model_pdf ) . " ' " : " null " ) . " , " ;
2019-11-08 15:51:54 +01:00
$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 );
2017-12-01 15:39:18 +01:00
$this -> db -> begin ();
dol_syslog ( get_class ( $this ) . " ::update " , LOG_DEBUG );
$resql = $this -> db -> query ( $sql );
2019-11-08 15:51:54 +01:00
if ( ! $resql ) {
2021-03-01 20:37:16 +01:00
$error ++ ;
$this -> errors [] = " Error " . $this -> db -> lasterror ();
2017-12-01 15:39:18 +01:00
}
2021-02-23 18:59:19 +01:00
if ( ! $error ) {
2019-11-08 15:51:54 +01:00
$result = $this -> insertExtraFields ();
2021-02-23 18:59:19 +01:00
if ( $result < 0 ) {
2018-08-12 16:29:26 +02:00
$error ++ ;
2017-12-01 15:39:18 +01:00
}
}
2021-02-23 18:59:19 +01:00
if ( ! $error && ! $notrigger ) {
2018-08-12 16:29:26 +02:00
// Call trigger
2019-11-08 15:51:54 +01:00
$result = $this -> call_trigger ( 'PROPAL_MODIFY' , $user );
2021-02-23 18:59:19 +01:00
if ( $result < 0 ) {
$error ++ ;
}
2018-08-12 16:29:26 +02:00
// End call triggers
}
2017-12-01 15:39:18 +01:00
// Commit or rollback
2021-02-23 18:59:19 +01:00
if ( $error ) {
foreach ( $this -> errors as $errmsg ) {
2017-12-01 15:39:18 +01:00
dol_syslog ( get_class ( $this ) . " ::update " . $errmsg , LOG_ERR );
2019-11-08 15:51:54 +01:00
$this -> error .= ( $this -> error ? ', ' . $errmsg : $errmsg );
2017-12-01 15:39:18 +01:00
}
$this -> db -> rollback ();
2019-11-08 15:51:54 +01:00
return - 1 * $error ;
2020-05-21 15:05:19 +02:00
} else {
2017-12-01 15:39:18 +01:00
$this -> db -> commit ();
return 1 ;
}
}
2020-10-28 17:49:52 +01:00
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
2017-04-28 14:33:06 +02:00
/**
* Load array lines
2017-06-09 09:25:15 +02:00
*
2022-01-26 08:50:57 +01:00
* @ param int $only_product Return only physical products
* @ param int $loadalsotranslation Return translation for products
* @ param string $filters Filter on other fields
2019-06-25 18:16:11 +02:00
*
2022-01-26 08:50:57 +01:00
* @ return int < 0 if KO , > 0 if OK
2017-04-28 14:33:06 +02:00
*/
2022-01-26 08:50:57 +01:00
public function fetch_lines ( $only_product = 0 , $loadalsotranslation = 0 , $filters = '' )
2017-04-28 14:33:06 +02:00
{
2020-10-28 17:49:52 +01:00
// phpcs:enable
2022-03-28 13:50:47 +02:00
global $langs , $conf ;
2019-11-08 15:51:54 +01:00
$this -> lines = array ();
2017-06-09 09:25:15 +02:00
2017-09-24 22:55:27 +02:00
$sql = 'SELECT d.rowid, d.fk_propal, d.fk_parent_line, d.label as custom_label, d.description, d.price, d.vat_src_code, d.tva_tx, d.localtax1_tx, d.localtax2_tx, d.localtax1_type, d.localtax2_type, d.qty, d.fk_remise_except, d.remise_percent, d.subprice, d.fk_product,' ;
2019-11-08 15:51:54 +01:00
$sql .= ' d.info_bits, d.total_ht, d.total_tva, d.total_localtax1, d.total_localtax2, d.total_ttc, d.fk_product_fournisseur_price as fk_fournprice, d.buy_price_ht as pa_ht, d.special_code, d.rang, d.product_type,' ;
$sql .= ' d.fk_unit,' ;
2020-11-23 21:38:45 +01:00
$sql .= ' p.ref as product_ref, p.description as product_desc, p.fk_product_type, p.label as product_label, p.tobatch as product_tobatch, p.barcode as product_barcode,' ;
2019-11-08 15:51:54 +01:00
$sql .= ' p.weight, p.weight_units, p.volume, p.volume_units,' ;
$sql .= ' d.date_start, d.date_end,' ;
$sql .= ' d.fk_multicurrency, d.multicurrency_code, d.multicurrency_subprice, d.multicurrency_total_ht, d.multicurrency_total_tva, d.multicurrency_total_ttc' ;
$sql .= ' FROM ' . MAIN_DB_PREFIX . 'propaldet as d' ;
$sql .= ' LEFT JOIN ' . MAIN_DB_PREFIX . 'product as p ON (d.fk_product = p.rowid)' ;
2021-08-27 22:42:04 +02:00
$sql .= ' WHERE d.fk_propal = ' . (( int ) $this -> id );
2021-02-23 18:59:19 +01:00
if ( $only_product ) {
$sql .= ' AND p.fk_product_type = 0' ;
}
2022-01-26 08:50:57 +01:00
if ( $filters ) {
$sql .= $filters ;
}
2019-11-08 15:51:54 +01:00
$sql .= ' ORDER by d.rang' ;
2017-04-28 14:33:06 +02:00
dol_syslog ( get_class ( $this ) . " ::fetch_lines " , LOG_DEBUG );
$result = $this -> db -> query ( $sql );
2021-02-23 18:59:19 +01:00
if ( $result ) {
2017-04-28 14:33:06 +02:00
require_once DOL_DOCUMENT_ROOT . '/core/class/extrafields.class.php' ;
$num = $this -> db -> num_rows ( $result );
2017-06-09 09:25:15 +02:00
2017-04-28 14:33:06 +02:00
$i = 0 ;
2021-02-23 18:59:19 +01:00
while ( $i < $num ) {
2017-04-28 14:33:06 +02:00
$objp = $this -> db -> fetch_object ( $result );
$line = new PropaleLigne ( $this -> db );
2019-11-08 15:51:54 +01:00
$line -> rowid = $objp -> rowid ; //Deprecated
$line -> id = $objp -> rowid ;
$line -> fk_propal = $objp -> fk_propal ;
$line -> fk_parent_line = $objp -> fk_parent_line ;
2017-04-28 14:33:06 +02:00
$line -> product_type = $objp -> product_type ;
$line -> label = $objp -> custom_label ;
2019-11-08 15:51:54 +01:00
$line -> desc = $objp -> description ; // Description ligne
$line -> description = $objp -> description ; // Description ligne
2017-04-28 14:33:06 +02:00
$line -> qty = $objp -> qty ;
2017-05-05 14:49:25 +02:00
$line -> vat_src_code = $objp -> vat_src_code ;
2017-04-28 14:33:06 +02:00
$line -> tva_tx = $objp -> tva_tx ;
$line -> localtax1_tx = $objp -> localtax1_tx ;
$line -> localtax2_tx = $objp -> localtax2_tx ;
2017-09-24 22:55:27 +02:00
$line -> localtax1_type = $objp -> localtax1_type ;
$line -> localtax2_type = $objp -> localtax2_type ;
2017-04-28 14:33:06 +02:00
$line -> subprice = $objp -> subprice ;
$line -> fk_remise_except = $objp -> fk_remise_except ;
$line -> remise_percent = $objp -> remise_percent ;
2019-11-08 15:51:54 +01:00
$line -> price = $objp -> price ; // TODO deprecated
2017-04-28 14:33:06 +02:00
$line -> info_bits = $objp -> info_bits ;
$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 ;
2019-11-08 15:51:54 +01:00
$line -> fk_fournprice = $objp -> fk_fournprice ;
$marginInfos = getMarginInfos ( $objp -> subprice , $objp -> remise_percent , $objp -> tva_tx , $objp -> localtax1_tx , $objp -> localtax2_tx , $line -> fk_fournprice , $objp -> pa_ht );
$line -> pa_ht = $marginInfos [ 0 ];
2017-04-28 14:33:06 +02:00
$line -> marge_tx = $marginInfos [ 1 ];
$line -> marque_tx = $marginInfos [ 2 ];
$line -> special_code = $objp -> special_code ;
$line -> rang = $objp -> rang ;
$line -> fk_product = $objp -> fk_product ;
2019-12-18 15:20:36 +01:00
$line -> ref = $objp -> product_ref ; // deprecated
$line -> libelle = $objp -> product_label ; // deprecated
2020-11-23 21:38:45 +01:00
$line -> product_ref = $objp -> product_ref ;
2019-12-18 15:20:36 +01:00
$line -> product_label = $objp -> product_label ;
$line -> product_desc = $objp -> product_desc ; // Description produit
2018-08-31 13:50:58 +02:00
$line -> product_tobatch = $objp -> product_tobatch ;
2020-11-23 21:38:45 +01:00
$line -> product_barcode = $objp -> product_barcode ;
2019-12-18 15:20:36 +01:00
$line -> fk_product_type = $objp -> fk_product_type ; // deprecated
2017-04-28 14:33:06 +02:00
$line -> fk_unit = $objp -> fk_unit ;
2017-12-26 16:12:28 +01:00
$line -> weight = $objp -> weight ;
$line -> weight_units = $objp -> weight_units ;
$line -> volume = $objp -> volume ;
$line -> volume_units = $objp -> volume_units ;
2017-04-28 14:33:06 +02:00
2019-12-18 15:20:36 +01:00
$line -> date_start = $this -> db -> jdate ( $objp -> date_start );
$line -> date_end = $this -> db -> jdate ( $objp -> date_end );
2017-04-28 14:33:06 +02:00
// Multicurrency
2019-12-18 15:20:36 +01:00
$line -> fk_multicurrency = $objp -> fk_multicurrency ;
$line -> multicurrency_code = $objp -> multicurrency_code ;
2017-04-28 14:33:06 +02:00
$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 -> fetch_optionals ();
2019-06-29 16:29:32 +02:00
2019-06-25 15:47:16 +02:00
// multilangs
2020-10-28 17:49:52 +01:00
if ( ! empty ( $conf -> global -> MAIN_MULTILANGS ) && ! empty ( $objp -> fk_product ) && ! empty ( $loadalsotranslation )) {
2022-05-18 23:52:43 +02:00
$tmpproduct = new Product ( $this -> db );
$tmpproduct -> fetch ( $objp -> fk_product );
$tmpproduct -> getMultiLangs ();
$line -> multilangs = $tmpproduct -> multilangs ;
2020-10-28 17:49:52 +01:00
}
2017-04-28 14:33:06 +02:00
2019-11-08 15:51:54 +01:00
$this -> lines [ $i ] = $line ;
2022-05-18 23:52:43 +02:00
2017-04-28 14:33:06 +02:00
$i ++ ;
}
2017-06-09 09:25:15 +02:00
2017-10-07 13:09:31 +02:00
$this -> db -> free ( $result );
2018-04-14 17:04:38 +02:00
return $num ;
2020-05-21 15:05:19 +02:00
} else {
2019-11-08 15:51:54 +01:00
$this -> error = $this -> db -> lasterror ();
2017-10-07 13:09:31 +02:00
return - 3 ;
}
}
/**
* Set status to validated
*
* @ param User $user Object user that validate
* @ param int $notrigger 1 = Does not execute triggers , 0 = execute triggers
* @ return int < 0 if KO , 0 = Nothing done , >= 0 if OK
*/
2020-10-28 17:49:52 +01:00
public function valid ( $user , $notrigger = 0 )
2017-10-07 13:09:31 +02:00
{
global $conf ;
2019-07-28 22:26:55 +02:00
require_once DOL_DOCUMENT_ROOT . '/core/lib/files.lib.php' ;
2019-11-08 15:51:54 +01:00
$error = 0 ;
2017-10-07 13:09:31 +02:00
// Protection
2021-02-23 18:59:19 +01:00
if ( $this -> statut == self :: STATUS_VALIDATED ) {
2017-10-07 13:09:31 +02:00
dol_syslog ( get_class ( $this ) . " ::valid action abandonned: already validated " , LOG_WARNING );
return 0 ;
}
2019-11-08 15:51:54 +01:00
if ( ! (( empty ( $conf -> global -> MAIN_USE_ADVANCED_PERMS ) && ! empty ( $user -> rights -> propal -> creer ))
2021-02-23 18:59:19 +01:00
|| ( ! empty ( $conf -> global -> MAIN_USE_ADVANCED_PERMS ) && ! empty ( $user -> rights -> propal -> propal_advance -> validate )))) {
2019-11-08 15:51:54 +01:00
$this -> error = 'ErrorPermissionDenied' ;
2017-10-07 13:09:31 +02:00
dol_syslog ( get_class ( $this ) . " ::valid " . $this -> error , LOG_ERR );
return - 1 ;
}
2019-11-08 15:51:54 +01:00
$now = dol_now ();
2017-10-07 13:09:31 +02:00
$this -> db -> begin ();
// Numbering module definition
$soc = new Societe ( $this -> db );
$soc -> fetch ( $this -> socid );
// Define new ref
2021-02-23 18:59:19 +01:00
if ( ! $error && ( preg_match ( '/^[\(]?PROV/i' , $this -> ref ) || empty ( $this -> ref ))) { // empty should not happened, but when it occurs, the test save life
2017-10-07 13:09:31 +02:00
$num = $this -> getNextNumRef ( $soc );
2020-05-21 15:05:19 +02:00
} else {
2017-10-07 13:09:31 +02:00
$num = $this -> ref ;
}
2020-03-03 11:49:17 +01:00
$this -> newref = dol_sanitizeFileName ( $num );
2017-10-07 13:09:31 +02:00
$sql = " UPDATE " . MAIN_DB_PREFIX . " propal " ;
2020-01-07 22:01:55 +01:00
$sql .= " SET ref = ' " . $this -> db -> escape ( $num ) . " ', " ;
2021-08-23 19:33:24 +02:00
$sql .= " fk_statut = " . self :: STATUS_VALIDATED . " , date_valid=' " . $this -> db -> idate ( $now ) . " ', fk_user_valid= " . (( int ) $user -> id );
$sql .= " WHERE rowid = " . (( int ) $this -> id ) . " AND fk_statut = " . self :: STATUS_DRAFT ;
2017-10-07 13:09:31 +02:00
dol_syslog ( get_class ( $this ) . " ::valid " , LOG_DEBUG );
2019-11-08 15:51:54 +01:00
$resql = $this -> db -> query ( $sql );
2021-02-23 18:59:19 +01:00
if ( ! $resql ) {
2017-10-07 13:09:31 +02:00
dol_print_error ( $this -> db );
$error ++ ;
}
// Trigger calls
2021-02-23 18:59:19 +01:00
if ( ! $error && ! $notrigger ) {
2017-10-07 13:09:31 +02:00
// Call trigger
2019-11-08 15:51:54 +01:00
$result = $this -> call_trigger ( 'PROPAL_VALIDATE' , $user );
2021-02-23 18:59:19 +01:00
if ( $result < 0 ) {
$error ++ ;
}
2017-10-07 13:09:31 +02:00
// End call triggers
}
2021-02-23 18:59:19 +01:00
if ( ! $error ) {
2017-10-07 13:09:31 +02:00
$this -> oldref = $this -> ref ;
// Rename directory if dir was a temporary ref
2021-02-23 18:59:19 +01:00
if ( preg_match ( '/^[\(]?PROV/i' , $this -> ref )) {
2019-07-28 22:26:55 +02:00
// Now we rename also files into index
2019-11-08 15:51:54 +01:00
$sql = 'UPDATE ' . MAIN_DB_PREFIX . " ecm_files set filename = CONCAT(' " . $this -> db -> escape ( $this -> newref ) . " ', SUBSTR(filename, " . ( strlen ( $this -> ref ) + 1 ) . " )), filepath = 'propale/ " . $this -> db -> escape ( $this -> newref ) . " ' " ;
2021-08-23 19:33:24 +02:00
$sql .= " WHERE filename LIKE ' " . $this -> db -> escape ( $this -> ref ) . " %' AND filepath = 'propale/ " . $this -> db -> escape ( $this -> ref ) . " ' and entity = " . (( int ) $conf -> entity );
2019-07-28 22:26:55 +02:00
$resql = $this -> db -> query ( $sql );
2021-02-23 18:59:19 +01:00
if ( ! $resql ) {
2021-03-01 20:37:16 +01:00
$error ++ ;
$this -> error = $this -> db -> lasterror ();
2021-02-23 18:59:19 +01:00
}
2019-07-28 22:26:55 +02:00
// We rename directory ($this->ref = old ref, $num = new ref) in order not to lose the attachments
2017-10-07 13:09:31 +02:00
$oldref = dol_sanitizeFileName ( $this -> ref );
$newref = dol_sanitizeFileName ( $num );
2018-02-25 17:43:19 +01:00
$dirsource = $conf -> propal -> multidir_output [ $this -> entity ] . '/' . $oldref ;
$dirdest = $conf -> propal -> multidir_output [ $this -> entity ] . '/' . $newref ;
2021-02-23 18:59:19 +01:00
if ( ! $error && file_exists ( $dirsource )) {
2017-10-07 13:09:31 +02:00
dol_syslog ( get_class ( $this ) . " ::validate rename dir " . $dirsource . " into " . $dirdest );
2021-02-23 18:59:19 +01:00
if ( @ rename ( $dirsource , $dirdest )) {
2017-10-07 13:09:31 +02:00
dol_syslog ( " Rename ok " );
// Rename docs starting with $oldref with $newref
2019-11-08 15:51:54 +01:00
$listoffiles = dol_dir_list ( $dirdest , 'files' , 1 , '^' . preg_quote ( $oldref , '/' ));
2021-02-23 18:59:19 +01:00
foreach ( $listoffiles as $fileentry ) {
2019-11-08 15:51:54 +01:00
$dirsource = $fileentry [ 'name' ];
$dirdest = preg_replace ( '/^' . preg_quote ( $oldref , '/' ) . '/' , $newref , $dirsource );
$dirsource = $fileentry [ 'path' ] . '/' . $dirsource ;
$dirdest = $fileentry [ 'path' ] . '/' . $dirdest ;
2017-10-07 13:09:31 +02:00
@ rename ( $dirsource , $dirdest );
}
}
}
}
2019-11-08 15:51:54 +01:00
$this -> ref = $num ;
$this -> brouillon = 0 ;
2017-10-07 13:09:31 +02:00
$this -> statut = self :: STATUS_VALIDATED ;
2019-11-08 15:51:54 +01:00
$this -> user_valid_id = $user -> id ;
$this -> datev = $now ;
2017-10-07 13:09:31 +02:00
$this -> db -> commit ();
return 1 ;
2020-05-21 15:05:19 +02:00
} else {
2017-10-07 13:09:31 +02:00
$this -> db -> rollback ();
return - 1 ;
}
}
2020-10-28 17:49:52 +01:00
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
2017-10-07 13:09:31 +02:00
/**
* Define proposal date
*
* @ param User $user Object user that modify
* @ param int $date Date
* @ param int $notrigger 1 = Does not execute triggers , 0 = execute triggers
* @ return int < 0 if KO , > 0 if OK
*/
2020-10-28 17:49:52 +01:00
public function set_date ( $user , $date , $notrigger = 0 )
2017-10-07 13:09:31 +02:00
{
2020-10-28 17:49:52 +01:00
// phpcs:enable
2021-02-23 18:59:19 +01:00
if ( empty ( $date )) {
2019-11-08 15:51:54 +01:00
$this -> error = 'ErrorBadParameter' ;
2017-10-07 13:09:31 +02:00
dol_syslog ( get_class ( $this ) . " ::set_date " . $this -> error , LOG_ERR );
return - 1 ;
}
2021-02-23 18:59:19 +01:00
if ( ! empty ( $user -> rights -> propal -> creer )) {
2019-11-08 15:51:54 +01:00
$error = 0 ;
2017-10-07 13:09:31 +02:00
$this -> db -> begin ();
2022-08-23 08:56:00 +02:00
$sql = " UPDATE " . MAIN_DB_PREFIX . " propal SET datep = ' " . $this -> db -> idate ( $date ) . " ' " ;
2023-06-10 09:55:47 +02:00
$sql .= " WHERE rowid = " . (( int ) $this -> id );
2017-10-07 13:09:31 +02:00
dol_syslog ( __METHOD__ , LOG_DEBUG );
2019-11-08 15:51:54 +01:00
$resql = $this -> db -> query ( $sql );
2021-02-23 18:59:19 +01:00
if ( ! $resql ) {
2019-11-08 15:51:54 +01:00
$this -> errors [] = $this -> db -> error ();
2017-10-07 13:09:31 +02:00
$error ++ ;
}
2021-02-23 18:59:19 +01:00
if ( ! $error ) {
2019-11-08 15:51:54 +01:00
$this -> oldcopy = clone $this ;
2017-10-07 13:09:31 +02:00
$this -> date = $date ;
2019-11-08 15:51:54 +01:00
$this -> datep = $date ; // deprecated
2017-10-07 13:09:31 +02:00
}
2021-02-23 18:59:19 +01:00
if ( ! $notrigger && empty ( $error )) {
2017-10-07 13:09:31 +02:00
// Call trigger
2019-11-08 15:51:54 +01:00
$result = $this -> call_trigger ( 'PROPAL_MODIFY' , $user );
2021-02-23 18:59:19 +01:00
if ( $result < 0 ) {
$error ++ ;
}
2017-10-07 13:09:31 +02:00
// End call triggers
}
2021-02-23 18:59:19 +01:00
if ( ! $error ) {
2017-10-07 13:09:31 +02:00
$this -> db -> commit ();
return 1 ;
2020-05-21 15:05:19 +02:00
} else {
2021-02-23 18:59:19 +01:00
foreach ( $this -> errors as $errmsg ) {
2017-10-07 13:09:31 +02:00
dol_syslog ( __METHOD__ . ' Error: ' . $errmsg , LOG_ERR );
2019-11-08 15:51:54 +01:00
$this -> error .= ( $this -> error ? ', ' . $errmsg : $errmsg );
2017-10-07 13:09:31 +02:00
}
$this -> db -> rollback ();
2019-11-08 15:51:54 +01:00
return - 1 * $error ;
2017-10-07 13:09:31 +02:00
}
}
}
2020-10-28 17:49:52 +01:00
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
2017-10-07 13:09:31 +02:00
/**
* Define end validity date
*
* @ param User $user Object user that modify
* @ param int $date_fin_validite End of validity date
* @ param int $notrigger 1 = Does not execute triggers , 0 = execute triggers
* @ return int < 0 if KO , > 0 if OK
*/
2020-10-28 17:49:52 +01:00
public function set_echeance ( $user , $date_fin_validite , $notrigger = 0 )
2017-10-07 13:09:31 +02:00
{
2020-10-28 17:49:52 +01:00
// phpcs:enable
2021-02-23 18:59:19 +01:00
if ( ! empty ( $user -> rights -> propal -> creer )) {
2019-11-08 15:51:54 +01:00
$error = 0 ;
2017-10-07 13:09:31 +02:00
$this -> db -> begin ();
2019-11-08 15:51:54 +01:00
$sql = " UPDATE " . MAIN_DB_PREFIX . " propal SET fin_validite = " . ( $date_fin_validite != '' ? " ' " . $this -> db -> idate ( $date_fin_validite ) . " ' " : 'null' );
2023-06-10 09:55:47 +02:00
$sql .= " WHERE rowid = " . (( int ) $this -> id );
2017-10-07 13:09:31 +02:00
dol_syslog ( __METHOD__ , LOG_DEBUG );
2019-11-08 15:51:54 +01:00
$resql = $this -> db -> query ( $sql );
2021-02-23 18:59:19 +01:00
if ( ! $resql ) {
2019-11-08 15:51:54 +01:00
$this -> errors [] = $this -> db -> error ();
2017-10-07 13:09:31 +02:00
$error ++ ;
}
2021-02-23 18:59:19 +01:00
if ( ! $error ) {
2019-11-08 15:51:54 +01:00
$this -> oldcopy = clone $this ;
2017-10-07 13:09:31 +02:00
$this -> fin_validite = $date_fin_validite ;
}
2021-02-23 18:59:19 +01:00
if ( ! $notrigger && empty ( $error )) {
2017-10-07 13:09:31 +02:00
// Call trigger
2019-11-08 15:51:54 +01:00
$result = $this -> call_trigger ( 'PROPAL_MODIFY' , $user );
2021-02-23 18:59:19 +01:00
if ( $result < 0 ) {
$error ++ ;
}
2017-10-07 13:09:31 +02:00
// End call triggers
}
2021-02-23 18:59:19 +01:00
if ( ! $error ) {
2017-10-07 13:09:31 +02:00
$this -> db -> commit ();
return 1 ;
2020-05-21 15:05:19 +02:00
} else {
2021-02-23 18:59:19 +01:00
foreach ( $this -> errors as $errmsg ) {
2017-10-07 13:09:31 +02:00
dol_syslog ( __METHOD__ . ' Error: ' . $errmsg , LOG_ERR );
2019-11-08 15:51:54 +01:00
$this -> error .= ( $this -> error ? ', ' . $errmsg : $errmsg );
2017-10-07 13:09:31 +02:00
}
$this -> db -> rollback ();
2019-11-08 15:51:54 +01:00
return - 1 * $error ;
2017-10-07 13:09:31 +02:00
}
}
}
2020-10-26 16:50:52 +01:00
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
2017-10-07 13:09:31 +02:00
/**
* Set delivery date
*
* @ param User $user Object user that modify
2020-10-26 16:50:52 +01:00
* @ param int $delivery_date Delivery date
2017-10-07 13:09:31 +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
* @ deprecated Use setDeliveryDate
2017-10-07 13:09:31 +02:00
*/
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-10-31 14:32:18 +01:00
/**
2017-10-07 13:09:31 +02:00
* Set delivery date
*
* @ param User $user Object user that modify
2020-10-06 11:37:55 +02:00
* @ param int $delivery_date Delivery date
2017-10-07 13:09:31 +02:00
* @ param int $notrigger 1 = Does not execute triggers , 0 = execute triggers
* @ return int < 0 if ko , > 0 if ok
*/
2020-10-31 14:32:18 +01:00
public function setDeliveryDate ( $user , $delivery_date , $notrigger = 0 )
2017-10-07 13:09:31 +02:00
{
2021-02-23 18:59:19 +01:00
if ( ! empty ( $user -> rights -> propal -> creer )) {
2019-11-08 15:51:54 +01:00
$error = 0 ;
2017-10-07 13:09:31 +02:00
$this -> db -> begin ();
$sql = " UPDATE " . MAIN_DB_PREFIX . " propal " ;
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 );
2017-10-07 13:09:31 +02:00
dol_syslog ( __METHOD__ , LOG_DEBUG );
2019-11-08 15:51:54 +01:00
$resql = $this -> db -> query ( $sql );
2021-02-23 18:59:19 +01:00
if ( ! $resql ) {
2019-11-08 15:51:54 +01:00
$this -> errors [] = $this -> db -> error ();
2017-10-07 13:09:31 +02:00
$error ++ ;
}
2021-02-23 18:59:19 +01:00
if ( ! $error ) {
2019-11-08 15:51:54 +01:00
$this -> oldcopy = clone $this ;
2020-10-06 11:37:55 +02:00
$this -> date_livraison = $delivery_date ;
2020-11-16 12:20:18 +01:00
$this -> delivery_date = $delivery_date ;
2017-10-07 13:09:31 +02:00
}
2021-02-23 18:59:19 +01:00
if ( ! $notrigger && empty ( $error )) {
2017-10-07 13:09:31 +02:00
// Call trigger
2019-11-08 15:51:54 +01:00
$result = $this -> call_trigger ( 'PROPAL_MODIFY' , $user );
2021-02-23 18:59:19 +01:00
if ( $result < 0 ) {
$error ++ ;
}
2017-10-07 13:09:31 +02:00
// End call triggers
}
2021-02-23 18:59:19 +01:00
if ( ! $error ) {
2017-10-07 13:09:31 +02:00
$this -> db -> commit ();
return 1 ;
2020-05-21 15:05:19 +02:00
} else {
2021-02-23 18:59:19 +01:00
foreach ( $this -> errors as $errmsg ) {
2017-10-07 13:09:31 +02:00
dol_syslog ( __METHOD__ . ' Error: ' . $errmsg , LOG_ERR );
2019-11-08 15:51:54 +01:00
$this -> error .= ( $this -> error ? ', ' . $errmsg : $errmsg );
2017-10-07 13:09:31 +02:00
}
$this -> db -> rollback ();
2019-11-08 15:51:54 +01:00
return - 1 * $error ;
2017-10-07 13:09:31 +02:00
}
}
}
2020-10-28 17:49:52 +01:00
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
2017-10-07 13:09:31 +02:00
/**
* Set delivery
*
* @ param User $user Object user that modify
* @ param int $id Availability id
* @ param int $notrigger 1 = Does not execute triggers , 0 = execute triggers
* @ return int < 0 if KO , > 0 if OK
*/
2020-10-31 14:32:18 +01:00
public function set_availability ( $user , $id , $notrigger = 0 )
2017-10-07 13:09:31 +02:00
{
2020-10-31 14:32:18 +01:00
// phpcs:enable
2021-02-23 18:59:19 +01:00
if ( ! empty ( $user -> rights -> propal -> creer ) && $this -> statut >= self :: STATUS_DRAFT ) {
2019-11-08 15:51:54 +01:00
$error = 0 ;
2017-10-07 13:09:31 +02:00
$this -> db -> begin ();
2021-08-23 19:33:24 +02:00
$sql = " UPDATE " . MAIN_DB_PREFIX . " propal " ;
$sql .= " SET fk_availability = " . (( int ) $id );
$sql .= " WHERE rowid = " . (( int ) $this -> id );
2017-10-07 13:09:31 +02:00
2017-12-06 23:21:58 +01:00
dol_syslog ( __METHOD__ . ' availability(' . $id . ')' , LOG_DEBUG );
2019-11-08 15:51:54 +01:00
$resql = $this -> db -> query ( $sql );
2021-02-23 18:59:19 +01:00
if ( ! $resql ) {
2019-11-08 15:51:54 +01:00
$this -> errors [] = $this -> db -> error ();
2017-10-07 13:09:31 +02:00
$error ++ ;
}
2021-02-23 18:59:19 +01:00
if ( ! $error ) {
2019-11-08 15:51:54 +01:00
$this -> oldcopy = clone $this ;
2017-10-07 13:09:31 +02:00
$this -> fk_availability = $id ;
$this -> availability_id = $id ;
}
2021-02-23 18:59:19 +01:00
if ( ! $notrigger && empty ( $error )) {
2017-10-07 13:09:31 +02:00
// Call trigger
2019-11-08 15:51:54 +01:00
$result = $this -> call_trigger ( 'PROPAL_MODIFY' , $user );
2021-02-23 18:59:19 +01:00
if ( $result < 0 ) {
$error ++ ;
}
2017-10-07 13:09:31 +02:00
// End call triggers
}
2021-02-23 18:59:19 +01:00
if ( ! $error ) {
2017-10-07 13:09:31 +02:00
$this -> db -> commit ();
return 1 ;
2020-05-21 15:05:19 +02:00
} else {
2021-02-23 18:59:19 +01:00
foreach ( $this -> errors as $errmsg ) {
2017-10-07 13:09:31 +02:00
dol_syslog ( __METHOD__ . ' Error: ' . $errmsg , LOG_ERR );
2019-11-08 15:51:54 +01:00
$this -> error .= ( $this -> error ? ', ' . $errmsg : $errmsg );
2017-10-07 13:09:31 +02:00
}
$this -> db -> rollback ();
2019-11-08 15:51:54 +01:00
return - 1 * $error ;
2017-10-07 13:09:31 +02:00
}
2020-05-21 15:05:19 +02:00
} else {
2019-11-08 15:51:54 +01:00
$error_str = 'Propal status do not meet requirement ' . $this -> statut ;
2017-10-07 13:09:31 +02:00
dol_syslog ( __METHOD__ . $error_str , LOG_ERR );
2019-11-08 15:51:54 +01:00
$this -> error = $error_str ;
$this -> errors [] = $this -> error ;
2017-10-07 13:09:31 +02:00
return - 2 ;
}
}
2020-10-28 17:49:52 +01:00
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
2017-10-07 13:09:31 +02:00
/**
* Set source of demand
*
* @ param User $user Object user that modify
* @ param int $id Input reason id
* @ param int $notrigger 1 = Does not execute triggers , 0 = execute triggers
* @ return int < 0 if KO , > 0 if OK
*/
2020-10-31 14:32:18 +01:00
public function set_demand_reason ( $user , $id , $notrigger = 0 )
2017-10-07 13:09:31 +02:00
{
2020-10-31 14:32:18 +01:00
// phpcs:enable
2021-02-23 18:59:19 +01:00
if ( ! empty ( $user -> rights -> propal -> creer ) && $this -> statut >= self :: STATUS_DRAFT ) {
2019-11-08 15:51:54 +01:00
$error = 0 ;
2017-10-07 13:09:31 +02:00
$this -> db -> begin ();
$sql = " UPDATE " . MAIN_DB_PREFIX . " propal " ;
2021-03-30 03:37:54 +02:00
$sql .= " SET fk_input_reason = " . (( int ) $id );
2021-08-23 19:33:24 +02:00
$sql .= " WHERE rowid = " . (( int ) $this -> id );
2017-10-07 13:09:31 +02:00
dol_syslog ( __METHOD__ , LOG_DEBUG );
2019-11-08 15:51:54 +01:00
$resql = $this -> db -> query ( $sql );
2021-02-23 18:59:19 +01:00
if ( ! $resql ) {
2019-11-08 15:51:54 +01:00
$this -> errors [] = $this -> db -> error ();
2017-10-07 13:09:31 +02:00
$error ++ ;
}
2021-02-23 18:59:19 +01:00
if ( ! $error ) {
2019-11-08 15:51:54 +01:00
$this -> oldcopy = clone $this ;
2017-10-07 13:09:31 +02:00
$this -> fk_input_reason = $id ;
$this -> demand_reason_id = $id ;
}
2021-02-23 18:59:19 +01:00
if ( ! $notrigger && empty ( $error )) {
2017-10-07 13:09:31 +02:00
// Call trigger
2019-11-08 15:51:54 +01:00
$result = $this -> call_trigger ( 'PROPAL_MODIFY' , $user );
2021-02-23 18:59:19 +01:00
if ( $result < 0 ) {
$error ++ ;
}
2017-10-07 13:09:31 +02:00
// End call triggers
}
2021-02-23 18:59:19 +01:00
if ( ! $error ) {
2017-10-07 13:09:31 +02:00
$this -> db -> commit ();
return 1 ;
2020-05-21 15:05:19 +02:00
} else {
2021-02-23 18:59:19 +01:00
foreach ( $this -> errors as $errmsg ) {
2017-10-07 13:09:31 +02:00
dol_syslog ( __METHOD__ . ' Error: ' . $errmsg , LOG_ERR );
2019-11-08 15:51:54 +01:00
$this -> error .= ( $this -> error ? ', ' . $errmsg : $errmsg );
2017-10-07 13:09:31 +02:00
}
$this -> db -> rollback ();
2019-11-08 15:51:54 +01:00
return - 1 * $error ;
2017-10-07 13:09:31 +02:00
}
2020-05-21 15:05:19 +02:00
} else {
2019-11-08 15:51:54 +01:00
$error_str = 'Propal status do not meet requirement ' . $this -> statut ;
2017-10-07 13:09:31 +02:00
dol_syslog ( __METHOD__ . $error_str , LOG_ERR );
2019-11-08 15:51:54 +01:00
$this -> error = $error_str ;
$this -> errors [] = $this -> error ;
2017-10-07 13:09:31 +02:00
return - 2 ;
}
}
2020-10-28 17:49:52 +01:00
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
2017-10-07 13:09:31 +02:00
/**
* Set customer reference number
*
* @ param User $user Object user that modify
* @ param string $ref_client Customer reference
* @ param int $notrigger 1 = Does not execute triggers , 0 = execute triggers
* @ return int < 0 if ko , > 0 if ok
*/
2020-10-31 14:32:18 +01:00
public function set_ref_client ( $user , $ref_client , $notrigger = 0 )
2017-10-07 13:09:31 +02:00
{
2020-10-31 14:32:18 +01:00
// phpcs:enable
2021-02-23 18:59:19 +01:00
if ( ! empty ( $user -> rights -> propal -> creer )) {
2019-11-08 15:51:54 +01:00
$error = 0 ;
2017-10-07 13:09:31 +02:00
$this -> db -> begin ();
2021-08-27 23:36:06 +02:00
$sql = " UPDATE " . MAIN_DB_PREFIX . " propal SET ref_client = " . ( empty ( $ref_client ) ? 'NULL' : " ' " . $this -> db -> escape ( $ref_client ) . " ' " );
$sql .= " WHERE rowid = " . (( int ) $this -> id );
2017-10-07 13:09:31 +02:00
dol_syslog ( __METHOD__ . ' $this->id=' . $this -> id . ', ref_client=' . $ref_client , LOG_DEBUG );
2019-11-08 15:51:54 +01:00
$resql = $this -> db -> query ( $sql );
2021-02-23 18:59:19 +01:00
if ( ! $resql ) {
2019-11-08 15:51:54 +01:00
$this -> errors [] = $this -> db -> error ();
2017-10-07 13:09:31 +02:00
$error ++ ;
}
2021-02-23 18:59:19 +01:00
if ( ! $error ) {
2019-11-08 15:51:54 +01:00
$this -> oldcopy = clone $this ;
2017-10-07 13:09:31 +02:00
$this -> ref_client = $ref_client ;
}
2021-02-23 18:59:19 +01:00
if ( ! $notrigger && empty ( $error )) {
2017-10-07 13:09:31 +02:00
// Call trigger
2019-11-08 15:51:54 +01:00
$result = $this -> call_trigger ( 'PROPAL_MODIFY' , $user );
2021-02-23 18:59:19 +01:00
if ( $result < 0 ) {
$error ++ ;
}
2017-10-07 13:09:31 +02:00
// End call triggers
}
2021-02-23 18:59:19 +01:00
if ( ! $error ) {
2017-10-07 13:09:31 +02:00
$this -> db -> commit ();
return 1 ;
2020-05-21 15:05:19 +02:00
} else {
2021-02-23 18:59:19 +01:00
foreach ( $this -> errors as $errmsg ) {
2017-10-07 13:09:31 +02:00
dol_syslog ( __METHOD__ . ' Error: ' . $errmsg , LOG_ERR );
2019-11-08 15:51:54 +01:00
$this -> error .= ( $this -> error ? ', ' . $errmsg : $errmsg );
2017-10-07 13:09:31 +02:00
}
$this -> db -> rollback ();
2019-11-08 15:51:54 +01:00
return - 1 * $error ;
2017-10-07 13:09:31 +02:00
}
2020-05-21 15:05:19 +02:00
} else {
2017-10-07 13:09:31 +02:00
return - 1 ;
}
}
2020-10-28 17:49:52 +01:00
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
2017-10-07 13:09:31 +02:00
/**
* Set an overall discount on the proposal
*
* @ param User $user Object user that modify
* @ param double $remise Amount discount
* @ param int $notrigger 1 = Does not execute triggers , 0 = execute triggers
* @ return int < 0 if ko , > 0 if ok
*/
2020-10-31 14:32:18 +01:00
public function set_remise_percent ( $user , $remise , $notrigger = 0 )
2017-10-07 13:09:31 +02:00
{
2020-10-31 14:32:18 +01:00
// phpcs:enable
2019-11-08 15:51:54 +01:00
$remise = trim ( $remise ) ? trim ( $remise ) : 0 ;
2017-10-07 13:09:31 +02:00
2021-02-23 18:59:19 +01:00
if ( ! empty ( $user -> rights -> propal -> creer )) {
2021-03-30 03:37:54 +02:00
$remise = price2num ( $remise , 2 );
2017-10-07 13:09:31 +02:00
2019-11-08 15:51:54 +01:00
$error = 0 ;
2017-10-07 13:09:31 +02:00
$this -> db -> begin ();
2021-03-30 03:37:54 +02:00
$sql = " UPDATE " . MAIN_DB_PREFIX . " propal SET remise_percent = " . (( float ) $remise );
2021-08-23 19:33:24 +02:00
$sql .= " WHERE rowid = " . (( int ) $this -> id ) . " AND fk_statut = " . self :: STATUS_DRAFT ;
2017-10-07 13:09:31 +02:00
dol_syslog ( __METHOD__ , LOG_DEBUG );
2019-11-08 15:51:54 +01:00
$resql = $this -> db -> query ( $sql );
2021-02-23 18:59:19 +01:00
if ( ! $resql ) {
2019-11-08 15:51:54 +01:00
$this -> errors [] = $this -> db -> error ();
2017-10-07 13:09:31 +02:00
$error ++ ;
}
2021-02-23 18:59:19 +01:00
if ( ! $error ) {
2019-11-08 15:51:54 +01:00
$this -> oldcopy = clone $this ;
2017-10-07 13:09:31 +02:00
$this -> remise_percent = $remise ;
$this -> update_price ( 1 );
}
2021-02-23 18:59:19 +01:00
if ( ! $notrigger && empty ( $error )) {
2017-10-07 13:09:31 +02:00
// Call trigger
2019-11-08 15:51:54 +01:00
$result = $this -> call_trigger ( 'PROPAL_MODIFY' , $user );
2021-02-23 18:59:19 +01:00
if ( $result < 0 ) {
$error ++ ;
}
2017-10-07 13:09:31 +02:00
// End call triggers
}
2021-02-23 18:59:19 +01:00
if ( ! $error ) {
2017-10-07 13:09:31 +02:00
$this -> db -> commit ();
return 1 ;
2020-05-21 15:05:19 +02:00
} else {
2021-02-23 18:59:19 +01:00
foreach ( $this -> errors as $errmsg ) {
2017-10-07 13:09:31 +02:00
dol_syslog ( __METHOD__ . ' Error: ' . $errmsg , LOG_ERR );
2019-11-08 15:51:54 +01:00
$this -> error .= ( $this -> error ? ', ' . $errmsg : $errmsg );
2017-10-07 13:09:31 +02:00
}
$this -> db -> rollback ();
2019-11-08 15:51:54 +01:00
return - 1 * $error ;
2017-10-07 13:09:31 +02:00
}
}
}
2020-10-28 17:49:52 +01:00
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
2017-10-07 13:09:31 +02:00
/**
* Set an absolute overall discount on the proposal
*
* @ param User $user Object user that modify
* @ param double $remise Amount discount
* @ param int $notrigger 1 = Does not execute triggers , 0 = execute triggers
* @ return int < 0 if ko , > 0 if ok
*/
2020-10-31 14:32:18 +01:00
public function set_remise_absolue ( $user , $remise , $notrigger = 0 )
2017-10-07 13:09:31 +02:00
{
2020-10-31 14:32:18 +01:00
// phpcs:enable
2021-03-30 03:37:54 +02:00
if ( empty ( $remise )) {
$remise = 0 ;
}
$remise = price2num ( $remise );
2017-10-07 13:09:31 +02:00
2021-02-23 18:59:19 +01:00
if ( ! empty ( $user -> rights -> propal -> creer )) {
2019-11-08 15:51:54 +01:00
$error = 0 ;
2017-10-07 13:09:31 +02:00
$this -> db -> begin ();
2021-03-30 03:37:54 +02:00
$sql = " UPDATE " . MAIN_DB_PREFIX . " propal " ;
$sql .= " SET remise_absolue = " . (( float ) $remise );
2021-08-23 19:33:24 +02:00
$sql .= " WHERE rowid = " . (( int ) $this -> id ) . " AND fk_statut = " . self :: STATUS_DRAFT ;
2017-10-07 13:09:31 +02:00
dol_syslog ( __METHOD__ , LOG_DEBUG );
2019-11-08 15:51:54 +01:00
$resql = $this -> db -> query ( $sql );
2021-02-23 18:59:19 +01:00
if ( ! $resql ) {
2019-11-08 15:51:54 +01:00
$this -> errors [] = $this -> db -> error ();
2017-10-07 13:09:31 +02:00
$error ++ ;
}
2021-02-23 18:59:19 +01:00
if ( ! $error ) {
2019-11-08 15:51:54 +01:00
$this -> oldcopy = clone $this ;
2017-10-07 13:09:31 +02:00
$this -> update_price ( 1 );
}
2021-02-23 18:59:19 +01:00
if ( ! $notrigger && empty ( $error )) {
2017-10-07 13:09:31 +02:00
// Call trigger
2019-11-08 15:51:54 +01:00
$result = $this -> call_trigger ( 'PROPAL_MODIFY' , $user );
2021-02-23 18:59:19 +01:00
if ( $result < 0 ) {
$error ++ ;
}
2017-10-07 13:09:31 +02:00
// End call triggers
}
2021-02-23 18:59:19 +01:00
if ( ! $error ) {
2017-10-07 13:09:31 +02:00
$this -> db -> commit ();
return 1 ;
2020-05-21 15:05:19 +02:00
} else {
2021-02-23 18:59:19 +01:00
foreach ( $this -> errors as $errmsg ) {
2017-10-07 13:09:31 +02:00
dol_syslog ( __METHOD__ . ' Error: ' . $errmsg , LOG_ERR );
2019-11-08 15:51:54 +01:00
$this -> error .= ( $this -> error ? ', ' . $errmsg : $errmsg );
2017-10-07 13:09:31 +02:00
}
$this -> db -> rollback ();
2019-11-08 15:51:54 +01:00
return - 1 * $error ;
2017-10-07 13:09:31 +02:00
}
}
}
/**
* Reopen the commercial proposal
*
* @ param User $user Object user that close
2021-03-30 03:37:54 +02:00
* @ param int $status Status
2017-10-07 13:09:31 +02:00
* @ param string $note Comment
* @ param int $notrigger 1 = Does not execute triggers , 0 = execute triggers
* @ return int < 0 if KO , > 0 if OK
*/
2021-03-30 03:37:54 +02:00
public function reopen ( $user , $status , $note = '' , $notrigger = 0 )
2017-10-07 13:09:31 +02:00
{
2019-11-08 15:51:54 +01:00
$error = 0 ;
2017-10-07 13:09:31 +02:00
$sql = " UPDATE " . MAIN_DB_PREFIX . " propal " ;
2021-06-09 15:36:47 +02:00
$sql .= " SET fk_statut = " . (( int ) $status ) . " , " ;
2021-02-23 18:59:19 +01:00
if ( ! empty ( $note )) {
$sql .= " note_private = ' " . $this -> db -> escape ( $note ) . " ', " ;
}
2019-11-08 15:51:54 +01:00
$sql .= " date_cloture=NULL, fk_user_cloture=NULL " ;
2021-06-09 15:36:47 +02:00
$sql .= " WHERE rowid = " . (( int ) $this -> id );
2017-10-07 13:09:31 +02:00
$this -> db -> begin ();
dol_syslog ( get_class ( $this ) . " ::reopen " , LOG_DEBUG );
$resql = $this -> db -> query ( $sql );
2019-11-08 15:51:54 +01:00
if ( ! $resql ) {
2021-03-01 20:37:16 +01:00
$error ++ ;
$this -> errors [] = " Error " . $this -> db -> lasterror ();
2017-10-07 13:09:31 +02:00
}
2021-02-23 18:59:19 +01:00
if ( ! $error ) {
if ( ! $notrigger ) {
2017-10-07 13:09:31 +02:00
// Call trigger
2019-11-08 15:51:54 +01:00
$result = $this -> call_trigger ( 'PROPAL_REOPEN' , $user );
2021-02-23 18:59:19 +01:00
if ( $result < 0 ) {
$error ++ ;
}
2017-10-07 13:09:31 +02:00
// End call triggers
}
}
// Commit or rollback
2021-02-23 18:59:19 +01:00
if ( $error ) {
if ( ! empty ( $this -> errors )) {
foreach ( $this -> errors as $errmsg ) {
2017-10-07 13:09:31 +02:00
dol_syslog ( get_class ( $this ) . " ::update " . $errmsg , LOG_ERR );
2019-11-08 15:51:54 +01:00
$this -> error .= ( $this -> error ? ', ' . $errmsg : $errmsg );
2017-10-07 13:09:31 +02:00
}
}
$this -> db -> rollback ();
2019-11-08 15:51:54 +01:00
return - 1 * $error ;
2020-05-21 15:05:19 +02:00
} else {
2021-03-30 03:37:54 +02:00
$this -> statut = $status ;
$this -> status = $status ;
2017-10-07 13:09:31 +02:00
$this -> db -> commit ();
return 1 ;
}
}
2021-03-26 17:44:41 +01:00
/**
2021-04-13 19:38:55 +02:00
* Close / set the commercial proposal to status signed or refused ( fill also date signature )
2021-03-26 17:44:41 +01:00
*
* @ param User $user Object user that close
2021-04-13 19:38:55 +02:00
* @ param int $status Status ( self :: STATUS_BILLED or self :: STATUS_REFUSED )
2021-03-26 17:44:41 +01:00
* @ param string $note Complete private note with this note
* @ param int $notrigger 1 = Does not execute triggers , 0 = Execute triggers
* @ return int < 0 if KO , > 0 if OK
*/
2021-04-13 19:38:55 +02:00
public function closeProposal ( $user , $status , $note = '' , $notrigger = 0 )
2021-03-26 17:44:41 +01:00
{
global $langs , $conf ;
$error = 0 ;
$now = dol_now ();
$this -> db -> begin ();
$newprivatenote = dol_concatdesc ( $this -> note_private , $note );
$sql = " UPDATE " . MAIN_DB_PREFIX . " propal " ;
2021-04-13 19:38:55 +02:00
$sql .= " SET fk_statut = " . (( int ) $status ) . " , note_private = ' " . $this -> db -> escape ( $newprivatenote ) . " ', date_signature=' " . $this -> db -> idate ( $now ) . " ', fk_user_signature= " . $user -> id ;
2021-08-23 19:33:24 +02:00
$sql .= " WHERE rowid = " . (( int ) $this -> id );
2021-03-26 17:44:41 +01:00
$resql = $this -> db -> query ( $sql );
if ( $resql ) {
2021-04-13 19:38:55 +02:00
// Status self::STATUS_REFUSED by default
2021-06-29 16:26:48 +02:00
$modelpdf = ! empty ( $conf -> global -> PROPALE_ADDON_PDF_ODT_CLOSED ) ? $conf -> global -> PROPALE_ADDON_PDF_ODT_CLOSED : $this -> model_pdf ;
2021-03-26 17:44:41 +01:00
$trigger_name = 'PROPAL_CLOSE_REFUSED' ;
2021-04-13 19:38:55 +02:00
if ( $status == self :: STATUS_SIGNED ) { // Status self::STATUS_SIGNED
2021-03-26 17:44:41 +01:00
$trigger_name = 'PROPAL_CLOSE_SIGNED' ;
2021-06-29 16:26:48 +02:00
$modelpdf = ! empty ( $conf -> global -> PROPALE_ADDON_PDF_ODT_TOBILL ) ? $conf -> global -> PROPALE_ADDON_PDF_ODT_TOBILL : $this -> model_pdf ;
2021-03-26 17:44:41 +01:00
// The connected company is classified as a client
$soc = new Societe ( $this -> db );
$soc -> id = $this -> socid ;
$result = $soc -> set_as_client ();
if ( $result < 0 ) {
$this -> error = $this -> db -> lasterror ();
$this -> db -> rollback ();
return - 2 ;
}
}
if ( empty ( $conf -> global -> MAIN_DISABLE_PDF_AUTOUPDATE )) {
// Define output language
$outputlangs = $langs ;
if ( ! empty ( $conf -> global -> MAIN_MULTILANGS )) {
$outputlangs = new Translate ( " " , $conf );
2021-03-26 17:59:16 +01:00
$newlang = ( GETPOST ( 'lang_id' , 'aZ09' ) ? GETPOST ( 'lang_id' , 'aZ09' ) : $this -> thirdparty -> default_lang );
2021-03-26 17:44:41 +01:00
$outputlangs -> setDefaultLang ( $newlang );
}
2021-10-18 12:12:00 +02:00
// PDF
$hidedetails = ( ! empty ( $conf -> global -> MAIN_GENERATE_DOCUMENTS_HIDE_DETAILS ) ? 1 : 0 );
$hidedesc = ( ! empty ( $conf -> global -> MAIN_GENERATE_DOCUMENTS_HIDE_DESC ) ? 1 : 0 );
$hideref = ( ! empty ( $conf -> global -> MAIN_GENERATE_DOCUMENTS_HIDE_REF ) ? 1 : 0 );
2021-03-26 17:44:41 +01:00
//$ret=$object->fetch($id); // Reload to get new records
2021-10-18 12:12:00 +02:00
$this -> generateDocument ( $modelpdf , $outputlangs , $hidedetails , $hidedesc , $hideref );
2021-03-26 17:44:41 +01:00
}
if ( ! $error ) {
$this -> oldcopy = clone $this ;
2021-04-13 19:38:55 +02:00
$this -> statut = $status ;
$this -> status = $status ;
2021-03-26 17:44:41 +01:00
$this -> date_signature = $now ;
$this -> note_private = $newprivatenote ;
}
if ( ! $notrigger && empty ( $error )) {
// Call trigger
$result = $this -> call_trigger ( $trigger_name , $user );
if ( $result < 0 ) {
$error ++ ;
}
// End call triggers
}
if ( ! $error ) {
$this -> db -> commit ();
return 1 ;
} else {
$this -> statut = $this -> oldcopy -> statut ;
2021-04-13 19:38:55 +02:00
$this -> status = $this -> oldcopy -> statut ;
2021-03-26 17:44:41 +01:00
$this -> date_signature = $this -> oldcopy -> date_signature ;
$this -> note_private = $this -> oldcopy -> note_private ;
$this -> db -> rollback ();
return - 1 ;
}
} else {
2021-04-13 19:38:55 +02:00
$this -> error = $this -> db -> lasterror ();
2021-03-26 17:44:41 +01:00
$this -> db -> rollback ();
return - 1 ;
}
}
2017-10-07 13:09:31 +02:00
/**
2021-04-13 19:38:55 +02:00
* Classify the proposal to status Billed
2017-10-07 13:09:31 +02:00
*
2021-04-13 19:38:55 +02:00
* @ param User $user Object user
* @ param int $notrigger 1 = Does not execute triggers , 0 = execute triggers
2017-10-18 11:23:16 +02:00
* @ param string $note Complete private note with this note
2021-04-13 19:38:55 +02:00
* @ return int < 0 if KO , 0 = nothing done , > 0 if OK
2017-10-07 13:09:31 +02:00
*/
2021-04-13 19:38:55 +02:00
public function classifyBilled ( User $user , $notrigger = 0 , $note = '' )
2017-10-07 13:09:31 +02:00
{
2021-04-13 19:38:55 +02:00
global $conf , $langs ;
2017-10-07 13:09:31 +02:00
2019-11-08 15:51:54 +01:00
$error = 0 ;
2021-04-13 19:38:55 +02:00
2019-11-08 15:51:54 +01:00
$now = dol_now ();
2021-04-13 19:38:55 +02:00
$num = 0 ;
$triggerName = 'PROPAL_CLASSIFY_BILLED' ;
2017-10-07 13:09:31 +02:00
$this -> db -> begin ();
2017-10-18 11:23:16 +02:00
$newprivatenote = dol_concatdesc ( $this -> note_private , $note );
2021-04-13 19:38:55 +02:00
$sql = 'UPDATE ' . MAIN_DB_PREFIX . 'propal SET fk_statut = ' . self :: STATUS_BILLED . " , " ;
2021-08-27 23:36:06 +02:00
$sql .= " note_private = ' " . $this -> db -> escape ( $newprivatenote ) . " ', date_cloture=' " . $this -> db -> idate ( $now ) . " ', fk_user_cloture= " . (( int ) $user -> id );
$sql .= ' WHERE rowid = ' . (( int ) $this -> id ) . ' AND fk_statut = ' . (( int ) self :: STATUS_SIGNED );
2017-10-07 13:09:31 +02:00
2021-04-13 19:38:55 +02:00
dol_syslog ( __METHOD__ , LOG_DEBUG );
2019-11-08 15:51:54 +01:00
$resql = $this -> db -> query ( $sql );
2021-04-13 19:38:55 +02:00
if ( ! $resql ) {
$this -> errors [] = $this -> db -> error ();
$error ++ ;
} else {
$num = $this -> db -> affected_rows ( $resql );
}
2017-10-07 13:09:31 +02:00
2021-04-13 19:38:55 +02:00
if ( ! $error ) {
$modelpdf = $conf -> global -> PROPALE_ADDON_PDF_ODT_CLOSED ? $conf -> global -> PROPALE_ADDON_PDF_ODT_CLOSED : $this -> model_pdf ;
2017-10-07 13:09:31 +02:00
2021-02-23 18:59:19 +01:00
if ( empty ( $conf -> global -> MAIN_DISABLE_PDF_AUTOUPDATE )) {
2018-10-08 18:15:46 +02:00
// Define output language
$outputlangs = $langs ;
2021-02-23 18:59:19 +01:00
if ( ! empty ( $conf -> global -> MAIN_MULTILANGS )) {
2019-01-27 11:55:16 +01:00
$outputlangs = new Translate ( " " , $conf );
2019-11-08 15:51:54 +01:00
$newlang = ( GETPOST ( 'lang_id' , 'aZ09' ) ? GETPOST ( 'lang_id' , 'aZ09' ) : $this -> thirdparty -> default_lang );
2018-10-08 18:15:46 +02:00
$outputlangs -> setDefaultLang ( $newlang );
}
2021-04-13 19:38:55 +02:00
2021-10-18 12:12:00 +02:00
// PDF
$hidedetails = ( ! empty ( $conf -> global -> MAIN_GENERATE_DOCUMENTS_HIDE_DETAILS ) ? 1 : 0 );
$hidedesc = ( ! empty ( $conf -> global -> MAIN_GENERATE_DOCUMENTS_HIDE_DESC ) ? 1 : 0 );
$hideref = ( ! empty ( $conf -> global -> MAIN_GENERATE_DOCUMENTS_HIDE_REF ) ? 1 : 0 );
2018-10-08 18:15:46 +02:00
//$ret=$object->fetch($id); // Reload to get new records
2021-10-18 12:12:00 +02:00
$this -> generateDocument ( $modelpdf , $outputlangs , $hidedetails , $hidedesc , $hideref );
2017-10-07 13:09:31 +02:00
}
2019-11-08 15:51:54 +01:00
$this -> oldcopy = clone $this ;
$this -> statut = self :: STATUS_BILLED ;
2021-04-13 19:38:55 +02:00
$this -> date_cloture = $now ;
$this -> note_private = $newprivatenote ;
2017-10-07 13:09:31 +02:00
}
2021-02-23 18:59:19 +01:00
if ( ! $notrigger && empty ( $error )) {
2017-10-07 13:09:31 +02:00
// Call trigger
2021-04-13 19:38:55 +02:00
$result = $this -> call_trigger ( $triggerName , $user );
2021-02-23 18:59:19 +01:00
if ( $result < 0 ) {
$error ++ ;
}
2017-10-07 13:09:31 +02:00
// End call triggers
}
2021-02-23 18:59:19 +01:00
if ( ! $error ) {
2017-10-07 13:09:31 +02:00
$this -> db -> commit ();
2021-04-13 19:38:55 +02:00
return $num ;
2020-05-21 15:05:19 +02:00
} else {
2021-02-23 18:59:19 +01:00
foreach ( $this -> errors as $errmsg ) {
2017-10-07 13:09:31 +02:00
dol_syslog ( __METHOD__ . ' Error: ' . $errmsg , LOG_ERR );
2019-11-08 15:51:54 +01:00
$this -> error .= ( $this -> error ? ', ' . $errmsg : $errmsg );
2017-10-07 13:09:31 +02:00
}
$this -> db -> rollback ();
2019-11-08 15:51:54 +01:00
return - 1 * $error ;
2017-10-07 13:09:31 +02:00
}
}
2020-10-28 17:49:52 +01:00
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
2017-10-07 13:09:31 +02:00
/**
* Set draft status
*
* @ param User $user Object user that modify
* @ param int $notrigger 1 = Does not execute triggers , 0 = execute triggers
* @ return int < 0 if KO , > 0 if OK
*/
2020-10-31 14:32:18 +01:00
public function setDraft ( $user , $notrigger = 0 )
2017-10-07 13:09:31 +02:00
{
2020-10-31 14:32:18 +01:00
// phpcs:enable
2019-11-08 15:51:54 +01:00
$error = 0 ;
2017-10-07 13:09:31 +02:00
2019-03-21 17:37:56 +01:00
// Protection
2021-02-23 18:59:19 +01:00
if ( $this -> statut <= self :: STATUS_DRAFT ) {
2020-10-31 14:32:18 +01:00
return 0 ;
2019-03-21 17:37:56 +01:00
}
dol_syslog ( get_class ( $this ) . " ::setDraft " , LOG_DEBUG );
2017-10-07 13:09:31 +02:00
$this -> db -> begin ();
2019-03-21 17:37:56 +01:00
$sql = " UPDATE " . MAIN_DB_PREFIX . " propal " ;
2019-11-08 15:51:54 +01:00
$sql .= " SET fk_statut = " . self :: STATUS_DRAFT ;
2021-08-23 19:33:24 +02:00
$sql .= " WHERE rowid = " . (( int ) $this -> id );
2017-10-07 13:09:31 +02:00
2019-11-08 15:51:54 +01:00
$resql = $this -> db -> query ( $sql );
2021-02-23 18:59:19 +01:00
if ( ! $resql ) {
2019-11-08 15:51:54 +01:00
$this -> errors [] = $this -> db -> error ();
2017-10-07 13:09:31 +02:00
$error ++ ;
}
2021-02-23 18:59:19 +01:00
if ( ! $error ) {
2019-11-08 15:51:54 +01:00
$this -> oldcopy = clone $this ;
2017-10-07 13:09:31 +02:00
}
2021-02-23 18:59:19 +01:00
if ( ! $notrigger && empty ( $error )) {
2017-10-07 13:09:31 +02:00
// Call trigger
2019-11-08 15:51:54 +01:00
$result = $this -> call_trigger ( 'PROPAL_MODIFY' , $user );
2021-02-23 18:59:19 +01:00
if ( $result < 0 ) {
$error ++ ;
}
2017-10-07 13:09:31 +02:00
// End call triggers
}
2021-02-23 18:59:19 +01:00
if ( ! $error ) {
2020-10-31 14:32:18 +01:00
$this -> statut = self :: STATUS_DRAFT ;
$this -> brouillon = 1 ;
2019-03-21 17:37:56 +01:00
2020-10-31 14:32:18 +01:00
$this -> db -> commit ();
2017-10-07 13:09:31 +02:00
return 1 ;
2020-05-21 15:05:19 +02:00
} else {
2021-02-23 18:59:19 +01:00
foreach ( $this -> errors as $errmsg ) {
2017-10-07 13:09:31 +02:00
dol_syslog ( __METHOD__ . ' Error: ' . $errmsg , LOG_ERR );
2019-11-08 15:51:54 +01:00
$this -> error .= ( $this -> error ? ', ' . $errmsg : $errmsg );
2017-10-07 13:09:31 +02:00
}
$this -> db -> rollback ();
2019-11-08 15:51:54 +01:00
return - 1 * $error ;
2017-10-07 13:09:31 +02:00
}
}
2020-10-31 14:32:18 +01:00
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
2017-10-07 13:09:31 +02:00
/**
* Return list of proposal ( eventually filtered on user ) into an array
*
* @ param int $shortlist 0 = Return array [ id ] = ref , 1 = Return array []( id => id , ref => ref , name => name )
* @ param int $draft 0 = not draft , 1 = draft
* @ param int $notcurrentuser 0 = all user , 1 = not current user
* @ param int $socid Id third pary
* @ param int $limit For pagination
* @ param int $offset For pagination
* @ param string $sortfield Sort criteria
* @ param string $sortorder Sort order
* @ return int - 1 if KO , array with result if OK
*/
2020-10-31 14:32:18 +01:00
public function liste_array ( $shortlist = 0 , $draft = 0 , $notcurrentuser = 0 , $socid = 0 , $limit = 0 , $offset = 0 , $sortfield = 'p.datep' , $sortorder = 'DESC' )
2017-10-07 13:09:31 +02:00
{
2020-10-31 14:32:18 +01:00
// phpcs:enable
2017-10-07 13:09:31 +02:00
global $user ;
$ga = array ();
$sql = " SELECT s.rowid, s.nom as name, s.client, " ;
2019-11-08 15:51:54 +01:00
$sql .= " p.rowid as propalid, p.fk_statut, p.total_ht, p.ref, p.remise, " ;
$sql .= " p.datep as dp, p.fin_validite as datelimite " ;
2021-10-22 22:15:59 +02:00
if ( empty ( $user -> rights -> societe -> client -> voir ) && ! $socid ) {
2021-02-23 18:59:19 +01:00
$sql .= " , sc.fk_soc, sc.fk_user " ;
}
2019-11-08 15:51:54 +01:00
$sql .= " FROM " . MAIN_DB_PREFIX . " societe as s, " . MAIN_DB_PREFIX . " propal as p, " . MAIN_DB_PREFIX . " c_propalst as c " ;
2021-10-22 22:15:59 +02:00
if ( empty ( $user -> rights -> societe -> client -> voir ) && ! $socid ) {
2021-02-23 18:59:19 +01:00
$sql .= " , " . MAIN_DB_PREFIX . " societe_commerciaux as sc " ;
}
2019-11-08 15:51:54 +01:00
$sql .= " WHERE p.entity IN ( " . getEntity ( 'propal' ) . " ) " ;
$sql .= " AND p.fk_soc = s.rowid " ;
$sql .= " AND p.fk_statut = c.id " ;
2021-10-22 22:15:59 +02:00
if ( empty ( $user -> rights -> societe -> client -> voir ) && ! $socid ) { //restriction
2021-08-23 17:41:11 +02:00
$sql .= " AND s.rowid = sc.fk_soc AND sc.fk_user = " . (( int ) $user -> id );
2017-10-07 13:09:31 +02:00
}
2021-02-23 18:59:19 +01:00
if ( $socid ) {
2021-03-22 13:31:06 +01:00
$sql .= " AND s.rowid = " . (( int ) $socid );
2021-02-23 18:59:19 +01:00
}
if ( $draft ) {
$sql .= " AND p.fk_statut = " . self :: STATUS_DRAFT ;
}
if ( $notcurrentuser > 0 ) {
2021-08-23 19:33:24 +02:00
$sql .= " AND p.fk_user_author <> " . (( int ) $user -> id );
2021-02-23 18:59:19 +01:00
}
2019-11-08 15:51:54 +01:00
$sql .= $this -> db -> order ( $sortfield , $sortorder );
$sql .= $this -> db -> plimit ( $limit , $offset );
2017-10-07 13:09:31 +02:00
2019-11-08 15:51:54 +01:00
$result = $this -> db -> query ( $sql );
2021-02-23 18:59:19 +01:00
if ( $result ) {
2017-10-07 13:09:31 +02:00
$num = $this -> db -> num_rows ( $result );
2021-02-23 18:59:19 +01:00
if ( $num ) {
2017-10-07 13:09:31 +02:00
$i = 0 ;
2021-02-23 18:59:19 +01:00
while ( $i < $num ) {
2017-10-07 13:09:31 +02:00
$obj = $this -> db -> fetch_object ( $result );
2021-02-23 18:59:19 +01:00
if ( $shortlist == 1 ) {
2017-10-07 13:09:31 +02:00
$ga [ $obj -> propalid ] = $obj -> ref ;
2021-02-23 18:59:19 +01:00
} elseif ( $shortlist == 2 ) {
2017-10-07 13:09:31 +02:00
$ga [ $obj -> propalid ] = $obj -> ref . ' (' . $obj -> name . ')' ;
2020-05-21 15:05:19 +02:00
} else {
2019-11-08 15:51:54 +01:00
$ga [ $i ][ 'id' ] = $obj -> propalid ;
2017-10-07 13:09:31 +02:00
$ga [ $i ][ 'ref' ] = $obj -> ref ;
$ga [ $i ][ 'name' ] = $obj -> name ;
}
$i ++ ;
}
}
return $ga ;
2020-05-21 15:05:19 +02:00
} else {
2017-10-07 13:09:31 +02:00
dol_print_error ( $this -> db );
return - 1 ;
}
}
/**
* Returns an array with the numbers of related invoices
*
* @ return array Array of invoices
*/
2020-10-31 14:32:18 +01:00
public function getInvoiceArrayList ()
2017-10-07 13:09:31 +02:00
{
return $this -> InvoiceArrayList ( $this -> id );
}
2020-10-28 17:49:52 +01:00
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
2017-10-07 13:09:31 +02:00
/**
* Returns an array with id and ref of related invoices
*
* @ param int $id Id propal
* @ return array Array of invoices id
*/
2020-10-31 14:32:18 +01:00
public function InvoiceArrayList ( $id )
2017-10-07 13:09:31 +02:00
{
2020-10-31 14:32:18 +01:00
// phpcs:enable
2017-10-07 13:09:31 +02:00
$ga = array ();
$linkedInvoices = array ();
2019-01-27 11:55:16 +01:00
$this -> fetchObjectLinked ( $id , $this -> element );
2021-02-23 18:59:19 +01:00
foreach ( $this -> linkedObjectsIds as $objecttype => $objectid ) {
2017-10-07 13:09:31 +02:00
// Nouveau système du comon object renvoi des rowid et non un id linéaire de 1 à n
// On parcourt donc une liste d'objets en tant qu'objet unique
2021-02-23 18:59:19 +01:00
foreach ( $objectid as $key => $object ) {
2017-10-07 13:09:31 +02:00
// Cas des factures liees directement
2021-02-23 18:59:19 +01:00
if ( $objecttype == 'facture' ) {
2017-10-07 13:09:31 +02:00
$linkedInvoices [] = $object ;
2021-02-23 18:59:19 +01:00
} else {
// Cas des factures liees par un autre objet (ex: commande)
2019-01-27 11:55:16 +01:00
$this -> fetchObjectLinked ( $object , $objecttype );
2021-02-23 18:59:19 +01:00
foreach ( $this -> linkedObjectsIds as $subobjecttype => $subobjectid ) {
foreach ( $subobjectid as $subkey => $subobject ) {
if ( $subobjecttype == 'facture' ) {
2017-10-07 13:09:31 +02:00
$linkedInvoices [] = $subobject ;
}
}
}
}
}
}
2021-02-23 18:59:19 +01:00
if ( count ( $linkedInvoices ) > 0 ) {
2021-04-13 19:38:55 +02:00
$sql = " SELECT rowid as facid, ref, total_ht as total, datef as df, fk_user_author, fk_statut, paye " ;
2019-11-08 15:51:54 +01:00
$sql .= " FROM " . MAIN_DB_PREFIX . " facture " ;
2021-03-22 11:30:18 +01:00
$sql .= " WHERE rowid IN ( " . $this -> db -> sanitize ( implode ( ',' , $linkedInvoices )) . " ) " ;
2017-10-07 13:09:31 +02:00
dol_syslog ( get_class ( $this ) . " ::InvoiceArrayList " , LOG_DEBUG );
2019-11-08 15:51:54 +01:00
$resql = $this -> db -> query ( $sql );
2017-10-07 13:09:31 +02:00
2021-02-23 18:59:19 +01:00
if ( $resql ) {
2019-11-08 15:51:54 +01:00
$tab_sqlobj = array ();
2017-10-07 13:09:31 +02:00
$nump = $this -> db -> num_rows ( $resql );
2021-02-23 18:59:19 +01:00
for ( $i = 0 ; $i < $nump ; $i ++ ) {
2017-10-07 13:09:31 +02:00
$sqlobj = $this -> db -> fetch_object ( $resql );
$tab_sqlobj [] = $sqlobj ;
}
$this -> db -> free ( $resql );
$nump = count ( $tab_sqlobj );
2021-02-23 18:59:19 +01:00
if ( $nump ) {
2017-10-07 13:09:31 +02:00
$i = 0 ;
2021-02-23 18:59:19 +01:00
while ( $i < $nump ) {
2017-10-07 13:09:31 +02:00
$obj = array_shift ( $tab_sqlobj );
$ga [ $i ] = $obj ;
$i ++ ;
}
}
return $ga ;
2020-05-21 15:05:19 +02:00
} else {
2017-10-07 13:09:31 +02:00
return - 1 ;
}
2021-02-23 18:59:19 +01:00
} else {
return $ga ;
}
2017-10-07 13:09:31 +02:00
}
/**
* Delete proposal
*
* @ param User $user Object user that delete
* @ param int $notrigger 1 = Does not execute triggers , 0 = execute triggers
2020-11-25 14:15:59 +01:00
* @ return int > 0 if OK , <= 0 if KO
2017-10-07 13:09:31 +02:00
*/
2020-10-31 14:32:18 +01:00
public function delete ( $user , $notrigger = 0 )
2017-10-07 13:09:31 +02:00
{
global $conf ;
require_once DOL_DOCUMENT_ROOT . '/core/lib/files.lib.php' ;
2019-11-08 15:51:54 +01:00
$error = 0 ;
2017-10-07 13:09:31 +02:00
$this -> db -> begin ();
2020-11-25 14:15:59 +01:00
if ( ! $notrigger ) {
2017-10-07 13:09:31 +02:00
// Call trigger
2019-11-08 15:51:54 +01:00
$result = $this -> call_trigger ( 'PROPAL_DELETE' , $user );
2021-02-23 18:59:19 +01:00
if ( $result < 0 ) {
$error ++ ;
}
2017-10-07 13:09:31 +02:00
// End call triggers
}
2020-11-25 14:15:59 +01:00
// Delete extrafields of lines and lines
if ( ! $error && ! empty ( $this -> table_element_line )) {
$tabletodelete = $this -> table_element_line ;
2021-03-30 17:53:25 +02:00
$sqlef = " DELETE FROM " . MAIN_DB_PREFIX . $tabletodelete . " _extrafields WHERE fk_object IN (SELECT rowid FROM " . MAIN_DB_PREFIX . $tabletodelete . " WHERE " . $this -> fk_element . " = " . (( int ) $this -> id ) . " ) " ;
2021-08-23 19:33:24 +02:00
$sql = " DELETE FROM " . MAIN_DB_PREFIX . $tabletodelete . " WHERE " . $this -> fk_element . " = " . (( int ) $this -> id );
2020-12-01 02:41:19 +01:00
if ( ! $this -> db -> query ( $sqlef ) || ! $this -> db -> query ( $sql )) {
2020-11-25 14:15:59 +01:00
$error ++ ;
$this -> error = $this -> db -> lasterror ();
2020-11-26 09:16:16 +01:00
$this -> errors [] = $this -> error ;
2020-11-25 14:15:59 +01:00
dol_syslog ( get_class ( $this ) . " ::delete error " . $this -> error , LOG_ERR );
}
}
2017-10-07 13:09:31 +02:00
2020-11-26 09:16:16 +01:00
if ( ! $error ) {
// Delete linked object
$res = $this -> deleteObjectLinked ();
2021-02-23 18:59:19 +01:00
if ( $res < 0 ) {
$error ++ ;
}
2020-11-26 09:16:16 +01:00
}
2017-10-07 13:09:31 +02:00
2020-11-26 09:16:16 +01:00
if ( ! $error ) {
// Delete linked contacts
$res = $this -> delete_linked_contact ();
2021-02-23 18:59:19 +01:00
if ( $res < 0 ) {
$error ++ ;
}
2020-11-26 09:16:16 +01:00
}
2017-10-07 13:09:31 +02:00
2020-11-25 14:15:59 +01:00
// Removed extrafields of object
if ( ! $error ) {
$result = $this -> deleteExtraFields ();
if ( $result < 0 ) {
$error ++ ;
dol_syslog ( get_class ( $this ) . " ::delete error " . $this -> error , LOG_ERR );
}
}
2017-10-07 13:09:31 +02:00
2020-11-25 14:15:59 +01:00
// Delete main record
if ( ! $error ) {
2021-08-23 19:33:24 +02:00
$sql = " DELETE FROM " . MAIN_DB_PREFIX . $this -> table_element . " WHERE rowid = " . (( int ) $this -> id );
2020-11-25 14:15:59 +01:00
$res = $this -> db -> query ( $sql );
2020-12-01 02:41:19 +01:00
if ( ! $res ) {
2020-11-25 14:15:59 +01:00
$error ++ ;
2020-11-26 09:16:16 +01:00
$this -> error = $this -> db -> lasterror ();
$this -> errors [] = $this -> error ;
2020-11-25 14:15:59 +01:00
dol_syslog ( get_class ( $this ) . " ::delete error " . $this -> error , LOG_ERR );
}
}
2017-10-07 13:09:31 +02:00
2020-11-25 14:15:59 +01:00
// Delete record into ECM index and physically
if ( ! $error ) {
2020-11-26 09:16:16 +01:00
$res = $this -> deleteEcmFiles ( 0 ); // Deleting files physically is done later with the dol_delete_dir_recursive
2020-12-01 02:41:19 +01:00
if ( ! $res ) {
2020-11-25 14:15:59 +01:00
$error ++ ;
}
}
2017-10-07 13:09:31 +02:00
2020-11-25 14:15:59 +01:00
if ( ! $error ) {
// We remove directory
$ref = dol_sanitizeFileName ( $this -> ref );
if ( $conf -> propal -> multidir_output [ $this -> entity ] && ! empty ( $this -> ref )) {
$dir = $conf -> propal -> multidir_output [ $this -> entity ] . " / " . $ref ;
$file = $dir . " / " . $ref . " .pdf " ;
if ( file_exists ( $file )) {
dol_delete_preview ( $this );
if ( ! dol_delete_file ( $file , 0 , 0 , 0 , $this )) {
$this -> error = 'ErrorFailToDeleteFile' ;
2020-11-26 09:16:16 +01:00
$this -> errors [] = $this -> error ;
2020-11-25 14:15:59 +01:00
$this -> db -> rollback ();
return 0 ;
}
}
if ( file_exists ( $dir )) {
$res = @ dol_delete_dir_recursive ( $dir );
if ( ! $res ) {
$this -> error = 'ErrorFailToDeleteDir' ;
2020-11-26 09:16:16 +01:00
$this -> errors [] = $this -> error ;
2017-10-07 13:09:31 +02:00
$this -> db -> rollback ();
return 0 ;
}
}
}
2020-11-25 14:15:59 +01:00
}
if ( ! $error ) {
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 {
2017-10-07 13:09:31 +02:00
$this -> db -> rollback ();
return - 1 ;
}
}
/**
* Change the delivery time
*
* @ param int $availability_id Id of new delivery time
* @ param int $notrigger 1 = Does not execute triggers , 0 = execute triggers
* @ return int > 0 if OK , < 0 if KO
* @ deprecated use set_availability
*/
2020-10-31 14:32:18 +01:00
public function availability ( $availability_id , $notrigger = 0 )
2017-10-07 13:09:31 +02:00
{
global $user ;
2021-02-23 18:59:19 +01:00
if ( $this -> statut >= self :: STATUS_DRAFT ) {
2019-11-08 15:51:54 +01:00
$error = 0 ;
2017-10-07 13:09:31 +02:00
$this -> db -> begin ();
$sql = 'UPDATE ' . MAIN_DB_PREFIX . 'propal' ;
2021-03-30 11:36:50 +02:00
$sql .= ' SET fk_availability = ' . (( int ) $availability_id );
2021-03-14 12:20:23 +01:00
$sql .= ' WHERE rowid=' . (( int ) $this -> id );
2017-10-07 13:09:31 +02:00
dol_syslog ( __METHOD__ . ' availability(' . $availability_id . ')' , LOG_DEBUG );
2019-11-08 15:51:54 +01:00
$resql = $this -> db -> query ( $sql );
2021-02-23 18:59:19 +01:00
if ( ! $resql ) {
2019-11-08 15:51:54 +01:00
$this -> errors [] = $this -> db -> error ();
2017-10-07 13:09:31 +02:00
$error ++ ;
}
2021-02-23 18:59:19 +01:00
if ( ! $error ) {
2019-11-08 15:51:54 +01:00
$this -> oldcopy = clone $this ;
2017-10-07 13:09:31 +02:00
$this -> availability_id = $availability_id ;
}
2021-02-23 18:59:19 +01:00
if ( ! $notrigger && empty ( $error )) {
2017-10-07 13:09:31 +02:00
// Call trigger
2019-11-08 15:51:54 +01:00
$result = $this -> call_trigger ( 'PROPAL_MODIFY' , $user );
2021-02-23 18:59:19 +01:00
if ( $result < 0 ) {
$error ++ ;
}
2017-10-07 13:09:31 +02:00
// End call triggers
}
2021-02-23 18:59:19 +01:00
if ( ! $error ) {
2017-10-07 13:09:31 +02:00
$this -> db -> commit ();
return 1 ;
2020-05-21 15:05:19 +02:00
} else {
2021-02-23 18:59:19 +01:00
foreach ( $this -> errors as $errmsg ) {
2017-10-07 13:09:31 +02:00
dol_syslog ( __METHOD__ . ' Error: ' . $errmsg , LOG_ERR );
2019-11-08 15:51:54 +01:00
$this -> error .= ( $this -> error ? ', ' . $errmsg : $errmsg );
2017-10-07 13:09:31 +02:00
}
$this -> db -> rollback ();
2019-11-08 15:51:54 +01:00
return - 1 * $error ;
2017-10-07 13:09:31 +02:00
}
2020-05-21 15:05:19 +02:00
} else {
2019-11-08 15:51:54 +01:00
$error_str = 'Propal status do not meet requirement ' . $this -> statut ;
2017-10-07 13:09:31 +02:00
dol_syslog ( __METHOD__ . $error_str , LOG_ERR );
2019-11-08 15:51:54 +01:00
$this -> error = $error_str ;
$this -> errors [] = $this -> error ;
2017-10-07 13:09:31 +02:00
return - 2 ;
}
}
2020-10-28 17:49:52 +01:00
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
2017-10-07 13:09:31 +02:00
/**
* Change source demand
*
* @ param int $demand_reason_id Id of new source demand
* @ param int $notrigger 1 = Does not execute triggers , 0 = execute triggers
* @ return int > 0 si ok , < 0 si ko
* @ deprecated use set_demand_reason
*/
2020-10-31 14:32:18 +01:00
public function demand_reason ( $demand_reason_id , $notrigger = 0 )
2017-10-07 13:09:31 +02:00
{
2020-10-31 14:32:18 +01:00
// phpcs:enable
2017-12-02 15:03:14 +01:00
global $user ;
2021-02-23 18:59:19 +01:00
if ( $this -> statut >= self :: STATUS_DRAFT ) {
2019-11-08 15:51:54 +01:00
$error = 0 ;
2017-10-07 13:09:31 +02:00
$this -> db -> begin ();
$sql = 'UPDATE ' . MAIN_DB_PREFIX . 'propal' ;
2021-03-30 11:36:50 +02:00
$sql .= ' SET fk_input_reason = ' . (( int ) $demand_reason_id );
2021-03-14 12:20:23 +01:00
$sql .= ' WHERE rowid=' . (( int ) $this -> id );
2017-10-07 13:09:31 +02:00
dol_syslog ( __METHOD__ . ' demand_reason(' . $demand_reason_id . ')' , LOG_DEBUG );
2019-11-08 15:51:54 +01:00
$resql = $this -> db -> query ( $sql );
2021-02-23 18:59:19 +01:00
if ( ! $resql ) {
2019-11-08 15:51:54 +01:00
$this -> errors [] = $this -> db -> error ();
2017-10-07 13:09:31 +02:00
$error ++ ;
}
2021-02-23 18:59:19 +01:00
if ( ! $error ) {
2019-11-08 15:51:54 +01:00
$this -> oldcopy = clone $this ;
2017-10-07 13:09:31 +02:00
$this -> demand_reason_id = $demand_reason_id ;
}
2021-02-23 18:59:19 +01:00
if ( ! $notrigger && empty ( $error )) {
2017-10-07 13:09:31 +02:00
// Call trigger
2019-11-08 15:51:54 +01:00
$result = $this -> call_trigger ( 'PROPAL_MODIFY' , $user );
2021-02-23 18:59:19 +01:00
if ( $result < 0 ) {
$error ++ ;
}
2017-10-07 13:09:31 +02:00
// End call triggers
}
2021-02-23 18:59:19 +01:00
if ( ! $error ) {
2017-10-07 13:09:31 +02:00
$this -> db -> commit ();
return 1 ;
2020-05-21 15:05:19 +02:00
} else {
2021-02-23 18:59:19 +01:00
foreach ( $this -> errors as $errmsg ) {
2017-10-07 13:09:31 +02:00
dol_syslog ( __METHOD__ . ' Error: ' . $errmsg , LOG_ERR );
2019-11-08 15:51:54 +01:00
$this -> error .= ( $this -> error ? ', ' . $errmsg : $errmsg );
2017-10-07 13:09:31 +02:00
}
$this -> db -> rollback ();
2019-11-08 15:51:54 +01:00
return - 1 * $error ;
2017-10-07 13:09:31 +02:00
}
2020-05-21 15:05:19 +02:00
} else {
2019-11-08 15:51:54 +01:00
$error_str = 'Propal status do not meet requirement ' . $this -> statut ;
2017-10-07 13:09:31 +02:00
dol_syslog ( __METHOD__ . $error_str , LOG_ERR );
2019-11-08 15:51:54 +01:00
$this -> error = $error_str ;
$this -> errors [] = $this -> error ;
2017-10-07 13:09:31 +02:00
return - 2 ;
}
}
/**
* Object Proposal Information
*
* @ param int $id Proposal id
* @ return void
*/
2020-10-31 14:32:18 +01:00
public function info ( $id )
2017-10-07 13:09:31 +02:00
{
$sql = " SELECT c.rowid, " ;
2022-06-28 13:09:53 +02:00
$sql .= " c.datec, c.date_valid as datev, c.date_signature, c.date_cloture, " ;
2021-03-26 17:44:41 +01:00
$sql .= " c.fk_user_author, c.fk_user_valid, c.fk_user_signature, c.fk_user_cloture " ;
2019-11-08 15:51:54 +01:00
$sql .= " FROM " . MAIN_DB_PREFIX . " propal as c " ;
2020-10-14 01:52:53 +02:00
$sql .= " WHERE c.rowid = " . (( int ) $id );
2017-10-07 13:09:31 +02:00
$result = $this -> db -> query ( $sql );
2021-02-23 18:59:19 +01:00
if ( $result ) {
if ( $this -> db -> num_rows ( $result )) {
2017-10-07 13:09:31 +02:00
$obj = $this -> db -> fetch_object ( $result );
$this -> id = $obj -> rowid ;
$this -> date_creation = $this -> db -> jdate ( $obj -> datec );
$this -> date_validation = $this -> db -> jdate ( $obj -> datev );
2021-03-26 17:44:41 +01:00
$this -> date_signature = $this -> db -> jdate ( $obj -> date_signature );
2022-06-28 13:09:53 +02:00
$this -> date_cloture = $this -> db -> jdate ( $obj -> date_cloture );
2017-10-07 13:09:31 +02:00
$cuser = new User ( $this -> db );
$cuser -> fetch ( $obj -> fk_user_author );
2019-11-08 15:51:54 +01:00
$this -> user_creation = $cuser ;
2017-10-07 13:09:31 +02:00
2021-02-23 18:59:19 +01:00
if ( $obj -> fk_user_valid ) {
2017-10-07 13:09:31 +02:00
$vuser = new User ( $this -> db );
$vuser -> fetch ( $obj -> fk_user_valid );
2019-11-08 15:51:54 +01:00
$this -> user_validation = $vuser ;
2017-10-07 13:09:31 +02:00
}
2021-03-26 17:44:41 +01:00
if ( $obj -> fk_user_signature ) {
$user_signature = new User ( $this -> db );
$user_signature -> fetch ( $obj -> fk_user_signature );
$this -> user_signature = $user_signature ;
}
2021-02-23 18:59:19 +01:00
if ( $obj -> fk_user_cloture ) {
2017-10-07 13:09:31 +02:00
$cluser = new User ( $this -> db );
$cluser -> fetch ( $obj -> fk_user_cloture );
2019-11-08 15:51:54 +01:00
$this -> user_cloture = $cluser ;
2017-10-07 13:09:31 +02:00
}
}
$this -> db -> free ( $result );
2020-05-21 15:05:19 +02:00
} else {
2017-10-07 13:09:31 +02:00
dol_print_error ( $this -> db );
}
}
/**
* Return label of status of proposal ( draft , validated , ... )
*
2017-11-18 01:48:16 +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
2017-10-07 13:09:31 +02:00
* @ return string Label
*/
2020-10-31 14:32:18 +01:00
public function getLibStatut ( $mode = 0 )
2017-10-07 13:09:31 +02:00
{
return $this -> LibStatut ( $this -> statut , $mode );
}
2020-10-31 14:32:18 +01:00
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
2017-10-07 13:09:31 +02:00
/**
* Return label of a status ( draft , validated , ... )
*
2019-11-01 23:58:14 +01:00
* @ param int $status Id status
2017-10-07 13:09:31 +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 , 6 = Long label + Picto
* @ return string Label
*/
2020-10-31 14:32:18 +01:00
public function LibStatut ( $status , $mode = 1 )
2017-10-07 13:09:31 +02:00
{
2020-10-31 14:32:18 +01:00
// phpcs:enable
2018-05-16 15:23:52 +02:00
global $conf ;
2018-04-21 15:08:46 +02:00
// Init/load array of translation of status
2021-02-23 18:59:19 +01:00
if ( empty ( $this -> labelStatus ) || empty ( $this -> labelStatusShort )) {
2018-04-21 15:08:46 +02:00
global $langs ;
$langs -> load ( " propal " );
2020-10-25 14:11:09 +01:00
$this -> labelStatus [ 0 ] = $langs -> transnoentitiesnoconv ( " PropalStatusDraft " );
$this -> labelStatus [ 1 ] = $langs -> transnoentitiesnoconv ( " PropalStatusValidated " );
$this -> labelStatus [ 2 ] = $langs -> transnoentitiesnoconv ( " PropalStatusSigned " );
$this -> labelStatus [ 3 ] = $langs -> transnoentitiesnoconv ( " PropalStatusNotSigned " );
$this -> labelStatus [ 4 ] = $langs -> transnoentitiesnoconv ( " PropalStatusBilled " );
$this -> labelStatusShort [ 0 ] = $langs -> transnoentitiesnoconv ( " PropalStatusDraftShort " );
$this -> labelStatusShort [ 1 ] = $langs -> transnoentitiesnoconv ( " PropalStatusValidatedShort " );
$this -> labelStatusShort [ 2 ] = $langs -> transnoentitiesnoconv ( " PropalStatusSignedShort " );
$this -> labelStatusShort [ 3 ] = $langs -> transnoentitiesnoconv ( " PropalStatusNotSignedShort " );
$this -> labelStatusShort [ 4 ] = $langs -> transnoentitiesnoconv ( " PropalStatusBilledShort " );
2019-12-18 15:20:36 +01:00
}
$statusType = '' ;
2021-02-23 18:59:19 +01:00
if ( $status == self :: STATUS_DRAFT ) {
$statusType = 'status0' ;
} elseif ( $status == self :: STATUS_VALIDATED ) {
$statusType = 'status1' ;
} elseif ( $status == self :: STATUS_SIGNED ) {
$statusType = 'status4' ;
} elseif ( $status == self :: STATUS_NOTSIGNED ) {
$statusType = 'status9' ;
} elseif ( $status == self :: STATUS_BILLED ) {
$statusType = 'status6' ;
}
2019-03-11 21:03:23 +01:00
2019-11-01 23:58:14 +01:00
return dolGetStatus ( $this -> labelStatus [ $status ], $this -> labelStatusShort [ $status ], '' , $statusType , $mode );
2018-09-01 23:46:13 +02:00
}
2017-10-07 13:09:31 +02:00
2020-10-31 14:32:18 +01:00
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
2017-10-07 13:09:31 +02:00
/**
* Load indicators for dashboard ( this -> nbtodo and this -> nbtodolate )
*
* @ param User $user Object user
* @ param int $mode " opened " for proposal to close , " signed " for proposal to invoice
* @ return WorkboardResponse | int < 0 if KO , WorkboardResponse if OK
*/
2020-10-31 14:32:18 +01:00
public function load_board ( $user , $mode )
2017-10-07 13:09:31 +02:00
{
2020-10-31 14:32:18 +01:00
// phpcs:enable
2017-10-07 13:09:31 +02:00
global $conf , $langs ;
$clause = " WHERE " ;
2018-07-05 12:11:20 +02:00
$sql = " SELECT p.rowid, p.ref, p.datec as datec, p.fin_validite as datefin, p.total_ht " ;
2019-12-18 15:20:36 +01:00
$sql .= " FROM " . MAIN_DB_PREFIX . " propal as p " ;
2021-10-22 22:15:59 +02:00
if ( empty ( $user -> rights -> societe -> client -> voir ) && ! $user -> socid ) {
2019-12-18 15:20:36 +01:00
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . " societe_commerciaux as sc ON p.fk_soc = sc.fk_soc " ;
2021-08-23 17:41:11 +02:00
$sql .= " WHERE sc.fk_user = " . (( int ) $user -> id );
2017-10-07 13:09:31 +02:00
$clause = " AND " ;
}
2019-12-18 15:20:36 +01:00
$sql .= $clause . " p.entity IN ( " . getEntity ( 'propal' ) . " ) " ;
2021-02-23 18:59:19 +01:00
if ( $mode == 'opened' ) {
$sql .= " AND p.fk_statut = " . self :: STATUS_VALIDATED ;
}
if ( $mode == 'signed' ) {
$sql .= " AND p.fk_statut = " . self :: STATUS_SIGNED ;
}
if ( $user -> socid ) {
2021-08-23 17:41:11 +02:00
$sql .= " AND p.fk_soc = " . (( int ) $user -> socid );
2021-02-23 18:59:19 +01:00
}
2017-10-07 13:09:31 +02:00
2019-12-18 15:20:36 +01:00
$resql = $this -> db -> query ( $sql );
2021-02-23 18:59:19 +01:00
if ( $resql ) {
2017-10-07 13:09:31 +02:00
$langs -> load ( " propal " );
2019-12-18 15:20:36 +01:00
$now = dol_now ();
2017-10-07 13:09:31 +02:00
2017-12-06 23:21:58 +01:00
$delay_warning = 0 ;
2019-11-01 23:58:14 +01:00
$status = 0 ;
2019-08-01 12:33:19 +02:00
$label = $labelShort = '' ;
2017-10-07 13:09:31 +02:00
if ( $mode == 'opened' ) {
2019-12-18 15:20:36 +01:00
$delay_warning = $conf -> propal -> cloture -> warning_delay ;
2019-11-01 23:58:14 +01:00
$status = self :: STATUS_VALIDATED ;
2020-10-25 14:11:09 +01:00
$label = $langs -> transnoentitiesnoconv ( " PropalsToClose " );
$labelShort = $langs -> transnoentitiesnoconv ( " ToAcceptRefuse " );
2017-10-07 13:09:31 +02:00
}
if ( $mode == 'signed' ) {
2019-12-18 15:20:36 +01:00
$delay_warning = $conf -> propal -> facturation -> warning_delay ;
2019-11-01 23:58:14 +01:00
$status = self :: STATUS_SIGNED ;
2019-12-18 15:20:36 +01:00
$label = $langs -> trans ( " PropalsToBill " ); // We set here bill but may be billed or ordered
2019-08-01 12:33:19 +02:00
$labelShort = $langs -> trans ( " ToBill " );
2017-10-07 13:09:31 +02:00
}
$response = new WorkboardResponse ();
2019-12-18 15:20:36 +01:00
$response -> warning_delay = $delay_warning / 60 / 60 / 24 ;
2017-10-07 13:09:31 +02:00
$response -> label = $label ;
2019-08-01 12:33:19 +02:00
$response -> labelShort = $labelShort ;
2020-04-15 15:01:00 +02:00
$response -> url = DOL_URL_ROOT . '/comm/propal/list.php?search_status=' . $status . '&mainmenu=commercial&leftmenu=propals' ;
$response -> url_late = DOL_URL_ROOT . '/comm/propal/list.php?search_status=' . $status . '&mainmenu=commercial&leftmenu=propals&sortfield=p.datep&sortorder=asc' ;
2019-01-27 11:55:16 +01:00
$response -> img = img_object ( '' , " propal " );
2017-10-07 13:09:31 +02:00
// This assignment in condition is not a bug. It allows walking the results.
2021-02-23 18:59:19 +01:00
while ( $obj = $this -> db -> fetch_object ( $resql )) {
2017-10-07 13:09:31 +02:00
$response -> nbtodo ++ ;
2019-11-08 15:51:54 +01:00
$response -> total += $obj -> total_ht ;
2018-08-31 13:50:58 +02:00
2021-02-23 18:59:19 +01:00
if ( $mode == 'opened' ) {
2017-10-07 13:09:31 +02:00
$datelimit = $this -> db -> jdate ( $obj -> datefin );
2021-02-23 18:59:19 +01:00
if ( $datelimit < ( $now - $delay_warning )) {
2017-10-07 13:09:31 +02:00
$response -> nbtodolate ++ ;
}
}
// TODO Definir regle des propales a facturer en retard
// if ($mode == 'signed' && ! count($this->FactureListeArray($obj->rowid))) $this->nbtodolate++;
}
return $response ;
2020-05-21 15:05:19 +02:00
} else {
2019-11-08 15:51:54 +01:00
$this -> error = $this -> db -> error ();
2017-10-07 13:09:31 +02:00
return - 1 ;
}
}
/**
* 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
*/
2020-10-31 14:32:18 +01:00
public function initAsSpecimen ()
2017-10-07 13:09:31 +02:00
{
2020-01-21 00:16:11 +01:00
global $conf , $langs ;
2017-10-07 13:09:31 +02:00
// Load array of products prodids
$num_prods = 0 ;
$prodids = array ();
$sql = " SELECT rowid " ;
2019-11-08 15:51:54 +01:00
$sql .= " FROM " . MAIN_DB_PREFIX . " product " ;
$sql .= " WHERE entity IN ( " . getEntity ( 'product' ) . " ) " ;
2020-08-19 01:43:48 +02:00
$sql .= $this -> db -> plimit ( 100 );
2017-10-07 13:09:31 +02:00
$resql = $this -> db -> query ( $sql );
2021-02-23 18:59:19 +01:00
if ( $resql ) {
2017-10-07 13:09:31 +02:00
$num_prods = $this -> db -> num_rows ( $resql );
$i = 0 ;
2021-02-23 18:59:19 +01:00
while ( $i < $num_prods ) {
2017-10-07 13:09:31 +02:00
$i ++ ;
$row = $this -> db -> fetch_row ( $resql );
$prodids [ $i ] = $row [ 0 ];
}
}
// Initialise parametres
2019-11-08 15:51:54 +01:00
$this -> id = 0 ;
2017-10-07 13:09:31 +02:00
$this -> ref = 'SPECIMEN' ;
2019-11-08 15:51:54 +01:00
$this -> ref_client = 'NEMICEPS' ;
$this -> specimen = 1 ;
2017-10-07 13:09:31 +02:00
$this -> socid = 1 ;
$this -> date = time ();
2019-11-08 15:51:54 +01:00
$this -> fin_validite = $this -> date + 3600 * 24 * 30 ;
2017-10-07 13:09:31 +02:00
$this -> cond_reglement_id = 1 ;
$this -> cond_reglement_code = 'RECEP' ;
$this -> mode_reglement_id = 7 ;
$this -> mode_reglement_code = 'CHQ' ;
$this -> availability_id = 1 ;
$this -> availability_code = 'AV_NOW' ;
$this -> demand_reason_id = 1 ;
$this -> demand_reason_code = 'SRC_00' ;
2019-11-08 15:51:54 +01:00
$this -> note_public = 'This is a comment (public)' ;
$this -> note_private = 'This is a comment (private)' ;
2020-01-21 00:16:11 +01:00
$this -> multicurrency_tx = 1 ;
$this -> multicurrency_code = $conf -> currency ;
2017-10-07 13:09:31 +02:00
// Lines
$nbp = 5 ;
$xnbp = 0 ;
2021-02-23 18:59:19 +01:00
while ( $xnbp < $nbp ) {
2019-11-08 15:51:54 +01:00
$line = new PropaleLigne ( $this -> db );
$line -> desc = $langs -> trans ( " Description " ) . " " . $xnbp ;
$line -> qty = 1 ;
$line -> subprice = 100 ;
$line -> price = 100 ;
$line -> tva_tx = 20 ;
$line -> localtax1_tx = 0 ;
$line -> localtax2_tx = 0 ;
2021-02-23 18:59:19 +01:00
if ( $xnbp == 2 ) {
2019-11-08 15:51:54 +01:00
$line -> total_ht = 50 ;
$line -> total_ttc = 60 ;
$line -> total_tva = 10 ;
$line -> remise_percent = 50 ;
2020-05-21 15:05:19 +02:00
} else {
2019-11-08 15:51:54 +01:00
$line -> total_ht = 100 ;
$line -> total_ttc = 120 ;
$line -> total_tva = 20 ;
$line -> remise_percent = 00 ;
2017-10-07 13:09:31 +02:00
}
2021-02-23 18:59:19 +01:00
if ( $num_prods > 0 ) {
2017-10-07 13:09:31 +02:00
$prodid = mt_rand ( 1 , $num_prods );
2019-11-08 15:51:54 +01:00
$line -> fk_product = $prodids [ $prodid ];
2020-10-31 14:32:18 +01:00
$line -> product_ref = 'SPECIMEN' ;
2017-10-07 13:09:31 +02:00
}
2019-11-08 15:51:54 +01:00
$this -> lines [ $xnbp ] = $line ;
2017-10-07 13:09:31 +02:00
$this -> total_ht += $line -> total_ht ;
$this -> total_tva += $line -> total_tva ;
$this -> total_ttc += $line -> total_ttc ;
$xnbp ++ ;
}
}
2020-10-28 17:49:52 +01:00
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
2017-10-07 13:09:31 +02:00
/**
* Charge indicateurs this -> nb de tableau de bord
*
* @ return int < 0 if ko , > 0 if ok
*/
2020-10-31 14:32:18 +01:00
public function load_state_board ()
2017-10-07 13:09:31 +02:00
{
2020-10-31 14:32:18 +01:00
// phpcs:enable
2017-10-07 13:09:31 +02:00
global $user ;
2019-12-18 15:20:36 +01:00
$this -> nb = array ();
2017-10-07 13:09:31 +02:00
$clause = " WHERE " ;
$sql = " SELECT count(p.rowid) as nb " ;
2019-12-18 15:20:36 +01:00
$sql .= " FROM " . MAIN_DB_PREFIX . " propal as p " ;
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . " societe as s ON p.fk_soc = s.rowid " ;
2021-10-22 22:15:59 +02:00
if ( empty ( $user -> rights -> societe -> client -> voir ) && ! $user -> socid ) {
2019-12-18 15:20:36 +01: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 );
2017-10-07 13:09:31 +02:00
$clause = " AND " ;
}
2019-12-18 15:20:36 +01:00
$sql .= " " . $clause . " p.entity IN ( " . getEntity ( 'propal' ) . " ) " ;
2017-06-09 09:25:15 +02:00
2019-12-18 15:20:36 +01:00
$resql = $this -> db -> query ( $sql );
2021-02-23 18:59:19 +01:00
if ( $resql ) {
2017-10-07 13:09:31 +02:00
// This assignment in condition is not a bug. It allows walking the results.
2021-02-23 18:59:19 +01:00
while ( $obj = $this -> db -> fetch_object ( $resql )) {
2019-12-18 15:20:36 +01:00
$this -> nb [ " proposals " ] = $obj -> nb ;
2017-10-07 13:09:31 +02:00
}
$this -> db -> free ( $resql );
2017-04-28 14:33:06 +02:00
return 1 ;
2020-05-21 15:05:19 +02:00
} else {
2017-10-07 13:09:31 +02:00
dol_print_error ( $this -> db );
2019-11-08 15:51:54 +01:00
$this -> error = $this -> db -> error ();
2017-10-07 13:09:31 +02:00
return - 1 ;
2017-04-28 14:33:06 +02:00
}
}
2013-04-27 15:08:35 +02:00
2017-10-07 13:09:31 +02:00
/**
* Returns the reference to the following non used Proposal used depending on the active numbering module
* defined into PROPALE_ADDON
*
* @ param Societe $soc Object thirdparty
* @ return string Reference libre pour la propale
*/
2020-10-31 14:32:18 +01:00
public function getNextNumRef ( $soc )
2017-10-07 13:09:31 +02:00
{
2019-11-08 15:51:54 +01:00
global $conf , $langs ;
2017-10-07 13:09:31 +02:00
$langs -> load ( " propal " );
2014-06-12 15:56:38 +02:00
2018-11-14 16:44:10 +01:00
$classname = $conf -> global -> PROPALE_ADDON ;
2018-07-01 17:06:19 +02:00
2021-02-23 18:59:19 +01:00
if ( ! empty ( $classname )) {
2019-11-08 15:51:54 +01:00
$mybool = false ;
2012-03-18 19:23:01 +01:00
2018-07-01 17:06:19 +02:00
$file = $classname . " .php " ;
2013-07-15 09:33:26 +02:00
2017-10-07 13:09:31 +02:00
// Include file with class
$dirmodels = array_merge ( array ( '/' ), ( array ) $conf -> modules_parts [ 'models' ]);
foreach ( $dirmodels as $reldir ) {
$dir = dol_buildpath ( $reldir . " core/modules/propale/ " );
// Load file with numbering class (if found)
2019-11-08 15:51:54 +01:00
$mybool |= @ include_once $dir . $file ;
2017-10-07 13:09:31 +02:00
}
2021-02-23 18:59:19 +01:00
if ( ! $mybool ) {
2019-01-27 11:55:16 +01:00
dol_print_error ( '' , " Failed to include file " . $file );
2017-10-07 13:09:31 +02:00
return '' ;
2013-07-15 09:33:26 +02:00
}
2017-10-07 13:09:31 +02:00
$obj = new $classname ();
$numref = " " ;
2019-01-27 11:55:16 +01:00
$numref = $obj -> getNextValue ( $soc , $this );
2017-10-07 13:09:31 +02:00
2021-02-23 18:59:19 +01:00
if ( $numref != " " ) {
2017-10-07 13:09:31 +02:00
return $numref ;
2020-05-21 15:05:19 +02:00
} else {
2019-11-08 15:51:54 +01:00
$this -> error = $obj -> error ;
2017-10-07 13:09:31 +02:00
//dol_print_error($db,"Propale::getNextNumRef ".$obj->error);
return " " ;
}
2020-05-21 15:05:19 +02:00
} else {
2017-10-07 13:09:31 +02:00
$langs -> load ( " errors " );
2019-08-01 12:23:02 +02:00
print $langs -> trans ( " Error " ) . " " . $langs -> trans ( " ErrorModuleSetupNotComplete " , $langs -> transnoentitiesnoconv ( " Proposal " ));
2017-10-07 13:09:31 +02:00
return " " ;
2013-07-15 09:33:26 +02:00
}
2017-10-07 13:09:31 +02:00
}
2012-03-18 19:23:01 +01:00
2017-10-07 13:09:31 +02:00
/**
* Return clicable link of object ( with eventually picto )
*
* @ param int $withpicto Add picto into link
* @ param string $option Where point the link ( 'expedition' , 'document' , ... )
* @ param string $get_params Parametres added to url
* @ 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
2020-10-31 14:32:18 +01:00
* @ param int $addlinktonotes - 1 = Disable , 0 = Just add label show notes , 1 = Add private note ( only internal user ), 2 = Add public note ( internal or external user ), 3 = Add private ( internal user ) and public note ( internal and external user )
2017-10-07 13:09:31 +02:00
* @ return string String with URL
*/
2020-10-31 14:32:18 +01:00
public function getNomUrl ( $withpicto = 0 , $option = '' , $get_params = '' , $notooltip = 0 , $save_lastsearch_value = - 1 , $addlinktonotes = - 1 )
2017-10-07 13:09:31 +02:00
{
2022-02-15 18:14:44 +01:00
global $langs , $conf , $user , $hookmanager ;
2012-03-18 19:23:01 +01:00
2021-02-23 18:59:19 +01:00
if ( ! empty ( $conf -> dol_no_mouse_hover )) {
$notooltip = 1 ; // Force disable tooltips
}
2012-03-18 19:23:01 +01:00
2019-11-08 15:51:54 +01:00
$result = '' ;
$label = '' ;
$url = '' ;
2012-03-18 19:23:01 +01:00
2021-02-23 18:59:19 +01:00
if ( $user -> rights -> propal -> lire ) {
2020-11-02 11:41:07 +01:00
$label = img_picto ( '' , $this -> picto ) . ' <u class="paddingrightonly">' . $langs -> trans ( " Proposal " ) . '</u>' ;
if ( isset ( $this -> statut )) {
$label .= ' ' . $this -> getLibStatut ( 5 );
}
2020-11-16 12:20:18 +01:00
if ( ! empty ( $this -> ref )) {
2019-11-08 15:51:54 +01:00
$label .= '<br><b>' . $langs -> trans ( 'Ref' ) . ':</b> ' . $this -> ref ;
2020-11-16 12:20:18 +01:00
}
if ( ! empty ( $this -> ref_client )) {
2019-11-08 15:51:54 +01:00
$label .= '<br><b>' . $langs -> trans ( 'RefCustomer' ) . ':</b> ' . $this -> ref_client ;
2020-11-16 12:20:18 +01:00
}
if ( ! empty ( $this -> total_ht )) {
2019-11-08 15:51:54 +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 )) {
2019-11-08 15:51:54 +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 )) {
2019-11-08 15:51:54 +01:00
$label .= '<br><b>' . $langs -> trans ( 'AmountTTC' ) . ':</b> ' . price ( $this -> total_ttc , 0 , $langs , 0 , - 1 , - 1 , $conf -> currency );
2020-04-20 03:10:26 +02: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-04-20 03:10:26 +02:00
2017-10-07 13:09:31 +02:00
if ( $option == '' ) {
2019-11-08 15:51:54 +01:00
$url = DOL_URL_ROOT . '/comm/propal/card.php?id=' . $this -> id . $get_params ;
2020-05-21 15:05:19 +02:00
} elseif ( $option == 'compta' ) { // deprecated
2019-11-08 15:51:54 +01:00
$url = DOL_URL_ROOT . '/comm/propal/card.php?id=' . $this -> id . $get_params ;
2020-05-21 15:05:19 +02:00
} elseif ( $option == 'expedition' ) {
2019-11-08 15:51:54 +01:00
$url = DOL_URL_ROOT . '/expedition/propal.php?id=' . $this -> id . $get_params ;
2020-05-21 15:05:19 +02:00
} elseif ( $option == 'document' ) {
2019-11-08 15:51:54 +01:00
$url = DOL_URL_ROOT . '/comm/propal/document.php?id=' . $this -> id . $get_params ;
2017-10-07 13:09:31 +02:00
}
2014-11-03 16:20:55 +01:00
2021-02-23 18:59:19 +01:00
if ( $option != 'nolink' ) {
2017-10-07 13:09:31 +02:00
// Add param to save lastsearch_values or not
2019-11-08 15:51:54 +01:00
$add_save_lastsearch_values = ( $save_lastsearch_value == 1 ? 1 : 0 );
2021-02-23 18:59:19 +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' ;
}
2017-10-07 13:09:31 +02:00
}
}
2014-11-03 16:20:55 +01:00
2019-11-08 15:51:54 +01:00
$linkclose = '' ;
2021-02-23 18:59:19 +01:00
if ( empty ( $notooltip ) && $user -> rights -> propal -> lire ) {
if ( ! empty ( $conf -> global -> MAIN_OPTIMIZEFORTEXTBROWSER )) {
2020-04-20 03:10:26 +02:00
$label = $langs -> trans ( " Proposal " );
2019-11-08 15:51:54 +01:00
$linkclose .= ' alt="' . dol_escape_htmltag ( $label , 1 ) . '"' ;
2017-10-07 13:09:31 +02:00
}
2019-11-08 15:51:54 +01:00
$linkclose .= ' title="' . dol_escape_htmltag ( $label , 1 ) . '"' ;
$linkclose .= ' class="classfortooltip"' ;
2017-10-07 13:09:31 +02:00
}
2012-03-18 19:23:01 +01:00
2017-10-07 13:09:31 +02:00
$linkstart = '<a href="' . $url . '"' ;
2019-11-08 15:51:54 +01:00
$linkstart .= $linkclose . '>' ;
$linkend = '</a>' ;
2015-04-23 23:21:06 +02:00
2017-11-02 15:03:09 +01:00
$result .= $linkstart ;
2021-02-23 18:59:19 +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 ;
}
2017-11-02 15:03:09 +01:00
$result .= $linkend ;
2020-10-31 14:32:18 +01:00
if ( $addlinktonotes >= 0 ) {
$txttoshow = '' ;
if ( $addlinktonotes == 0 ) {
if ( ! empty ( $this -> note_private ) || ! empty ( $this -> note_public )) {
$txttoshow = $langs -> trans ( 'ViewPrivateNote' );
}
} elseif ( $addlinktonotes == 1 ) {
if ( ! empty ( $this -> note_private )) {
$txttoshow .= ( $user -> socid > 0 ? '' : dol_string_nohtmltag ( $this -> note_private , 1 ));
}
} elseif ( $addlinktonotes == 2 ) {
if ( ! empty ( $this -> note_public )) {
$txttoshow .= dol_string_nohtmltag ( $this -> note_public , 1 );
}
} elseif ( $addlinktonotes == 3 ) {
if ( $user -> socid > 0 ) {
if ( ! empty ( $this -> note_public )) {
$txttoshow .= dol_string_nohtmltag ( $this -> note_public , 1 );
}
} else {
if ( ! empty ( $this -> note_public )) {
$txttoshow .= dol_string_nohtmltag ( $this -> note_public , 1 );
}
if ( ! empty ( $this -> note_private )) {
2021-02-23 18:59:19 +01:00
if ( ! empty ( $txttoshow )) {
$txttoshow .= '<br><br>' ;
}
2020-10-31 14:32:18 +01:00
$txttoshow .= dol_string_nohtmltag ( $this -> note_private , 1 );
}
}
}
if ( $txttoshow ) {
$result .= ' <span class="note inline-block">' ;
$result .= '<a href="' . DOL_URL_ROOT . '/comm/propal/note.php?id=' . $this -> id . '" class="classfortooltip" title="' . dol_escape_htmltag ( $txttoshow ) . '">' ;
$result .= img_picto ( '' , 'note' );
$result .= '</a>' ;
$result .= '</span>' ;
}
}
2020-01-15 19:49:45 +01:00
2022-02-15 10:53:33 +01:00
global $action ;
2022-02-15 11:03:50 +01:00
$hookmanager -> initHooks ( array ( $this -> element . 'dao' ));
2022-02-15 18:31:05 +01:00
$parameters = array ( 'id' => $this -> id , 'getnomurl' => & $result );
2022-02-15 10:53:33 +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 ;
}
2017-10-07 13:09:31 +02:00
return $result ;
}
2012-03-18 19:23:01 +01:00
2017-10-07 13:09:31 +02:00
/**
2018-09-28 16:15:17 +02:00
* Retrieve an array of proposal lines
2022-01-26 08:50:57 +01:00
* @ param string $filters Filter on other fields
2017-10-07 13:09:31 +02:00
*
* @ return int > 0 if OK , < 0 if KO
*/
2022-01-26 08:50:57 +01:00
public function getLinesArray ( $filters = '' )
2017-10-07 13:09:31 +02:00
{
2022-01-26 08:50:57 +01:00
return $this -> fetch_lines ( 0 , 0 , $filters );
2017-10-07 13:09:31 +02:00
}
2007-05-05 00:37:06 +02:00
Created a method generateDocument for several classes
Which are: Commande, Contrat, Livraison, Facture, Projet, Propal, Task, Expedition, CommandeFournisseur, FactureFournisseur and therefore deprecated the following methods supplier_order_pdf_create, supplier_invoice_pdf_create, delivery_order_pdf_create, task_pdf_create, propale_pdf_create, project_pdf_create, facture_pdf_create, expedition_pdf_create, commande_pdf_create
2014-09-16 12:30:37 +02:00
/**
* Create a document onto disk according to template module .
*
* @ param string $modele Force model to use ( '' to not force )
* @ param Translate $outputlangs Object langs to use for output
* @ param int $hidedetails Hide details of lines
* @ param int $hidedesc Hide description
* @ param int $hideref Hide ref
2022-08-14 20:45:04 +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
{
2019-11-08 15:51:54 +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
$langs -> load ( " propale " );
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
2019-11-08 15:51:54 +01:00
if ( ! dol_strlen ( $modele )) {
2017-01-16 21:16:05 +01:00
$modele = 'azur' ;
2020-09-10 01:49:09 +02:00
if ( $this -> model_pdf ) {
$modele = $this -> model_pdf ;
2019-11-08 15:51:54 +01:00
} elseif ( ! empty ( $conf -> global -> PROPALE_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 -> PROPALE_ADDON_PDF ;
}
}
2014-09-21 18:16:14 +02:00
$modelpath = " core/modules/propale/doc/ " ;
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
2019-01-27 11:55:16 +01:00
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-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 (
'propal'
);
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-04-18 18:11:01 +02:00
return CommonObject :: commonReplaceThirdparty ( $db , $origin_id , $dest_id , $tables );
}
2005-08-11 22:01:25 +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 (
'propaldet'
);
return CommonObject :: commonReplaceProduct ( $db , $origin_id , $dest_id , $tables );
}
}
2005-08-11 22:01:25 +02:00
/**
2015-12-16 19:26:50 +01:00
* Class to manage commercial proposal lines
2008-08-28 01:00:37 +02:00
*/
2017-07-13 23:46:01 +02:00
class PropaleLigne extends CommonObjectLine
2003-09-11 18:00:49 +02:00
{
2018-08-23 17:07:27 +02:00
/**
* @ var string ID to identify managed object
*/
2019-11-08 15:51:54 +01:00
public $element = 'propaldet' ;
2018-08-31 13:50:58 +02:00
2018-08-22 18:12:44 +02:00
/**
* @ var string Name of table without prefix where object is stored
*/
2019-11-08 15:51:54 +01:00
public $table_element = 'propaldet' ;
2013-06-10 16:05:41 +02:00
2020-10-31 14:32:18 +01:00
public $oldline ;
2012-03-18 19:23:01 +01:00
2017-10-07 13:09:31 +02:00
// From llx_propaldet
2020-10-31 14:32:18 +01:00
public $fk_propal ;
public $fk_parent_line ;
public $desc ; // Description ligne
public $fk_product ; // Id produit predefini
2015-04-23 23:21:06 +02:00
/**
* @ deprecated
2019-03-11 21:03:23 +01:00
* @ see $product_type
2015-04-23 23:21:06 +02:00
*/
2020-10-31 14:32:18 +01:00
public $fk_product_type ;
2015-04-03 05:18:47 +02:00
/**
* Product type .
* @ var int
2015-04-23 23:21:06 +02:00
* @ see Product :: TYPE_PRODUCT , Product :: TYPE_SERVICE
2015-04-03 05:18:47 +02:00
*/
2020-10-31 14:32:18 +01:00
public $product_type = Product :: TYPE_PRODUCT ;
2012-03-18 19:23:01 +01:00
2020-10-31 14:32:18 +01:00
public $qty ;
2012-03-18 19:23:01 +01:00
2020-10-31 14:32:18 +01:00
public $tva_tx ;
2020-12-07 18:29:14 +01:00
public $vat_src_code ;
2012-07-20 09:57:50 +02:00
2020-10-31 14:32:18 +01:00
public $subprice ;
public $remise_percent ;
public $fk_remise_except ;
2012-03-18 19:23:01 +01:00
2020-10-31 14:32:18 +01:00
public $rang = 0 ;
2012-07-20 09:57:50 +02:00
2020-10-31 14:32:18 +01:00
public $fk_fournprice ;
public $pa_ht ;
public $marge_tx ;
public $marque_tx ;
2012-03-18 19:23:01 +01:00
2020-10-31 14:32:18 +01:00
public $special_code ; // Tag for special lines (exlusive tags)
2017-10-07 13:09:31 +02:00
// 1: frais de port
// 2: ecotaxe
// 3: option line (when qty = 0)
2012-03-18 19:23:01 +01:00
2020-10-31 14:32:18 +01:00
public $info_bits = 0 ; // Some other info:
2017-10-07 13:09:31 +02:00
// Bit 0: 0 si TVA normal - 1 si TVA NPR
// Bit 1: 0 ligne normale - 1 si ligne de remise fixe
2012-03-18 19:23:01 +01:00
2020-10-31 14:32:18 +01:00
public $total_ht ; // Total HT de la ligne toute quantite et incluant la remise ligne
public $total_tva ; // Total TVA de la ligne toute quantite et incluant la remise ligne
public $total_ttc ; // Total TTC de la ligne toute quantite et incluant la remise ligne
2012-03-18 19:23:01 +01:00
2015-04-23 23:21:06 +02:00
/**
* @ deprecated
* @ see $remise_percent , $fk_remise_except
*/
2020-10-31 14:32:18 +01:00
public $remise ;
2015-04-23 23:21:06 +02:00
/**
* @ deprecated
2019-03-11 21:03:23 +01:00
* @ see $subprice
2015-04-23 23:21:06 +02:00
*/
2020-10-31 14:32:18 +01:00
public $price ;
2012-03-18 19:23:01 +01:00
2017-10-07 13:09:31 +02:00
// From llx_product
2015-04-23 23:21:06 +02:00
/**
* @ deprecated
2019-03-11 21:03:23 +01:00
* @ see $product_ref
2015-04-23 23:21:06 +02:00
*/
2020-10-31 14:32:18 +01:00
public $ref ;
2015-04-23 23:21:06 +02:00
/**
* Product reference
* @ var string
*/
public $product_ref ;
/**
* @ deprecated
2019-03-11 21:03:23 +01:00
* @ see $product_label
2015-04-23 23:21:06 +02:00
*/
2020-10-31 14:32:18 +01:00
public $libelle ;
2020-12-07 18:29:14 +01:00
/**
* @ deprecated
* @ see $product_label
*/
public $label ;
2015-04-23 23:21:06 +02:00
/**
* Product label
* @ var string
*/
public $product_label ;
/**
* Product description
* @ var string
*/
2017-10-07 13:09:31 +02:00
public $product_desc ;
2012-03-18 19:23:01 +01:00
2020-11-23 21:38:45 +01:00
/**
* Product use lot
* @ var string
*/
public $product_tobatch ;
2013-04-27 15:08:35 +02:00
2020-11-23 21:38:45 +01:00
/**
* Product barcode
* @ var string
*/
public $product_barcode ;
2012-03-18 19:23:01 +01:00
2020-10-31 14:32:18 +01:00
public $localtax1_tx ; // Local tax 1
public $localtax2_tx ; // Local tax 2
public $localtax1_type ; // Local tax 1 type
public $localtax2_type ; // Local tax 2 type
public $total_localtax1 ; // Line total local tax 1
public $total_localtax2 ; // Line total local tax 2
2013-04-27 15:08:35 +02:00
2020-10-31 14:32:18 +01:00
public $date_start ;
public $date_end ;
2012-03-18 19:23:01 +01:00
2020-10-31 14:32:18 +01:00
public $skip_update_total ; // Skip update price total for special lines
2012-03-18 19:23:01 +01:00
2017-10-07 13:09:31 +02:00
// Multicurrency
2020-10-31 14:32:18 +01:00
public $fk_multicurrency ;
public $multicurrency_code ;
public $multicurrency_subprice ;
public $multicurrency_total_ht ;
public $multicurrency_total_tva ;
public $multicurrency_total_ttc ;
2016-07-08 20:40:25 +02:00
2022-05-18 23:52:43 +02:00
2017-10-07 13:09:31 +02:00
/**
* Class line Contructor
*
* @ param DoliDB $db Database handler
*/
2020-10-31 14:32:18 +01:00
public function __construct ( $db )
2017-10-07 13:09:31 +02:00
{
2019-11-08 15:51:54 +01:00
$this -> db = $db ;
2017-10-07 13:09:31 +02:00
}
/**
* Retrieve the propal line object
*
* @ param int $rowid Propal line id
* @ return int < 0 if KO , > 0 if OK
*/
2020-10-31 14:32:18 +01:00
public function fetch ( $rowid )
2012-07-29 09:54:58 +02:00
{
2017-05-03 12:34:57 +02:00
$sql = 'SELECT pd.rowid, pd.fk_propal, pd.fk_parent_line, pd.fk_product, pd.label as custom_label, pd.description, pd.price, pd.qty, pd.vat_src_code, pd.tva_tx,' ;
2019-11-08 15:51:54 +01:00
$sql .= ' pd.remise, pd.remise_percent, pd.fk_remise_except, pd.subprice,' ;
$sql .= ' pd.info_bits, pd.total_ht, pd.total_tva, pd.total_ttc, pd.fk_product_fournisseur_price as fk_fournprice, pd.buy_price_ht as pa_ht, pd.special_code, pd.rang,' ;
$sql .= ' pd.fk_unit,' ;
$sql .= ' pd.localtax1_tx, pd.localtax2_tx, pd.total_localtax1, pd.total_localtax2,' ;
$sql .= ' pd.fk_multicurrency, pd.multicurrency_code, pd.multicurrency_subprice, pd.multicurrency_total_ht, pd.multicurrency_total_tva, pd.multicurrency_total_ttc,' ;
$sql .= ' p.ref as product_ref, p.label as product_label, p.description as product_desc,' ;
$sql .= ' pd.date_start, pd.date_end, pd.product_type' ;
$sql .= ' FROM ' . MAIN_DB_PREFIX . 'propaldet as pd' ;
$sql .= ' LEFT JOIN ' . MAIN_DB_PREFIX . 'product as p ON pd.fk_product = p.rowid' ;
2021-03-29 15:32:09 +02:00
$sql .= ' WHERE pd.rowid = ' . (( int ) $rowid );
2012-07-29 09:54:58 +02:00
$result = $this -> db -> query ( $sql );
2021-02-23 18:59:19 +01:00
if ( $result ) {
2012-07-29 09:54:58 +02:00
$objp = $this -> db -> fetch_object ( $result );
2021-02-23 18:59:19 +01:00
if ( $objp ) {
2019-11-08 15:51:54 +01:00
$this -> id = $objp -> rowid ;
$this -> rowid = $objp -> rowid ; // deprecated
$this -> fk_propal = $objp -> fk_propal ;
$this -> fk_parent_line = $objp -> fk_parent_line ;
2017-10-06 15:01:31 +02:00
$this -> label = $objp -> custom_label ;
$this -> desc = $objp -> description ;
2019-11-08 15:51:54 +01:00
$this -> qty = $objp -> qty ;
$this -> price = $objp -> price ; // deprecated
$this -> subprice = $objp -> subprice ;
$this -> vat_src_code = $objp -> vat_src_code ;
2017-10-06 15:01:31 +02:00
$this -> tva_tx = $objp -> tva_tx ;
2019-11-08 15:51:54 +01:00
$this -> remise = $objp -> remise ; // deprecated
$this -> remise_percent = $objp -> remise_percent ;
2017-10-06 15:01:31 +02:00
$this -> fk_remise_except = $objp -> fk_remise_except ;
2019-11-08 15:51:54 +01:00
$this -> fk_product = $objp -> fk_product ;
2017-10-06 15:01:31 +02:00
$this -> info_bits = $objp -> info_bits ;
$this -> total_ht = $objp -> total_ht ;
$this -> total_tva = $objp -> total_tva ;
$this -> total_ttc = $objp -> total_ttc ;
2019-11-08 15:51:54 +01:00
$this -> fk_fournprice = $objp -> fk_fournprice ;
2017-10-06 15:01:31 +02:00
$marginInfos = getMarginInfos ( $objp -> subprice , $objp -> remise_percent , $objp -> tva_tx , $objp -> localtax1_tx , $objp -> localtax2_tx , $this -> fk_fournprice , $objp -> pa_ht );
$this -> pa_ht = $marginInfos [ 0 ];
$this -> marge_tx = $marginInfos [ 1 ];
$this -> marque_tx = $marginInfos [ 2 ];
$this -> special_code = $objp -> special_code ;
$this -> product_type = $objp -> product_type ;
2019-11-08 15:51:54 +01:00
$this -> rang = $objp -> rang ;
2017-10-06 15:01:31 +02:00
2019-11-08 15:51:54 +01:00
$this -> ref = $objp -> product_ref ; // deprecated
$this -> product_ref = $objp -> product_ref ;
$this -> libelle = $objp -> product_label ; // deprecated
2017-10-06 15:01:31 +02:00
$this -> product_label = $objp -> product_label ;
$this -> product_desc = $objp -> product_desc ;
$this -> fk_unit = $objp -> fk_unit ;
$this -> date_start = $this -> db -> jdate ( $objp -> date_start );
2017-10-07 13:09:31 +02:00
$this -> date_end = $this -> db -> jdate ( $objp -> date_end );
2012-07-29 09:54:58 +02:00
2017-10-06 15:01:31 +02:00
// Multicurrency
2019-11-08 15:51:54 +01:00
$this -> fk_multicurrency = $objp -> fk_multicurrency ;
$this -> multicurrency_code = $objp -> multicurrency_code ;
2017-10-06 15:01:31 +02: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 ;
2016-07-08 20:40:25 +02:00
2018-04-14 17:04:38 +02:00
$this -> fetch_optionals ();
2017-10-06 15:01:31 +02:00
$this -> db -> free ( $result );
2015-08-09 13:52:02 +02:00
2017-10-07 13:09:31 +02:00
return 1 ;
2020-05-21 15:05:19 +02:00
} else {
2017-10-06 15:01:31 +02:00
return 0 ;
}
2020-05-21 15:05:19 +02:00
} else {
2015-08-09 13:52:02 +02:00
return - 1 ;
2012-07-29 09:54:58 +02:00
}
}
2012-03-18 19:23:01 +01:00
2017-10-07 13:09:31 +02:00
/**
* Insert object line propal in database
*
* @ param int $notrigger 1 = Does not execute triggers , 0 = execute triggers
* @ return int < 0 if KO , > 0 if OK
*/
2020-10-31 14:32:18 +01:00
public function insert ( $notrigger = 0 )
2017-10-07 13:09:31 +02:00
{
2019-11-08 15:51:54 +01:00
global $conf , $user ;
2012-03-18 19:23:01 +01:00
2019-11-08 15:51:54 +01:00
$error = 0 ;
2012-03-18 19:23:01 +01:00
2017-10-07 13:09:31 +02:00
dol_syslog ( get_class ( $this ) . " ::insert rang= " . $this -> rang );
2012-03-18 19:23:01 +01:00
2017-10-07 13:09:31 +02:00
$pa_ht_isemptystring = ( empty ( $this -> pa_ht ) && $this -> pa_ht == '' ); // If true, we can use a default value. If this->pa_ht = '0', we must use '0'.
2016-07-08 20:40:25 +02:00
2017-10-07 13:09:31 +02:00
// Clean parameters
2021-02-23 18:59:19 +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 ) || ! is_numeric ( $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 -> fk_fournprice )) {
$this -> fk_fournprice = 0 ;
}
if ( ! is_numeric ( $this -> qty )) {
$this -> qty = 0 ;
}
if ( empty ( $this -> pa_ht )) {
$this -> pa_ht = 0 ;
}
if ( empty ( $this -> multicurrency_subprice )) {
$this -> multicurrency_subprice = 0 ;
}
if ( empty ( $this -> multicurrency_total_ht )) {
$this -> multicurrency_total_ht = 0 ;
}
if ( empty ( $this -> multicurrency_total_tva )) {
$this -> multicurrency_total_tva = 0 ;
}
if ( empty ( $this -> multicurrency_total_ttc )) {
$this -> multicurrency_total_ttc = 0 ;
}
2016-12-10 12:21:48 +01:00
2020-10-31 14:32:18 +01:00
// if buy price not defined, define buyprice as configured in margin admin
2021-02-23 18:59:19 +01:00
if ( $this -> pa_ht == 0 && $pa_ht_isemptystring ) {
if (( $result = $this -> defineBuyPrice ( $this -> subprice , $this -> remise_percent , $this -> fk_product )) < 0 ) {
2015-10-26 20:33:42 +01:00
return $result ;
2020-05-21 15:05:19 +02:00
} else {
2015-10-26 20:33:42 +01:00
$this -> pa_ht = $result ;
}
}
2012-07-20 09:57:50 +02:00
2017-10-07 13:09:31 +02:00
// Check parameters
2021-02-23 18:59:19 +01:00
if ( $this -> product_type < 0 ) {
return - 1 ;
}
2012-03-18 19:23:01 +01:00
2017-10-07 13:09:31 +02:00
$this -> db -> begin ();
2012-03-18 19:23:01 +01:00
2017-10-07 13:09:31 +02:00
// Insert line into database
$sql = 'INSERT INTO ' . MAIN_DB_PREFIX . 'propaldet' ;
2019-11-08 15:51:54 +01:00
$sql .= ' (fk_propal, fk_parent_line, label, description, fk_product, product_type,' ;
$sql .= ' fk_remise_except, qty, vat_src_code, tva_tx, localtax1_tx, localtax2_tx, localtax1_type, localtax2_type,' ;
$sql .= ' subprice, remise_percent, ' ;
$sql .= ' info_bits, ' ;
$sql .= ' total_ht, total_tva, total_localtax1, total_localtax2, total_ttc, fk_product_fournisseur_price, buy_price_ht, special_code, rang,' ;
$sql .= ' fk_unit,' ;
$sql .= ' date_start, date_end' ;
$sql .= ', fk_multicurrency, multicurrency_code, multicurrency_subprice, multicurrency_total_ht, multicurrency_total_tva, multicurrency_total_ttc)' ;
$sql .= " VALUES ( " . $this -> fk_propal . " , " ;
$sql .= " " . ( $this -> fk_parent_line > 0 ? " ' " . $this -> db -> escape ( $this -> fk_parent_line ) . " ' " : " null " ) . " , " ;
$sql .= " " . ( ! empty ( $this -> label ) ? " ' " . $this -> db -> escape ( $this -> label ) . " ' " : " null " ) . " , " ;
$sql .= " ' " . $this -> db -> escape ( $this -> desc ) . " ', " ;
$sql .= " " . ( $this -> fk_product ? " ' " . $this -> db -> escape ( $this -> fk_product ) . " ' " : " null " ) . " , " ;
$sql .= " ' " . $this -> db -> escape ( $this -> product_type ) . " ', " ;
$sql .= " " . ( $this -> fk_remise_except ? " ' " . $this -> db -> escape ( $this -> fk_remise_except ) . " ' " : " null " ) . " , " ;
2021-09-03 21:25:17 +02:00
$sql .= " " . price2num ( $this -> qty , 'MS' ) . " , " ;
2019-11-08 15:51:54 +01:00
$sql .= " " . ( empty ( $this -> vat_src_code ) ? " '' " : " ' " . $this -> db -> escape ( $this -> vat_src_code ) . " ' " ) . " , " ;
$sql .= " " . price2num ( $this -> tva_tx ) . " , " ;
$sql .= " " . price2num ( $this -> localtax1_tx ) . " , " ;
$sql .= " " . price2num ( $this -> localtax2_tx ) . " , " ;
$sql .= " ' " . $this -> db -> escape ( $this -> localtax1_type ) . " ', " ;
$sql .= " ' " . $this -> db -> escape ( $this -> localtax2_type ) . " ', " ;
2021-09-03 21:25:17 +02:00
$sql .= " " . ( price2num ( $this -> subprice ) !== '' ? price2num ( $this -> subprice , 'MU' ) : " null " ) . " , " ;
$sql .= " " . price2num ( $this -> remise_percent , 3 ) . " , " ;
$sql .= " " . ( isset ( $this -> info_bits ) ? (( int ) $this -> info_bits ) : " null " ) . " , " ;
$sql .= " " . price2num ( $this -> total_ht , 'MT' ) . " , " ;
$sql .= " " . price2num ( $this -> total_tva , 'MT' ) . " , " ;
$sql .= " " . price2num ( $this -> total_localtax1 , 'MT' ) . " , " ;
$sql .= " " . price2num ( $this -> total_localtax2 , 'MT' ) . " , " ;
$sql .= " " . price2num ( $this -> total_ttc , 'MT' ) . " , " ;
2019-11-08 15:51:54 +01:00
$sql .= " " . ( ! empty ( $this -> fk_fournprice ) ? " ' " . $this -> db -> escape ( $this -> fk_fournprice ) . " ' " : " null " ) . " , " ;
$sql .= " " . ( isset ( $this -> pa_ht ) ? " ' " . price2num ( $this -> pa_ht ) . " ' " : " null " ) . " , " ;
2021-08-27 23:36:06 +02:00
$sql .= ' ' . (( int ) $this -> special_code ) . ',' ;
$sql .= ' ' . (( int ) $this -> rang ) . ',' ;
$sql .= ' ' . ( empty ( $this -> fk_unit ) ? 'NULL' : (( int ) $this -> fk_unit )) . ',' ;
2019-11-08 15:51:54 +01:00
$sql .= " " . ( ! empty ( $this -> date_start ) ? " ' " . $this -> db -> idate ( $this -> date_start ) . " ' " : " null " ) . ',' ;
$sql .= " " . ( ! empty ( $this -> date_end ) ? " ' " . $this -> db -> idate ( $this -> date_end ) . " ' " : " null " );
2021-08-27 23:36:06 +02:00
$sql .= " , " . ( $this -> fk_multicurrency > 0 ? (( int ) $this -> fk_multicurrency ) : 'null' );
2019-11-08 15:51:54 +01:00
$sql .= " , ' " . $this -> db -> escape ( $this -> multicurrency_code ) . " ' " ;
2021-09-03 21:25:17 +02:00
$sql .= " , " . price2num ( $this -> multicurrency_subprice , 'CU' );
$sql .= " , " . price2num ( $this -> multicurrency_total_ht , 'CT' );
$sql .= " , " . price2num ( $this -> multicurrency_total_tva , 'CT' );
$sql .= " , " . price2num ( $this -> multicurrency_total_ttc , 'CT' );
2019-11-08 15:51:54 +01:00
$sql .= ')' ;
2017-10-07 13:09:31 +02:00
dol_syslog ( get_class ( $this ) . '::insert' , LOG_DEBUG );
2019-11-08 15:51:54 +01:00
$resql = $this -> db -> query ( $sql );
2021-02-23 18:59:19 +01:00
if ( $resql ) {
2019-11-08 15:51:54 +01:00
$this -> rowid = $this -> db -> last_insert_id ( MAIN_DB_PREFIX . 'propaldet' );
2017-10-07 13:09:31 +02:00
2021-02-23 18:59:19 +01:00
if ( ! $error ) {
2019-11-08 15:51:54 +01:00
$this -> id = $this -> rowid ;
$result = $this -> insertExtraFields ();
2021-02-23 18:59:19 +01:00
if ( $result < 0 ) {
2017-10-07 13:09:31 +02:00
$error ++ ;
}
}
2021-02-23 18:59:19 +01:00
if ( ! $error && ! $notrigger ) {
2017-10-07 13:09:31 +02:00
// Call trigger
2019-11-08 15:51:54 +01:00
$result = $this -> call_trigger ( 'LINEPROPAL_INSERT' , $user );
2021-02-23 18:59:19 +01:00
if ( $result < 0 ) {
2017-10-07 13:09:31 +02:00
$this -> db -> rollback ();
return - 1 ;
}
// End call triggers
}
$this -> db -> commit ();
return 1 ;
2020-05-21 15:05:19 +02:00
} else {
2019-11-08 15:51:54 +01:00
$this -> error = $this -> db -> error () . " sql= " . $sql ;
2017-10-07 13:09:31 +02:00
$this -> db -> rollback ();
return - 1 ;
}
}
/**
* Delete line in database
*
2017-12-03 20:51:26 +01:00
* @ param User $user Object user
2017-10-07 13:09:31 +02:00
* @ param int $notrigger 1 = Does not execute triggers , 0 = execute triggers
2017-12-03 20:51:26 +01:00
* @ return int < 0 if ko , > 0 if ok
2017-10-07 13:09:31 +02:00
*/
2020-10-31 14:32:18 +01:00
public function delete ( User $user , $notrigger = 0 )
2017-10-07 13:09:31 +02:00
{
2017-12-06 23:21:58 +01:00
global $conf ;
2017-10-07 13:09:31 +02:00
2019-11-08 15:51:54 +01:00
$error = 0 ;
2017-10-07 13:09:31 +02:00
$this -> db -> begin ();
2022-03-09 11:32:07 +01:00
if ( ! $notrigger ) {
// Call trigger
$result = $this -> call_trigger ( 'LINEPROPAL_DELETE' , $user );
if ( $result < 0 ) {
$error ++ ;
2017-10-07 13:09:31 +02:00
}
2022-03-09 11:32:07 +01:00
}
// End call triggers
2017-10-07 13:09:31 +02:00
2022-03-09 11:32:07 +01:00
if ( ! $error ) {
2022-03-09 11:40:26 +01:00
$sql = " DELETE FROM " . MAIN_DB_PREFIX . " propaldet WHERE rowid = " . (( int ) $this -> rowid );
2022-03-09 11:32:07 +01:00
dol_syslog ( " PropaleLigne::delete " , LOG_DEBUG );
if ( $this -> db -> query ( $sql )) {
// Remove extrafields
if ( ! $error ) {
$this -> id = $this -> rowid ;
$result = $this -> deleteExtraFields ();
if ( $result < 0 ) {
$error ++ ;
dol_syslog ( get_class ( $this ) . " ::delete error -4 " . $this -> error , LOG_ERR );
}
2017-10-07 13:09:31 +02:00
}
2022-03-09 11:32:07 +01:00
} else {
$this -> error = $this -> db -> error () . " sql= " . $sql ;
$error ++ ;
2017-10-07 13:09:31 +02:00
}
2022-03-09 11:32:07 +01:00
}
2017-10-07 13:09:31 +02:00
2022-03-09 11:32:07 +01:00
if ( $error ) {
2017-10-07 13:09:31 +02:00
$this -> db -> rollback ();
return - 1 ;
2022-03-09 11:32:07 +01:00
} else {
$this -> db -> commit ();
return 1 ;
2017-10-07 13:09:31 +02:00
}
}
/**
* Update propal line object into DB
*
* @ param int $notrigger 1 = Does not execute triggers , 0 = execute triggers
* @ return int < 0 if ko , > 0 if ok
*/
2020-10-31 14:32:18 +01:00
public function update ( $notrigger = 0 )
2017-10-07 13:09:31 +02:00
{
2019-11-08 15:51:54 +01:00
global $conf , $user ;
2017-10-07 13:09:31 +02:00
2019-11-08 15:51:54 +01:00
$error = 0 ;
2017-10-07 13:09:31 +02:00
$pa_ht_isemptystring = ( empty ( $this -> pa_ht ) && $this -> pa_ht == '' ); // If true, we can use a default value. If this->pa_ht = '0', we must use '0'.
2021-02-23 18:59:19 +01:00
if ( empty ( $this -> id ) && ! empty ( $this -> rowid )) {
$this -> id = $this -> rowid ;
}
2020-07-06 22:48:22 +02:00
2017-10-07 13:09:31 +02:00
// Clean parameters
2021-02-23 18:59:19 +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 -> total_localtax1 )) {
$this -> total_localtax1 = 0 ;
}
if ( empty ( $this -> total_localtax2 )) {
$this -> total_localtax2 = 0 ;
}
if ( empty ( $this -> localtax1_type )) {
$this -> localtax1_type = 0 ;
}
if ( empty ( $this -> localtax2_type )) {
$this -> localtax2_type = 0 ;
}
if ( empty ( $this -> marque_tx )) {
$this -> marque_tx = 0 ;
}
if ( empty ( $this -> marge_tx )) {
$this -> marge_tx = 0 ;
}
if ( empty ( $this -> price )) {
$this -> price = 0 ; // TODO A virer
}
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 -> fk_fournprice )) {
$this -> fk_fournprice = 0 ;
}
if ( empty ( $this -> subprice )) {
$this -> subprice = 0 ;
}
if ( empty ( $this -> pa_ht )) {
$this -> pa_ht = 0 ;
}
2012-07-20 09:57:50 +02:00
2015-10-26 20:33:42 +01:00
// if buy price not defined, define buyprice as configured in margin admin
2021-02-23 18:59:19 +01:00
if ( $this -> pa_ht == 0 && $pa_ht_isemptystring ) {
if (( $result = $this -> defineBuyPrice ( $this -> subprice , $this -> remise_percent , $this -> fk_product )) < 0 ) {
2015-10-26 20:33:42 +01:00
return $result ;
2020-05-21 15:05:19 +02:00
} else {
2015-10-26 20:33:42 +01:00
$this -> pa_ht = $result ;
}
2012-08-01 17:36:15 +02:00
}
2012-07-18 15:15:54 +02:00
2017-10-07 13:09:31 +02:00
$this -> db -> begin ();
2012-03-18 19:23:01 +01:00
2017-10-07 13:09:31 +02:00
// Mise a jour ligne en base
$sql = " UPDATE " . MAIN_DB_PREFIX . " propaldet SET " ;
2019-11-08 15:51:54 +01:00
$sql .= " description=' " . $this -> db -> escape ( $this -> desc ) . " ' " ;
$sql .= " , label= " . ( ! empty ( $this -> label ) ? " ' " . $this -> db -> escape ( $this -> label ) . " ' " : " null " );
$sql .= " , product_type= " . $this -> product_type ;
$sql .= " , vat_src_code = ' " . ( empty ( $this -> vat_src_code ) ? '' : $this -> vat_src_code ) . " ' " ;
$sql .= " , tva_tx=' " . price2num ( $this -> tva_tx ) . " ' " ;
$sql .= " , localtax1_tx= " . price2num ( $this -> localtax1_tx );
$sql .= " , localtax2_tx= " . price2num ( $this -> localtax2_tx );
$sql .= " , localtax1_type=' " . $this -> db -> escape ( $this -> localtax1_type ) . " ' " ;
$sql .= " , localtax2_type=' " . $this -> db -> escape ( $this -> localtax2_type ) . " ' " ;
$sql .= " , qty=' " . price2num ( $this -> qty ) . " ' " ;
$sql .= " , subprice= " . price2num ( $this -> subprice ) . " " ;
$sql .= " , remise_percent= " . price2num ( $this -> remise_percent ) . " " ;
2022-11-21 14:47:31 +01:00
$sql .= " , price= " . ( float ) price2num ( $this -> price ) . " " ; // TODO A virer
$sql .= " , remise= " . ( float ) price2num ( $this -> remise ) . " " ; // TODO A virer
2019-11-08 15:51:54 +01:00
$sql .= " , info_bits=' " . $this -> db -> escape ( $this -> info_bits ) . " ' " ;
2021-02-23 18:59:19 +01:00
if ( empty ( $this -> skip_update_total )) {
2019-11-08 15:51:54 +01:00
$sql .= " , total_ht= " . price2num ( $this -> total_ht ) . " " ;
$sql .= " , total_tva= " . price2num ( $this -> total_tva ) . " " ;
$sql .= " , total_ttc= " . price2num ( $this -> total_ttc ) . " " ;
$sql .= " , total_localtax1= " . price2num ( $this -> total_localtax1 ) . " " ;
$sql .= " , total_localtax2= " . price2num ( $this -> total_localtax2 ) . " " ;
2017-10-07 13:09:31 +02:00
}
2019-11-08 15:51:54 +01:00
$sql .= " , fk_product_fournisseur_price= " . ( ! empty ( $this -> fk_fournprice ) ? " ' " . $this -> db -> escape ( $this -> fk_fournprice ) . " ' " : " null " );
$sql .= " , buy_price_ht= " . price2num ( $this -> pa_ht );
2021-02-23 18:59:19 +01:00
if ( strlen ( $this -> special_code )) {
$sql .= " , special_code= " . $this -> special_code ;
}
2019-11-08 15:51:54 +01:00
$sql .= " , fk_parent_line= " . ( $this -> fk_parent_line > 0 ? $this -> fk_parent_line : " null " );
2021-02-23 18:59:19 +01:00
if ( ! empty ( $this -> rang )) {
2021-06-09 15:36:47 +02:00
$sql .= " , rang= " . (( int ) $this -> rang );
2021-02-23 18:59:19 +01:00
}
2019-11-08 15:51:54 +01:00
$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 .= " , fk_unit= " . ( ! $this -> fk_unit ? 'NULL' : $this -> fk_unit );
2016-07-08 20:40:25 +02:00
2016-01-21 22:40:07 +01:00
// Multicurrency
2019-11-08 15:51:54 +01:00
$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 ) . " " ;
2017-10-07 13:09:31 +02:00
2021-06-09 15:36:47 +02:00
$sql .= " WHERE rowid = " . (( int ) $this -> id );
2017-10-07 13:09:31 +02:00
dol_syslog ( get_class ( $this ) . " ::update " , LOG_DEBUG );
2019-11-08 15:51:54 +01:00
$resql = $this -> db -> query ( $sql );
2021-02-23 18:59:19 +01:00
if ( $resql ) {
if ( ! $error ) {
2019-11-08 15:51:54 +01:00
$result = $this -> insertExtraFields ();
2021-02-23 18:59:19 +01:00
if ( $result < 0 ) {
2017-10-07 13:09:31 +02:00
$error ++ ;
}
}
2021-02-23 18:59:19 +01:00
if ( ! $error && ! $notrigger ) {
2017-10-07 13:09:31 +02:00
// Call trigger
2022-04-02 10:31:58 +02:00
$result = $this -> call_trigger ( 'LINEPROPAL_MODIFY' , $user );
2021-02-23 18:59:19 +01:00
if ( $result < 0 ) {
2017-10-07 13:09:31 +02:00
$this -> db -> rollback ();
return - 1 ;
}
// End call triggers
}
$this -> db -> commit ();
return 1 ;
2020-05-21 15:05:19 +02:00
} else {
2019-11-08 15:51:54 +01:00
$this -> error = $this -> db -> error ();
2017-10-07 13:09:31 +02:00
$this -> db -> rollback ();
return - 2 ;
}
}
2020-10-28 17:49:52 +01:00
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
2017-10-07 13:09:31 +02:00
/**
* Update DB line fields total_xxx
* Used by migration
*
2018-09-03 17:05:44 +02:00
* @ return int < 0 if KO , > 0 if OK
2017-10-07 13:09:31 +02:00
*/
2020-10-31 14:32:18 +01:00
public function update_total ()
2017-10-07 13:09:31 +02:00
{
2020-10-31 14:32:18 +01:00
// phpcs:enable
2017-10-07 13:09:31 +02:00
$this -> db -> begin ();
// Mise a jour ligne en base
$sql = " UPDATE " . MAIN_DB_PREFIX . " propaldet SET " ;
2019-11-08 15:51:54 +01:00
$sql .= " total_ht= " . price2num ( $this -> total_ht , 'MT' ) . " " ;
$sql .= " ,total_tva= " . price2num ( $this -> total_tva , 'MT' ) . " " ;
$sql .= " ,total_ttc= " . price2num ( $this -> total_ttc , 'MT' ) . " " ;
2021-06-09 15:36:47 +02:00
$sql .= " WHERE rowid = " . (( int ) $this -> rowid );
2017-10-07 13:09:31 +02:00
dol_syslog ( " PropaleLigne::update_total " , LOG_DEBUG );
2019-11-08 15:51:54 +01:00
$resql = $this -> db -> query ( $sql );
2021-02-23 18:59:19 +01:00
if ( $resql ) {
2017-10-07 13:09:31 +02:00
$this -> db -> commit ();
return 1 ;
2020-05-21 15:05:19 +02:00
} else {
2019-11-08 15:51:54 +01:00
$this -> error = $this -> db -> error ();
2017-10-07 13:09:31 +02:00
$this -> db -> rollback ();
return - 2 ;
}
}
2003-09-11 18:00:49 +02:00
}