2005-09-15 02:37:03 +02:00
< ? php
2006-12-01 22:35:44 +01:00
/* Copyright ( C ) 2003 - 2006 Rodolphe Quiedeville < rodolphe @ quiedeville . org >
2012-08-05 21:30:40 +02:00
* Copyright ( C ) 2004 - 2012 Laurent Destailleur < eldy @ users . sourceforge . net >
2014-08-18 20:23:06 +02:00
* Copyright ( C ) 2005 - 2014 Regis Houssin < regis . houssin @ capnetworks . com >
2006-02-12 09:54:15 +01:00
* Copyright ( C ) 2006 Andre Cianfarani < acianfa @ free . fr >
2016-05-06 22:30:34 +02:00
* Copyright ( C ) 2010 - 2016 Juanjo Menent < jmenent @ 2 byte . es >
2011-05-21 09:12:21 +02:00
* Copyright ( C ) 2011 Jean Heimburger < jean @ tiaris . info >
2014-09-24 11:47:34 +02:00
* Copyright ( C ) 2012 - 2014 Christophe Battarel < christophe . battarel @ altairis . fr >
2015-02-26 14:15:33 +01:00
* Copyright ( C ) 2012 Cedric Salvador < csalvador @ gpcsolutions . fr >
2013-09-10 11:04:36 +02:00
* Copyright ( C ) 2013 Florian Henry < florian . henry @ open - concept . pro >
2015-02-15 15:07:24 +01:00
* Copyright ( C ) 2014 - 2015 Marcos GarcÃa < marcosgdf @ gmail . com >
2016-02-01 13:05:14 +01:00
* Copyright ( C ) 2016 Ferran Marcet < fmarcet @ 2 byte . es >
2005-09-15 02:37:03 +02:00
*
* This program is free software ; you can redistribute it and / or modify
2014-08-18 20:23:06 +02:00
* 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
2005-09-15 02:37:03 +02:00
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
2011-08-01 00:21:57 +02:00
* along with this program . If not , see < http :// www . gnu . org / licenses />.
2005-09-15 02:37:03 +02:00
*/
2008-08-07 22:29:46 +02:00
2005-09-15 02:37:03 +02:00
/**
2010-04-27 10:13:42 +02:00
* \file htdocs / commande / class / commande . class . php
2008-08-07 22:29:46 +02:00
* \ingroup commande
* \brief Fichier des classes de commandes
*/
2016-02-16 20:44:23 +01:00
include_once DOL_DOCUMENT_ROOT . '/core/class/commonorder.class.php' ;
require_once DOL_DOCUMENT_ROOT . '/core/class/commonobjectline.class.php' ;
require_once DOL_DOCUMENT_ROOT . '/product/class/product.class.php' ;
2012-08-22 23:11:24 +02:00
require_once DOL_DOCUMENT_ROOT . '/margin/lib/margins.lib.php' ;
2016-02-16 20:44:23 +01:00
require_once DOL_DOCUMENT_ROOT . '/multicurrency/class/multicurrency.class.php' ;
2008-08-07 22:29:46 +02:00
2005-09-15 02:37:03 +02:00
/**
2012-08-05 21:30:40 +02:00
* Class to manage customers orders
2008-08-07 22:29:46 +02:00
*/
2012-07-11 18:13:41 +02:00
class Commande extends CommonOrder
2005-09-15 02:37:03 +02:00
{
2011-09-20 19:19:46 +02:00
public $element = 'commande' ;
public $table_element = 'commande' ;
public $table_element_line = 'commandedet' ;
public $class_element_line = 'OrderLine' ;
public $fk_element = 'fk_commande' ;
protected $ismultientitymanaged = 1 ; // 0=No test on entity, 1=Test with field entity, 2=Test with link by societe
2011-09-12 19:08:02 +02:00
2014-12-25 21:47:39 +01:00
/**
* { @ inheritdoc }
*/
protected $table_ref_field = 'ref' ;
2015-04-03 05:18:47 +02:00
/**
* Client ID
* @ var int
*/
2016-07-08 21:28:21 +02:00
public $socid ;
2015-04-03 05:18:47 +02:00
2016-07-08 21:28:21 +02:00
public $ref_client ;
public $ref_int ;
public $contactid ;
2015-04-01 16:33:39 +02:00
2015-03-15 11:48:57 +01:00
/**
2015-03-30 03:19:20 +02:00
* Status of the order . Check the following constants :
2015-03-15 11:48:57 +01:00
* @ var int
2015-04-23 23:21:06 +02:00
* @ see Commande :: STATUS_CANCELED , Commande :: STATUS_DRAFT , Commande :: STATUS_ACCEPTED , Commande :: STATUS_CLOSED
2015-03-15 11:48:57 +01:00
*/
2016-07-08 21:28:21 +02:00
public $statut ;
2015-03-15 11:48:57 +01:00
/**
2015-04-03 05:18:47 +02:00
* @ deprecated
2015-04-23 23:21:06 +02:00
* @ see billed
2015-03-15 11:48:57 +01:00
*/
2016-07-08 21:28:21 +02:00
public $facturee ;
public $billed ; // billed or not
2015-03-15 11:48:57 +01:00
2016-07-08 21:28:21 +02:00
public $brouillon ;
public $cond_reglement_code ;
2015-12-27 19:15:20 +01:00
2016-07-08 21:28:21 +02:00
public $fk_account ;
2015-12-27 19:15:20 +01:00
2015-12-27 13:10:33 +01:00
/**
* It holds the label of the payment mode . Use it in case translation cannot be found .
* @ var string
*/
2016-07-08 21:28:21 +02:00
public $mode_reglement ;
2015-12-27 13:10:33 +01:00
/**
* Payment mode id
* @ var int
*/
2016-07-08 21:28:21 +02:00
public $mode_reglement_id ;
2015-12-27 13:10:33 +01:00
/**
* Payment mode code
* @ var string
*/
2016-07-08 21:28:21 +02:00
public $mode_reglement_code ;
2015-12-27 13:10:33 +01:00
/**
* Availability delivery time id
* @ var int
*/
2016-07-08 21:28:21 +02:00
public $availability_id ;
2015-12-27 13:10:33 +01:00
/**
* Availability delivery time code
* @ var string
*/
2016-07-08 21:28:21 +02:00
public $availability_code ;
2015-12-27 13:10:33 +01:00
/**
* Label of availability delivery time . Use it in case translation cannot be found .
* @ var string
*/
2016-07-08 21:28:21 +02:00
public $availability ;
2015-12-27 13:10:33 +01:00
2016-07-08 21:28:21 +02:00
public $demand_reason_id ;
public $demand_reason_code ;
public $address ;
public $date ; // Date commande
2015-04-23 23:21:06 +02:00
/**
* @ deprecated
* @ see date
*/
2016-07-08 21:28:21 +02:00
public $date_commande ;
public $date_livraison ; // Date livraison souhaitee
public $fk_remise_except ;
public $remise_percent ;
public $remise_absolue ;
public $info_bits ;
public $rang ;
public $special_code ;
public $source ; // Origin of order
public $extraparams = array ();
2011-09-12 19:08:02 +02:00
2016-07-08 21:28:21 +02:00
public $linked_objects = array ();
2011-09-12 19:08:02 +02:00
2016-07-08 21:28:21 +02:00
public $user_author_id ;
2011-09-12 19:08:02 +02:00
2015-03-23 01:39:12 +01:00
/**
* @ var OrderLine []
*/
2016-07-08 21:28:21 +02:00
public $lines = array ();
2011-09-12 19:08:02 +02:00
2016-01-23 00:38:17 +01:00
// Multicurrency
2016-07-08 21:28:21 +02:00
public $fk_multicurrency ;
public $multicurrency_code ;
public $multicurrency_tx ;
public $multicurrency_total_ht ;
public $multicurrency_total_tva ;
public $multicurrency_total_ttc ;
2016-07-08 18:30:50 +02:00
2016-07-08 21:28:21 +02:00
public $oldcopy ;
2016-07-08 21:02:27 +02:00
2015-04-01 16:33:39 +02:00
/**
2015-11-19 16:31:55 +01:00
* ERR Not enough stock
2015-03-14 09:57:28 +01:00
*/
const STOCK_NOT_ENOUGH_FOR_ORDER = - 3 ;
2011-09-12 19:08:02 +02:00
2015-04-03 05:18:47 +02:00
/**
* Canceled status
*/
const STATUS_CANCELED = - 1 ;
/**
* Draft status
*/
const STATUS_DRAFT = 0 ;
/**
* Validated status
*/
const STATUS_VALIDATED = 1 ;
/**
2016-04-01 16:59:08 +02:00
* Accepted ( supplier orders )
2015-04-03 05:18:47 +02:00
*/
const STATUS_ACCEPTED = 2 ;
2016-04-01 16:59:08 +02:00
/**
* Shipment on process ( customer orders )
*/
const STATUS_SHIPMENTONPROCESS = 2 ;
2015-04-03 05:18:47 +02:00
/**
* Closed ( Sent / Received , billed or not )
*/
const STATUS_CLOSED = 3 ;
2011-09-12 19:08:02 +02:00
/**
* Constructor
*
2011-12-05 18:36:54 +01:00
* @ param DoliDB $db Database handler
2011-09-12 19:08:02 +02:00
*/
2012-04-14 15:04:46 +02:00
function __construct ( $db )
2011-09-12 19:08:02 +02:00
{
2011-12-05 18:36:54 +01:00
$this -> db = $db ;
2011-09-12 19:08:02 +02:00
$this -> remise = 0 ;
$this -> remise_percent = 0 ;
$this -> products = array ();
}
2012-02-06 17:18:19 +01:00
/**
2011-12-16 12:47:23 +01:00
* Returns the reference to the following non used Order depending on the active numbering module
* defined into COMMANDE_ADDON
*
* @ param Societe $soc Object thirdparty
* @ return string Order free reference
*/
2011-09-12 19:08:02 +02:00
function getNextNumRef ( $soc )
{
2016-05-06 22:30:34 +02:00
global $langs , $conf ;
2011-09-12 19:08:02 +02:00
$langs -> load ( " order " );
if ( ! empty ( $conf -> global -> COMMANDE_ADDON ))
{
2013-07-07 03:26:51 +02:00
$mybool = false ;
2011-09-12 19:08:02 +02:00
2015-01-18 17:13:42 +01:00
$file = $conf -> global -> COMMANDE_ADDON . " .php " ;
$classname = $conf -> global -> COMMANDE_ADDON ;
2015-01-17 18:58:05 +01:00
2015-01-18 17:13:42 +01:00
// Include file with class
$dirmodels = array_merge ( array ( '/' ),( array ) $conf -> modules_parts [ 'models' ]);
foreach ( $dirmodels as $reldir )
{
2015-01-17 18:58:05 +01:00
$dir = dol_buildpath ( $reldir . " core/modules/commande/ " );
// Load file with numbering class (if found)
$mybool |=@ include_once $dir . $file ;
2013-07-07 13:17:48 +02:00
}
if ( ! $mybool )
{
2015-01-17 18:58:05 +01:00
dol_print_error ( '' , " Failed to include file " . $file );
return '' ;
2013-07-07 03:26:51 +02:00
}
$obj = new $classname ();
$numref = $obj -> getNextValue ( $soc , $this );
if ( $numref != " " )
2011-09-12 19:08:02 +02:00
{
2013-07-07 03:26:51 +02:00
return $numref ;
2011-09-12 19:08:02 +02:00
}
else
2013-07-07 03:26:51 +02:00
{
2016-05-06 22:30:34 +02:00
dol_print_error ( $this -> db , get_class ( $this ) . " ::getNextNumRef " . $obj -> error );
2013-07-07 03:26:51 +02:00
return " " ;
2011-09-12 19:08:02 +02:00
}
}
else
{
print $langs -> trans ( " Error " ) . " " . $langs -> trans ( " Error_COMMANDE_ADDON_NotDefined " );
return " " ;
}
}
/**
2011-12-16 12:47:23 +01:00
* Validate order
2011-11-07 15:04:02 +01:00
*
2011-12-16 12:47:23 +01:00
* @ param User $user User making status change
* @ param int $idwarehouse Id of warehouse to use for stock decrease
2014-10-27 03:24:45 +01:00
* @ param int $notrigger 1 = Does not execute triggers , 0 = execuete triggers
2011-12-16 12:47:23 +01:00
* @ return int <= 0 if OK , > 0 if KO
2011-09-12 19:08:02 +02:00
*/
2014-10-27 03:24:45 +01:00
function valid ( $user , $idwarehouse = 0 , $notrigger = 0 )
2011-09-12 19:08:02 +02:00
{
global $conf , $langs ;
2012-08-22 23:11:24 +02:00
require_once DOL_DOCUMENT_ROOT . '/core/lib/files.lib.php' ;
2011-09-12 19:08:02 +02:00
$error = 0 ;
// Protection
2015-03-15 11:48:57 +01:00
if ( $this -> statut == self :: STATUS_VALIDATED )
2011-09-12 19:08:02 +02:00
{
2015-10-06 16:38:27 +02:00
dol_syslog ( get_class ( $this ) . " ::valid action abandonned: no draft status " , LOG_WARNING );
2011-09-12 19:08:02 +02:00
return 0 ;
}
2015-01-25 21:32:40 +01:00
if ( ! (( empty ( $conf -> global -> MAIN_USE_ADVANCED_PERMS ) && ! empty ( $user -> rights -> commande -> creer ))
|| ( ! empty ( $conf -> global -> MAIN_USE_ADVANCED_PERMS ) && ! empty ( $user -> rights -> commande -> order_advance -> validate ))))
2011-09-12 19:08:02 +02:00
{
2015-10-06 16:38:27 +02:00
$this -> error = 'ErrorPermissionDenied' ;
2011-11-07 15:04:02 +01:00
dol_syslog ( get_class ( $this ) . " ::valid " . $this -> error , LOG_ERR );
2011-09-12 19:08:02 +02:00
return - 1 ;
}
$now = dol_now ();
$this -> db -> begin ();
// Definition du nom de module de numerotation de commande
$soc = new Societe ( $this -> db );
$soc -> fetch ( $this -> socid );
// Class of company linked to order
$result = $soc -> set_as_client ();
// Define new ref
2015-10-06 16:38:27 +02:00
if ( ! $error && ( preg_match ( '/^[\(]?PROV/i' , $this -> ref ) || empty ( $this -> ref ))) // empty should not happened, but when it occurs, the test save life
2011-09-12 19:08:02 +02:00
{
$num = $this -> getNextNumRef ( $soc );
}
else
2014-10-27 03:24:45 +01:00
{
2011-09-12 19:08:02 +02:00
$num = $this -> ref ;
}
2014-10-27 03:24:45 +01:00
$this -> newref = $num ;
2011-09-12 19:08:02 +02:00
// Validate
$sql = " UPDATE " . MAIN_DB_PREFIX . " commande " ;
2011-11-07 15:04:02 +01:00
$sql .= " SET ref = ' " . $num . " ', " ;
2015-03-15 11:48:57 +01:00
$sql .= " fk_statut = " . self :: STATUS_VALIDATED . " , " ;
2011-11-07 15:04:02 +01:00
$sql .= " date_valid=' " . $this -> db -> idate ( $now ) . " ', " ;
$sql .= " fk_user_valid = " . $user -> id ;
2011-09-12 19:08:02 +02:00
$sql .= " WHERE rowid = " . $this -> id ;
2014-06-12 11:31:53 +02:00
dol_syslog ( get_class ( $this ) . " ::valid() " , LOG_DEBUG );
2011-09-12 19:08:02 +02:00
$resql = $this -> db -> query ( $sql );
if ( ! $resql )
{
dol_print_error ( $this -> db );
2014-07-11 14:02:21 +02:00
$this -> error = $this -> db -> lasterror ();
2011-09-12 19:08:02 +02:00
$error ++ ;
}
if ( ! $error )
{
// If stock is incremented on validate order, we must increment it
2012-09-15 11:21:22 +02:00
if ( $result >= 0 && ! empty ( $conf -> stock -> enabled ) && $conf -> global -> STOCK_CALCULATE_ON_VALIDATE_ORDER == 1 )
2011-09-12 19:08:02 +02:00
{
2012-08-22 23:11:24 +02:00
require_once DOL_DOCUMENT_ROOT . '/product/stock/class/mouvementstock.class.php' ;
2011-09-12 19:08:02 +02:00
$langs -> load ( " agenda " );
// Loop on each line
2011-11-08 00:03:19 +01:00
$cpt = count ( $this -> lines );
for ( $i = 0 ; $i < $cpt ; $i ++ )
2011-09-12 19:08:02 +02:00
{
if ( $this -> lines [ $i ] -> fk_product > 0 )
{
$mouvP = new MouvementStock ( $this -> db );
2014-03-15 02:18:39 +01:00
$mouvP -> origin = & $this ;
2011-09-12 19:08:02 +02:00
// We decrement stock of product (and sub-products)
2011-11-08 00:03:19 +01:00
$result = $mouvP -> livraison ( $user , $this -> lines [ $i ] -> fk_product , $idwarehouse , $this -> lines [ $i ] -> qty , $this -> lines [ $i ] -> subprice , $langs -> trans ( " OrderValidatedInDolibarr " , $num ));
2014-07-11 14:02:21 +02:00
if ( $result < 0 )
2014-08-01 14:26:13 +02:00
{
2014-07-11 14:02:21 +02:00
$error ++ ;
$this -> error = $mouvP -> error ;
}
2011-09-12 19:08:02 +02:00
}
2014-07-11 14:02:21 +02:00
if ( $error ) break ;
2011-09-12 19:08:02 +02:00
}
}
}
2014-10-27 03:24:45 +01:00
if ( ! $error && ! $notrigger )
{
// Call trigger
$result = $this -> call_trigger ( 'ORDER_VALIDATE' , $user );
if ( $result < 0 ) $error ++ ;
// End call triggers
}
2011-09-12 19:08:02 +02:00
if ( ! $error )
{
2014-10-27 03:24:45 +01:00
$this -> oldref = $this -> ref ;
2011-09-12 19:08:02 +02:00
// Rename directory if dir was a temporary ref
if ( preg_match ( '/^[\(]?PROV/i' , $this -> ref ))
{
2015-04-01 11:30:48 +02:00
// On renomme repertoire ($this->ref = ancienne ref, $num = nouvelle ref)
2013-11-02 17:50:24 +01:00
// in order not to lose the attachments
2014-10-27 03:24:45 +01:00
$oldref = dol_sanitizeFileName ( $this -> ref );
$newref = dol_sanitizeFileName ( $num );
$dirsource = $conf -> commande -> dir_output . '/' . $oldref ;
$dirdest = $conf -> commande -> dir_output . '/' . $newref ;
2011-09-12 19:08:02 +02:00
if ( file_exists ( $dirsource ))
{
2011-11-07 15:04:02 +01:00
dol_syslog ( get_class ( $this ) . " ::valid() rename dir " . $dirsource . " into " . $dirdest );
2011-09-12 19:08:02 +02:00
if ( @ rename ( $dirsource , $dirdest ))
{
dol_syslog ( " Rename ok " );
2014-10-27 03:24:45 +01:00
// Rename docs starting with $oldref with $newref
$listoffiles = dol_dir_list ( $conf -> commande -> dir_output . '/' . $newref , 'files' , 1 , '^' . preg_quote ( $oldref , '/' ));
foreach ( $listoffiles as $fileentry )
{
$dirsource = $fileentry [ 'name' ];
$dirdest = preg_replace ( '/^' . preg_quote ( $oldref , '/' ) . '/' , $newref , $dirsource );
$dirsource = $fileentry [ 'path' ] . '/' . $dirsource ;
$dirdest = $fileentry [ 'path' ] . '/' . $dirdest ;
@ rename ( $dirsource , $dirdest );
}
2011-09-12 19:08:02 +02:00
}
}
}
}
2014-08-19 14:53:30 +02:00
// Set new ref and current status
if ( ! $error )
{
$this -> ref = $num ;
2015-03-15 11:48:57 +01:00
$this -> statut = self :: STATUS_VALIDATED ;
2014-08-19 14:53:30 +02:00
}
2011-09-12 19:08:02 +02:00
if ( ! $error )
{
$this -> db -> commit ();
return 1 ;
}
else
2014-10-27 03:24:45 +01:00
{
2011-09-12 19:08:02 +02:00
$this -> db -> rollback ();
return - 1 ;
}
}
/**
2011-11-14 15:46:44 +01:00
* Set draft status
*
2011-11-14 16:23:59 +01:00
* @ param User $user Object user that modify
* @ param int $idwarehouse Id warehouse to use for stock change .
* @ return int < 0 if KO , > 0 if OK
2011-09-12 19:08:02 +02:00
*/
2011-11-14 16:23:59 +01:00
function set_draft ( $user , $idwarehouse =- 1 )
2011-09-12 19:08:02 +02:00
{
global $conf , $langs ;
$error = 0 ;
// Protection
2015-03-15 11:48:57 +01:00
if ( $this -> statut <= self :: STATUS_DRAFT )
2011-09-12 19:08:02 +02:00
{
return 0 ;
}
2015-01-25 21:32:40 +01:00
if ( ! (( empty ( $conf -> global -> MAIN_USE_ADVANCED_PERMS ) && ! empty ( $user -> rights -> commande -> creer ))
|| ( ! empty ( $conf -> global -> MAIN_USE_ADVANCED_PERMS ) && ! empty ( $user -> rights -> commande -> order_advance -> validate ))))
2011-09-12 19:08:02 +02:00
{
$this -> error = 'Permission denied' ;
return - 1 ;
}
$this -> db -> begin ();
$sql = " UPDATE " . MAIN_DB_PREFIX . " commande " ;
2015-03-15 11:48:57 +01:00
$sql .= " SET fk_statut = " . self :: STATUS_DRAFT ;
2011-09-12 19:08:02 +02:00
$sql .= " WHERE rowid = " . $this -> id ;
2014-06-12 11:31:53 +02:00
dol_syslog ( get_class ( $this ) . " ::set_draft " , LOG_DEBUG );
2011-09-12 19:08:02 +02:00
if ( $this -> db -> query ( $sql ))
{
// If stock is decremented on validate order, we must reincrement it
2012-09-15 11:21:22 +02:00
if ( ! empty ( $conf -> stock -> enabled ) && $conf -> global -> STOCK_CALCULATE_ON_VALIDATE_ORDER == 1 )
2011-09-12 19:08:02 +02:00
{
2016-06-28 02:36:40 +02:00
$result = 0 ;
2016-07-08 18:30:50 +02:00
2012-08-22 23:11:24 +02:00
require_once DOL_DOCUMENT_ROOT . '/product/stock/class/mouvementstock.class.php' ;
2011-09-12 19:08:02 +02:00
$langs -> load ( " agenda " );
2011-09-17 21:49:50 +02:00
$num = count ( $this -> lines );
for ( $i = 0 ; $i < $num ; $i ++ )
2011-09-12 19:08:02 +02:00
{
if ( $this -> lines [ $i ] -> fk_product > 0 )
{
$mouvP = new MouvementStock ( $this -> db );
// We increment stock of product (and sub-products)
2015-11-05 17:00:22 +01:00
$result = $mouvP -> reception ( $user , $this -> lines [ $i ] -> fk_product , $idwarehouse , $this -> lines [ $i ] -> qty , 0 , $langs -> trans ( " OrderBackToDraftInDolibarr " , $this -> ref ));
2016-06-28 02:36:40 +02:00
if ( $result < 0 ) { $error ++ ; $this -> error = $mouvP -> error ; break ; }
2011-09-12 19:08:02 +02:00
}
}
}
2016-05-23 14:18:29 +02:00
if ( ! $error ) {
// Call trigger
2016-07-08 20:40:25 +02:00
$result = $this -> call_trigger ( 'ORDER_UNVALIDATE' , $user );
2016-05-23 14:18:29 +02:00
if ( $result < 0 ) $error ++ ;
}
2016-07-08 18:30:50 +02:00
2016-05-23 14:18:29 +02:00
if ( ! $error ) {
$this -> statut = self :: STATUS_DRAFT ;
$this -> db -> commit ();
return 1 ;
} else {
$this -> db -> rollback ();
return - 1 ;
}
2011-09-12 19:08:02 +02:00
}
else
{
$this -> error = $this -> db -> error ();
$this -> db -> rollback ();
return - 1 ;
}
}
/**
2011-12-16 12:47:23 +01:00
* Tag the order as validated ( opened )
* Function used when order is reopend after being closed .
*
* @ param User $user Object user that change status
* @ return int < 0 if KO , 0 if nothing is done , > 0 if OK
2011-09-12 19:08:02 +02:00
*/
function set_reopen ( $user )
{
$error = 0 ;
2015-04-01 16:33:39 +02:00
if ( $this -> statut != self :: STATUS_CANCELED && $this -> statut != self :: STATUS_CLOSED )
2011-09-12 19:08:02 +02:00
{
2015-01-10 01:07:18 +01:00
dol_syslog ( get_class ( $this ) . " ::set_reopen order has not status closed " , LOG_WARNING );
2011-09-12 19:08:02 +02:00
return 0 ;
}
$this -> db -> begin ();
$sql = 'UPDATE ' . MAIN_DB_PREFIX . 'commande' ;
2015-03-15 11:48:57 +01:00
$sql .= ' SET fk_statut=' . self :: STATUS_VALIDATED . ', facture=0' ;
2011-09-12 19:08:02 +02:00
$sql .= ' WHERE rowid = ' . $this -> id ;
2014-06-12 11:31:53 +02:00
dol_syslog ( get_class ( $this ) . " ::set_reopen " , LOG_DEBUG );
2011-09-12 19:08:02 +02:00
$resql = $this -> db -> query ( $sql );
if ( $resql )
{
2014-07-11 14:02:21 +02:00
// Call trigger
$result = $this -> call_trigger ( 'ORDER_REOPEN' , $user );
2014-08-01 14:26:13 +02:00
if ( $result < 0 ) $error ++ ;
2014-07-11 14:02:21 +02:00
// End call triggers
2011-09-12 19:08:02 +02:00
}
else
{
$error ++ ;
2015-04-01 16:07:22 +02:00
$this -> error = $this -> db -> lasterror ();
2011-09-12 19:08:02 +02:00
dol_print_error ( $this -> db );
}
if ( ! $error )
{
2015-03-15 11:48:57 +01:00
$this -> statut = self :: STATUS_VALIDATED ;
2012-07-08 12:18:29 +02:00
$this -> billed = 0 ;
$this -> facturee = 0 ; // deprecated
2011-09-12 19:08:02 +02:00
$this -> db -> commit ();
return 1 ;
}
else
{
2014-06-14 12:30:48 +02:00
foreach ( $this -> errors as $errmsg )
{
dol_syslog ( get_class ( $this ) . " ::set_reopen " . $errmsg , LOG_ERR );
$this -> error .= ( $this -> error ? ', ' . $errmsg : $errmsg );
}
$this -> db -> rollback ();
return - 1 * $error ;
2011-09-12 19:08:02 +02:00
}
}
/**
2011-12-05 18:36:54 +01:00
* Close order
2012-02-06 17:18:19 +01:00
*
2011-12-16 12:47:23 +01:00
* @ param User $user Objet user that close
* @ return int < 0 if KO , > 0 if OK
2011-09-12 19:08:02 +02:00
*/
function cloture ( $user )
{
2016-05-06 22:30:34 +02:00
global $conf ;
2011-09-12 19:08:02 +02:00
$error = 0 ;
2015-01-25 21:32:40 +01:00
if (( empty ( $conf -> global -> MAIN_USE_ADVANCED_PERMS ) && ! empty ( $user -> rights -> commande -> creer ))
|| ( ! empty ( $conf -> global -> MAIN_USE_ADVANCED_PERMS ) && ! empty ( $user -> rights -> commande -> order_advance -> validate )))
2011-09-12 19:08:02 +02:00
{
$this -> db -> begin ();
$now = dol_now ();
$sql = 'UPDATE ' . MAIN_DB_PREFIX . 'commande' ;
2015-03-15 11:48:57 +01:00
$sql .= ' SET fk_statut = ' . self :: STATUS_CLOSED . ',' ;
2011-09-12 19:08:02 +02:00
$sql .= ' fk_user_cloture = ' . $user -> id . ',' ;
2014-06-25 20:07:21 +02:00
$sql .= " date_cloture = ' " . $this -> db -> idate ( $now ) . " ' " ;
2015-03-15 11:48:57 +01:00
$sql .= ' WHERE rowid = ' . $this -> id . ' AND fk_statut > ' . self :: STATUS_DRAFT ;
2011-09-12 19:08:02 +02:00
if ( $this -> db -> query ( $sql ))
{
2014-07-11 14:02:21 +02:00
// Call trigger
$result = $this -> call_trigger ( 'ORDER_CLOSE' , $user );
2014-08-01 14:26:13 +02:00
if ( $result < 0 ) $error ++ ;
2014-07-11 14:02:21 +02:00
// End call triggers
2014-08-01 14:26:13 +02:00
2011-09-12 19:08:02 +02:00
if ( ! $error )
{
2015-03-15 11:48:57 +01:00
$this -> statut = self :: STATUS_CLOSED ;
2012-07-08 12:18:29 +02:00
2011-09-12 19:08:02 +02:00
$this -> db -> commit ();
return 1 ;
}
else
{
$this -> db -> rollback ();
return - 1 ;
}
}
else
{
$this -> error = $this -> db -> lasterror ();
$this -> db -> rollback ();
return - 1 ;
}
}
}
/**
2011-12-05 18:36:54 +01:00
* Cancel an order
* If stock is decremented on order validation , we must reincrement it
2012-02-06 17:18:19 +01:00
*
2011-12-05 18:36:54 +01:00
* @ param int $idwarehouse Id warehouse to use for stock change .
* @ return int < 0 if KO , > 0 if OK
2011-09-12 19:08:02 +02:00
*/
2012-07-06 13:43:59 +02:00
function cancel ( $idwarehouse =- 1 )
{
global $conf , $user , $langs ;
$error = 0 ;
$this -> db -> begin ();
$sql = " UPDATE " . MAIN_DB_PREFIX . " commande " ;
2015-03-15 11:48:57 +01:00
$sql .= " SET fk_statut = " . self :: STATUS_CANCELED ;
2012-07-06 13:43:59 +02:00
$sql .= " WHERE rowid = " . $this -> id ;
2015-03-15 11:48:57 +01:00
$sql .= " AND fk_statut = " . self :: STATUS_VALIDATED ;
2012-07-06 13:43:59 +02:00
2014-06-12 11:31:53 +02:00
dol_syslog ( get_class ( $this ) . " ::cancel " , LOG_DEBUG );
2012-07-06 13:43:59 +02:00
if ( $this -> db -> query ( $sql ))
{
// If stock is decremented on validate order, we must reincrement it
2012-09-15 11:21:22 +02:00
if ( ! empty ( $conf -> stock -> enabled ) && $conf -> global -> STOCK_CALCULATE_ON_VALIDATE_ORDER == 1 )
2012-07-06 13:43:59 +02:00
{
2012-08-22 23:11:24 +02:00
require_once DOL_DOCUMENT_ROOT . '/product/stock/class/mouvementstock.class.php' ;
2012-07-06 13:43:59 +02:00
$langs -> load ( " agenda " );
$num = count ( $this -> lines );
for ( $i = 0 ; $i < $num ; $i ++ )
{
if ( $this -> lines [ $i ] -> fk_product > 0 )
{
$mouvP = new MouvementStock ( $this -> db );
// We increment stock of product (and sub-products)
2015-11-05 22:04:18 +01:00
$result = $mouvP -> reception ( $user , $this -> lines [ $i ] -> fk_product , $idwarehouse , $this -> lines [ $i ] -> qty , 0 , $langs -> trans ( " OrderCanceledInDolibarr " , $this -> ref )); // price is 0, we don't want WAP to be changed
2014-08-01 14:26:13 +02:00
if ( $result < 0 )
2014-07-11 14:02:21 +02:00
{
2012-07-06 13:43:59 +02:00
$error ++ ;
2014-07-11 14:02:21 +02:00
$this -> error = $mouvP -> error ;
break ;
2012-07-06 13:43:59 +02:00
}
}
}
}
if ( ! $error )
{
2014-07-11 14:02:21 +02:00
// Call trigger
$result = $this -> call_trigger ( 'ORDER_CANCEL' , $user );
2014-08-01 14:26:13 +02:00
if ( $result < 0 ) $error ++ ;
2014-07-11 14:02:21 +02:00
// End call triggers
2012-07-06 13:43:59 +02:00
}
if ( ! $error )
{
2015-03-15 11:48:57 +01:00
$this -> statut = self :: STATUS_CANCELED ;
2012-07-06 13:43:59 +02:00
$this -> db -> commit ();
return 1 ;
}
else
{
2014-06-14 12:30:48 +02:00
foreach ( $this -> errors as $errmsg )
{
dol_syslog ( get_class ( $this ) . " ::cancel " . $errmsg , LOG_ERR );
$this -> error .= ( $this -> error ? ', ' . $errmsg : $errmsg );
}
2012-07-06 13:43:59 +02:00
$this -> db -> rollback ();
2014-06-14 12:30:48 +02:00
return - 1 * $error ;
2012-07-06 13:43:59 +02:00
}
}
else
{
$this -> error = $this -> db -> error ();
$this -> db -> rollback ();
return - 1 ;
}
}
2011-09-12 19:08:02 +02:00
/**
2011-12-16 12:47:23 +01:00
* Create order
* Note that this -> ref can be set or empty . If empty , we will use " (PROV) "
2012-02-06 17:18:19 +01:00
*
2011-12-16 12:47:23 +01:00
* @ param User $user Objet user that make creation
2016-07-29 02:28:51 +02:00
* @ param int $notrigger Disable all triggers
* @ return int < 0 if KO , > 0 if OK
2011-09-12 19:08:02 +02:00
*/
function create ( $user , $notrigger = 0 )
{
2016-05-06 22:30:34 +02:00
global $conf , $langs ;
2011-09-12 19:08:02 +02:00
$error = 0 ;
// Clean parameters
2015-03-16 12:23:25 +01:00
$this -> brouillon = 1 ; // set command as draft
2016-07-08 18:30:50 +02:00
2016-01-23 00:38:17 +01:00
// Multicurrency (test on $this->multicurrency_tx because we sould take the default rate only if not using origin rate)
if ( ! empty ( $this -> multicurrency_code ) && empty ( $this -> multicurrency_tx )) list ( $this -> fk_multicurrency , $this -> multicurrency_tx ) = MultiCurrency :: getIdAndTxFromCode ( $this -> db , $this -> multicurrency_code );
else $this -> fk_multicurrency = MultiCurrency :: getIdFromCode ( $this -> db , $this -> multicurrency_code );
if ( empty ( $this -> fk_multicurrency ))
{
$this -> multicurrency_code = $conf -> currency ;
$this -> fk_multicurrency = 0 ;
$this -> multicurrency_tx = 1 ;
}
2016-07-08 18:30:50 +02:00
2013-04-08 14:57:06 +02:00
dol_syslog ( get_class ( $this ) . " ::create user= " . $user -> id );
2011-09-12 19:08:02 +02:00
// Check parameters
2014-05-13 10:12:45 +02:00
if ( ! empty ( $this -> ref )) // We check that ref is not already used
2015-03-16 12:23:25 +01:00
{
$result = self :: isExistingObject ( $this -> element , 0 , $this -> ref ); // Check ref is not yet used
if ( $result > 0 )
{
$this -> error = 'ErrorRefAlreadyExists' ;
dol_syslog ( get_class ( $this ) . " ::create " . $this -> error , LOG_WARNING );
$this -> db -> rollback ();
return - 1 ;
}
}
2014-05-13 10:12:45 +02:00
2011-09-12 19:08:02 +02:00
$soc = new Societe ( $this -> db );
$result = $soc -> fetch ( $this -> socid );
if ( $result < 0 )
{
$this -> error = " Failed to fetch company " ;
2013-04-08 14:57:06 +02:00
dol_syslog ( get_class ( $this ) . " ::create " . $this -> error , LOG_ERR );
2011-09-12 19:08:02 +02:00
return - 2 ;
}
if ( ! empty ( $conf -> global -> COMMANDE_REQUIRE_SOURCE ) && $this -> source < 0 )
{
$this -> error = $langs -> trans ( " ErrorFieldRequired " , $langs -> trans ( " Source " ));
2013-04-08 14:57:06 +02:00
dol_syslog ( get_class ( $this ) . " ::create " . $this -> error , LOG_ERR );
2011-09-12 19:08:02 +02:00
return - 1 ;
}
// $date_commande is deprecated
$date = ( $this -> date_commande ? $this -> date_commande : $this -> date );
2012-05-01 15:08:54 +02:00
2012-03-23 18:19:50 +01:00
$now = dol_now ();
2011-09-12 19:08:02 +02:00
$this -> db -> begin ();
$sql = " INSERT INTO " . MAIN_DB_PREFIX . " commande ( " ;
2015-01-10 01:15:39 +01:00
$sql .= " ref, fk_soc, date_creation, fk_user_author, fk_projet, date_commande, source, note_private, note_public, ref_ext, ref_client, ref_int " ;
2014-07-06 20:49:34 +02:00
$sql .= " , model_pdf, fk_cond_reglement, fk_mode_reglement, fk_account, fk_availability, fk_input_reason, date_livraison, fk_delivery_address " ;
2014-07-25 17:20:42 +02:00
$sql .= " , fk_shipping_method " ;
2015-10-19 21:21:27 +02:00
$sql .= " , fk_warehouse " ;
2011-09-12 19:08:02 +02:00
$sql .= " , remise_absolue, remise_percent " ;
2015-03-16 12:23:25 +01:00
$sql .= " , fk_incoterms, location_incoterms " ;
2011-09-12 19:08:02 +02:00
$sql .= " , entity " ;
2016-01-23 00:38:17 +01:00
$sql .= " , fk_multicurrency " ;
$sql .= " , multicurrency_code " ;
$sql .= " , multicurrency_tx " ;
2011-09-12 19:08:02 +02:00
$sql .= " ) " ;
2013-07-10 10:30:33 +02:00
$sql .= " VALUES ('(PROV)', " . $this -> socid . " , ' " . $this -> db -> idate ( $now ) . " ', " . $user -> id ;
2015-01-09 22:32:00 +01:00
$sql .= " , " . ( $this -> fk_project > 0 ? $this -> fk_project : " null " );
2013-07-10 10:35:10 +02:00
$sql .= " , ' " . $this -> db -> idate ( $date ) . " ' " ;
2015-09-12 11:23:44 +02:00
$sql .= " , " . ( $this -> source >= 0 && $this -> source != '' ? $this -> db -> escape ( $this -> source ) : 'null' );
2013-04-09 17:18:07 +02:00
$sql .= " , ' " . $this -> db -> escape ( $this -> note_private ) . " ' " ;
2011-09-12 19:08:02 +02:00
$sql .= " , ' " . $this -> db -> escape ( $this -> note_public ) . " ' " ;
2015-01-09 22:32:00 +01:00
$sql .= " , " . ( $this -> ref_ext ? " ' " . $this -> db -> escape ( $this -> ref_ext ) . " ' " : " null " );
$sql .= " , " . ( $this -> ref_client ? " ' " . $this -> db -> escape ( $this -> ref_client ) . " ' " : " null " );
2011-09-12 19:08:02 +02:00
$sql .= " , " . ( $this -> ref_int ? " ' " . $this -> db -> escape ( $this -> ref_int ) . " ' " : " null " );
2015-09-12 11:23:44 +02:00
$sql .= " , ' " . $this -> db -> escape ( $this -> modelpdf ) . " ' " ;
2011-09-12 19:08:02 +02:00
$sql .= " , " . ( $this -> cond_reglement_id > 0 ? " ' " . $this -> cond_reglement_id . " ' " : " null " );
$sql .= " , " . ( $this -> mode_reglement_id > 0 ? " ' " . $this -> mode_reglement_id . " ' " : " null " );
2014-07-06 20:49:34 +02:00
$sql .= " , " . ( $this -> fk_account > 0 ? $this -> fk_account : 'NULL' );
2011-09-12 19:08:02 +02:00
$sql .= " , " . ( $this -> availability_id > 0 ? " ' " . $this -> availability_id . " ' " : " null " );
$sql .= " , " . ( $this -> demand_reason_id > 0 ? " ' " . $this -> demand_reason_id . " ' " : " null " );
$sql .= " , " . ( $this -> date_livraison ? " ' " . $this -> db -> idate ( $this -> date_livraison ) . " ' " : " null " );
$sql .= " , " . ( $this -> fk_delivery_address > 0 ? $this -> fk_delivery_address : 'NULL' );
2014-07-25 21:50:21 +02:00
$sql .= " , " . ( $this -> shipping_method_id > 0 ? $this -> shipping_method_id : 'NULL' );
2015-10-19 21:21:27 +02:00
$sql .= " , " . ( $this -> warehouse_id > 0 ? $this -> warehouse_id : 'NULL' );
2015-09-12 11:23:44 +02:00
$sql .= " , " . ( $this -> remise_absolue > 0 ? $this -> db -> escape ( $this -> remise_absolue ) : 'NULL' );
$sql .= " , " . ( $this -> remise_percent > 0 ? $this -> db -> escape ( $this -> remise_percent ) : 0 );
2015-02-10 12:22:07 +01:00
$sql .= " , " . ( int ) $this -> fk_incoterms ;
$sql .= " , ' " . $this -> db -> escape ( $this -> location_incoterms ) . " ' " ;
2011-09-12 19:08:02 +02:00
$sql .= " , " . $conf -> entity ;
2016-01-23 00:38:17 +01:00
$sql .= " , " . ( int ) $this -> fk_multicurrency ;
$sql .= " , ' " . $this -> db -> escape ( $this -> multicurrency_code ) . " ' " ;
$sql .= " , " . ( double ) $this -> multicurrency_tx ;
2011-09-12 19:08:02 +02:00
$sql .= " ) " ;
2014-06-12 11:31:53 +02:00
dol_syslog ( get_class ( $this ) . " ::create " , LOG_DEBUG );
2011-09-12 19:08:02 +02:00
$resql = $this -> db -> query ( $sql );
if ( $resql )
{
$this -> id = $this -> db -> last_insert_id ( MAIN_DB_PREFIX . 'commande' );
if ( $this -> id )
{
$fk_parent_line = 0 ;
2011-09-17 21:49:50 +02:00
$num = count ( $this -> lines );
2011-09-12 19:08:02 +02:00
/*
2015-03-16 12:23:25 +01:00
* Insert products details into db
2011-09-12 19:08:02 +02:00
*/
for ( $i = 0 ; $i < $num ; $i ++ )
{
2016-07-29 02:28:51 +02:00
$line = $this -> lines [ $i ];
// Test and convert into object this->lines[$i]. When coming from REST API, we may still have an array
//if (! is_object($line)) $line=json_decode(json_encode($line), FALSE); // convert recursively array into object.
if ( ! is_object ( $line )) $line = ( object ) $line ;
2011-09-12 19:08:02 +02:00
// Reset fk_parent_line for no child products and special product
2016-07-29 02:28:51 +02:00
if (( $line -> product_type != 9 && empty ( $line -> fk_parent_line )) || $line -> product_type == 9 ) {
2011-09-12 19:08:02 +02:00
$fk_parent_line = 0 ;
}
$result = $this -> addline (
2016-07-29 02:28:51 +02:00
$line -> desc ,
$line -> subprice ,
$line -> qty ,
$line -> tva_tx ,
$line -> localtax1_tx ,
$line -> localtax2_tx ,
$line -> fk_product ,
$line -> remise_percent ,
$line -> info_bits ,
$line -> fk_remise_except ,
2012-05-09 02:39:30 +02:00
'HT' ,
2012-03-18 19:23:01 +01:00
0 ,
2016-07-29 02:28:51 +02:00
$line -> date_start ,
$line -> date_end ,
$line -> product_type ,
$line -> rang ,
$line -> special_code ,
2012-07-19 10:26:26 +02:00
$fk_parent_line ,
2016-07-29 02:28:51 +02:00
$line -> fk_fournprice ,
$line -> pa_ht ,
$line -> label ,
$line -> array_options ,
$line -> fk_unit ,
2015-11-06 01:53:20 +01:00
$this -> element ,
2016-07-29 02:28:51 +02:00
$line -> id
2011-09-12 19:08:02 +02:00
);
if ( $result < 0 )
{
2015-03-14 09:57:28 +01:00
if ( $result != self :: STOCK_NOT_ENOUGH_FOR_ORDER )
{
$this -> error = $this -> db -> lasterror ();
dol_print_error ( $this -> db );
}
2011-09-12 19:08:02 +02:00
$this -> db -> rollback ();
return - 1 ;
}
// Defined the new fk_parent_line
2016-07-29 02:28:51 +02:00
if ( $result > 0 && $line -> product_type == 9 ) {
2011-09-12 19:08:02 +02:00
$fk_parent_line = $result ;
}
}
2015-03-16 12:23:25 +01:00
// update ref
2015-03-17 00:35:17 +01:00
$initialref = '(PROV' . $this -> id . ')' ;
if ( ! empty ( $this -> ref )) $initialref = $this -> ref ;
$sql = 'UPDATE ' . MAIN_DB_PREFIX . " commande SET ref=' " . $this -> db -> escape ( $initialref ) . " ' WHERE rowid= " . $this -> id ;
2011-09-12 19:08:02 +02:00
if ( $this -> db -> query ( $sql ))
{
if ( $this -> id )
{
2015-03-17 00:35:17 +01:00
$this -> ref = $initialref ;
2012-03-18 19:23:01 +01:00
2012-02-21 18:16:24 +01:00
// Add object linked
if ( is_array ( $this -> linked_objects ) && ! empty ( $this -> linked_objects ))
2011-09-12 19:08:02 +02:00
{
2012-02-21 18:16:24 +01:00
foreach ( $this -> linked_objects as $origin => $origin_id )
{
$ret = $this -> add_object_linked ( $origin , $origin_id );
if ( ! $ret )
{
dol_print_error ( $this -> db );
$error ++ ;
}
2012-03-18 19:23:01 +01:00
2016-07-28 19:02:23 +02:00
if ( ! empty ( $conf -> global -> MAIN_PROPAGATE_CONTACTS_FROM_ORIGIN ))
2012-02-21 18:16:24 +01:00
{
2016-07-28 19:02:23 +02:00
$originforcontact = $origin ;
$originidforcontact = $origin_id ;
if ( $originforcontact == 'shipping' ) // shipment and order share the same contacts. If creating from shipment we take data of order
{
require_once DOL_DOCUMENT_ROOT . '/expedition/class/expedition.class.php' ;
$exp = new Expedition ( $db );
$exp -> fetch ( $origin_id );
$exp -> fetchObjectLinked ();
if ( count ( $exp -> linkedObjectsIds [ 'commande' ]) > 0 )
{
foreach ( $exp -> linkedObjectsIds [ 'commande' ] as $key => $value )
{
$originforcontact = 'commande' ;
$originidforcontact = $value -> id ;
break ; // We take first one
}
}
}
$sqlcontact = " SELECT ctc.code, ctc.source, ec.fk_socpeople FROM " . MAIN_DB_PREFIX . " element_contact as ec, " . MAIN_DB_PREFIX . " c_type_contact as ctc " ;
$sqlcontact .= " WHERE element_id = " . $originidforcontact . " AND ec.fk_c_type_contact = ctc.rowid AND ctc.element = ' " . $originforcontact . " ' " ;
$resqlcontact = $this -> db -> query ( $sqlcontact );
if ( $resqlcontact )
{
while ( $objcontact = $this -> db -> fetch_object ( $resqlcontact ))
{
//print $objcontact->code.'-'.$objcontact->source.'-'.$objcontact->fk_socpeople."\n";
$this -> add_contact ( $objcontact -> fk_socpeople , $objcontact -> code , $objcontact -> source ); // May failed because of duplicate key or because code of contact type does not exists for new object
}
}
else dol_print_error ( $resqlcontact );
2012-02-21 18:16:24 +01:00
}
}
2011-09-12 19:08:02 +02:00
}
}
2013-04-27 15:08:35 +02:00
2013-04-05 12:43:00 +02:00
if ( ! $error )
{
2016-07-28 19:02:23 +02:00
$result = $this -> insertExtraFields ();
if ( $result < 0 ) $error ++ ;
2013-04-05 12:43:00 +02:00
}
2011-09-12 19:08:02 +02:00
2015-04-03 11:00:52 +02:00
if ( ! $error && ! $notrigger )
2011-09-12 19:08:02 +02:00
{
2014-07-11 14:02:21 +02:00
// Call trigger
$result = $this -> call_trigger ( 'ORDER_CREATE' , $user );
2014-08-01 14:26:13 +02:00
if ( $result < 0 ) $error ++ ;
2014-07-11 14:02:21 +02:00
// End call triggers
2011-09-12 19:08:02 +02:00
}
2015-04-03 11:00:52 +02:00
if ( ! $error )
{
2014-06-14 12:30:48 +02:00
$this -> db -> commit ();
return $this -> id ;
}
2015-04-03 11:00:52 +02:00
else
{
$this -> db -> rollback ();
return - 1 * $error ;
}
2011-09-12 19:08:02 +02:00
}
else
2015-04-03 11:00:52 +02:00
{
$this -> error = $this -> db -> lasterror ();
2011-09-12 19:08:02 +02:00
$this -> db -> rollback ();
return - 1 ;
}
}
}
else
2015-04-03 11:00:52 +02:00
{
2011-09-12 19:08:02 +02:00
dol_print_error ( $this -> db );
$this -> db -> rollback ();
return - 1 ;
}
}
/**
2011-12-16 12:47:23 +01:00
* Load an object from its id and create a new one in database
2011-09-12 19:08:02 +02:00
*
2011-12-16 12:47:23 +01:00
* @ param int $socid Id of thirdparty
* @ return int New id of clone
2011-09-12 19:08:02 +02:00
*/
2013-01-26 10:35:30 +01:00
function createFromClone ( $socid = 0 )
2011-09-12 19:08:02 +02:00
{
2016-05-06 22:30:34 +02:00
global $user , $hookmanager ;
2011-09-12 19:08:02 +02:00
$error = 0 ;
2015-02-26 13:03:17 +01:00
$this -> context [ 'createfromclone' ] = 'createfromclone' ;
2011-09-12 19:08:02 +02:00
$this -> db -> begin ();
2014-09-24 11:47:34 +02:00
// get extrafields so they will be clone
foreach ( $this -> lines as $line )
$line -> fetch_optionals ( $line -> rowid );
2011-09-12 19:08:02 +02:00
// Load source object
2015-09-24 16:32:48 +02:00
$objFrom = clone $this ;
2011-09-12 19:08:02 +02:00
// Change socid if needed
2011-12-12 14:04:03 +01:00
if ( ! empty ( $socid ) && $socid != $this -> socid )
2011-09-12 19:08:02 +02:00
{
$objsoc = new Societe ( $this -> db );
if ( $objsoc -> fetch ( $socid ) > 0 )
{
2011-12-12 14:04:03 +01:00
$this -> socid = $objsoc -> id ;
$this -> cond_reglement_id = ( ! empty ( $objsoc -> cond_reglement_id ) ? $objsoc -> cond_reglement_id : 0 );
$this -> mode_reglement_id = ( ! empty ( $objsoc -> mode_reglement_id ) ? $objsoc -> mode_reglement_id : 0 );
$this -> fk_project = '' ;
$this -> fk_delivery_address = '' ;
2011-09-12 19:08:02 +02:00
}
// TODO Change product price if multi-prices
}
2011-12-12 14:04:03 +01:00
$this -> id = 0 ;
2015-10-28 14:34:34 +01:00
$this -> ref = '' ;
2015-03-15 11:48:57 +01:00
$this -> statut = self :: STATUS_DRAFT ;
2011-09-12 19:08:02 +02:00
// Clear fields
2011-12-12 14:04:03 +01:00
$this -> user_author_id = $user -> id ;
$this -> user_valid = '' ;
2015-11-05 15:36:13 +01:00
$this -> date = dol_now ();
2016-04-20 17:17:03 +02:00
$this -> date_commande = dol_now ();
2011-12-12 14:04:03 +01:00
$this -> date_creation = '' ;
$this -> date_validation = '' ;
$this -> ref_client = '' ;
2015-11-04 22:38:45 +01:00
2011-09-12 19:08:02 +02:00
// Create clone
2011-12-12 14:04:03 +01:00
$result = $this -> create ( $user );
if ( $result < 0 ) $error ++ ;
2011-09-12 19:08:02 +02:00
if ( ! $error )
{
// Hook of thirdparty module
if ( is_object ( $hookmanager ))
{
$parameters = array ( 'objFrom' => $objFrom );
2011-11-22 14:00:03 +01:00
$action = '' ;
2012-02-06 17:18:19 +01:00
$reshook = $hookmanager -> executeHooks ( 'createFrom' , $parameters , $this , $action ); // Note that $action and $object may have been modified by some hooks
2011-09-12 19:08:02 +02:00
if ( $reshook < 0 ) $error ++ ;
}
2014-07-11 14:02:21 +02:00
// Call trigger
$result = $this -> call_trigger ( 'ORDER_CLONE' , $user );
2014-08-01 14:26:13 +02:00
if ( $result < 0 ) $error ++ ;
2014-07-11 14:02:21 +02:00
// End call triggers
2011-09-12 19:08:02 +02:00
}
2015-02-26 13:03:17 +01:00
unset ( $this -> context [ 'createfromclone' ]);
2011-09-12 19:08:02 +02:00
// End
if ( ! $error )
{
$this -> db -> commit ();
2011-12-12 14:04:03 +01:00
return $this -> id ;
2011-09-12 19:08:02 +02:00
}
else
{
$this -> db -> rollback ();
return - 1 ;
}
}
/**
* Load an object from a proposal and create a new order into database
*
* @ param Object $object Object source
* @ return int < 0 if KO , 0 if nothing done , 1 if OK
*/
2011-10-14 18:51:20 +02:00
function createFromProposal ( $object )
2011-09-12 19:08:02 +02:00
{
2016-05-06 22:30:34 +02:00
global $conf , $user , $hookmanager ;
2015-06-01 11:24:30 +02:00
dol_include_once ( '/core/class/extrafields.class.php' );
2011-09-12 19:08:02 +02:00
$error = 0 ;
2015-11-04 22:38:45 +01:00
2015-10-15 12:17:57 +02:00
$this -> date_commande = dol_now ();
$this -> source = 0 ;
2011-09-12 19:08:02 +02:00
2015-10-15 12:17:57 +02:00
$num = count ( $object -> lines );
for ( $i = 0 ; $i < $num ; $i ++ )
{
$line = new OrderLine ( $this -> db );
$line -> libelle = $object -> lines [ $i ] -> libelle ;
$line -> label = $object -> lines [ $i ] -> label ;
$line -> desc = $object -> lines [ $i ] -> desc ;
$line -> price = $object -> lines [ $i ] -> price ;
$line -> subprice = $object -> lines [ $i ] -> subprice ;
$line -> tva_tx = $object -> lines [ $i ] -> tva_tx ;
$line -> localtax1_tx = $object -> lines [ $i ] -> localtax1_tx ;
$line -> localtax2_tx = $object -> lines [ $i ] -> localtax2_tx ;
$line -> qty = $object -> lines [ $i ] -> qty ;
$line -> fk_remise_except = $object -> lines [ $i ] -> fk_remise_except ;
$line -> remise_percent = $object -> lines [ $i ] -> remise_percent ;
$line -> fk_product = $object -> lines [ $i ] -> fk_product ;
$line -> info_bits = $object -> lines [ $i ] -> info_bits ;
$line -> product_type = $object -> lines [ $i ] -> product_type ;
$line -> rang = $object -> lines [ $i ] -> rang ;
$line -> special_code = $object -> lines [ $i ] -> special_code ;
$line -> fk_parent_line = $object -> lines [ $i ] -> fk_parent_line ;
$line -> fk_unit = $object -> lines [ $i ] -> fk_unit ;
$line -> date_start = $object -> lines [ $i ] -> date_start ;
$line -> date_end = $object -> lines [ $i ] -> date_end ;
$line -> fk_fournprice = $object -> lines [ $i ] -> fk_fournprice ;
$marginInfos = getMarginInfos ( $object -> lines [ $i ] -> subprice , $object -> lines [ $i ] -> remise_percent , $object -> lines [ $i ] -> tva_tx , $object -> lines [ $i ] -> localtax1_tx , $object -> lines [ $i ] -> localtax2_tx , $object -> lines [ $i ] -> fk_fournprice , $object -> lines [ $i ] -> pa_ht );
$line -> pa_ht = $marginInfos [ 0 ];
$line -> marge_tx = $marginInfos [ 1 ];
$line -> marque_tx = $marginInfos [ 2 ];
2012-07-02 19:30:37 +02:00
2014-11-12 17:51:26 +01:00
// get extrafields from original line
2015-10-15 12:17:57 +02:00
$object -> lines [ $i ] -> fetch_optionals ( $object -> lines [ $i ] -> rowid );
foreach ( $object -> lines [ $i ] -> array_options as $options_key => $value )
$line -> array_options [ $options_key ] = $value ;
2014-11-12 17:51:26 +01:00
2015-10-15 12:17:57 +02:00
$this -> lines [ $i ] = $line ;
}
2015-08-13 03:58:32 +02:00
2015-10-15 12:17:57 +02:00
$this -> socid = $object -> socid ;
$this -> fk_project = $object -> fk_project ;
$this -> cond_reglement_id = $object -> cond_reglement_id ;
$this -> mode_reglement_id = $object -> mode_reglement_id ;
$this -> fk_account = $object -> fk_account ;
$this -> availability_id = $object -> availability_id ;
$this -> demand_reason_id = $object -> demand_reason_id ;
$this -> date_livraison = $object -> date_livraison ;
$this -> shipping_method_id = $object -> shipping_method_id ;
2015-11-29 15:42:20 +01:00
$this -> warehouse_id = $object -> warehouse_id ;
2015-10-15 12:17:57 +02:00
$this -> fk_delivery_address = $object -> fk_delivery_address ;
$this -> contact_id = $object -> contactid ;
$this -> ref_client = $object -> ref_client ;
$this -> note_private = $object -> note_private ;
$this -> note_public = $object -> note_public ;
$this -> origin = $object -> element ;
$this -> origin_id = $object -> id ;
// get extrafields from original line
$object -> fetch_optionals ( $object -> id );
2016-05-06 22:30:34 +02:00
$e = new ExtraFields ( $this -> db );
2015-10-15 12:17:57 +02:00
$element_extrafields = $e -> fetch_name_optionals_label ( $this -> element );
foreach ( $object -> array_options as $options_key => $value ) {
if ( array_key_exists ( str_replace ( 'options_' , '' , $options_key ), $element_extrafields )){
$this -> array_options [ $options_key ] = $value ;
2015-06-01 11:24:30 +02:00
}
2015-10-15 12:17:57 +02:00
}
// Possibility to add external linked objects with hooks
$this -> linked_objects [ $this -> origin ] = $this -> origin_id ;
if ( is_array ( $object -> other_linked_objects ) && ! empty ( $object -> other_linked_objects ))
{
$this -> linked_objects = array_merge ( $this -> linked_objects , $object -> other_linked_objects );
}
2011-09-12 19:08:02 +02:00
2015-10-15 12:17:57 +02:00
$ret = $this -> create ( $user );
2011-09-12 19:08:02 +02:00
2015-10-15 12:17:57 +02:00
if ( $ret > 0 )
{
// Actions hooked (by external module)
$hookmanager -> initHooks ( array ( 'orderdao' ));
2011-10-14 18:51:20 +02:00
2015-10-15 12:17:57 +02:00
$parameters = array ( 'objFrom' => $object );
$action = '' ;
$reshook = $hookmanager -> executeHooks ( 'createFrom' , $parameters , $this , $action ); // Note that $action and $object may have been modified by some hooks
if ( $reshook < 0 ) $error ++ ;
2011-09-12 19:08:02 +02:00
2015-10-15 12:17:57 +02:00
if ( ! $error )
{
// Ne pas passer par la commande provisoire
if ( $conf -> global -> COMMANDE_VALID_AFTER_CLOSE_PROPAL == 1 )
2011-09-12 19:08:02 +02:00
{
2015-10-15 12:17:57 +02:00
$this -> fetch ( $ret );
$this -> valid ( $user );
2011-09-12 19:08:02 +02:00
}
2015-10-15 12:17:57 +02:00
return $ret ;
2011-09-12 19:08:02 +02:00
}
else return - 1 ;
}
2015-10-15 12:17:57 +02:00
else return - 1 ;
2011-09-12 19:08:02 +02:00
}
/**
2011-12-16 12:47:23 +01:00
* Add an order line into database ( linked to product / service or not )
2012-02-06 17:18:19 +01:00
*
2011-12-16 12:47:23 +01:00
* @ param string $desc Description of line
2015-02-10 13:17:37 +01:00
* @ param float $pu_ht Unit price ( without tax )
* @ param float $qty Quantite
* @ param float $txtva Taux de tva force , sinon - 1
* @ param float $txlocaltax1 Local tax 1 rate
* @ param float $txlocaltax2 Local tax 2 rate
2015-10-03 18:33:46 +02:00
* @ param int $fk_product Id of product
2015-02-10 13:17:37 +01:00
* @ param float $remise_percent Pourcentage de remise de la ligne
2011-12-16 12:47:23 +01:00
* @ param int $info_bits Bits de type de lignes
* @ param int $fk_remise_except Id remise
* @ param string $price_base_type HT or TTC
2015-02-10 13:17:37 +01:00
* @ param float $pu_ttc Prix unitaire TTC
2015-02-28 03:11:15 +01:00
* @ param int $date_start Start date of the line - Added by Matelli ( See http :// matelli . fr / showcases / patchs - dolibarr / add - dates - in - order - lines . html )
* @ param int $date_end End date of the line - Added by Matelli ( See http :// matelli . fr / showcases / patchs - dolibarr / add - dates - in - order - lines . html )
2015-10-03 18:33:46 +02:00
* @ param int $type Type of line ( 0 = product , 1 = service ) . Not used if fk_product is defined , the type of product is used .
2011-12-16 12:47:23 +01:00
* @ param int $rang Position of line
2013-01-22 21:36:30 +01:00
* @ param int $special_code Special code ( also used by externals modules ! )
2012-03-18 19:23:01 +01:00
* @ param int $fk_parent_line Parent line
2012-07-23 10:46:09 +02:00
* @ param int $fk_fournprice Id supplier price
* @ param int $pa_ht Buying price ( without tax )
2012-09-18 17:41:59 +02:00
* @ param string $label Label
2015-10-20 12:40:37 +02:00
* @ param array $array_options extrafields array . Example array ( 'options_codeforfield1' => 'valueforfield1' , 'options_codeforfield2' => 'valueforfield2' , ... )
2015-04-21 15:49:58 +02:00
* @ param string $fk_unit Code of the unit to use . Null to use the default one
2015-11-04 23:18:28 +01:00
* @ param string $origin 'order' , ...
* @ param int $origin_id Id of origin object
2011-12-16 12:47:23 +01:00
* @ return int > 0 if OK , < 0 if KO
*
* @ see add_product
*
* Les parametres sont deja cense etre juste et avec valeurs finales a l ' appel
* de cette methode . Aussi , pour le taux tva , il doit deja avoir ete defini
* par l ' appelant par la methode get_default_tva ( societe_vendeuse , societe_acheteuse , produit )
* et le desc doit deja avoir la bonne valeur ( a l ' appelant de gerer le multilangue )
2011-09-12 19:08:02 +02:00
*/
2015-11-04 23:18:28 +01:00
function addline ( $desc , $pu_ht , $qty , $txtva , $txlocaltax1 = 0 , $txlocaltax2 = 0 , $fk_product = 0 , $remise_percent = 0 , $info_bits = 0 , $fk_remise_except = 0 , $price_base_type = 'HT' , $pu_ttc = 0 , $date_start = '' , $date_end = '' , $type = 0 , $rang =- 1 , $special_code = 0 , $fk_parent_line = 0 , $fk_fournprice = null , $pa_ht = 0 , $label = '' , $array_options = 0 , $fk_unit = null , $origin = '' , $origin_id = 0 )
2011-09-12 19:08:02 +02:00
{
2014-03-15 12:45:56 +01:00
global $mysoc , $conf , $langs ;
2014-05-13 10:12:45 +02:00
2015-11-13 12:18:46 +01:00
dol_syslog ( get_class ( $this ) . " ::addline commandeid= $this->id , desc= $desc , pu_ht= $pu_ht , qty= $qty , txtva= $txtva , fk_product= $fk_product , remise_percent= $remise_percent , info_bits= $info_bits , fk_remise_except= $fk_remise_except , price_base_type= $price_base_type , pu_ttc= $pu_ttc , date_start= $date_start , date_end= $date_end , type= $type special_code= $special_code , fk_unit= $fk_unit " , LOG_DEBUG );
2011-09-12 19:08:02 +02:00
2012-08-23 02:04:35 +02:00
include_once DOL_DOCUMENT_ROOT . '/core/lib/price.lib.php' ;
2011-09-12 19:08:02 +02:00
// Clean parameters
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 ( $txtva )) $txtva = 0 ;
if ( empty ( $txlocaltax1 )) $txlocaltax1 = 0 ;
if ( empty ( $txlocaltax2 )) $txlocaltax2 = 0 ;
if ( empty ( $fk_parent_line ) || $fk_parent_line < 0 ) $fk_parent_line = 0 ;
2016-02-20 04:25:39 +01:00
if ( empty ( $this -> fk_multicurrency )) $this -> fk_multicurrency = 0 ;
2016-07-08 18:30:50 +02:00
2011-09-12 19:08:02 +02:00
$remise_percent = price2num ( $remise_percent );
$qty = price2num ( $qty );
$pu_ht = price2num ( $pu_ht );
$pu_ttc = price2num ( $pu_ttc );
2012-07-28 18:32:54 +02:00
$pa_ht = price2num ( $pa_ht );
2011-09-12 19:08:02 +02:00
$txtva = price2num ( $txtva );
$txlocaltax1 = price2num ( $txlocaltax1 );
$txlocaltax2 = price2num ( $txlocaltax2 );
if ( $price_base_type == 'HT' )
{
$pu = $pu_ht ;
}
else
{
$pu = $pu_ttc ;
}
2012-08-23 07:50:20 +02:00
$label = trim ( $label );
2011-09-12 19:08:02 +02:00
$desc = trim ( $desc );
// Check parameters
if ( $type < 0 ) return - 1 ;
2015-03-15 11:48:57 +01:00
if ( $this -> statut == self :: STATUS_DRAFT )
2011-09-12 19:08:02 +02:00
{
$this -> db -> begin ();
2015-10-03 18:33:46 +02:00
$product_type = $type ;
if ( ! empty ( $fk_product ))
{
$product = new Product ( $this -> db );
$result = $product -> fetch ( $fk_product );
$product_type = $product -> type ;
if ( ! empty ( $conf -> global -> STOCK_MUST_BE_ENOUGH_FOR_ORDER ) && $product_type == 0 && $product -> stock_reel < $qty )
{
2016-06-24 17:04:59 +02:00
$langs -> load ( " errors " );
$this -> error = $langs -> trans ( 'ErrorStockIsNotEnoughToAddProductOnOrder' , $product -> ref );
2015-10-03 18:33:46 +02:00
dol_syslog ( get_class ( $this ) . " ::addline error=Product " . $product -> ref . " : " . $this -> error , LOG_ERR );
$this -> db -> rollback ();
return self :: STOCK_NOT_ENOUGH_FOR_ORDER ;
}
}
// Calcul du total TTC et de la TVA pour la ligne a partir de
2011-09-12 19:08:02 +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.
2014-05-13 10:12:45 +02:00
2014-07-04 11:38:08 +02:00
$localtaxes_type = getLocalTaxesFromRate ( $txtva , 0 , $this -> thirdparty , $mysoc );
2015-11-14 15:28:25 +01:00
$txtva = preg_replace ( '/\s*\(.*\)/' , '' , $txtva ); // Remove code into vatrate.
2016-07-08 18:30:50 +02:00
2016-01-23 00:38:17 +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 );
2016-04-20 17:17:03 +02:00
2011-09-12 19:08:02 +02:00
$total_ht = $tabprice [ 0 ];
$total_tva = $tabprice [ 1 ];
$total_ttc = $tabprice [ 2 ];
$total_localtax1 = $tabprice [ 9 ];
$total_localtax2 = $tabprice [ 10 ];
2016-01-23 00:38:17 +01:00
// MultiCurrency
$multicurrency_total_ht = $tabprice [ 16 ];
$multicurrency_total_tva = $tabprice [ 17 ];
$multicurrency_total_ttc = $tabprice [ 18 ];
2016-07-08 18:30:50 +02:00
2011-09-12 19:08:02 +02:00
// Rang to use
$rangtouse = $rang ;
if ( $rangtouse == - 1 )
{
$rangmax = $this -> line_max ( $fk_parent_line );
$rangtouse = $rangmax + 1 ;
}
2014-05-13 10:12:45 +02:00
2011-09-12 19:08:02 +02:00
// TODO A virer
// Anciens indicateurs: $price, $remise (a ne plus utiliser)
$price = $pu ;
$remise = 0 ;
if ( $remise_percent > 0 )
{
$remise = round (( $pu * $remise_percent / 100 ), 2 );
$price = $pu - $remise ;
}
// Insert line
$this -> line = new OrderLine ( $this -> db );
2015-02-26 13:19:19 +01:00
$this -> line -> context = $this -> context ;
2014-05-13 13:22:29 +02:00
$this -> line -> fk_commande = $this -> id ;
2012-08-23 07:50:20 +02:00
$this -> line -> label = $label ;
2011-09-12 19:08:02 +02:00
$this -> line -> desc = $desc ;
$this -> line -> qty = $qty ;
$this -> line -> tva_tx = $txtva ;
$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 ];
$this -> line -> localtax2_type = $localtaxes_type [ 2 ];
2011-09-12 19:08:02 +02:00
$this -> line -> fk_product = $fk_product ;
2014-03-15 12:45:56 +01:00
$this -> line -> product_type = $product_type ;
2011-09-12 19:08:02 +02:00
$this -> line -> fk_remise_except = $fk_remise_except ;
$this -> line -> remise_percent = $remise_percent ;
$this -> line -> subprice = $pu_ht ;
$this -> line -> rang = $rangtouse ;
$this -> line -> info_bits = $info_bits ;
$this -> line -> total_ht = $total_ht ;
$this -> line -> total_tva = $total_tva ;
$this -> line -> total_localtax1 = $total_localtax1 ;
$this -> line -> total_localtax2 = $total_localtax2 ;
$this -> line -> total_ttc = $total_ttc ;
$this -> line -> product_type = $type ;
$this -> line -> special_code = $special_code ;
2015-11-04 22:38:45 +01:00
$this -> line -> origin = $origin ;
$this -> line -> origin_id = $origin_id ;
2011-09-12 19:08:02 +02:00
$this -> line -> fk_parent_line = $fk_parent_line ;
2015-02-26 14:15:33 +01:00
$this -> line -> fk_unit = $fk_unit ;
2011-09-12 19:08:02 +02:00
$this -> line -> date_start = $date_start ;
$this -> line -> date_end = $date_end ;
2015-10-26 20:33:42 +01:00
$this -> line -> fk_fournprice = $fk_fournprice ;
2012-07-28 18:32:54 +02:00
$this -> line -> pa_ht = $pa_ht ;
2012-07-19 10:26:26 +02:00
2016-01-23 00:38:17 +01:00
// Multicurrency
$this -> line -> fk_multicurrency = $this -> fk_multicurrency ;
$this -> line -> multicurrency_code = $this -> multicurrency_code ;
$this -> line -> multicurrency_subprice = price2num ( $pu_ht * $this -> multicurrency_tx );
$this -> line -> multicurrency_total_ht = $multicurrency_total_ht ;
$this -> line -> multicurrency_total_tva = $multicurrency_total_tva ;
$this -> line -> multicurrency_total_ttc = $multicurrency_total_ttc ;
2011-09-12 19:08:02 +02:00
// TODO Ne plus utiliser
$this -> line -> price = $price ;
$this -> line -> remise = $remise ;
2015-02-28 04:59:27 +01:00
if ( is_array ( $array_options ) && count ( $array_options ) > 0 ) {
$this -> line -> array_options = $array_options ;
2013-06-10 16:05:41 +02:00
}
2011-09-12 19:08:02 +02:00
$result = $this -> line -> insert ();
if ( $result > 0 )
{
// Reorder if child line
if ( ! empty ( $fk_parent_line )) $this -> line_order ( true , 'DESC' );
// Mise a jour informations denormalisees au niveau de la commande meme
2014-05-13 13:22:29 +02:00
$result = $this -> update_price ( 1 , 'auto' ); // This method is designed to add line from user input so total calculation must be done using 'auto' mode.
2011-09-12 19:08:02 +02:00
if ( $result > 0 )
{
$this -> db -> commit ();
return $this -> line -> rowid ;
}
else
{
$this -> db -> rollback ();
return - 1 ;
}
}
else
{
$this -> error = $this -> line -> error ;
2012-08-05 21:30:40 +02:00
dol_syslog ( get_class ( $this ) . " ::addline error= " . $this -> error , LOG_ERR );
2011-09-12 19:08:02 +02:00
$this -> db -> rollback ();
return - 2 ;
}
}
2016-05-27 14:56:59 +02:00
else
{
dol_syslog ( get_class ( $this ) . " ::addline status of order must be Draft to allow use of ->addline() " , LOG_ERR );
return - 3 ;
}
2011-09-12 19:08:02 +02:00
}
/**
2011-12-16 12:47:23 +01:00
* Add line into array
* $this -> client must be loaded
*
* @ param int $idproduct Product Id
2015-02-10 13:17:37 +01:00
* @ param float $qty Quantity
* @ param float $remise_percent Product discount relative
* @ param int $date_start Start date of the line - Added by Matelli ( See http :// matelli . fr / showcases / patchs - dolibarr / add - dates - in - order - lines . html )
* @ param int $date_end End date of the line - Added by Matelli ( See http :// matelli . fr / showcases / patchs - dolibarr / add - dates - in - order - lines . html )
2011-12-16 12:47:23 +01:00
* @ return void
2012-02-06 17:18:19 +01:00
*
2011-12-16 12:47:23 +01:00
* TODO Remplacer les appels a cette fonction par generation objet Ligne
* insere dans tableau $this -> products
2011-09-12 19:08:02 +02:00
*/
2015-02-10 13:17:37 +01:00
function add_product ( $idproduct , $qty , $remise_percent = 0.0 , $date_start = '' , $date_end = '' )
2011-09-12 19:08:02 +02:00
{
global $conf , $mysoc ;
if ( ! $qty ) $qty = 1 ;
if ( $idproduct > 0 )
{
$prod = new Product ( $this -> db );
$prod -> fetch ( $idproduct );
2016-04-17 15:24:22 +02:00
$tva_tx = get_default_tva ( $mysoc , $this -> thirdparty , $prod -> id );
$tva_npr = get_default_npr ( $mysoc , $this -> thirdparty , $prod -> id );
2016-02-27 11:32:49 +01:00
if ( empty ( $tva_tx )) $tva_npr = 0 ;
2016-04-22 21:02:20 +02:00
2016-04-17 15:24:22 +02:00
$localtax1_tx = get_localtax ( $tva_tx , 1 , $this -> thirdparty , $mysoc , $tva_npr );
$localtax2_tx = get_localtax ( $tva_tx , 2 , $this -> thirdparty , $mysoc , $tva_npr );
2016-04-20 17:17:03 +02:00
2011-09-12 19:08:02 +02:00
// multiprix
2016-04-17 15:24:22 +02:00
if ( $conf -> global -> PRODUIT_MULTIPRICES && $this -> thirdparty -> price_level )
$price = $prod -> multiprices [ $this -> thirdparty -> price_level ];
2011-09-12 19:08:02 +02:00
else
$price = $prod -> price ;
$line = new OrderLine ( $this -> db );
2015-02-26 13:19:19 +01:00
$line -> context = $this -> context ;
2011-09-12 19:08:02 +02:00
$line -> fk_product = $idproduct ;
$line -> desc = $prod -> description ;
$line -> qty = $qty ;
$line -> subprice = $price ;
$line -> remise_percent = $remise_percent ;
$line -> tva_tx = $tva_tx ;
$line -> localtax1_tx = $localtax1_tx ;
$line -> localtax2_tx = $localtax2_tx ;
$line -> ref = $prod -> ref ;
2015-05-04 03:03:24 +02:00
$line -> libelle = $prod -> label ;
2011-09-12 19:08:02 +02:00
$line -> product_desc = $prod -> description ;
2015-02-26 14:15:33 +01:00
$line -> fk_unit = $prod -> fk_unit ;
2011-09-12 19:08:02 +02:00
// Added by Matelli (See http://matelli.fr/showcases/patchs-dolibarr/add-dates-in-order-lines.html)
// Save the start and end date of the line in the object
if ( $date_start ) { $line -> date_start = $date_start ; }
if ( $date_end ) { $line -> date_end = $date_end ; }
$this -> lines [] = $line ;
/** POUR AJOUTER AUTOMATIQUEMENT LES SOUSPRODUITS a LA COMMANDE
if ( ! empty ( $conf -> global -> PRODUIT_SOUSPRODUITS ))
{
$prod = new Product ( $this -> db );
$prod -> fetch ( $idproduct );
$prod -> get_sousproduits_arbo ();
$prods_arbo = $prod -> get_each_prod ();
2011-09-17 21:49:50 +02:00
if ( count ( $prods_arbo ) > 0 )
2011-09-12 19:08:02 +02:00
{
foreach ( $prods_arbo as $key => $value )
{
// print "id : ".$value[1].' :qty: '.$value[0].'<br>';
if ( ! in_array ( $value [ 1 ], $this -> products ))
$this -> add_product ( $value [ 1 ], $value [ 0 ]);
}
}
}
**/
}
}
/**
* Get object and lines from database
2011-12-16 12:47:23 +01:00
*
* @ param int $id Id of object to load
* @ param string $ref Ref of object
* @ param string $ref_ext External reference of object
* @ param string $ref_int Internal reference of other object
2012-02-08 16:41:06 +01:00
* @ return int > 0 if OK , < 0 if KO , 0 if not found
2011-09-12 19:08:02 +02:00
*/
function fetch ( $id , $ref = '' , $ref_ext = '' , $ref_int = '' )
{
// Check parameters
if ( empty ( $id ) && empty ( $ref ) && empty ( $ref_ext ) && empty ( $ref_int )) return - 1 ;
$sql = 'SELECT c.rowid, c.date_creation, c.ref, c.fk_soc, c.fk_user_author, c.fk_statut' ;
2012-07-22 16:53:02 +02:00
$sql .= ', c.amount_ht, c.total_ht, c.total_ttc, c.tva as total_tva, c.localtax1 as total_localtax1, c.localtax2 as total_localtax2, c.fk_cond_reglement, c.fk_mode_reglement, c.fk_availability, c.fk_input_reason' ;
2014-07-06 20:49:34 +02:00
$sql .= ', c.fk_account' ;
2011-09-12 19:08:02 +02:00
$sql .= ', c.date_commande' ;
$sql .= ', c.date_livraison' ;
2014-07-25 23:20:19 +02:00
$sql .= ', c.fk_shipping_method' ;
2015-10-19 21:21:27 +02:00
$sql .= ', c.fk_warehouse' ;
2012-07-08 12:18:29 +02:00
$sql .= ', c.fk_projet, c.remise_percent, c.remise, c.remise_absolue, c.source, c.facture as billed' ;
2013-04-09 17:18:07 +02:00
$sql .= ', c.note_private, c.note_public, c.ref_client, c.ref_ext, c.ref_int, c.model_pdf, c.fk_delivery_address, c.extraparams' ;
2015-02-10 12:22:07 +01:00
$sql .= ', c.fk_incoterms, c.location_incoterms' ;
2016-01-23 00:38:17 +01:00
$sql .= " , c.fk_multicurrency, c.multicurrency_code, c.multicurrency_tx, c.multicurrency_total_ht, c.multicurrency_total_tva, c.multicurrency_total_ttc " ;
2015-02-10 12:22:07 +01:00
$sql .= " , i.libelle as libelle_incoterms " ;
2011-09-12 19:08:02 +02:00
$sql .= ', p.code as mode_reglement_code, p.libelle as mode_reglement_libelle' ;
$sql .= ', cr.code as cond_reglement_code, cr.libelle as cond_reglement_libelle, cr.libelle_facture as cond_reglement_libelle_doc' ;
2015-12-27 13:10:33 +01:00
$sql .= ', ca.code as availability_code, ca.label as availability_label' ;
2011-09-12 19:08:02 +02:00
$sql .= ', dr.code as demand_reason_code' ;
$sql .= ' FROM ' . MAIN_DB_PREFIX . 'commande as c' ;
$sql .= ' LEFT JOIN ' . MAIN_DB_PREFIX . 'c_payment_term as cr ON (c.fk_cond_reglement = cr.rowid)' ;
$sql .= ' LEFT JOIN ' . MAIN_DB_PREFIX . 'c_paiement as p ON (c.fk_mode_reglement = p.id)' ;
$sql .= ' LEFT JOIN ' . MAIN_DB_PREFIX . 'c_availability as ca ON (c.fk_availability = ca.rowid)' ;
2012-07-22 16:53:02 +02:00
$sql .= ' LEFT JOIN ' . MAIN_DB_PREFIX . 'c_input_reason as dr ON (c.fk_input_reason = ca.rowid)' ;
2015-02-10 12:22:07 +01:00
$sql .= ' LEFT JOIN ' . MAIN_DB_PREFIX . 'c_incoterms as i ON c.fk_incoterms = i.rowid' ;
2015-04-19 03:05:37 +02:00
$sql .= " WHERE c.entity IN ( " . getEntity ( 'commande' , 1 ) . " ) " ;
2011-09-12 19:08:02 +02:00
if ( $id ) $sql .= " AND c.rowid= " . $id ;
if ( $ref ) $sql .= " AND c.ref=' " . $this -> db -> escape ( $ref ) . " ' " ;
if ( $ref_ext ) $sql .= " AND c.ref_ext=' " . $this -> db -> escape ( $ref_ext ) . " ' " ;
if ( $ref_int ) $sql .= " AND c.ref_int=' " . $this -> db -> escape ( $ref_int ) . " ' " ;
2014-06-12 11:31:53 +02:00
dol_syslog ( get_class ( $this ) . " ::fetch " , LOG_DEBUG );
2011-09-20 15:32:16 +02:00
$result = $this -> db -> query ( $sql );
2011-09-12 19:08:02 +02:00
if ( $result )
{
$obj = $this -> db -> fetch_object ( $result );
if ( $obj )
{
2012-07-08 12:18:29 +02:00
$this -> id = $obj -> rowid ;
$this -> ref = $obj -> ref ;
$this -> ref_client = $obj -> ref_client ;
2016-05-22 08:57:23 +02:00
$this -> ref_customer = $obj -> ref_client ;
2012-07-08 12:18:29 +02:00
$this -> ref_ext = $obj -> ref_ext ;
$this -> ref_int = $obj -> ref_int ;
$this -> socid = $obj -> fk_soc ;
$this -> statut = $obj -> fk_statut ;
$this -> user_author_id = $obj -> fk_user_author ;
$this -> total_ht = $obj -> total_ht ;
$this -> total_tva = $obj -> total_tva ;
$this -> total_localtax1 = $obj -> total_localtax1 ;
$this -> total_localtax2 = $obj -> total_localtax2 ;
$this -> total_ttc = $obj -> total_ttc ;
$this -> date = $this -> db -> jdate ( $obj -> date_commande );
$this -> date_commande = $this -> db -> jdate ( $obj -> date_commande );
$this -> remise = $obj -> remise ;
$this -> remise_percent = $obj -> remise_percent ;
$this -> remise_absolue = $obj -> remise_absolue ;
$this -> source = $obj -> source ;
$this -> facturee = $obj -> billed ; // deprecated
$this -> billed = $obj -> billed ;
$this -> note = $obj -> note_private ; // deprecated
$this -> note_private = $obj -> note_private ;
$this -> note_public = $obj -> note_public ;
$this -> fk_project = $obj -> fk_projet ;
$this -> modelpdf = $obj -> model_pdf ;
$this -> mode_reglement_id = $obj -> fk_mode_reglement ;
$this -> mode_reglement_code = $obj -> mode_reglement_code ;
$this -> mode_reglement = $obj -> mode_reglement_libelle ;
$this -> cond_reglement_id = $obj -> fk_cond_reglement ;
$this -> cond_reglement_code = $obj -> cond_reglement_code ;
$this -> cond_reglement = $obj -> cond_reglement_libelle ;
$this -> cond_reglement_doc = $obj -> cond_reglement_libelle_doc ;
2014-07-06 20:49:34 +02:00
$this -> fk_account = $obj -> fk_account ;
2012-07-08 12:18:29 +02:00
$this -> availability_id = $obj -> fk_availability ;
$this -> availability_code = $obj -> availability_code ;
2015-12-27 13:10:33 +01:00
$this -> availability = $obj -> availability_label ;
2012-07-22 16:53:02 +02:00
$this -> demand_reason_id = $obj -> fk_input_reason ;
2012-07-08 12:18:29 +02:00
$this -> demand_reason_code = $obj -> demand_reason_code ;
$this -> date_livraison = $this -> db -> jdate ( $obj -> date_livraison );
2014-07-25 21:50:21 +02:00
$this -> shipping_method_id = ( $obj -> fk_shipping_method > 0 ) ? $obj -> fk_shipping_method : null ;
2015-10-19 21:21:27 +02:00
$this -> warehouse_id = ( $obj -> fk_warehouse > 0 ) ? $obj -> fk_warehouse : null ;
2013-02-15 19:18:26 +01:00
$this -> fk_delivery_address = $obj -> fk_delivery_address ;
2012-07-08 12:18:29 +02:00
2015-02-10 12:22:07 +01:00
//Incoterms
$this -> fk_incoterms = $obj -> fk_incoterms ;
2015-03-16 18:30:30 +01:00
$this -> location_incoterms = $obj -> location_incoterms ;
2015-02-10 12:22:07 +01:00
$this -> libelle_incoterms = $obj -> libelle_incoterms ;
2016-01-23 00:38:17 +01:00
// Multicurrency
$this -> fk_multicurrency = $obj -> fk_multicurrency ;
$this -> multicurrency_code = $obj -> multicurrency_code ;
$this -> multicurrency_tx = $obj -> multicurrency_tx ;
$this -> multicurrency_total_ht = $obj -> multicurrency_total_ht ;
$this -> multicurrency_total_tva = $obj -> multicurrency_total_tva ;
$this -> multicurrency_total_ttc = $obj -> multicurrency_total_ttc ;
2016-07-08 18:30:50 +02:00
2012-07-08 12:18:29 +02:00
$this -> extraparams = ( array ) json_decode ( $obj -> extraparams , true );
$this -> lines = array ();
2011-09-12 19:08:02 +02:00
2015-03-15 11:48:57 +01:00
if ( $this -> statut == self :: STATUS_DRAFT ) $this -> brouillon = 1 ;
2013-06-16 21:31:21 +02:00
2015-05-01 18:44:27 +02:00
// Retrieve all extrafields for invoice
2013-04-26 16:51:01 +02:00
// fetch optionals attributes and labels
2013-06-16 21:31:21 +02:00
require_once DOL_DOCUMENT_ROOT . '/core/class/extrafields.class.php' ;
2013-04-26 16:51:01 +02:00
$extrafields = new ExtraFields ( $this -> db );
$extralabels = $extrafields -> fetch_name_optionals_label ( $this -> table_element , true );
2013-06-16 21:31:21 +02:00
$this -> fetch_optionals ( $this -> id , $extralabels );
2011-09-12 19:08:02 +02:00
2014-05-23 11:37:57 +02:00
$this -> db -> free ( $result );
2011-09-12 19:08:02 +02:00
/*
2012-02-08 16:41:06 +01:00
* Lines
2011-09-12 19:08:02 +02:00
*/
$result = $this -> fetch_lines ();
if ( $result < 0 )
{
return - 3 ;
}
return 1 ;
}
else
{
2011-12-05 18:36:54 +01:00
$this -> error = 'Order with id ' . $id . ' not found sql=' . $sql ;
2012-02-08 16:41:06 +01:00
return 0 ;
2011-09-12 19:08:02 +02:00
}
}
else
{
$this -> error = $this -> db -> error ();
return - 1 ;
}
}
/**
2011-12-16 12:47:23 +01:00
* Adding line of fixed discount in the order in DB
2012-02-06 17:18:19 +01:00
*
2011-12-16 12:47:23 +01:00
* @ param int $idremise Id de la remise fixe
* @ return int > 0 si ok , < 0 si ko
2011-09-12 19:08:02 +02:00
*/
function insert_discount ( $idremise )
{
global $langs ;
2012-08-23 02:04:35 +02:00
include_once DOL_DOCUMENT_ROOT . '/core/lib/price.lib.php' ;
include_once DOL_DOCUMENT_ROOT . '/core/class/discount.class.php' ;
2011-09-12 19:08:02 +02:00
$this -> db -> begin ();
$remise = new DiscountAbsolute ( $this -> db );
$result = $remise -> fetch ( $idremise );
if ( $result > 0 )
{
if ( $remise -> fk_facture ) // Protection against multiple submission
{
$this -> error = $langs -> trans ( " ErrorDiscountAlreadyUsed " );
$this -> db -> rollback ();
return - 5 ;
}
$line = new OrderLine ( $this -> db );
$line -> fk_commande = $this -> id ;
$line -> fk_remise_except = $remise -> id ;
$line -> desc = $remise -> description ; // Description ligne
$line -> tva_tx = $remise -> tva_tx ;
$line -> subprice =- $remise -> amount_ht ;
$line -> price =- $remise -> amount_ht ;
$line -> fk_product = 0 ; // Id produit predefini
$line -> qty = 1 ;
$line -> remise = 0 ;
$line -> remise_percent = 0 ;
$line -> rang =- 1 ;
$line -> info_bits = 2 ;
$line -> total_ht = - $remise -> amount_ht ;
$line -> total_tva = - $remise -> amount_tva ;
$line -> total_ttc = - $remise -> amount_ttc ;
$result = $line -> insert ();
if ( $result > 0 )
{
$result = $this -> update_price ( 1 );
if ( $result > 0 )
{
$this -> db -> commit ();
return 1 ;
}
else
{
$this -> db -> rollback ();
return - 1 ;
}
}
else
{
$this -> error = $line -> error ;
$this -> db -> rollback ();
return - 2 ;
}
}
else
{
$this -> db -> rollback ();
return - 2 ;
}
}
/**
2011-12-16 12:47:23 +01:00
* Load array lines
2012-02-06 17:18:19 +01:00
*
2011-12-16 12:47:23 +01:00
* @ param int $only_product Return only physical products
* @ return int < 0 if KO , > 0 if OK
2011-09-12 19:08:02 +02:00
*/
function fetch_lines ( $only_product = 0 )
{
$this -> lines = array ();
2012-08-23 07:50:20 +02:00
$sql = 'SELECT l.rowid, l.fk_product, l.fk_parent_line, l.product_type, l.fk_commande, l.label as custom_label, l.description, l.price, l.qty, l.tva_tx,' ;
2012-07-19 10:26:26 +02:00
$sql .= ' l.localtax1_tx, l.localtax2_tx, l.fk_remise_except, l.remise_percent, l.subprice, l.fk_product_fournisseur_price as fk_fournprice, l.buy_price_ht as pa_ht, l.rang, l.info_bits, l.special_code,' ;
2011-09-12 19:08:02 +02:00
$sql .= ' l.total_ht, l.total_ttc, l.total_tva, l.total_localtax1, l.total_localtax2, l.date_start, l.date_end,' ;
2015-02-26 14:15:33 +01:00
$sql .= ' l.fk_unit,' ;
2016-01-23 00:38:17 +01:00
$sql .= ' l.fk_multicurrency, l.multicurrency_code, l.multicurrency_subprice, l.multicurrency_total_ht, l.multicurrency_total_tva, l.multicurrency_total_ttc,' ;
2016-04-01 18:44:23 +02:00
$sql .= ' p.ref as product_ref, p.description as product_desc, p.fk_product_type, p.label as product_label,' ;
$sql .= ' p.weight, p.weight_units, p.volume, p.volume_units' ;
2011-09-12 19:08:02 +02:00
$sql .= ' FROM ' . MAIN_DB_PREFIX . 'commandedet as l' ;
$sql .= ' LEFT JOIN ' . MAIN_DB_PREFIX . 'product as p ON (p.rowid = l.fk_product)' ;
$sql .= ' WHERE l.fk_commande = ' . $this -> id ;
if ( $only_product ) $sql .= ' AND p.fk_product_type = 0' ;
2016-03-14 14:38:30 +01:00
$sql .= ' ORDER BY l.rang, l.rowid' ;
2011-09-12 19:08:02 +02:00
2014-06-12 11:31:53 +02:00
dol_syslog ( get_class ( $this ) . " ::fetch_lines " , LOG_DEBUG );
2011-09-12 19:08:02 +02:00
$result = $this -> db -> query ( $sql );
if ( $result )
{
$num = $this -> db -> num_rows ( $result );
$i = 0 ;
while ( $i < $num )
{
$objp = $this -> db -> fetch_object ( $result );
$line = new OrderLine ( $this -> db );
2015-03-23 01:39:12 +01:00
$line -> rowid = $objp -> rowid ;
2011-09-12 19:08:02 +02:00
$line -> id = $objp -> rowid ;
$line -> fk_commande = $objp -> fk_commande ;
2015-03-23 01:39:12 +01:00
$line -> commande_id = $objp -> fk_commande ;
2012-08-23 07:50:20 +02:00
$line -> label = $objp -> custom_label ;
2015-03-23 01:39:12 +01:00
$line -> desc = $objp -> description ;
2016-03-19 19:25:28 +01:00
$line -> description = $objp -> description ; // Description line
2011-09-12 19:08:02 +02:00
$line -> product_type = $objp -> product_type ;
$line -> qty = $objp -> qty ;
$line -> tva_tx = $objp -> tva_tx ;
$line -> localtax1_tx = $objp -> localtax1_tx ;
$line -> localtax2_tx = $objp -> localtax2_tx ;
$line -> total_ht = $objp -> total_ht ;
$line -> total_ttc = $objp -> total_ttc ;
$line -> total_tva = $objp -> total_tva ;
$line -> total_localtax1 = $objp -> total_localtax1 ;
$line -> total_localtax2 = $objp -> total_localtax2 ;
$line -> subprice = $objp -> subprice ;
$line -> fk_remise_except = $objp -> fk_remise_except ;
$line -> remise_percent = $objp -> remise_percent ;
$line -> price = $objp -> price ;
$line -> fk_product = $objp -> fk_product ;
2012-08-23 07:50:20 +02: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 ];
$line -> marge_tx = $marginInfos [ 1 ];
$line -> marque_tx = $marginInfos [ 2 ];
2011-09-12 19:08:02 +02:00
$line -> rang = $objp -> rang ;
$line -> info_bits = $objp -> info_bits ;
$line -> special_code = $objp -> special_code ;
$line -> fk_parent_line = $objp -> fk_parent_line ;
2015-03-23 01:39:12 +01:00
$line -> ref = $objp -> product_ref ;
2011-09-12 19:08:02 +02:00
$line -> product_ref = $objp -> product_ref ;
2015-03-23 01:39:12 +01:00
$line -> libelle = $objp -> product_label ;
2011-09-12 19:08:02 +02:00
$line -> product_label = $objp -> product_label ;
2015-03-23 01:39:12 +01:00
$line -> product_desc = $objp -> product_desc ;
2011-09-12 19:08:02 +02:00
$line -> fk_product_type = $objp -> fk_product_type ; // Produit ou service
2015-02-26 14:15:33 +01:00
$line -> fk_unit = $objp -> fk_unit ;
2016-07-08 18:30:50 +02:00
2016-04-01 18:44:23 +02:00
$line -> weight = $objp -> weight ;
$line -> weight_units = $objp -> weight_units ;
$line -> volume = $objp -> volume ;
$line -> volume_units = $objp -> volume_units ;
2011-09-12 19:08:02 +02:00
$line -> date_start = $this -> db -> jdate ( $objp -> date_start );
$line -> date_end = $this -> db -> jdate ( $objp -> date_end );
2016-01-23 00:38:17 +01:00
// Multicurrency
$line -> fk_multicurrency = $objp -> fk_multicurrency ;
$line -> multicurrency_code = $objp -> multicurrency_code ;
$line -> multicurrency_subprice = $objp -> multicurrency_subprice ;
$line -> multicurrency_total_ht = $objp -> multicurrency_total_ht ;
$line -> multicurrency_total_tva = $objp -> multicurrency_total_tva ;
$line -> multicurrency_total_ttc = $objp -> multicurrency_total_ttc ;
2016-07-08 18:30:50 +02:00
2011-09-12 19:08:02 +02:00
$this -> lines [ $i ] = $line ;
$i ++ ;
}
2015-06-01 11:24:30 +02:00
2011-09-12 19:08:02 +02:00
$this -> db -> free ( $result );
return 1 ;
}
else
{
$this -> error = $this -> db -> error ();
return - 3 ;
}
}
/**
2011-12-16 12:47:23 +01:00
* Return number of line with type product .
*
* @ return int < 0 if KO , Nbr of product lines if OK
2011-09-12 19:08:02 +02:00
*/
function getNbOfProductsLines ()
{
$nb = 0 ;
foreach ( $this -> lines as $line )
{
2012-10-25 11:26:36 +02:00
if ( $line -> product_type == 0 ) $nb ++ ;
}
return $nb ;
}
/**
* Return number of line with type service .
*
* @ return int < 0 if KO , Nbr of service lines if OK
*/
function getNbOfServicesLines ()
{
$nb = 0 ;
foreach ( $this -> lines as $line )
{
if ( $line -> product_type == 1 ) $nb ++ ;
2011-09-12 19:08:02 +02:00
}
return $nb ;
}
/**
2016-04-01 16:59:08 +02:00
* Load array this -> expeditions of lines of shipments with nb of products sent for each order line
2016-06-09 22:30:50 +02:00
* Note : For a dedicated shipment , the fetch_lines can be used to load the qty_asked and qty_shipped . This function is use to return qty_shipped cumulated for the order
2016-07-08 18:30:50 +02:00
*
2016-06-09 22:30:50 +02:00
* @ param int $filtre_statut Filter on shipment status
2011-12-16 12:47:23 +01:00
* @ return int < 0 if KO , Nb of lines found if OK
2011-09-12 19:08:02 +02:00
*/
2016-05-06 22:30:34 +02:00
function loadExpeditions ( $filtre_statut =- 1 )
2011-09-12 19:08:02 +02:00
{
$this -> expeditions = array ();
$sql = 'SELECT cd.rowid, cd.fk_product,' ;
$sql .= ' sum(ed.qty) as qty' ;
$sql .= ' FROM ' . MAIN_DB_PREFIX . 'expeditiondet as ed,' ;
if ( $filtre_statut >= 0 ) $sql .= ' ' . MAIN_DB_PREFIX . 'expedition as e,' ;
$sql .= ' ' . MAIN_DB_PREFIX . 'commandedet as cd' ;
$sql .= ' WHERE' ;
if ( $filtre_statut >= 0 ) $sql .= ' ed.fk_expedition = e.rowid AND' ;
$sql .= ' ed.fk_origin_line = cd.rowid' ;
$sql .= ' AND cd.fk_commande =' . $this -> id ;
2016-04-21 02:38:49 +02:00
if ( $this -> fk_product > 0 ) $sql .= ' AND cd.fk_product = ' . $this -> fk_product ;
2013-09-10 11:04:36 +02:00
if ( $filtre_statut >= 0 ) $sql .= ' AND e.fk_statut >= ' . $filtre_statut ;
2011-09-12 19:08:02 +02:00
$sql .= ' GROUP BY cd.rowid, cd.fk_product' ;
//print $sql;
2014-06-12 11:31:53 +02:00
dol_syslog ( get_class ( $this ) . " ::loadExpeditions " , LOG_DEBUG );
2011-09-12 19:08:02 +02:00
$result = $this -> db -> query ( $sql );
if ( $result )
{
$num = $this -> db -> num_rows ( $result );
$i = 0 ;
while ( $i < $num )
{
$obj = $this -> db -> fetch_object ( $result );
$this -> expeditions [ $obj -> rowid ] = $obj -> qty ;
$i ++ ;
}
$this -> db -> free ();
return $num ;
}
else
{
$this -> error = $this -> db -> lasterror ();
return - 1 ;
}
}
/**
2011-12-16 12:47:23 +01:00
* Returns a array with expeditions lines number
2012-02-06 17:18:19 +01:00
*
2012-03-18 19:23:01 +01:00
* @ return int Nb of shipments
*
2015-04-23 23:21:06 +02:00
* TODO deprecate , move to Shipping class
2011-09-12 19:08:02 +02:00
*/
function nb_expedition ()
{
$sql = 'SELECT count(*)' ;
$sql .= ' FROM ' . MAIN_DB_PREFIX . 'expedition as e' ;
$sql .= ', ' . MAIN_DB_PREFIX . 'element_element as el' ;
$sql .= ' WHERE el.fk_source = ' . $this -> id ;
$sql .= " AND el.fk_target = e.rowid " ;
$sql .= " AND el.targettype = 'shipping' " ;
$resql = $this -> db -> query ( $sql );
if ( $resql )
{
$row = $this -> db -> fetch_row ( $resql );
return $row [ 0 ];
}
else dol_print_error ( $this -> db );
}
/**
2011-12-16 12:47:23 +01:00
* Return a array with the pending stock by product
2012-02-06 17:18:19 +01:00
*
2011-12-16 12:47:23 +01:00
* @ param int $filtre_statut Filtre sur statut
* @ return int 0 si OK , < 0 si KO
2012-02-06 17:18:19 +01:00
*
2011-12-16 12:47:23 +01:00
* TODO FONCTION NON FINIE A FINIR
2011-09-12 19:08:02 +02:00
*/
2015-03-15 11:48:57 +01:00
function stock_array ( $filtre_statut = self :: STATUS_CANCELED )
2011-09-12 19:08:02 +02:00
{
$this -> stocks = array ();
// Tableau des id de produit de la commande
2011-11-22 14:00:03 +01:00
$array_of_product = array ();
2012-02-06 17:18:19 +01:00
2011-09-12 19:08:02 +02:00
// Recherche total en stock pour chaque produit
2012-02-11 10:18:09 +01:00
// TODO $array_of_product est défini vide juste au dessus !!
2011-09-17 21:49:50 +02:00
if ( count ( $array_of_product ))
2011-09-12 19:08:02 +02:00
{
$sql = " SELECT fk_product, sum(ps.reel) as total " ;
$sql .= " FROM " . MAIN_DB_PREFIX . " product_stock as ps " ;
2012-02-11 10:18:09 +01:00
$sql .= " WHERE ps.fk_product IN ( " . join ( ',' , $array_of_product ) . " ) " ;
2011-09-12 19:08:02 +02:00
$sql .= ' GROUP BY fk_product ' ;
$result = $this -> db -> query ( $sql );
if ( $result )
{
$num = $this -> db -> num_rows ( $result );
$i = 0 ;
while ( $i < $num )
{
$obj = $this -> db -> fetch_object ( $result );
$this -> stocks [ $obj -> fk_product ] = $obj -> total ;
$i ++ ;
}
$this -> db -> free ();
}
}
return 0 ;
}
/**
* Delete an order line
2012-02-06 17:18:19 +01:00
*
2011-12-16 12:47:23 +01:00
* @ param int $lineid Id of line to delete
* @ return int > 0 if OK , 0 if nothing to do , < 0 if KO
2011-09-12 19:08:02 +02:00
*/
function deleteline ( $lineid )
{
2015-03-15 11:48:57 +01:00
if ( $this -> statut == self :: STATUS_DRAFT )
2011-09-12 19:08:02 +02:00
{
$this -> db -> begin ();
$sql = " SELECT fk_product, qty " ;
$sql .= " FROM " . MAIN_DB_PREFIX . " commandedet " ;
$sql .= " WHERE rowid = " . $lineid ;
$result = $this -> db -> query ( $sql );
if ( $result )
{
$obj = $this -> db -> fetch_object ( $result );
if ( $obj )
{
$product = new Product ( $this -> db );
$product -> id = $obj -> fk_product ;
// Delete line
$line = new OrderLine ( $this -> db );
// For triggers
$line -> fetch ( $lineid );
if ( $line -> delete () > 0 )
{
$result = $this -> update_price ( 1 );
if ( $result > 0 )
{
$this -> db -> commit ();
return 1 ;
}
else
{
$this -> db -> rollback ();
$this -> error = $this -> db -> lasterror ();
return - 1 ;
}
}
else
{
$this -> db -> rollback ();
2014-06-14 12:30:48 +02:00
$this -> error = $line -> error ;
2011-09-12 19:08:02 +02:00
return - 1 ;
}
}
else
{
$this -> db -> rollback ();
return 0 ;
}
}
else
{
$this -> db -> rollback ();
$this -> error = $this -> db -> lasterror ();
return - 1 ;
}
}
else
{
return - 1 ;
}
}
/**
* Applique une remise relative
*
* @ param User $user User qui positionne la remise
* @ param float $remise Discount ( percent )
2016-07-08 20:40:25 +02:00
* @ param int $notrigger 1 = Does not execute triggers , 0 = execuete triggers
2011-09-12 19:08:02 +02:00
* @ return int < 0 if KO , > 0 if OK
*/
2016-07-08 18:30:50 +02:00
function set_remise ( $user , $remise , $notrigger = 0 )
2011-09-12 19:08:02 +02:00
{
$remise = trim ( $remise ) ? trim ( $remise ) : 0 ;
if ( $user -> rights -> commande -> creer )
{
2016-07-08 18:30:50 +02:00
$error = 0 ;
$this -> db -> begin ();
2011-09-12 19:08:02 +02:00
$remise = price2num ( $remise );
$sql = 'UPDATE ' . MAIN_DB_PREFIX . 'commande' ;
$sql .= ' SET remise_percent = ' . $remise ;
2015-03-15 11:48:57 +01:00
$sql .= ' WHERE rowid = ' . $this -> id . ' AND fk_statut = ' . self :: STATUS_DRAFT . ' ;' ;
2011-09-12 19:08:02 +02:00
2016-07-08 20:40:25 +02:00
dol_syslog ( __METHOD__ , LOG_DEBUG );
2016-07-08 18:30:50 +02:00
$resql = $this -> db -> query ( $sql );
if ( ! $resql )
2011-09-12 19:08:02 +02:00
{
2016-07-08 18:30:50 +02:00
$this -> errors [] = $this -> db -> error ();
$error ++ ;
}
2016-07-08 21:02:27 +02:00
if ( ! $error )
{
$this -> oldcopy = clone $this ;
$this -> remise_percent = $remise ;
$this -> update_price ( 1 );
}
2016-07-08 18:30:50 +02:00
if ( ! $notrigger && empty ( $error ))
{
// Call trigger
$result = $this -> call_trigger ( 'ORDER_MODIFY' , $user );
if ( $result < 0 ) $error ++ ;
// End call triggers
}
if ( ! $error )
{
$this -> db -> commit ();
return 1 ;
2011-09-12 19:08:02 +02:00
}
else
{
2016-07-08 18:30:50 +02:00
foreach ( $this -> errors as $errmsg )
{
dol_syslog ( __METHOD__ . ' Error: ' . $errmsg , LOG_ERR );
$this -> error .= ( $this -> error ? ', ' . $errmsg : $errmsg );
}
$this -> db -> rollback ();
return - 1 * $error ;
2011-09-12 19:08:02 +02:00
}
}
}
/**
* Applique une remise absolue
*
* @ param User $user User qui positionne la remise
* @ param float $remise Discount
2016-07-08 20:40:25 +02:00
* @ param int $notrigger 1 = Does not execute triggers , 0 = execuete triggers
2011-09-12 19:08:02 +02:00
* @ return int < 0 if KO , > 0 if OK
*/
2016-07-08 18:30:50 +02:00
function set_remise_absolue ( $user , $remise , $notrigger = 0 )
2011-09-12 19:08:02 +02:00
{
$remise = trim ( $remise ) ? trim ( $remise ) : 0 ;
if ( $user -> rights -> commande -> creer )
{
2016-07-08 18:30:50 +02:00
$error = 0 ;
$this -> db -> begin ();
2011-09-12 19:08:02 +02:00
$remise = price2num ( $remise );
$sql = 'UPDATE ' . MAIN_DB_PREFIX . 'commande' ;
$sql .= ' SET remise_absolue = ' . $remise ;
2015-03-15 11:48:57 +01:00
$sql .= ' WHERE rowid = ' . $this -> id . ' AND fk_statut = ' . self :: STATUS_DRAFT . ' ;' ;
2011-09-12 19:08:02 +02:00
2016-07-08 18:30:50 +02:00
dol_syslog ( __METHOD__ , LOG_DEBUG );
$resql = $this -> db -> query ( $sql );
if ( ! $resql )
2011-09-12 19:08:02 +02:00
{
2016-07-08 18:30:50 +02:00
$this -> errors [] = $this -> db -> error ();
$error ++ ;
}
2016-07-08 21:02:27 +02:00
if ( ! $error )
{
$this -> oldcopy = clone $this ;
$this -> remise_absolue = $remise ;
$this -> update_price ( 1 );
}
2016-07-08 18:30:50 +02:00
if ( ! $notrigger && empty ( $error ))
{
// Call trigger
$result = $this -> call_trigger ( 'ORDER_MODIFY' , $user );
if ( $result < 0 ) $error ++ ;
// End call triggers
}
if ( ! $error )
{
$this -> db -> commit ();
return 1 ;
2011-09-12 19:08:02 +02:00
}
else
{
2016-07-08 18:30:50 +02:00
foreach ( $this -> errors as $errmsg )
{
dol_syslog ( __METHOD__ . ' Error: ' . $errmsg , LOG_ERR );
$this -> error .= ( $this -> error ? ', ' . $errmsg : $errmsg );
}
$this -> db -> rollback ();
return - 1 * $error ;
2011-09-12 19:08:02 +02:00
}
}
}
/**
2011-12-16 12:47:23 +01:00
* Set the order date
2011-09-12 19:08:02 +02:00
*
2016-07-08 18:30:50 +02:00
* @ param User $user Object user making change
* @ param int $date Date
2016-07-08 20:40:25 +02:00
* @ param int $notrigger 1 = Does not execute triggers , 0 = execuete triggers
2016-07-08 18:30:50 +02:00
* @ return int < 0 if KO , > 0 if OK
2011-09-12 19:08:02 +02:00
*/
2016-07-08 18:30:50 +02:00
function set_date ( $user , $date , $notrigger = 0 )
2011-09-12 19:08:02 +02:00
{
if ( $user -> rights -> commande -> creer )
{
2016-07-08 18:30:50 +02:00
$error = 0 ;
$this -> db -> begin ();
2011-09-12 19:08:02 +02:00
$sql = " UPDATE " . MAIN_DB_PREFIX . " commande " ;
$sql .= " SET date_commande = " . ( $date ? $this -> db -> idate ( $date ) : 'null' );
2015-03-15 11:48:57 +01:00
$sql .= " WHERE rowid = " . $this -> id . " AND fk_statut = " . self :: STATUS_DRAFT ;
2011-09-12 19:08:02 +02:00
2016-07-08 18:30:50 +02:00
dol_syslog ( __METHOD__ , LOG_DEBUG );
2011-09-12 19:08:02 +02:00
$resql = $this -> db -> query ( $sql );
2016-07-08 18:30:50 +02:00
if ( ! $resql )
2011-09-12 19:08:02 +02:00
{
2016-07-08 18:30:50 +02:00
$this -> errors [] = $this -> db -> error ();
$error ++ ;
}
2016-07-08 21:02:27 +02:00
if ( ! $error )
{
$this -> oldcopy = clone $this ;
$this -> date = $date ;
}
2016-07-08 18:30:50 +02:00
if ( ! $notrigger && empty ( $error ))
{
// Call trigger
$result = $this -> call_trigger ( 'ORDER_MODIFY' , $user );
if ( $result < 0 ) $error ++ ;
// End call triggers
}
if ( ! $error )
{
$this -> db -> commit ();
return 1 ;
2011-09-12 19:08:02 +02:00
}
else
{
2016-07-08 18:30:50 +02:00
foreach ( $this -> errors as $errmsg )
{
dol_syslog ( __METHOD__ . ' Error: ' . $errmsg , LOG_ERR );
$this -> error .= ( $this -> error ? ', ' . $errmsg : $errmsg );
}
$this -> db -> rollback ();
return - 1 * $error ;
2011-09-12 19:08:02 +02:00
}
}
else
{
return - 2 ;
}
}
/**
2011-12-16 12:47:23 +01:00
* Set the planned delivery date
2011-09-12 19:08:02 +02:00
*
2016-07-08 18:30:50 +02:00
* @ param User $user Objet utilisateur qui modifie
2015-02-10 13:17:37 +01:00
* @ param int $date_livraison Date de livraison
2016-07-08 20:40:25 +02:00
* @ param int $notrigger 1 = Does not execute triggers , 0 = execuete triggers
2016-07-08 18:30:50 +02:00
* @ return int < 0 si ko , > 0 si ok
2011-09-12 19:08:02 +02:00
*/
2016-07-08 18:30:50 +02:00
function set_date_livraison ( $user , $date_livraison , $notrigger = 0 )
2011-09-12 19:08:02 +02:00
{
if ( $user -> rights -> commande -> creer )
{
2016-07-08 20:40:25 +02:00
$error = 0 ;
$this -> db -> begin ();
2011-09-12 19:08:02 +02:00
$sql = " UPDATE " . MAIN_DB_PREFIX . " commande " ;
$sql .= " SET date_livraison = " . ( $date_livraison ? " ' " . $this -> db -> idate ( $date_livraison ) . " ' " : 'null' );
$sql .= " WHERE rowid = " . $this -> id ;
2016-07-08 18:30:50 +02:00
dol_syslog ( __METHOD__ , LOG_DEBUG );
2011-09-12 19:08:02 +02:00
$resql = $this -> db -> query ( $sql );
2016-07-08 18:30:50 +02:00
if ( ! $resql )
2011-09-12 19:08:02 +02:00
{
2016-07-08 18:30:50 +02:00
$this -> errors [] = $this -> db -> error ();
$error ++ ;
}
2016-07-08 21:02:27 +02:00
if ( ! $error )
{
$this -> oldcopy = clone $this ;
$this -> date_livraison = $date_livraison ;
}
2016-07-08 18:30:50 +02:00
if ( ! $notrigger && empty ( $error ))
{
// Call trigger
$result = $this -> call_trigger ( 'ORDER_MODIFY' , $user );
if ( $result < 0 ) $error ++ ;
// End call triggers
}
if ( ! $error )
{
$this -> db -> commit ();
return 1 ;
2011-09-12 19:08:02 +02:00
}
else
{
2016-07-08 18:30:50 +02:00
foreach ( $this -> errors as $errmsg )
{
dol_syslog ( __METHOD__ . ' Error: ' . $errmsg , LOG_ERR );
$this -> error .= ( $this -> error ? ', ' . $errmsg : $errmsg );
}
$this -> db -> rollback ();
return - 1 * $error ;
2011-09-12 19:08:02 +02:00
}
}
else
{
return - 2 ;
}
}
/**
* Return list of orders ( eventuelly filtered on a user ) into an array
*
2013-04-27 15:08:35 +02:00
* @ 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 User $excluser Objet user to exclude
* @ 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
2011-12-16 12:47:23 +01:00
* @ return int - 1 if KO , array with result if OK
2011-09-12 19:08:02 +02:00
*/
2013-04-27 15:08:35 +02:00
function liste_array ( $shortlist = 0 , $draft = 0 , $excluser = '' , $socid = 0 , $limit = 0 , $offset = 0 , $sortfield = 'c.date_commande' , $sortorder = 'DESC' )
2011-09-12 19:08:02 +02:00
{
2016-05-06 22:30:34 +02:00
global $user ;
2011-09-12 19:08:02 +02:00
$ga = array ();
2013-04-27 15:08:35 +02:00
$sql = " SELECT s.rowid, s.nom as name, s.client, " ;
$sql .= " c.rowid as cid, c.ref " ;
if ( ! $user -> rights -> societe -> client -> voir && ! $socid ) $sql .= " , sc.fk_soc, sc.fk_user " ;
2011-09-12 19:08:02 +02:00
$sql .= " FROM " . MAIN_DB_PREFIX . " societe as s, " . MAIN_DB_PREFIX . " commande as c " ;
2013-04-27 15:08:35 +02:00
if ( ! $user -> rights -> societe -> client -> voir && ! $socid ) $sql .= " , " . MAIN_DB_PREFIX . " societe_commerciaux as sc " ;
2015-04-19 03:05:37 +02:00
$sql .= " WHERE c.entity IN ( " . getEntity ( 'commande' , 1 ) . " ) " ;
2011-09-12 19:08:02 +02:00
$sql .= " AND c.fk_soc = s.rowid " ;
2013-04-27 15:08:35 +02:00
if ( ! $user -> rights -> societe -> client -> voir && ! $socid ) //restriction
{
$sql .= " AND s.rowid = sc.fk_soc AND sc.fk_user = " . $user -> id ;
}
if ( $socid ) $sql .= " AND s.rowid = " . $socid ;
2015-03-15 11:48:57 +01:00
if ( $draft ) $sql .= " AND c.fk_statut = " . self :: STATUS_DRAFT ;
2013-04-27 15:08:35 +02:00
if ( is_object ( $excluser )) $sql .= " AND c.fk_user_author <> " . $excluser -> id ;
$sql .= $this -> db -> order ( $sortfield , $sortorder );
$sql .= $this -> db -> plimit ( $limit , $offset );
2011-09-12 19:08:02 +02:00
$result = $this -> db -> query ( $sql );
if ( $result )
{
$numc = $this -> db -> num_rows ( $result );
if ( $numc )
{
$i = 0 ;
while ( $i < $numc )
{
$obj = $this -> db -> fetch_object ( $result );
2013-06-05 16:24:32 +02:00
if ( $shortlist == 1 )
{
$ga [ $obj -> cid ] = $obj -> ref ;
}
else if ( $shortlist == 2 )
{
$ga [ $obj -> cid ] = $obj -> ref . ' (' . $obj -> name . ')' ;
}
else
{
$ga [ $i ][ 'id' ] = $obj -> cid ;
$ga [ $i ][ 'ref' ] = $obj -> ref ;
$ga [ $i ][ 'name' ] = $obj -> name ;
2013-04-27 15:08:35 +02:00
}
2011-09-12 19:08:02 +02:00
$i ++ ;
}
}
return $ga ;
}
else
{
dol_print_error ( $this -> db );
return - 1 ;
}
}
/**
2016-07-08 18:30:50 +02:00
* Update delivery delay
2012-02-06 17:18:19 +01:00
*
2011-12-16 12:47:23 +01:00
* @ param int $availability_id Id du nouveau mode
2016-07-08 20:40:25 +02:00
* @ param int $notrigger 1 = Does not execute triggers , 0 = execuete triggers
2011-12-16 12:47:23 +01:00
* @ return int > 0 if OK , < 0 if KO
2011-09-12 19:08:02 +02:00
*/
2016-07-08 18:30:50 +02:00
function availability ( $availability_id , $notrigger = 0 )
2011-09-12 19:08:02 +02:00
{
2016-07-21 17:22:24 +02:00
global $user ;
2011-09-12 19:08:02 +02:00
dol_syslog ( 'Commande::availability(' . $availability_id . ')' );
2015-03-15 11:48:57 +01:00
if ( $this -> statut >= self :: STATUS_DRAFT )
2011-09-12 19:08:02 +02:00
{
2016-07-08 20:40:25 +02:00
$error = 0 ;
$this -> db -> begin ();
2011-09-12 19:08:02 +02:00
$sql = 'UPDATE ' . MAIN_DB_PREFIX . 'commande' ;
$sql .= ' SET fk_availability = ' . $availability_id ;
$sql .= ' WHERE rowid=' . $this -> id ;
2016-07-08 18:30:50 +02:00
dol_syslog ( __METHOD__ , LOG_DEBUG );
$resql = $this -> db -> query ( $sql );
if ( ! $resql )
2011-09-12 19:08:02 +02:00
{
2016-07-08 18:30:50 +02:00
$this -> errors [] = $this -> db -> error ();
$error ++ ;
}
2016-07-08 21:02:27 +02:00
if ( ! $error )
{
$this -> oldcopy = clone $this ;
$this -> availability_id = $availability_id ;
}
2016-07-08 18:30:50 +02:00
if ( ! $notrigger && empty ( $error ))
{
// Call trigger
$result = $this -> call_trigger ( 'ORDER_MODIFY' , $user );
if ( $result < 0 ) $error ++ ;
// End call triggers
}
if ( ! $error )
{
$this -> db -> commit ();
return 1 ;
2011-09-12 19:08:02 +02:00
}
else
{
2016-07-08 18:30:50 +02:00
foreach ( $this -> errors as $errmsg )
{
dol_syslog ( __METHOD__ . ' Error: ' . $errmsg , LOG_ERR );
$this -> error .= ( $this -> error ? ', ' . $errmsg : $errmsg );
}
$this -> db -> rollback ();
return - 1 * $error ;
2011-09-12 19:08:02 +02:00
}
}
else
{
2016-07-08 18:30:50 +02:00
$error_str = 'Command status do not meet requirement ' . $this -> statut ;
dol_syslog ( __METHOD__ . $error_str , LOG_ERR );
$this -> error = $error_str ;
$this -> errors [] = $this -> error ;
2011-09-12 19:08:02 +02:00
return - 2 ;
}
}
/**
2016-07-08 18:30:50 +02:00
* Update order demand_reason
2011-12-16 12:47:23 +01:00
*
* @ param int $demand_reason_id Id of new demand
2016-07-08 20:40:25 +02:00
* @ param int $notrigger 1 = Does not execute triggers , 0 = execuete triggers
2011-12-16 12:47:23 +01:00
* @ return int > 0 if ok , < 0 if ko
2011-09-12 19:08:02 +02:00
*/
2016-07-08 18:30:50 +02:00
function demand_reason ( $demand_reason_id , $notrigger = 0 )
2011-09-12 19:08:02 +02:00
{
2016-07-21 17:22:24 +02:00
global $user ;
2011-09-12 19:08:02 +02:00
dol_syslog ( 'Commande::demand_reason(' . $demand_reason_id . ')' );
2015-03-15 11:48:57 +01:00
if ( $this -> statut >= self :: STATUS_DRAFT )
2011-09-12 19:08:02 +02:00
{
2016-07-08 20:40:25 +02:00
$error = 0 ;
$this -> db -> begin ();
2011-09-12 19:08:02 +02:00
$sql = 'UPDATE ' . MAIN_DB_PREFIX . 'commande' ;
2012-07-22 16:53:02 +02:00
$sql .= ' SET fk_input_reason = ' . $demand_reason_id ;
2011-09-12 19:08:02 +02:00
$sql .= ' WHERE rowid=' . $this -> id ;
2016-07-08 18:30:50 +02:00
dol_syslog ( __METHOD__ , LOG_DEBUG );
$resql = $this -> db -> query ( $sql );
if ( ! $resql )
2011-09-12 19:08:02 +02:00
{
2016-07-08 18:30:50 +02:00
$this -> errors [] = $this -> db -> error ();
$error ++ ;
}
2016-07-08 21:02:27 +02:00
if ( ! $error )
{
$this -> oldcopy = clone $this ;
$this -> demand_reason_id = $demand_reason_id ;
}
2016-07-08 18:30:50 +02:00
if ( ! $notrigger && empty ( $error ))
{
// Call trigger
$result = $this -> call_trigger ( 'ORDER_MODIFY' , $user );
if ( $result < 0 ) $error ++ ;
// End call triggers
}
if ( ! $error )
{
$this -> db -> commit ();
return 1 ;
2011-09-12 19:08:02 +02:00
}
else
{
2016-07-08 18:30:50 +02:00
foreach ( $this -> errors as $errmsg )
{
dol_syslog ( __METHOD__ . ' Error: ' . $errmsg , LOG_ERR );
$this -> error .= ( $this -> error ? ', ' . $errmsg : $errmsg );
}
$this -> db -> rollback ();
return - 1 * $error ;
2011-09-12 19:08:02 +02:00
}
}
else
{
2016-07-08 18:30:50 +02:00
$error_str = 'order status do not meet requirement ' . $this -> statut ;
dol_syslog ( __METHOD__ . $error_str , LOG_ERR );
$this -> error = $error_str ;
$this -> errors [] = $this -> error ;
2011-09-12 19:08:02 +02:00
return - 2 ;
}
}
/**
2011-12-16 12:47:23 +01:00
* Set customer ref
2012-03-18 19:23:01 +01:00
*
2011-12-16 12:47:23 +01:00
* @ param User $user User that make change
* @ param string $ref_client Customer ref
2016-07-08 20:40:25 +02:00
* @ param int $notrigger 1 = Does not execute triggers , 0 = execuete triggers
2011-12-16 12:47:23 +01:00
* @ return int < 0 if KO , > 0 if OK
2011-09-12 19:08:02 +02:00
*/
2016-07-08 20:40:25 +02:00
function set_ref_client ( $user , $ref_client , $notrigger = 0 )
2011-09-12 19:08:02 +02:00
{
if ( $user -> rights -> commande -> creer )
{
2016-07-08 20:40:25 +02:00
$error = 0 ;
$this -> db -> begin ();
2011-09-12 19:08:02 +02:00
$sql = 'UPDATE ' . MAIN_DB_PREFIX . 'commande SET' ;
$sql .= ' ref_client = ' . ( empty ( $ref_client ) ? 'NULL' : '\'' . $this -> db -> escape ( $ref_client ) . '\'' );
$sql .= ' WHERE rowid = ' . $this -> id ;
2016-07-08 18:30:50 +02:00
dol_syslog ( __METHOD__ . ' this->id=' . $this -> id . ', ref_client=' . $ref_client , LOG_DEBUG );
$resql = $this -> db -> query ( $sql );
if ( ! $resql )
2011-09-12 19:08:02 +02:00
{
2016-07-08 18:30:50 +02:00
$this -> errors [] = $this -> db -> error ();
$error ++ ;
}
2016-07-08 21:02:27 +02:00
if ( ! $error )
{
$this -> oldcopy = clone $this ;
$this -> ref_client = $ref_client ;
}
2016-07-08 18:30:50 +02:00
if ( ! $notrigger && empty ( $error ))
{
// Call trigger
$result = $this -> call_trigger ( 'ORDER_MODIFY' , $user );
if ( $result < 0 ) $error ++ ;
// End call triggers
}
if ( ! $error )
{
$this -> db -> commit ();
return 1 ;
2011-09-12 19:08:02 +02:00
}
else
{
2016-07-08 18:30:50 +02:00
foreach ( $this -> errors as $errmsg )
{
dol_syslog ( __METHOD__ . ' Error: ' . $errmsg , LOG_ERR );
$this -> error .= ( $this -> error ? ', ' . $errmsg : $errmsg );
}
$this -> db -> rollback ();
return - 1 * $error ;
2011-09-12 19:08:02 +02:00
}
}
else
{
return - 1 ;
}
}
2012-07-08 12:18:29 +02:00
/**
* Classify the order as invoiced
*
2016-07-08 21:02:27 +02:00
* @ param User $user Object user making the change
* @ param int $notrigger 1 = Does not execute triggers , 0 = execuete triggers
* @ return int < 0 if KO , > 0 if OK
2012-07-08 12:18:29 +02:00
*/
2016-07-08 21:02:27 +02:00
function classifyBilled ( User $user , $notrigger = 0 )
2012-07-08 12:18:29 +02:00
{
2015-11-06 01:53:20 +01:00
$error = 0 ;
2012-07-08 13:19:13 +02:00
$this -> db -> begin ();
2011-09-12 19:08:02 +02:00
2012-07-08 12:18:29 +02:00
$sql = 'UPDATE ' . MAIN_DB_PREFIX . 'commande SET facture = 1' ;
2015-03-15 11:48:57 +01:00
$sql .= ' WHERE rowid = ' . $this -> id . ' AND fk_statut > ' . self :: STATUS_DRAFT ;
2012-07-08 13:19:13 +02:00
2014-06-12 11:31:53 +02:00
dol_syslog ( get_class ( $this ) . " ::classifyBilled " , LOG_DEBUG );
2012-07-08 12:18:29 +02:00
if ( $this -> db -> query ( $sql ))
{
2016-07-08 21:28:21 +02:00
2012-07-08 13:19:13 +02:00
if ( ! $error )
{
2016-07-08 21:02:27 +02:00
$this -> oldcopy = clone $this ;
2012-07-08 13:19:13 +02:00
$this -> facturee = 1 ; // deprecated
$this -> billed = 1 ;
2016-07-08 21:02:27 +02:00
}
2016-07-08 21:28:21 +02:00
2016-07-08 21:02:27 +02:00
if ( ! $notrigger && empty ( $error ))
{
// Call trigger
$result = $this -> call_trigger ( 'ORDER_CLASSIFY_BILLED' , $user );
if ( $result < 0 ) $error ++ ;
// End call triggers
}
2012-07-08 12:18:29 +02:00
2016-07-08 21:02:27 +02:00
if ( ! $error )
{
2012-07-08 13:19:13 +02:00
$this -> db -> commit ();
return 1 ;
}
else
{
2014-06-14 12:30:48 +02:00
foreach ( $this -> errors as $errmsg )
{
dol_syslog ( get_class ( $this ) . " ::classifyBilled " . $errmsg , LOG_ERR );
$this -> error .= ( $this -> error ? ', ' . $errmsg : $errmsg );
}
2012-07-08 13:19:13 +02:00
$this -> db -> rollback ();
2014-06-14 12:30:48 +02:00
return - 1 * $error ;
2012-07-08 13:19:13 +02:00
}
2012-07-08 12:18:29 +02:00
}
else
{
2012-07-08 13:19:13 +02:00
$this -> error = $this -> db -> error ();
$this -> db -> rollback ();
2012-07-08 12:18:29 +02:00
return - 1 ;
}
}
/**
* Classify the order as invoiced
*
* @ return int < 0 if ko , > 0 if ok
2013-09-16 11:50:53 +02:00
* @ deprecated
2015-04-23 23:21:06 +02:00
* @ see classifyBilled ()
2012-07-08 12:18:29 +02:00
*/
function classer_facturee ()
{
2016-04-09 18:50:22 +02:00
global $user ;
2015-04-23 23:21:06 +02:00
dol_syslog ( __METHOD__ . " is deprecated " , LOG_WARNING );
2016-04-09 18:50:22 +02:00
return $this -> classifyBilled ( $user );
2012-07-08 12:18:29 +02:00
}
2011-09-12 19:08:02 +02:00
2016-06-06 13:29:37 +02:00
/**
* Classify the order as not invoiced
*
* @ return int < 0 if ko , > 0 if ok
*/
function classifyUnBilled ()
{
global $conf , $user , $langs ;
$error = 0 ;
2016-07-08 18:30:50 +02:00
2016-06-06 13:29:37 +02:00
$this -> db -> begin ();
2016-07-08 18:30:50 +02:00
2016-06-06 13:29:37 +02:00
$sql = 'UPDATE ' . MAIN_DB_PREFIX . 'commande SET facture = 0' ;
$sql .= ' WHERE rowid = ' . $this -> id . ' AND fk_statut > ' . self :: STATUS_DRAFT ;
2016-07-08 18:30:50 +02:00
2016-06-06 13:29:37 +02:00
dol_syslog ( get_class ( $this ) . " ::classifyUnBilled " , LOG_DEBUG );
if ( $this -> db -> query ( $sql ))
{
2016-07-08 21:02:27 +02:00
if ( ! $error )
{
$this -> oldcopy = clone $this ;
$this -> facturee = 1 ; // deprecated
$this -> billed = 1 ;
}
2016-07-08 21:28:21 +02:00
2016-06-06 13:29:37 +02:00
// Call trigger
$result = $this -> call_trigger ( 'ORDER_CLASSIFY_UNBILLED' , $user );
if ( $result < 0 ) $error ++ ;
// End call triggers
2016-07-08 18:30:50 +02:00
2016-06-06 13:29:37 +02:00
if ( ! $error )
{
$this -> facturee = 0 ; // deprecated
$this -> billed = 0 ;
2016-07-08 18:30:50 +02:00
2016-06-06 13:29:37 +02:00
$this -> db -> commit ();
return 1 ;
}
else
{
foreach ( $this -> errors as $errmsg )
{
dol_syslog ( get_class ( $this ) . " ::classifyUnBilled " . $errmsg , LOG_ERR );
$this -> error .= ( $this -> error ? ', ' . $errmsg : $errmsg );
}
$this -> db -> rollback ();
return - 1 * $error ;
}
}
else
{
$this -> error = $this -> db -> error ();
$this -> db -> rollback ();
return - 1 ;
}
}
2016-07-08 18:30:50 +02:00
2011-09-12 19:08:02 +02:00
/**
* Update a line in database
*
2011-12-16 12:47:23 +01:00
* @ param int $rowid Id of line to update
* @ param string $desc Description de la ligne
2015-02-10 13:17:37 +01:00
* @ param float $pu Prix unitaire
* @ param float $qty Quantity
* @ param float $remise_percent Pourcentage de remise de la ligne
* @ param float $txtva Taux TVA
* @ param float $txlocaltax1 Local tax 1 rate
* @ param float $txlocaltax2 Local tax 2 rate
2011-12-16 12:47:23 +01:00
* @ param string $price_base_type HT or TTC
* @ param int $info_bits Miscellaneous informations on line
2015-02-10 13:17:37 +01:00
* @ param int $date_start Start date of the line
* @ param int $date_end End date of the line
2011-12-16 12:47:23 +01:00
* @ param int $type Type of line ( 0 = product , 1 = service )
2012-10-13 13:03:39 +02:00
* @ 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
2012-09-18 17:41:59 +02:00
* @ param string $label Label
2013-01-22 21:36:30 +01:00
* @ param int $special_code Special code ( also used by externals modules ! )
2015-02-28 04:59:27 +01:00
* @ param array $array_options extrafields array
2015-04-21 15:49:58 +02:00
* @ param string $fk_unit Code of the unit to use . Null to use the default one
2011-12-16 12:47:23 +01:00
* @ return int < 0 if KO , > 0 if OK
2011-09-12 19:08:02 +02:00
*/
2015-04-21 15:49:58 +02:00
function updateline ( $rowid , $desc , $pu , $qty , $remise_percent , $txtva , $txlocaltax1 = 0.0 , $txlocaltax2 = 0.0 , $price_base_type = 'HT' , $info_bits = 0 , $date_start = '' , $date_end = '' , $type = 0 , $fk_parent_line = 0 , $skip_update_total = 0 , $fk_fournprice = null , $pa_ht = 0 , $label = '' , $special_code = 0 , $array_options = 0 , $fk_unit = null )
2011-09-12 19:08:02 +02:00
{
2016-02-01 13:05:14 +01:00
global $conf , $mysoc , $langs ;
2011-09-12 19:08:02 +02:00
2015-05-07 12:10:27 +02:00
dol_syslog ( get_class ( $this ) . " ::updateline id= $rowid , desc= $desc , pu= $pu , qty= $qty , remise_percent= $remise_percent , txtva= $txtva , txlocaltax1= $txlocaltax1 , txlocaltax2= $txlocaltax2 , price_base_type= $price_base_type , info_bits= $info_bits , date_start= $date_start , date_end= $date_end , type= $type , fk_parent_line= $fk_parent_line , pa_ht= $pa_ht , special_code= $special_code " );
2012-08-23 02:04:35 +02:00
include_once DOL_DOCUMENT_ROOT . '/core/lib/price.lib.php' ;
2011-09-12 19:08:02 +02:00
2012-08-23 07:50:20 +02:00
if ( ! empty ( $this -> brouillon ))
2011-09-12 19:08:02 +02:00
{
$this -> db -> begin ();
// Clean parameters
if ( empty ( $qty )) $qty = 0 ;
if ( empty ( $info_bits )) $info_bits = 0 ;
if ( empty ( $txtva )) $txtva = 0 ;
if ( empty ( $txlocaltax1 )) $txlocaltax1 = 0 ;
if ( empty ( $txlocaltax2 )) $txlocaltax2 = 0 ;
if ( empty ( $remise )) $remise = 0 ;
if ( empty ( $remise_percent )) $remise_percent = 0 ;
2013-01-22 21:36:30 +01:00
if ( empty ( $special_code ) || $special_code == 3 ) $special_code = 0 ;
2015-02-26 14:15:33 +01:00
2011-09-12 19:08:02 +02:00
$remise_percent = price2num ( $remise_percent );
$qty = price2num ( $qty );
$pu = price2num ( $pu );
2012-08-23 07:50:20 +02:00
$pa_ht = price2num ( $pa_ht );
2011-09-12 19:08:02 +02:00
$txtva = price2num ( $txtva );
2011-12-05 18:36:54 +01:00
$txlocaltax1 = price2num ( $txlocaltax1 );
$txlocaltax2 = price2num ( $txlocaltax2 );
2011-09-12 19:08:02 +02:00
// Calcul du total TTC et de la TVA pour la ligne a partir de
// qty, pu, remise_percent et txtva
// TRES IMPORTANT: C'est au moment de l'insertion ligne qu'on doit stocker
// la part ht, tva et ttc, et ce au niveau de la ligne qui a son propre taux tva.
2014-05-13 10:12:45 +02:00
2014-07-04 11:38:08 +02:00
$localtaxes_type = getLocalTaxesFromRate ( $txtva , 0 , $this -> thirdparty , $mysoc );
2015-11-14 15:28:25 +01:00
$txtva = preg_replace ( '/\s*\(.*\)/' , '' , $txtva ); // Remove code into vatrate.
2016-07-08 18:30:50 +02:00
2016-01-23 00:38:17 +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 );
2016-04-20 17:17:03 +02:00
2011-09-12 19:08:02 +02:00
$total_ht = $tabprice [ 0 ];
$total_tva = $tabprice [ 1 ];
$total_ttc = $tabprice [ 2 ];
$total_localtax1 = $tabprice [ 9 ];
$total_localtax2 = $tabprice [ 10 ];
2016-01-23 00:38:17 +01:00
// MultiCurrency
$multicurrency_total_ht = $tabprice [ 16 ];
$multicurrency_total_tva = $tabprice [ 17 ];
$multicurrency_total_ttc = $tabprice [ 18 ];
2016-07-08 18:30:50 +02:00
2011-09-12 19:08:02 +02:00
// Anciens indicateurs: $price, $subprice, $remise (a ne plus utiliser)
$price = $pu ;
2016-07-08 18:30:50 +02:00
if ( $price_base_type == 'TTC' )
2016-03-14 17:27:12 +01:00
{
$subprice = $tabprice [ 5 ];
2016-07-08 18:30:50 +02:00
}
else
2016-03-14 17:27:12 +01:00
{
$subprice = $pu ;
}
2011-09-12 19:08:02 +02:00
$remise = 0 ;
if ( $remise_percent > 0 )
{
$remise = round (( $pu * $remise_percent / 100 ), 2 );
$price = ( $pu - $remise );
}
2015-07-18 19:37:58 +02:00
//Fetch current line from the database and then clone the object and set it in $oldline property
$line = new OrderLine ( $this -> db );
$line -> fetch ( $rowid );
2011-09-12 19:08:02 +02:00
2016-02-01 13:05:14 +01:00
if ( ! empty ( $line -> fk_product ))
{
$product = new Product ( $this -> db );
$result = $product -> fetch ( $line -> fk_product );
$product_type = $product -> type ;
if ( ! empty ( $conf -> global -> STOCK_MUST_BE_ENOUGH_FOR_ORDER ) && $product_type == 0 && $product -> stock_reel < $qty )
{
2016-06-24 17:04:59 +02:00
$langs -> load ( " errors " );
$this -> error = $langs -> trans ( 'ErrorStockIsNotEnoughToAddProductOnOrder' , $product -> ref );
2016-02-01 13:05:14 +01:00
dol_syslog ( get_class ( $this ) . " ::addline error=Product " . $product -> ref . " : " . $this -> error , LOG_ERR );
$this -> db -> rollback ();
unset ( $_POST [ 'productid' ]);
unset ( $_POST [ 'tva_tx' ]);
unset ( $_POST [ 'price_ht' ]);
unset ( $_POST [ 'qty' ]);
unset ( $_POST [ 'buying_price' ]);
return self :: STOCK_NOT_ENOUGH_FOR_ORDER ;
}
}
2015-07-18 19:37:58 +02:00
$staticline = clone $line ;
2015-02-26 13:19:19 +01:00
2015-07-18 19:37:58 +02:00
$line -> oldline = $staticline ;
$this -> line = $line ;
2015-08-13 03:58:32 +02:00
$this -> line -> context = $this -> context ;
2011-10-14 18:51:20 +02:00
2011-10-05 18:10:06 +02:00
// Reorder if fk_parent_line change
if ( ! empty ( $fk_parent_line ) && ! empty ( $staticline -> fk_parent_line ) && $fk_parent_line != $staticline -> fk_parent_line )
{
$rangmax = $this -> line_max ( $fk_parent_line );
$this -> line -> rang = $rangmax + 1 ;
}
2011-09-12 19:08:02 +02:00
$this -> line -> rowid = $rowid ;
2012-08-23 07:50:20 +02:00
$this -> line -> label = $label ;
2011-09-12 19:08:02 +02:00
$this -> line -> desc = $desc ;
$this -> line -> qty = $qty ;
$this -> line -> tva_tx = $txtva ;
$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 ];
$this -> line -> localtax2_type = $localtaxes_type [ 2 ];
2011-09-12 19:08:02 +02:00
$this -> line -> remise_percent = $remise_percent ;
$this -> line -> subprice = $subprice ;
$this -> line -> info_bits = $info_bits ;
2013-01-22 21:36:30 +01:00
$this -> line -> special_code = $special_code ;
2011-09-12 19:08:02 +02:00
$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 -> date_start = $date_start ;
$this -> line -> date_end = $date_end ;
$this -> line -> product_type = $type ;
$this -> line -> fk_parent_line = $fk_parent_line ;
$this -> line -> skip_update_total = $skip_update_total ;
2015-02-26 14:15:33 +01:00
$this -> line -> fk_unit = $fk_unit ;
2011-09-12 19:08:02 +02:00
2015-10-26 20:33:42 +01:00
$this -> line -> fk_fournprice = $fk_fournprice ;
2012-08-23 07:50:20 +02:00
$this -> line -> pa_ht = $pa_ht ;
2012-07-20 09:57:50 +02:00
2016-01-23 00:38:17 +01:00
// Multicurrency
$this -> line -> multicurrency_subprice = price2num ( $subprice * $this -> multicurrency_tx );
$this -> line -> multicurrency_total_ht = $multicurrency_total_ht ;
$this -> line -> multicurrency_total_tva = $multicurrency_total_tva ;
$this -> line -> multicurrency_total_ttc = $multicurrency_total_ttc ;
2016-07-08 18:30:50 +02:00
2011-09-12 19:08:02 +02:00
// TODO deprecated
$this -> line -> price = $price ;
$this -> line -> remise = $remise ;
2015-02-28 04:59:27 +01:00
if ( is_array ( $array_options ) && count ( $array_options ) > 0 ) {
$this -> line -> array_options = $array_options ;
2013-06-10 16:05:41 +02:00
}
2011-09-12 19:08:02 +02:00
$result = $this -> line -> update ();
if ( $result > 0 )
{
2011-10-05 18:10:06 +02:00
// Reorder if child line
if ( ! empty ( $fk_parent_line )) $this -> line_order ( true , 'DESC' );
2011-10-14 18:51:20 +02:00
2011-09-12 19:08:02 +02:00
// Mise a jour info denormalisees
$this -> update_price ( 1 );
$this -> db -> commit ();
return $result ;
}
else
{
2014-06-14 12:30:48 +02:00
$this -> error = $this -> line -> error ;
$this -> db -> rollback ();
return - 1 ;
2011-09-12 19:08:02 +02:00
}
}
else
{
2012-05-09 02:39:30 +02:00
$this -> error = get_class ( $this ) . " ::updateline Order status makes operation forbidden " ;
2012-07-29 14:15:29 +02:00
$this -> errors = array ( 'OrderStatusMakeOperationForbidden' );
2011-09-12 19:08:02 +02:00
return - 2 ;
}
}
2015-01-10 01:07: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
*/
function update ( $user = null , $notrigger = 0 )
{
$error = 0 ;
// Clean parameters
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 -> modelpdf )) $this -> modelpdf = trim ( $this -> modelpdf );
if ( isset ( $this -> import_key )) $this -> import_key = trim ( $this -> import_key );
// Check parameters
// Put here code to add control on parameters values
// Update request
$sql = " UPDATE " . MAIN_DB_PREFIX . " commande SET " ;
$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 " ) . " , " ;
$sql .= " date_commande= " . ( strval ( $this -> date_commande ) != '' ? " ' " . $this -> db -> idate ( $this -> date_commande ) . " ' " : 'null' ) . " , " ;
$sql .= " date_valid= " . ( strval ( $this -> date_validation ) != '' ? " ' " . $this -> db -> idate ( $this -> date_validation ) . " ' " : 'null' ) . " , " ;
$sql .= " tva= " . ( isset ( $this -> total_tva ) ? $this -> total_tva : " null " ) . " , " ;
$sql .= " localtax1= " . ( isset ( $this -> total_localtax1 ) ? $this -> total_localtax1 : " null " ) . " , " ;
$sql .= " localtax2= " . ( isset ( $this -> total_localtax2 ) ? $this -> total_localtax2 : " null " ) . " , " ;
$sql .= " total_ht= " . ( isset ( $this -> total_ht ) ? $this -> total_ht : " null " ) . " , " ;
$sql .= " total_ttc= " . ( isset ( $this -> total_ttc ) ? $this -> total_ttc : " null " ) . " , " ;
$sql .= " fk_statut= " . ( isset ( $this -> statut ) ? $this -> statut : " null " ) . " , " ;
$sql .= " fk_user_author= " . ( isset ( $this -> user_author ) ? $this -> user_author : " null " ) . " , " ;
$sql .= " fk_user_valid= " . ( isset ( $this -> fk_user_valid ) ? $this -> fk_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 " ) . " , " ;
$sql .= " fk_mode_reglement= " . ( isset ( $this -> mode_reglement_id ) ? $this -> mode_reglement_id : " null " ) . " , " ;
$sql .= " note_private= " . ( isset ( $this -> note_private ) ? " ' " . $this -> db -> escape ( $this -> note_private ) . " ' " : " null " ) . " , " ;
$sql .= " note_public= " . ( isset ( $this -> note_public ) ? " ' " . $this -> db -> escape ( $this -> note_public ) . " ' " : " null " ) . " , " ;
$sql .= " model_pdf= " . ( isset ( $this -> modelpdf ) ? " ' " . $this -> db -> escape ( $this -> modelpdf ) . " ' " : " null " ) . " , " ;
$sql .= " import_key= " . ( isset ( $this -> import_key ) ? " ' " . $this -> db -> escape ( $this -> import_key ) . " ' " : " null " ) . " " ;
$sql .= " WHERE rowid= " . $this -> id ;
$this -> db -> begin ();
dol_syslog ( get_class ( $this ) . " ::update " , LOG_DEBUG );
$resql = $this -> db -> query ( $sql );
if ( ! $resql ) {
$error ++ ; $this -> errors [] = " Error " . $this -> db -> lasterror ();
}
if ( ! $error )
{
if ( ! $notrigger )
{
// Call trigger
$result = $this -> call_trigger ( 'ORDER_MODIFY' , $user );
if ( $result < 0 ) $error ++ ;
// End call triggers
}
}
// Commit or rollback
if ( $error )
{
foreach ( $this -> errors as $errmsg )
{
dol_syslog ( get_class ( $this ) . " ::update " . $errmsg , LOG_ERR );
$this -> error .= ( $this -> error ? ', ' . $errmsg : $errmsg );
}
$this -> db -> rollback ();
return - 1 * $error ;
}
else
{
$this -> db -> commit ();
return 1 ;
}
}
/**
* Update value of extrafields on order
*
* @ param User $user Object user that modify
* @ return int < 0 if ko , > 0 if ok
*/
function update_extrafields ( $user )
{
2015-02-10 13:17:37 +01:00
global $hookmanager , $conf ;
2015-01-10 01:07:18 +01:00
$action = 'create' ;
2015-11-06 01:53:20 +01:00
$error = 0 ;
2015-01-10 01:07:18 +01:00
// Actions on extra fields (by external module or standard code)
2015-04-12 04:01:28 +02:00
// TODO le hook fait double emploi avec le trigger !!
2015-01-10 01:07:18 +01:00
$hookmanager -> initHooks ( array ( 'orderdao' ));
$parameters = array ( 'id' => $this -> id );
$reshook = $hookmanager -> executeHooks ( 'insertExtraFields' , $parameters , $this , $action ); // Note that $action and $object may have been modified by some hooks
if ( empty ( $reshook ))
{
if ( empty ( $conf -> global -> MAIN_EXTRAFIELDS_DISABLED )) // For avoid conflicts if trigger used
{
$result = $this -> insertExtraFields ();
if ( $result < 0 )
{
$error ++ ;
}
}
}
else if ( $reshook < 0 ) $error ++ ;
if ( ! $error )
{
return 1 ;
}
else
{
return - 1 ;
}
}
2011-09-12 19:08:02 +02:00
/**
* Delete the customer order
2011-12-05 18:36:54 +01:00
*
* @ param User $user User object
2012-02-13 18:27:42 +01:00
* @ param int $notrigger 1 = Does not execute triggers , 0 = execuete triggers
2011-12-05 18:36:54 +01:00
* @ return int <= 0 if KO , > 0 if OK
2011-09-12 19:08:02 +02:00
*/
2012-02-13 18:27:42 +01:00
function delete ( $user , $notrigger = 0 )
2011-09-12 19:08:02 +02:00
{
global $conf , $langs ;
2012-08-22 23:11:24 +02:00
require_once DOL_DOCUMENT_ROOT . '/core/lib/files.lib.php' ;
2011-09-12 19:08:02 +02:00
2011-12-05 18:36:54 +01:00
$error = 0 ;
2011-09-12 19:08:02 +02:00
$this -> db -> begin ();
2012-03-18 19:23:01 +01:00
2012-02-15 15:16:33 +01:00
if ( ! $error && ! $notrigger )
2011-09-12 19:08:02 +02:00
{
2014-07-11 14:02:21 +02:00
// Call trigger
$result = $this -> call_trigger ( 'ORDER_DELETE' , $user );
2014-08-01 14:26:13 +02:00
if ( $result < 0 ) $error ++ ;
2014-07-11 14:02:21 +02:00
// End call triggers
2011-09-12 19:08:02 +02:00
}
2012-03-18 19:23:01 +01:00
2014-07-11 14:02:21 +02:00
//TODO: Check for error after each action. If one failed we rollback, don't waste time to do action if previous fail
2012-02-15 15:16:33 +01:00
if ( ! $error )
2011-09-12 19:08:02 +02:00
{
2012-02-15 15:16:33 +01:00
// Delete order details
$sql = 'DELETE FROM ' . MAIN_DB_PREFIX . " commandedet WHERE fk_commande = " . $this -> id ;
2014-06-12 11:31:53 +02:00
dol_syslog ( get_class ( $this ) . " ::delete " , LOG_DEBUG );
2012-02-15 15:16:33 +01:00
if ( ! $this -> db -> query ( $sql ) )
{
$error ++ ;
2014-07-11 14:02:21 +02:00
$this -> errors [] = $this -> db -> lasterror ();
2012-02-15 15:16:33 +01:00
}
2012-03-18 19:23:01 +01:00
2012-02-15 15:16:33 +01:00
// Delete order
$sql = 'DELETE FROM ' . MAIN_DB_PREFIX . " commande WHERE rowid = " . $this -> id ;
2014-06-12 11:31:53 +02:00
dol_syslog ( get_class ( $this ) . " ::delete " , LOG_DEBUG );
2012-02-15 15:16:33 +01:00
if ( ! $this -> db -> query ( $sql ) )
{
$error ++ ;
2014-07-11 14:02:21 +02:00
$this -> errors [] = $this -> db -> lasterror ();
2012-02-15 15:16:33 +01:00
}
2012-03-18 19:23:01 +01:00
2012-02-15 15:16:33 +01:00
// Delete linked object
$res = $this -> deleteObjectLinked ();
if ( $res < 0 ) $error ++ ;
2012-03-18 19:23:01 +01:00
2012-02-15 15:16:33 +01:00
// Delete linked contacts
$res = $this -> delete_linked_contact ();
if ( $res < 0 ) $error ++ ;
2013-06-16 21:31:21 +02:00
2013-04-26 17:20:21 +02:00
// Remove extrafields
if (( ! $error ) && ( empty ( $conf -> global -> MAIN_EXTRAFIELDS_DISABLED ))) // For avoid conflicts if trigger used
{
$result = $this -> deleteExtraFields ();
if ( $result < 0 )
{
$error ++ ;
dol_syslog ( get_class ( $this ) . " ::delete error -4 " . $this -> error , LOG_ERR );
}
}
2012-03-18 19:23:01 +01:00
2012-02-15 15:16:33 +01:00
// On efface le repertoire de pdf provisoire
$comref = dol_sanitizeFileName ( $this -> ref );
2013-12-11 15:14:29 +01:00
if ( $conf -> commande -> dir_output && ! empty ( $this -> ref ))
2012-02-15 15:16:33 +01:00
{
$dir = $conf -> commande -> dir_output . " / " . $comref ;
$file = $conf -> commande -> dir_output . " / " . $comref . " / " . $comref . " .pdf " ;
if ( file_exists ( $file )) // We must delete all files before deleting directory
{
dol_delete_preview ( $this );
2012-03-18 19:23:01 +01:00
2012-05-29 23:00:12 +02:00
if ( ! dol_delete_file ( $file , 0 , 0 , 0 , $this )) // For triggers
2012-02-15 15:16:33 +01:00
{
$this -> db -> rollback ();
return 0 ;
}
}
if ( file_exists ( $dir ))
{
2012-06-11 21:45:59 +02:00
if ( ! dol_delete_dir_recursive ( $dir ))
2012-02-15 15:16:33 +01:00
{
$this -> error = $langs -> trans ( " ErrorCanNotDeleteDir " , $dir );
$this -> db -> rollback ();
return 0 ;
}
}
}
2013-06-16 21:31:21 +02:00
2012-02-13 18:27:42 +01:00
}
2012-03-18 19:23:01 +01:00
2012-02-13 18:27:42 +01:00
if ( ! $error )
{
dol_syslog ( get_class ( $this ) . " ::delete $this->id by $user->id " , LOG_DEBUG );
$this -> db -> commit ();
return 1 ;
2011-09-12 19:08:02 +02:00
}
else
{
2014-06-14 12:30:48 +02:00
foreach ( $this -> errors as $errmsg )
{
dol_syslog ( get_class ( $this ) . " ::delete " . $errmsg , LOG_ERR );
$this -> error .= ( $this -> error ? ', ' . $errmsg : $errmsg );
}
$this -> db -> rollback ();
return - 1 * $error ;
2011-09-12 19:08:02 +02:00
}
}
/**
2011-12-16 12:47:23 +01:00
* Load indicators for dashboard ( this -> nbtodo and this -> nbtodolate )
2012-02-06 17:18:19 +01:00
*
2011-12-16 12:47:23 +01:00
* @ param User $user Object user
2015-02-16 23:49:07 +01:00
* @ return WorkboardResponse | int < 0 if KO , WorkboardResponse if OK
2011-09-12 19:08:02 +02:00
*/
function load_board ( $user )
{
2016-01-18 15:56:51 +01:00
global $conf , $langs ;
2011-09-12 19:08:02 +02:00
$clause = " WHERE " ;
2015-09-05 10:42:54 +02:00
$sql = " SELECT c.rowid, c.date_creation as datec, c.date_commande, c.date_livraison as delivery_date, c.fk_statut " ;
2011-09-12 19:08:02 +02:00
$sql .= " FROM " . MAIN_DB_PREFIX . " commande as c " ;
if ( ! $user -> rights -> societe -> client -> voir && ! $user -> societe_id )
{
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . " societe_commerciaux as sc ON c.fk_soc = sc.fk_soc " ;
$sql .= " WHERE sc.fk_user = " . $user -> id ;
$clause = " AND " ;
}
2015-04-19 03:05:37 +02:00
$sql .= $clause . " c.entity IN ( " . getEntity ( 'commande' , 1 ) . " ) " ;
2012-05-03 22:58:12 +02:00
//$sql.= " AND c.fk_statut IN (1,2,3) AND c.facture = 0";
2015-03-15 11:48:57 +01:00
$sql .= " AND ((c.fk_statut IN ( " . self :: STATUS_VALIDATED . " , " . self :: STATUS_ACCEPTED . " )) OR (c.fk_statut = " . self :: STATUS_CLOSED . " AND c.facture = 0)) " ; // If status is 2 and facture=1, it must be selected
2011-09-12 19:08:02 +02:00
if ( $user -> societe_id ) $sql .= " AND c.fk_soc = " . $user -> societe_id ;
$resql = $this -> db -> query ( $sql );
if ( $resql )
{
2015-02-16 23:49:07 +01:00
$response = new WorkboardResponse ();
2015-02-15 15:01:28 +01:00
$response -> warning_delay = $conf -> commande -> client -> warning_delay / 60 / 60 / 24 ;
$response -> label = $langs -> trans ( " OrdersToProcess " );
2016-06-04 14:45:03 +02:00
$response -> url = DOL_URL_ROOT . '/commande/list.php?viewstatut=-3&mainmenu=commercial&leftmenu=orders' ;
2015-02-15 15:01:28 +01:00
$response -> img = img_object ( $langs -> trans ( " Orders " ), " order " );
2015-09-05 10:42:54 +02:00
$generic_commande = new Commande ( $this -> db );
2011-09-12 19:08:02 +02:00
while ( $obj = $this -> db -> fetch_object ( $resql ))
{
2015-09-05 10:42:54 +02:00
$response -> nbtodo ++ ;
2014-06-24 22:14:45 +02:00
2015-09-05 10:42:54 +02:00
$generic_commande -> statut = $obj -> fk_statut ;
$generic_commande -> date_livraison = $obj -> delivery_date ;
2015-02-15 15:01:28 +01:00
2015-09-05 10:42:54 +02:00
if ( $generic_commande -> hasDelay ()) {
2015-02-15 15:01:28 +01:00
$response -> nbtodolate ++ ;
}
2011-09-12 19:08:02 +02:00
}
2015-02-15 15:01:28 +01:00
return $response ;
2011-09-12 19:08:02 +02:00
}
else
{
$this -> error = $this -> db -> error ();
return - 1 ;
}
}
/**
2011-12-16 12:47:23 +01:00
* Return source label of order
*
* @ return string Label
2011-09-12 19:08:02 +02:00
*/
function getLabelSource ()
{
global $langs ;
$label = $langs -> trans ( 'OrderSource' . $this -> source );
if ( $label == 'OrderSource' ) return '' ;
return $label ;
}
/**
2011-12-16 12:47:23 +01:00
* Return status label of Order
*
* @ param int $mode 0 = libelle long , 1 = libelle court , 2 = Picto + Libelle court , 3 = Picto , 4 = Picto + Libelle long , 5 = Libelle court + Picto
* @ return string Libelle
2011-09-12 19:08:02 +02:00
*/
function getLibStatut ( $mode )
{
2015-11-29 16:33:50 +01:00
if ( $this -> facturee && empty ( $this -> billed )) $this -> billed = $this -> facturee ; // For backward compatibility
return $this -> LibStatut ( $this -> statut , $this -> billed , $mode );
2011-09-12 19:08:02 +02:00
}
/**
2011-12-16 12:47:23 +01:00
* Return label of status
*
2015-11-29 16:33:50 +01:00
* @ param int $statut Id statut
* @ param int $billed If invoiced
* @ param int $mode 0 = libelle long , 1 = libelle court , 2 = Picto + Libelle court , 3 = Picto , 4 = Picto + Libelle long , 5 = Libelle court + Picto
* @ param int $donotshowbilled Do not show billed status after order status
* @ return string Label of status
2011-09-12 19:08:02 +02:00
*/
2015-11-29 16:33:50 +01:00
function LibStatut ( $statut , $billed , $mode , $donotshowbilled = 0 )
2011-09-12 19:08:02 +02:00
{
2015-11-06 01:53:20 +01:00
global $langs , $conf ;
2016-04-20 17:17:03 +02:00
2015-11-29 16:33:50 +01:00
$billedtext = '' ;
if ( empty ( $donotshowbilled )) $billedtext .= ( $billed ? ' - ' . $langs -> trans ( " Billed " ) : '' );
2015-01-10 01:07:18 +01:00
//print 'x'.$statut.'-'.$billed;
2011-09-12 19:08:02 +02:00
if ( $mode == 0 )
{
2015-03-30 03:19:20 +02:00
if ( $statut == self :: STATUS_CANCELED ) return $langs -> trans ( 'StatusOrderCanceled' );
2015-03-15 11:48:57 +01:00
if ( $statut == self :: STATUS_DRAFT ) return $langs -> trans ( 'StatusOrderDraft' );
2015-11-29 16:33:50 +01:00
if ( $statut == self :: STATUS_VALIDATED ) return $langs -> trans ( 'StatusOrderValidated' ) . $billedtext ;
if ( $statut == self :: STATUS_ACCEPTED ) return $langs -> trans ( 'StatusOrderSentShort' ) . $billedtext ;
2015-03-15 11:48:57 +01:00
if ( $statut == self :: STATUS_CLOSED && ( ! $billed && empty ( $conf -> global -> WORKFLOW_BILL_ON_SHIPMENT ))) return $langs -> trans ( 'StatusOrderToBill' );
2015-11-29 16:33:50 +01:00
if ( $statut == self :: STATUS_CLOSED && ( $billed && empty ( $conf -> global -> WORKFLOW_BILL_ON_SHIPMENT ))) return $langs -> trans ( 'StatusOrderProcessed' ) . $billedtext ;
2016-02-24 22:12:38 +01:00
if ( $statut == self :: STATUS_CLOSED && ( ! empty ( $conf -> global -> WORKFLOW_BILL_ON_SHIPMENT ))) return $langs -> trans ( 'StatusOrderDelivered' );
2011-09-12 19:08:02 +02:00
}
2012-03-18 19:23:01 +01:00
elseif ( $mode == 1 )
2011-09-12 19:08:02 +02:00
{
2015-03-15 11:48:57 +01:00
if ( $statut == self :: STATUS_CANCELED ) return $langs -> trans ( 'StatusOrderCanceledShort' );
if ( $statut == self :: STATUS_DRAFT ) return $langs -> trans ( 'StatusOrderDraftShort' );
2015-11-29 16:33:50 +01:00
if ( $statut == self :: STATUS_VALIDATED ) return $langs -> trans ( 'StatusOrderValidatedShort' ) . $billedtext ;
if ( $statut == self :: STATUS_ACCEPTED ) return $langs -> trans ( 'StatusOrderSentShort' ) . $billedtext ;
2015-03-15 11:48:57 +01:00
if ( $statut == self :: STATUS_CLOSED && ( ! $billed && empty ( $conf -> global -> WORKFLOW_BILL_ON_SHIPMENT ))) return $langs -> trans ( 'StatusOrderToBillShort' );
2015-11-29 16:33:50 +01:00
if ( $statut == self :: STATUS_CLOSED && ( $billed && empty ( $conf -> global -> WORKFLOW_BILL_ON_SHIPMENT ))) return $langs -> trans ( 'StatusOrderProcessed' ) . $billedtext ;
2016-02-24 22:12:38 +01:00
if ( $statut == self :: STATUS_CLOSED && ( ! empty ( $conf -> global -> WORKFLOW_BILL_ON_SHIPMENT ))) return $langs -> trans ( 'StatusOrderDelivered' );
2011-09-12 19:08:02 +02:00
}
2012-03-18 19:23:01 +01:00
elseif ( $mode == 2 )
2011-09-12 19:08:02 +02:00
{
2015-03-15 11:48:57 +01:00
if ( $statut == self :: STATUS_CANCELED ) return img_picto ( $langs -> trans ( 'StatusOrderCanceled' ), 'statut5' ) . ' ' . $langs -> trans ( 'StatusOrderCanceledShort' );
if ( $statut == self :: STATUS_DRAFT ) return img_picto ( $langs -> trans ( 'StatusOrderDraft' ), 'statut0' ) . ' ' . $langs -> trans ( 'StatusOrderDraftShort' );
2015-11-29 16:33:50 +01:00
if ( $statut == self :: STATUS_VALIDATED ) return img_picto ( $langs -> trans ( 'StatusOrderValidated' ), 'statut1' ) . ' ' . $langs -> trans ( 'StatusOrderValidatedShort' ) . $billedtext ;
if ( $statut == self :: STATUS_ACCEPTED ) return img_picto ( $langs -> trans ( 'StatusOrderSent' ), 'statut3' ) . ' ' . $langs -> trans ( 'StatusOrderSentShort' ) . $billedtext ;
2016-09-10 17:57:35 +02:00
if ( $statut == self :: STATUS_CLOSED && ( ! $billed && empty ( $conf -> global -> WORKFLOW_BILL_ON_SHIPMENT ))) return img_picto ( $langs -> trans ( 'StatusOrderToBill' ), 'statut4' ) . ' ' . $langs -> trans ( 'StatusOrderToBillShort' );
2015-11-29 16:33:50 +01:00
if ( $statut == self :: STATUS_CLOSED && ( $billed && empty ( $conf -> global -> WORKFLOW_BILL_ON_SHIPMENT ))) return img_picto ( $langs -> trans ( 'StatusOrderProcessed' ) . $billedtext , 'statut6' ) . ' ' . $langs -> trans ( 'StatusOrderProcessed' ) . $billedtext ;
2016-02-24 22:12:38 +01:00
if ( $statut == self :: STATUS_CLOSED && ( ! empty ( $conf -> global -> WORKFLOW_BILL_ON_SHIPMENT ))) return img_picto ( $langs -> trans ( 'StatusOrderDelivered' ), 'statut6' ) . ' ' . $langs -> trans ( 'StatusOrderDeliveredShort' );
2011-09-12 19:08:02 +02:00
}
2012-03-18 19:23:01 +01:00
elseif ( $mode == 3 )
2011-09-12 19:08:02 +02:00
{
2015-03-15 11:48:57 +01:00
if ( $statut == self :: STATUS_CANCELED ) return img_picto ( $langs -> trans ( 'StatusOrderCanceled' ), 'statut5' );
if ( $statut == self :: STATUS_DRAFT ) return img_picto ( $langs -> trans ( 'StatusOrderDraft' ), 'statut0' );
2015-11-29 16:33:50 +01:00
if ( $statut == self :: STATUS_VALIDATED ) return img_picto ( $langs -> trans ( 'StatusOrderValidated' ) . $billedtext , 'statut1' );
if ( $statut == self :: STATUS_ACCEPTED ) return img_picto ( $langs -> trans ( 'StatusOrderSentShort' ) . $billedtext , 'statut3' );
2016-09-10 17:57:35 +02:00
if ( $statut == self :: STATUS_CLOSED && ( ! $billed && empty ( $conf -> global -> WORKFLOW_BILL_ON_SHIPMENT ))) return img_picto ( $langs -> trans ( 'StatusOrderToBill' ), 'statut4' );
2015-11-29 16:33:50 +01:00
if ( $statut == self :: STATUS_CLOSED && ( $billed && empty ( $conf -> global -> WORKFLOW_BILL_ON_SHIPMENT ))) return img_picto ( $langs -> trans ( 'StatusOrderProcessed' ) . $billedtext , 'statut6' );
2016-02-24 22:12:38 +01:00
if ( $statut == self :: STATUS_CLOSED && ( ! empty ( $conf -> global -> WORKFLOW_BILL_ON_SHIPMENT ))) return img_picto ( $langs -> trans ( 'StatusOrderDelivered' ), 'statut6' );
2011-09-12 19:08:02 +02:00
}
2012-03-18 19:23:01 +01:00
elseif ( $mode == 4 )
2011-09-12 19:08:02 +02:00
{
2015-03-15 11:48:57 +01:00
if ( $statut == self :: STATUS_CANCELED ) return img_picto ( $langs -> trans ( 'StatusOrderCanceled' ), 'statut5' ) . ' ' . $langs -> trans ( 'StatusOrderCanceled' );
if ( $statut == self :: STATUS_DRAFT ) return img_picto ( $langs -> trans ( 'StatusOrderDraft' ), 'statut0' ) . ' ' . $langs -> trans ( 'StatusOrderDraft' );
2015-11-29 16:33:50 +01:00
if ( $statut == self :: STATUS_VALIDATED ) return img_picto ( $langs -> trans ( 'StatusOrderValidated' ) . $billedtext , 'statut1' ) . ' ' . $langs -> trans ( 'StatusOrderValidated' ) . $billedtext ;
if ( $statut == self :: STATUS_ACCEPTED ) return img_picto ( $langs -> trans ( 'StatusOrderSentShort' ) . $billedtext , 'statut3' ) . ' ' . $langs -> trans ( 'StatusOrderSent' ) . $billedtext ;
2016-09-10 17:57:35 +02:00
if ( $statut == self :: STATUS_CLOSED && ( ! $billed && empty ( $conf -> global -> WORKFLOW_BILL_ON_SHIPMENT ))) return img_picto ( $langs -> trans ( 'StatusOrderToBill' ), 'statut4' ) . ' ' . $langs -> trans ( 'StatusOrderToBill' );
2016-02-24 22:12:38 +01:00
if ( $statut == self :: STATUS_CLOSED && ( $billed && empty ( $conf -> global -> WORKFLOW_BILL_ON_SHIPMENT ))) return img_picto ( $langs -> trans ( 'StatusOrderProcessedShort' ) . $billedtext , 'statut6' ) . ' ' . $langs -> trans ( 'StatusOrderProcessed' ) . $billedtext ;
if ( $statut == self :: STATUS_CLOSED && ( ! empty ( $conf -> global -> WORKFLOW_BILL_ON_SHIPMENT ))) return img_picto ( $langs -> trans ( 'StatusOrderDelivered' ), 'statut6' ) . ' ' . $langs -> trans ( 'StatusOrderDelivered' );
2011-09-12 19:08:02 +02:00
}
2012-03-18 19:23:01 +01:00
elseif ( $mode == 5 )
2011-09-12 19:08:02 +02:00
{
2015-03-15 11:48:57 +01:00
if ( $statut == self :: STATUS_CANCELED ) return '<span class="hideonsmartphone">' . $langs -> trans ( 'StatusOrderCanceledShort' ) . ' </span>' . img_picto ( $langs -> trans ( 'StatusOrderCanceled' ), 'statut5' );
if ( $statut == self :: STATUS_DRAFT ) return '<span class="hideonsmartphone">' . $langs -> trans ( 'StatusOrderDraftShort' ) . ' </span>' . img_picto ( $langs -> trans ( 'StatusOrderDraft' ), 'statut0' );
2015-11-29 16:33:50 +01:00
if ( $statut == self :: STATUS_VALIDATED ) return '<span class="hideonsmartphone">' . $langs -> trans ( 'StatusOrderValidatedShort' ) . $billedtext . ' </span>' . img_picto ( $langs -> trans ( 'StatusOrderValidated' ) . $billedtext , 'statut1' );
if ( $statut == self :: STATUS_ACCEPTED ) return '<span class="hideonsmartphone">' . $langs -> trans ( 'StatusOrderSentShort' ) . $billedtext . ' </span>' . img_picto ( $langs -> trans ( 'StatusOrderSent' ) . $billedtext , 'statut3' );
2016-09-10 17:57:35 +02:00
if ( $statut == self :: STATUS_CLOSED && ( ! $billed && empty ( $conf -> global -> WORKFLOW_BILL_ON_SHIPMENT ))) return '<span class="hideonsmartphone">' . $langs -> trans ( 'StatusOrderToBillShort' ) . ' </span>' . img_picto ( $langs -> trans ( 'StatusOrderToBill' ), 'statut4' );
2016-02-24 22:12:38 +01:00
if ( $statut == self :: STATUS_CLOSED && ( $billed && empty ( $conf -> global -> WORKFLOW_BILL_ON_SHIPMENT ))) return '<span class="hideonsmartphone">' . $langs -> trans ( 'StatusOrderProcessedShort' ) . $billedtext . ' </span>' . img_picto ( $langs -> trans ( 'StatusOrderProcessed' ) . $billedtext , 'statut6' );
if ( $statut == self :: STATUS_CLOSED && ( ! empty ( $conf -> global -> WORKFLOW_BILL_ON_SHIPMENT ))) return '<span class="hideonsmartphone">' . $langs -> trans ( 'StatusOrderDeliveredShort' ) . ' </span>' . img_picto ( $langs -> trans ( 'StatusOrderDelivered' ), 'statut6' );
2011-09-12 19:08:02 +02:00
}
}
/**
2011-12-16 12:47:23 +01:00
* Return clicable link of object ( with eventually picto )
*
* @ param int $withpicto Add picto into link
2012-10-03 11:43:39 +02:00
* @ param int $option Where point the link ( 0 => main card , 1 , 2 => shipment )
2011-12-16 12:47:23 +01:00
* @ param int $max Max length to show
* @ param int $short Use short labels
2012-10-03 11:43:39 +02:00
* @ return string String with URL
2011-09-12 19:08:02 +02:00
*/
function getNomUrl ( $withpicto = 0 , $option = 0 , $max = 0 , $short = 0 )
{
2016-07-29 11:53:24 +02:00
global $conf , $langs , $user ;
2011-09-12 19:08:02 +02:00
$result = '' ;
2012-09-15 11:21:22 +02:00
if ( ! empty ( $conf -> expedition -> enabled ) && ( $option == 1 || $option == 2 )) $url = DOL_URL_ROOT . '/expedition/shipment.php?id=' . $this -> id ;
2014-09-18 21:18:25 +02:00
else $url = DOL_URL_ROOT . '/commande/card.php?id=' . $this -> id ;
2011-09-12 19:08:02 +02:00
if ( $short ) return $url ;
2015-01-24 15:36:47 +01:00
$picto = 'order' ;
2016-07-26 17:07:56 +02:00
$label = '' ;
if ( $user -> rights -> commande -> lire ) {
$label = '<u>' . $langs -> trans ( " ShowOrder " ) . '</u>' ;
if ( ! empty ( $this -> ref )) {
$label .= '<br><b>' . $langs -> trans ( 'Ref' ) . ':</b> ' . $this -> ref ;
}
if ( ! empty ( $this -> ref_client )) {
$label .= '<br><b>' . $langs -> trans ( 'RefCustomer' ) . ':</b> ' . $this -> ref_client ;
}
if ( ! empty ( $this -> total_ht )) {
$label .= '<br><b>' . $langs -> trans ( 'AmountHT' ) . ':</b> ' . price ( $this -> total_ht , 0 , $langs , 0 , - 1 , - 1 ,
$conf -> currency );
}
if ( ! empty ( $this -> total_tva )) {
$label .= '<br><b>' . $langs -> trans ( 'VAT' ) . ':</b> ' . price ( $this -> total_tva , 0 , $langs , 0 , - 1 , - 1 ,
$conf -> currency );
}
if ( ! empty ( $this -> total_ttc )) {
$label .= '<br><b>' . $langs -> trans ( 'AmountTTC' ) . ':</b> ' . price ( $this -> total_ttc , 0 , $langs , 0 , - 1 , - 1 ,
$conf -> currency );
}
}
2011-09-12 19:08:02 +02:00
2015-01-21 01:06:04 +01:00
$linkstart = '<a href="' . $url . '" title="' . dol_escape_htmltag ( $label , 1 ) . '" class="classfortooltip">' ;
2015-01-20 20:45:38 +01:00
$linkend = '</a>' ;
2015-01-08 10:01:02 +01:00
if ( $withpicto ) $result .= ( $linkstart . img_object ( $label , $picto , 'class="classfortooltip"' ) . $linkend );
2011-09-12 19:08:02 +02:00
if ( $withpicto && $withpicto != 2 ) $result .= ' ' ;
$result .= $linkstart . $this -> ref . $linkend ;
return $result ;
}
/**
2011-12-16 12:47:23 +01:00
* Charge les informations d 'ordre info dans l' objet commande
*
2012-03-18 19:23:01 +01:00
* @ param int $id Id of order
* @ return void
2011-09-12 19:08:02 +02:00
*/
function info ( $id )
{
$sql = 'SELECT c.rowid, date_creation as datec, tms as datem,' ;
$sql .= ' date_valid as datev,' ;
$sql .= ' date_cloture as datecloture,' ;
$sql .= ' fk_user_author, fk_user_valid, fk_user_cloture' ;
$sql .= ' FROM ' . MAIN_DB_PREFIX . 'commande as c' ;
$sql .= ' WHERE c.rowid = ' . $id ;
$result = $this -> db -> query ( $sql );
if ( $result )
{
if ( $this -> db -> num_rows ( $result ))
{
$obj = $this -> db -> fetch_object ( $result );
$this -> id = $obj -> rowid ;
if ( $obj -> fk_user_author )
{
$cuser = new User ( $this -> db );
$cuser -> fetch ( $obj -> fk_user_author );
$this -> user_creation = $cuser ;
}
if ( $obj -> fk_user_valid )
{
$vuser = new User ( $this -> db );
$vuser -> fetch ( $obj -> fk_user_valid );
$this -> user_validation = $vuser ;
}
if ( $obj -> fk_user_cloture )
{
$cluser = new User ( $this -> db );
$cluser -> fetch ( $obj -> fk_user_cloture );
$this -> user_cloture = $cluser ;
}
$this -> date_creation = $this -> db -> jdate ( $obj -> datec );
$this -> date_modification = $this -> db -> jdate ( $obj -> datem );
$this -> date_validation = $this -> db -> jdate ( $obj -> datev );
$this -> date_cloture = $this -> db -> jdate ( $obj -> datecloture );
}
$this -> db -> free ( $result );
}
else
{
dol_print_error ( $this -> db );
}
}
/**
2011-09-20 19:19:46 +02:00
* Initialise an instance with random values .
* Used to build previews or test instances .
* id must be 0 if object instance is a specimen .
*
* @ return void
2011-09-12 19:08:02 +02:00
*/
function initAsSpecimen ()
{
2016-05-06 22:30:34 +02:00
global $langs ;
2011-09-12 19:08:02 +02:00
dol_syslog ( get_class ( $this ) . " ::initAsSpecimen " );
2016-06-28 02:36:40 +02:00
// Load array of products prodids
$num_prods = 0 ;
2011-09-12 19:08:02 +02:00
$prodids = array ();
$sql = " SELECT rowid " ;
$sql .= " FROM " . MAIN_DB_PREFIX . " product " ;
2012-02-11 10:18:09 +01:00
$sql .= " WHERE entity IN ( " . getEntity ( 'product' , 1 ) . " ) " ;
2011-09-12 19:08:02 +02:00
$resql = $this -> db -> query ( $sql );
if ( $resql )
{
$num_prods = $this -> db -> num_rows ( $resql );
$i = 0 ;
while ( $i < $num_prods )
{
$i ++ ;
$row = $this -> db -> fetch_row ( $resql );
$prodids [ $i ] = $row [ 0 ];
}
}
// Initialise parametres
$this -> id = 0 ;
$this -> ref = 'SPECIMEN' ;
$this -> specimen = 1 ;
$this -> socid = 1 ;
$this -> date = time ();
$this -> date_lim_reglement = $this -> date + 3600 * 24 * 30 ;
$this -> cond_reglement_code = 'RECEP' ;
$this -> mode_reglement_code = 'CHQ' ;
$this -> availability_code = 'DSP' ;
$this -> demand_reason_code = 'SRC_00' ;
$this -> note_public = 'This is a comment (public)' ;
2013-04-09 17:18:07 +02:00
$this -> note_private = 'This is a comment (private)' ;
2011-09-12 19:08:02 +02:00
// Lines
$nbp = 5 ;
$xnbp = 0 ;
while ( $xnbp < $nbp )
{
$line = new OrderLine ( $this -> db );
$line -> desc = $langs -> trans ( " Description " ) . " " . $xnbp ;
$line -> qty = 1 ;
$line -> subprice = 100 ;
$line -> price = 100 ;
$line -> tva_tx = 19.6 ;
if ( $xnbp == 2 )
{
$line -> total_ht = 50 ;
$line -> total_ttc = 59.8 ;
$line -> total_tva = 9.8 ;
$line -> remise_percent = 50 ;
}
else
{
$line -> total_ht = 100 ;
$line -> total_ttc = 119.6 ;
$line -> total_tva = 19.6 ;
2012-09-19 12:49:58 +02:00
$line -> remise_percent = 0 ;
2011-09-12 19:08:02 +02:00
}
2016-06-03 22:20:58 +02:00
if ( $num_prods > 0 )
{
$prodid = mt_rand ( 1 , $num_prods );
$line -> fk_product = $prodids [ $prodid ];
}
2016-07-08 18:30:50 +02:00
2011-09-12 19:08:02 +02:00
$this -> lines [ $xnbp ] = $line ;
$this -> total_ht += $line -> total_ht ;
$this -> total_tva += $line -> total_tva ;
$this -> total_ttc += $line -> total_ttc ;
$xnbp ++ ;
}
}
/**
2011-12-16 12:47:23 +01:00
* Charge indicateurs this -> nb de tableau de bord
2011-09-12 19:08:02 +02:00
*
2011-12-16 12:47:23 +01:00
* @ return int < 0 si ko , > 0 si ok
2011-09-12 19:08:02 +02:00
*/
function load_state_board ()
{
2016-05-06 22:30:34 +02:00
global $user ;
2011-09-12 19:08:02 +02:00
$this -> nb = array ();
$clause = " WHERE " ;
$sql = " SELECT count(co.rowid) as nb " ;
$sql .= " FROM " . MAIN_DB_PREFIX . " commande as co " ;
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . " societe as s ON co.fk_soc = s.rowid " ;
if ( ! $user -> rights -> societe -> client -> voir && ! $user -> societe_id )
{
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . " societe_commerciaux as sc ON s.rowid = sc.fk_soc " ;
$sql .= " WHERE sc.fk_user = " . $user -> id ;
$clause = " AND " ;
}
2015-04-19 03:05:37 +02:00
$sql .= " " . $clause . " co.entity IN ( " . getEntity ( 'commande' , 1 ) . " ) " ;
2011-09-12 19:08:02 +02:00
$resql = $this -> db -> query ( $sql );
if ( $resql )
{
while ( $obj = $this -> db -> fetch_object ( $resql ))
{
$this -> nb [ " orders " ] = $obj -> nb ;
}
2013-06-16 21:31:21 +02:00
$this -> db -> free ( $resql );
2011-09-12 19:08:02 +02:00
return 1 ;
}
else
{
dol_print_error ( $this -> db );
$this -> error = $this -> db -> error ();
return - 1 ;
}
}
2013-04-27 15:08:35 +02:00
2011-09-12 19:08:02 +02:00
/**
2016-03-14 14:38:30 +01:00
* Create an array of order lines
*
* @ return int > 0 if OK , < 0 if KO
2011-09-12 19:08:02 +02:00
*/
function getLinesArray ()
{
2016-03-14 14:38:30 +01:00
return $this -> fetch_lines ();
2011-09-12 19:08:02 +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 accordign to template module .
*
* @ param string $modele Force le mnodele a utiliser ( '' to not force )
* @ param Translate $outputlangs objet lang a utiliser pour traduction
* @ param int $hidedetails Hide details of lines
* @ param int $hidedesc Hide description
* @ param int $hideref Hide ref
* @ return int 0 if KO , 1 if OK
*/
public function generateDocument ( $modele , $outputlangs , $hidedetails = 0 , $hidedesc = 0 , $hideref = 0 )
{
2015-02-10 13:17:37 +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 ( " orders " );
// Positionne le modele sur le nom du modele a utiliser
if ( ! dol_strlen ( $modele ))
{
if ( ! empty ( $conf -> global -> COMMANDE_ADDON_PDF ))
{
$modele = $conf -> global -> COMMANDE_ADDON_PDF ;
}
else
{
$modele = 'einstein' ;
}
}
2014-09-21 18:16:14 +02:00
$modelpath = " core/modules/commande/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
2014-09-21 18:16:14 +02:00
return $this -> commonGenerateDocument ( $modelpath , $modele , $outputlangs , $hidedetails , $hidedesc , $hideref );
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 (
'commande'
);
return CommonObject :: commonReplaceThirdparty ( $db , $origin_id , $dest_id , $tables );
}
2015-09-05 10:42:54 +02:00
/**
* Is the customer order delayed ?
*
2016-02-09 14:29:12 +01:00
* @ return bool true if late , false if not
2015-09-05 10:42:54 +02:00
*/
public function hasDelay ()
{
global $conf ;
2016-02-09 14:29:12 +01:00
if ( ! ( $this -> statut > Commande :: STATUS_DRAFT && $this -> statut < Commande :: STATUS_CLOSED )) {
return false ; // Never late if not inside this status range
2015-09-05 10:42:54 +02:00
}
$now = dol_now ();
return max ( $this -> date_commande , $this -> date_livraison ) < ( $now - $conf -> commande -> client -> warning_delay );
}
2016-07-08 18:30:50 +02:00
2016-03-10 10:50:54 +01:00
/**
* Show the customer delayed info
*
* @ return string Show delayed information
*/
public function showDelay ()
{
global $conf , $langs ;
2016-07-08 18:30:50 +02:00
2016-03-10 10:50:54 +01:00
if ( empty ( $this -> date_livraison )) $text = $langs -> trans ( " OrderDate " ) . ' ' . dol_print_date ( $this -> date_commande , 'day' );
else $text = $text = $langs -> trans ( " DeliveryDate " ) . ' ' . dol_print_date ( $this -> date_livraison , 'day' );
$text .= ' ' . ( $conf -> commande -> client -> warning_delay > 0 ? '+' : '-' ) . ' ' . round ( abs ( $conf -> commande -> client -> warning_delay ) / 3600 / 24 , 1 ) . ' ' . $langs -> trans ( " days " ) . ' < ' . $langs -> trans ( " Today " );
2016-07-08 18:30:50 +02:00
2016-03-10 10:50:54 +01:00
return $text ;
}
2005-09-15 02:37:03 +02:00
}
/**
2015-11-19 16:41:11 +01:00
* Class to manage order lines
2006-12-12 18:05:40 +01:00
*/
2013-06-10 16:05:41 +02:00
class OrderLine extends CommonOrderLine
2005-09-15 02:37:03 +02:00
{
2013-06-10 16:05:41 +02:00
public $element = 'commandedet' ;
public $table_element = 'commandedet' ;
2011-09-12 19:08:02 +02:00
var $oldline ;
2015-03-23 01:39:12 +01:00
/**
* Id of parent order
* @ var int
*/
public $fk_commande ;
/**
* Id of parent order
* @ var int
* @ deprecated Use fk_commande
2015-04-23 23:21:06 +02:00
* @ see fk_commande
2015-03-23 01:39:12 +01:00
*/
public $commande_id ;
2011-09-12 19:08:02 +02:00
// From llx_commandedet
var $fk_parent_line ;
var $fk_facture ;
2012-08-23 07:50:20 +02:00
var $label ;
2012-09-19 12:49:58 +02:00
var $fk_remise_except ;
2011-09-12 19:08:02 +02:00
var $rang = 0 ;
2012-07-28 18:32:54 +02:00
var $fk_fournprice ;
2015-03-23 01:39:12 +01:00
/**
* Buy price without taxes
* @ var float
*/
2012-07-28 18:32:54 +02:00
var $pa_ht ;
2011-09-12 19:08:02 +02:00
var $marge_tx ;
var $marque_tx ;
2015-03-23 01:39:12 +01:00
/**
* @ deprecated
2015-04-23 23:21:06 +02:00
* @ see remise_percent , fk_remise_except
2015-03-23 01:39:12 +01:00
*/
var $remise ;
2011-09-12 19:08:02 +02:00
// Added by Matelli (See http://matelli.fr/showcases/patchs-dolibarr/add-dates-in-order-lines.html)
// Start and end date of the line
var $date_start ;
var $date_end ;
var $skip_update_total ; // Skip update price total for special lines
/**
* Constructor
*
2012-07-30 18:43:49 +02:00
* @ param DoliDB $db handler d ' acces base de donnee
2011-09-12 19:08:02 +02:00
*/
2012-07-30 18:43:49 +02:00
function __construct ( $db )
2011-09-12 19:08:02 +02:00
{
2012-07-30 18:43:49 +02:00
$this -> db = $db ;
2011-09-12 19:08:02 +02:00
}
/**
* Load line order
*
2012-03-18 19:23:01 +01:00
* @ param int $rowid Id line order
* @ return int < 0 if KO , > 0 if OK
2011-09-12 19:08:02 +02:00
*/
function fetch ( $rowid )
{
2012-08-23 07:50:20 +02:00
$sql = 'SELECT cd.rowid, cd.fk_commande, cd.fk_parent_line, cd.fk_product, cd.product_type, cd.label as custom_label, cd.description, cd.price, cd.qty, cd.tva_tx, cd.localtax1_tx, cd.localtax2_tx,' ;
2011-09-12 19:08:02 +02:00
$sql .= ' cd.remise, cd.remise_percent, cd.fk_remise_except, cd.subprice,' ;
2012-07-19 10:26:26 +02:00
$sql .= ' cd.info_bits, cd.total_ht, cd.total_tva, cd.total_localtax1, cd.total_localtax2, cd.total_ttc, cd.fk_product_fournisseur_price as fk_fournprice, cd.buy_price_ht as pa_ht, cd.rang, cd.special_code,' ;
2015-02-26 14:15:33 +01:00
$sql .= ' cd.fk_unit,' ;
2016-02-16 23:58:21 +01:00
$sql .= ' cd.fk_multicurrency, cd.multicurrency_code, cd.multicurrency_subprice, cd.multicurrency_total_ht, cd.multicurrency_total_tva, cd.multicurrency_total_ttc,' ;
2011-09-12 19:08:02 +02:00
$sql .= ' p.ref as product_ref, p.label as product_libelle, p.description as product_desc,' ;
$sql .= ' cd.date_start, cd.date_end' ;
$sql .= ' FROM ' . MAIN_DB_PREFIX . 'commandedet as cd' ;
$sql .= ' LEFT JOIN ' . MAIN_DB_PREFIX . 'product as p ON cd.fk_product = p.rowid' ;
$sql .= ' WHERE cd.rowid = ' . $rowid ;
$result = $this -> db -> query ( $sql );
if ( $result )
{
$objp = $this -> db -> fetch_object ( $result );
$this -> rowid = $objp -> rowid ;
$this -> fk_commande = $objp -> fk_commande ;
$this -> fk_parent_line = $objp -> fk_parent_line ;
2012-08-23 07:50:20 +02:00
$this -> label = $objp -> custom_label ;
2011-09-12 19:08:02 +02:00
$this -> desc = $objp -> description ;
$this -> qty = $objp -> qty ;
$this -> price = $objp -> price ;
$this -> subprice = $objp -> subprice ;
$this -> tva_tx = $objp -> tva_tx ;
$this -> localtax1_tx = $objp -> localtax1_tx ;
$this -> localtax2_tx = $objp -> localtax2_tx ;
$this -> remise = $objp -> remise ;
$this -> remise_percent = $objp -> remise_percent ;
$this -> fk_remise_except = $objp -> fk_remise_except ;
$this -> fk_product = $objp -> fk_product ;
$this -> product_type = $objp -> product_type ;
$this -> info_bits = $objp -> info_bits ;
2013-12-15 21:10:39 +01:00
$this -> special_code = $objp -> special_code ;
2011-09-12 19:08:02 +02:00
$this -> total_ht = $objp -> total_ht ;
$this -> total_tva = $objp -> total_tva ;
$this -> total_localtax1 = $objp -> total_localtax1 ;
$this -> total_localtax2 = $objp -> total_localtax2 ;
$this -> total_ttc = $objp -> total_ttc ;
2012-08-23 07:50:20 +02:00
$this -> fk_fournprice = $objp -> fk_fournprice ;
$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 ];
2011-09-12 19:08:02 +02:00
$this -> special_code = $objp -> special_code ;
$this -> rang = $objp -> rang ;
$this -> ref = $objp -> product_ref ; // deprecated
$this -> product_ref = $objp -> product_ref ;
$this -> libelle = $objp -> product_libelle ; // deprecated
$this -> product_label = $objp -> product_libelle ;
$this -> product_desc = $objp -> product_desc ;
2015-02-26 14:15:33 +01:00
$this -> fk_unit = $objp -> fk_unit ;
2011-09-12 19:08:02 +02:00
$this -> date_start = $this -> db -> jdate ( $objp -> date_start );
$this -> date_end = $this -> db -> jdate ( $objp -> date_end );
2016-02-16 23:58:21 +01:00
$this -> fk_multicurrency = $objp -> fk_multicurrency ;
$this -> multicurrency_code = $objp -> multicurrency_code ;
$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 ;
2011-09-12 19:08:02 +02:00
$this -> db -> free ( $result );
2015-08-09 13:52:02 +02:00
return 1 ;
2011-09-12 19:08:02 +02:00
}
else
{
2015-08-09 13:52:02 +02:00
return - 1 ;
2011-09-12 19:08:02 +02:00
}
}
/**
* Delete line in database
*
* @ return int < 0 si ko , > 0 si ok
*/
function delete ()
{
global $conf , $user , $langs ;
2011-12-05 18:36:54 +01:00
$error = 0 ;
2012-02-06 17:18:19 +01:00
2014-06-14 12:30:48 +02:00
$this -> db -> begin ();
2011-09-12 19:08:02 +02:00
$sql = 'DELETE FROM ' . MAIN_DB_PREFIX . " commandedet WHERE rowid=' " . $this -> rowid . " '; " ;
2014-06-12 11:31:53 +02:00
dol_syslog ( " OrderLine::delete " , LOG_DEBUG );
2011-09-12 19:08:02 +02:00
$resql = $this -> db -> query ( $sql );
if ( $resql )
{
2013-06-10 16:05:41 +02:00
// Remove extrafields
if (( ! $error ) && ( empty ( $conf -> global -> MAIN_EXTRAFIELDS_DISABLED ))) // For avoid conflicts if trigger used
{
$this -> id = $this -> rowid ;
$result = $this -> deleteExtraFields ();
if ( $result < 0 )
{
$error ++ ;
dol_syslog ( get_class ( $this ) . " ::delete error -4 " . $this -> error , LOG_ERR );
}
}
2013-06-16 21:31:21 +02:00
2014-07-11 14:02:21 +02:00
// Call trigger
$result = $this -> call_trigger ( 'LINEORDER_DELETE' , $user );
2014-08-01 14:26:13 +02:00
if ( $result < 0 ) $error ++ ;
2014-07-11 14:02:21 +02:00
// End call triggers
2011-09-12 19:08:02 +02:00
2014-06-14 12:30:48 +02:00
if ( ! $error ) {
$this -> db -> commit ();
return 1 ;
}
foreach ( $this -> errors as $errmsg )
{
dol_syslog ( get_class ( $this ) . " ::delete " . $errmsg , LOG_ERR );
$this -> error .= ( $this -> error ? ', ' . $errmsg : $errmsg );
}
$this -> db -> rollback ();
return - 1 * $error ;
2011-09-12 19:08:02 +02:00
}
else
{
$this -> error = $this -> db -> lasterror ();
return - 1 ;
}
}
/**
2011-12-16 12:47:23 +01:00
* Insert line into database
2011-09-12 19:08:02 +02:00
*
2011-12-16 12:47:23 +01:00
* @ param int $notrigger 1 = disable triggers
* @ return int < 0 if KO , > 0 if OK
2011-09-12 19:08:02 +02:00
*/
function insert ( $notrigger = 0 )
{
global $langs , $conf , $user ;
2011-12-05 18:36:54 +01:00
$error = 0 ;
2012-02-06 17:18:19 +01:00
2015-11-04 17:51:15 +01: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'.
2015-11-04 22:38:45 +01:00
2014-11-15 19:04:21 +01:00
dol_syslog ( get_class ( $this ) . " ::insert rang= " . $this -> rang );
2011-09-12 19:08:02 +02:00
// Clean parameters
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 ;
2013-09-10 18:32:03 +02:00
if ( empty ( $this -> localtax1_type )) $this -> localtax1_type = 0 ;
if ( empty ( $this -> localtax2_type )) $this -> localtax2_type = 0 ;
2011-09-12 19:08:02 +02:00
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 )) $this -> remise = 0 ;
if ( empty ( $this -> remise_percent )) $this -> remise_percent = 0 ;
if ( empty ( $this -> info_bits )) $this -> info_bits = 0 ;
if ( empty ( $this -> special_code )) $this -> special_code = 0 ;
if ( empty ( $this -> fk_parent_line )) $this -> fk_parent_line = 0 ;
2012-08-01 17:36:15 +02:00
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
2015-11-04 22:38:45 +01:00
if ( $this -> pa_ht == 0 && $pa_ht_isemptystring )
2015-10-26 20:33:42 +01:00
{
if (( $result = $this -> defineBuyPrice ( $this -> subprice , $this -> remise_percent , $this -> fk_product )) < 0 )
{
return $result ;
}
else
{
$this -> pa_ht = $result ;
}
2012-08-01 17:36:15 +02:00
}
2012-07-20 09:57:50 +02:00
2011-09-12 19:08:02 +02:00
// Check parameters
if ( $this -> product_type < 0 ) return - 1 ;
$this -> db -> begin ();
// Insertion dans base de la ligne
$sql = 'INSERT INTO ' . MAIN_DB_PREFIX . 'commandedet' ;
2013-09-10 18:32:03 +02:00
$sql .= ' (fk_commande, fk_parent_line, label, description, qty, ' ;
$sql .= ' tva_tx, localtax1_tx, localtax2_tx, localtax1_type, localtax2_type,' ;
2011-09-12 19:08:02 +02:00
$sql .= ' fk_product, product_type, remise_percent, subprice, price, remise, fk_remise_except,' ;
2012-07-19 10:26:26 +02:00
$sql .= ' special_code, rang, fk_product_fournisseur_price, buy_price_ht,' ;
2015-02-26 14:15:33 +01:00
$sql .= ' info_bits, total_ht, total_tva, total_localtax1, total_localtax2, total_ttc, date_start, date_end,' ;
2016-01-23 00:38:17 +01:00
$sql .= ' fk_unit' ;
$sql .= ', fk_multicurrency, multicurrency_code, multicurrency_subprice, multicurrency_total_ht, multicurrency_total_tva, multicurrency_total_ttc' ;
$sql .= ')' ;
2011-09-12 19:08:02 +02:00
$sql .= " VALUES ( " . $this -> fk_commande . " , " ;
$sql .= " " . ( $this -> fk_parent_line > 0 ? " ' " . $this -> fk_parent_line . " ' " : " null " ) . " , " ;
2012-08-23 07:50:20 +02:00
$sql .= " " . ( ! empty ( $this -> label ) ? " ' " . $this -> db -> escape ( $this -> label ) . " ' " : " null " ) . " , " ;
2011-09-12 19:08:02 +02:00
$sql .= " ' " . $this -> db -> escape ( $this -> desc ) . " ', " ;
$sql .= " ' " . price2num ( $this -> qty ) . " ', " ;
$sql .= " ' " . price2num ( $this -> tva_tx ) . " ', " ;
$sql .= " ' " . price2num ( $this -> localtax1_tx ) . " ', " ;
$sql .= " ' " . price2num ( $this -> localtax2_tx ) . " ', " ;
2013-09-10 18:32:03 +02:00
$sql .= " ' " . $this -> localtax1_type . " ', " ;
$sql .= " ' " . $this -> localtax2_type . " ', " ;
2012-08-01 17:36:15 +02:00
$sql .= ' ' . ( ! empty ( $this -> fk_product ) ? $this -> fk_product : " null " ) . ',' ;
2011-09-12 19:08:02 +02:00
$sql .= " ' " . $this -> product_type . " ', " ;
$sql .= " ' " . price2num ( $this -> remise_percent ) . " ', " ;
$sql .= " " . ( $this -> subprice != '' ? " ' " . price2num ( $this -> subprice ) . " ' " : " null " ) . " , " ;
$sql .= " " . ( $this -> price != '' ? " ' " . price2num ( $this -> price ) . " ' " : " null " ) . " , " ;
$sql .= " ' " . price2num ( $this -> remise ) . " ', " ;
2012-08-01 17:36:15 +02:00
$sql .= ' ' . ( ! empty ( $this -> fk_remise_except ) ? $this -> fk_remise_except : " null " ) . ',' ;
2011-09-12 19:08:02 +02:00
$sql .= ' ' . $this -> special_code . ',' ;
$sql .= ' ' . $this -> rang . ',' ;
2012-08-01 17:36:15 +02:00
$sql .= ' ' . ( ! empty ( $this -> fk_fournprice ) ? $this -> fk_fournprice : " null " ) . ',' ;
$sql .= ' ' . price2num ( $this -> pa_ht ) . ',' ;
2011-09-12 19:08:02 +02:00
$sql .= " ' " . $this -> info_bits . " ', " ;
$sql .= " ' " . price2num ( $this -> total_ht ) . " ', " ;
$sql .= " ' " . price2num ( $this -> total_tva ) . " ', " ;
$sql .= " ' " . price2num ( $this -> total_localtax1 ) . " ', " ;
$sql .= " ' " . price2num ( $this -> total_localtax2 ) . " ', " ;
$sql .= " ' " . price2num ( $this -> total_ttc ) . " ', " ;
2012-08-01 17:36:15 +02:00
$sql .= " " . ( ! empty ( $this -> date_start ) ? " ' " . $this -> db -> idate ( $this -> date_start ) . " ' " : " null " ) . ',' ;
2015-02-26 14:15:33 +01:00
$sql .= " " . ( ! empty ( $this -> date_end ) ? " ' " . $this -> db -> idate ( $this -> date_end ) . " ' " : " null " ) . ',' ;
$sql .= ' ' . ( ! $this -> fk_unit ? 'NULL' : $this -> fk_unit );
2016-01-23 00:38:17 +01:00
$sql .= " , " . $this -> fk_multicurrency ;
$sql .= " , ' " . $this -> db -> escape ( $this -> multicurrency_code ) . " ' " ;
$sql .= " , " . $this -> multicurrency_subprice ;
$sql .= " , " . $this -> multicurrency_total_ht ;
$sql .= " , " . $this -> multicurrency_total_tva ;
$sql .= " , " . $this -> multicurrency_total_ttc ;
2011-09-12 19:08:02 +02:00
$sql .= ')' ;
2014-06-12 11:31:53 +02:00
dol_syslog ( get_class ( $this ) . " ::insert " , LOG_DEBUG );
2011-09-12 19:08:02 +02:00
$resql = $this -> db -> query ( $sql );
if ( $resql )
{
$this -> rowid = $this -> db -> last_insert_id ( MAIN_DB_PREFIX . 'commandedet' );
2013-06-10 16:05:41 +02:00
if ( empty ( $conf -> global -> MAIN_EXTRAFIELDS_DISABLED )) // For avoid conflicts if trigger used
{
$this -> id = $this -> rowid ;
$result = $this -> insertExtraFields ();
if ( $result < 0 )
{
$error ++ ;
}
}
2013-06-16 21:31:21 +02:00
2015-02-28 04:59:27 +01:00
if ( ! $error && ! $notrigger )
2011-09-12 19:08:02 +02:00
{
2014-07-11 14:02:21 +02:00
// Call trigger
$result = $this -> call_trigger ( 'LINEORDER_INSERT' , $user );
2014-08-01 14:26:13 +02:00
if ( $result < 0 ) $error ++ ;
2014-07-11 14:02:21 +02:00
// End call triggers
2011-09-12 19:08:02 +02:00
}
2014-06-14 12:30:48 +02:00
if ( ! $error ) {
$this -> db -> commit ();
return 1 ;
}
foreach ( $this -> errors as $errmsg )
{
dol_syslog ( get_class ( $this ) . " ::delete " . $errmsg , LOG_ERR );
$this -> error .= ( $this -> error ? ', ' . $errmsg : $errmsg );
}
$this -> db -> rollback ();
return - 1 * $error ;
2011-09-12 19:08:02 +02:00
}
else
{
$this -> error = $this -> db -> error ();
$this -> db -> rollback ();
return - 2 ;
}
}
/**
2011-12-16 12:47:23 +01:00
* Update the line object into db
2011-09-12 19:08:02 +02:00
*
2011-12-16 12:47:23 +01:00
* @ param int $notrigger 1 = disable triggers
* @ return int < 0 si ko , > 0 si ok
2011-09-12 19:08:02 +02:00
*/
2012-07-28 18:32:54 +02:00
function update ( $notrigger = 0 )
{
global $conf , $langs , $user ;
2011-09-12 19:08:02 +02:00
2011-12-05 18:36:54 +01:00
$error = 0 ;
2012-02-06 17:18:19 +01:00
2015-11-04 17:51:15 +01: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'.
2015-11-04 22:38:45 +01:00
2012-07-28 18:32:54 +02:00
// Clean parameters
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 ;
2013-09-10 18:32:03 +02:00
if ( empty ( $this -> localtax1_type )) $this -> localtax1_type = 0 ;
if ( empty ( $this -> localtax2_type )) $this -> localtax2_type = 0 ;
2012-07-28 18:32:54 +02:00
if ( empty ( $this -> qty )) $this -> qty = 0 ;
if ( empty ( $this -> total_localtax1 )) $this -> total_localtax1 = 0 ;
if ( empty ( $this -> total_localtax2 )) $this -> total_localtax2 = 0 ;
if ( empty ( $this -> marque_tx )) $this -> marque_tx = 0 ;
if ( empty ( $this -> marge_tx )) $this -> marge_tx = 0 ;
if ( empty ( $this -> remise )) $this -> remise = 0 ;
if ( empty ( $this -> remise_percent )) $this -> remise_percent = 0 ;
if ( empty ( $this -> info_bits )) $this -> info_bits = 0 ;
2012-10-12 22:18:31 +02:00
if ( empty ( $this -> special_code )) $this -> special_code = 0 ;
2012-07-28 18:32:54 +02:00
if ( empty ( $this -> product_type )) $this -> product_type = 0 ;
if ( empty ( $this -> fk_parent_line )) $this -> fk_parent_line = 0 ;
if ( empty ( $this -> pa_ht )) $this -> pa_ht = 0 ;
2015-10-26 20:33:42 +01:00
// if buy price not defined, define buyprice as configured in margin admin
2015-11-04 22:38:45 +01:00
if ( $this -> pa_ht == 0 && $pa_ht_isemptystring )
2015-10-26 20:33:42 +01:00
{
if (( $result = $this -> defineBuyPrice ( $this -> subprice , $this -> remise_percent , $this -> fk_product )) < 0 )
{
return $result ;
}
else
{
$this -> pa_ht = $result ;
}
2012-07-28 18:32:54 +02:00
}
2012-07-19 10:26:26 +02:00
2012-07-28 18:32:54 +02:00
$this -> db -> begin ();
2011-09-12 19:08:02 +02:00
2012-07-28 18:32:54 +02:00
// Mise a jour ligne en base
$sql = " UPDATE " . MAIN_DB_PREFIX . " commandedet SET " ;
$sql .= " description=' " . $this -> db -> escape ( $this -> desc ) . " ' " ;
2012-08-23 13:45:51 +02:00
$sql .= " , label= " . ( ! empty ( $this -> label ) ? " ' " . $this -> db -> escape ( $this -> label ) . " ' " : " null " );
2012-07-28 18:32:54 +02:00
$sql .= " , tva_tx= " . price2num ( $this -> tva_tx );
$sql .= " , localtax1_tx= " . price2num ( $this -> localtax1_tx );
$sql .= " , localtax2_tx= " . price2num ( $this -> localtax2_tx );
2013-09-10 18:32:03 +02:00
$sql .= " , localtax1_type=' " . $this -> localtax1_type . " ' " ;
$sql .= " , localtax2_type=' " . $this -> localtax2_type . " ' " ;
2012-07-28 18:32:54 +02:00
$sql .= " , qty= " . price2num ( $this -> qty );
$sql .= " , subprice= " . price2num ( $this -> subprice ) . " " ;
$sql .= " , remise_percent= " . price2num ( $this -> remise_percent ) . " " ;
$sql .= " , price= " . price2num ( $this -> price ) . " " ; // TODO A virer
$sql .= " , remise= " . price2num ( $this -> remise ) . " " ; // TODO A virer
if ( empty ( $this -> skip_update_total ))
{
$sql .= " , total_ht= " . price2num ( $this -> total_ht ) . " " ;
$sql .= " , total_tva= " . price2num ( $this -> total_tva ) . " " ;
$sql .= " , total_ttc= " . price2num ( $this -> total_ttc ) . " " ;
2012-09-15 09:02:20 +02:00
$sql .= " , total_localtax1= " . price2num ( $this -> total_localtax1 );
2012-09-12 19:07:23 +02:00
$sql .= " , total_localtax2= " . price2num ( $this -> total_localtax2 );
2012-07-28 18:32:54 +02:00
}
$sql .= " , fk_product_fournisseur_price= " . ( ! empty ( $this -> fk_fournprice ) ? $this -> fk_fournprice : " null " );
$sql .= " , buy_price_ht=' " . price2num ( $this -> pa_ht ) . " ' " ;
$sql .= " , info_bits= " . $this -> info_bits ;
2012-10-12 22:18:31 +02:00
$sql .= " , special_code= " . $this -> special_code ;
2012-08-01 17:36:15 +02: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 " );
2012-07-28 18:32:54 +02:00
$sql .= " , product_type= " . $this -> product_type ;
$sql .= " , fk_parent_line= " . ( ! empty ( $this -> fk_parent_line ) ? $this -> fk_parent_line : " null " );
if ( ! empty ( $this -> rang )) $sql .= " , rang= " . $this -> rang ;
2015-02-26 14:15:33 +01:00
$sql .= " , fk_unit= " . ( ! $this -> fk_unit ? 'NULL' : $this -> fk_unit );
2016-07-08 18:30:50 +02:00
2016-01-23 16:01:55 +01:00
// Multicurrency
$sql .= " , multicurrency_subprice= " . price2num ( $this -> multicurrency_subprice ) . " " ;
$sql .= " , multicurrency_total_ht= " . price2num ( $this -> multicurrency_total_ht ) . " " ;
$sql .= " , multicurrency_total_tva= " . price2num ( $this -> multicurrency_total_tva ) . " " ;
$sql .= " , multicurrency_total_ttc= " . price2num ( $this -> multicurrency_total_ttc ) . " " ;
2016-07-08 18:30:50 +02:00
2012-07-28 18:32:54 +02:00
$sql .= " WHERE rowid = " . $this -> rowid ;
2014-06-12 11:31:53 +02:00
dol_syslog ( get_class ( $this ) . " ::update " , LOG_DEBUG );
2012-07-28 18:32:54 +02:00
$resql = $this -> db -> query ( $sql );
if ( $resql )
{
2013-06-10 16:05:41 +02:00
if ( empty ( $conf -> global -> MAIN_EXTRAFIELDS_DISABLED )) // For avoid conflicts if trigger used
{
$this -> id = $this -> rowid ;
$result = $this -> insertExtraFields ();
if ( $result < 0 )
{
$error ++ ;
}
}
2013-06-16 21:31:21 +02:00
2012-07-28 18:32:54 +02:00
if ( ! $notrigger )
{
2014-07-11 14:02:21 +02:00
// Call trigger
$result = $this -> call_trigger ( 'LINEORDER_UPDATE' , $user );
2014-08-01 14:26:13 +02:00
if ( $result < 0 ) $error ++ ;
2014-07-11 14:02:21 +02:00
// End call triggers
2012-07-28 18:32:54 +02:00
}
2011-09-12 19:08:02 +02:00
2014-06-14 12:30:48 +02:00
if ( ! $error ) {
$this -> db -> commit ();
return 1 ;
}
foreach ( $this -> errors as $errmsg )
{
dol_syslog ( get_class ( $this ) . " ::update " . $errmsg , LOG_ERR );
$this -> error .= ( $this -> error ? ', ' . $errmsg : $errmsg );
}
$this -> db -> rollback ();
return - 1 * $error ;
2012-07-28 18:32:54 +02:00
}
else
{
$this -> error = $this -> db -> error ();
$this -> db -> rollback ();
return - 2 ;
}
}
2011-09-12 19:08:02 +02:00
/**
2011-12-16 12:47:23 +01:00
* Update totals of order into database
2011-09-12 19:08:02 +02:00
*
2011-12-16 12:47:23 +01:00
* @ return int < 0 if ko , > 0 if ok
2011-09-12 19:08:02 +02:00
*/
function update_total ()
{
$this -> db -> begin ();
// Clean parameters
if ( empty ( $this -> total_localtax1 )) $this -> total_localtax1 = 0 ;
if ( empty ( $this -> total_localtax2 )) $this -> total_localtax2 = 0 ;
// Mise a jour ligne en base
$sql = " UPDATE " . MAIN_DB_PREFIX . " commandedet SET " ;
$sql .= " total_ht=' " . price2num ( $this -> total_ht ) . " ' " ;
$sql .= " ,total_tva=' " . price2num ( $this -> total_tva ) . " ' " ;
$sql .= " ,total_localtax1=' " . price2num ( $this -> total_localtax1 ) . " ' " ;
$sql .= " ,total_localtax2=' " . price2num ( $this -> total_localtax2 ) . " ' " ;
$sql .= " ,total_ttc=' " . price2num ( $this -> total_ttc ) . " ' " ;
$sql .= " WHERE rowid = " . $this -> rowid ;
2014-07-02 21:29:07 +02:00
dol_syslog ( " OrderLine::update_total " , LOG_DEBUG );
2011-09-12 19:08:02 +02:00
$resql = $this -> db -> query ( $sql );
if ( $resql )
{
$this -> db -> commit ();
return 1 ;
}
else
{
$this -> error = $this -> db -> error ();
$this -> db -> rollback ();
return - 2 ;
}
}
2005-09-15 02:37:03 +02:00
}