2004-10-19 22:43:23 +02:00
< ? php
2012-10-31 09:50:20 +01:00
/* Copyright ( C ) 2003 - 2008 Rodolphe Quiedeville < rodolphe @ quiedeville . org >
2018-10-27 14:43:12 +02:00
* Copyright ( C ) 2005 - 2012 Regis Houssin < regis . houssin @ inodbox . com >
2012-10-31 09:50:20 +01:00
* Copyright ( C ) 2007 Franky Van Liedekerke < franky . van . liedekerke @ telenet . be >
* Copyright ( C ) 2006 - 2012 Laurent Destailleur < eldy @ users . sourceforge . net >
2020-09-03 12:43:38 +02:00
* Copyright ( C ) 2011 - 2020 Juanjo Menent < jmenent @ 2 byte . es >
2013-06-20 18:37:23 +02:00
* Copyright ( C ) 2013 Florian Henry < florian . henry @ open - concept . pro >
2014-03-07 11:35:16 +01:00
* Copyright ( C ) 2014 Cedric GROSS < c . gross @ kreiz - it . fr >
2015-04-18 20:50:03 +02:00
* Copyright ( C ) 2014 - 2015 Marcos García < marcosgdf @ gmail . com >
2017-10-18 17:01:17 +02:00
* Copyright ( C ) 2014 - 2017 Francis Appels < francis . appels @ yahoo . com >
2016-02-15 01:37:23 +01:00
* Copyright ( C ) 2015 Claudio Aschieri < c . aschieri @ 19. coop >
2022-03-22 13:46:55 +01:00
* Copyright ( C ) 2016 - 2022 Ferran Marcet < fmarcet @ 2 byte . es >
2018-09-12 22:59:15 +02:00
* Copyright ( C ) 2018 Nicolas ZABOURI < info @ inovea - conseil . com >
2022-02-15 11:15:34 +01:00
* Copyright ( C ) 2018 - 2022 Frédéric France < frederic . france @ netlogic . fr >
2020-04-23 07:49:31 +02:00
* Copyright ( C ) 2020 Lenin Rivas < lenin @ leninrivas . com >
2003-11-13 18:36:45 +01:00
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
2013-01-16 15:36:08 +01:00
* the Free Software Foundation ; either version 3 of the License , or
2003-11-13 18:36:45 +01:00
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
2019-09-23 21:55:30 +02:00
* along with this program . If not , see < https :// www . gnu . org / licenses />.
2003-11-13 18:36:45 +01:00
*/
2005-07-09 03:16:31 +02:00
/**
2010-06-05 15:27:11 +02:00
* \file htdocs / expedition / class / expedition . class . php
2009-11-12 14:33:55 +01:00
* \ingroup expedition
* \brief Fichier de la classe de gestion des expeditions
2008-05-26 23:27:50 +02:00
*/
2004-08-14 15:05:12 +02:00
2012-08-22 23:11:24 +02:00
require_once DOL_DOCUMENT_ROOT . '/core/class/commonobject.class.php' ;
2015-12-16 16:18:29 +01:00
require_once DOL_DOCUMENT_ROOT . " /core/class/commonobjectline.class.php " ;
2020-09-16 02:50:18 +02:00
require_once DOL_DOCUMENT_ROOT . '/core/class/commonincoterm.class.php' ;
2021-02-25 22:38:35 +01:00
if ( ! empty ( $conf -> propal -> enabled )) {
require_once DOL_DOCUMENT_ROOT . '/comm/propal/class/propal.class.php' ;
}
if ( ! empty ( $conf -> commande -> enabled )) {
require_once DOL_DOCUMENT_ROOT . '/commande/class/commande.class.php' ;
}
2021-09-27 15:41:58 +02:00
require_once DOL_DOCUMENT_ROOT . '/expedition/class/expeditionlinebatch.class.php' ;
2006-06-18 16:35:35 +02:00
2016-09-07 12:41:32 +02:00
2008-05-26 23:27:50 +02:00
/**
2012-03-14 14:00:20 +01:00
* Class to manage shipments
2008-05-26 23:27:50 +02:00
*/
2006-06-18 16:35:35 +02:00
class Expedition extends CommonObject
2003-11-13 18:36:45 +01:00
{
2020-09-16 02:50:18 +02:00
use CommonIncoterm ;
2018-08-23 18:35:45 +02:00
/**
* @ var string ID to identify managed object
*/
2019-11-13 19:37:08 +01:00
public $element = " shipping " ;
2018-09-01 23:46:13 +02:00
2018-10-06 12:01:00 +02:00
/**
2020-12-05 23:53:55 +01:00
* @ var string Field with ID of parent key if this field has a parent
2018-10-06 12:01:00 +02:00
*/
2019-11-13 19:37:08 +01:00
public $fk_element = " fk_expedition " ;
2018-09-01 23:46:13 +02:00
2018-08-22 18:48:53 +02:00
/**
* @ var string Name of table without prefix where object is stored
*/
2019-11-13 19:37:08 +01:00
public $table_element = " expedition " ;
2018-09-01 23:46:13 +02:00
2018-09-02 11:08:41 +02:00
/**
2020-12-05 23:53:55 +01:00
* @ var string Name of subtable line
2018-09-02 11:08:41 +02:00
*/
2019-11-13 19:37:08 +01:00
public $table_element_line = " expeditiondet " ;
2018-09-02 11:08:41 +02:00
2018-10-06 12:14:47 +02:00
/**
* 0 = No test on entity , 1 = Test with field entity , 2 = Test with link by societe
* @ var int
*/
public $ismultientitymanaged = 1 ;
2018-09-05 12:21:13 +02:00
/**
* @ var string String with name of icon for myobject . Must be the part after the 'object_' into object_myobject . png
*/
2020-04-20 15:57:15 +02:00
public $picto = 'dolly' ;
2017-06-23 11:12:17 +02:00
2018-09-02 11:08:41 +02:00
public $socid ;
2018-10-25 21:36:01 +02:00
2020-10-05 20:16:18 +02:00
/**
* @ var string Customer ref
* @ deprecated
* @ see $ref_customer
*/
public $ref_client ;
2018-10-25 21:36:01 +02:00
/**
* @ var string Customer ref
*/
2018-09-02 11:08:41 +02:00
public $ref_customer ;
2018-10-25 21:36:01 +02:00
/**
* @ var string internal ref
2020-03-06 14:38:06 +01:00
* @ deprecated
2018-10-25 21:36:01 +02:00
*/
2018-09-02 11:08:41 +02:00
public $ref_int ;
2018-10-25 21:36:01 +02:00
2018-09-02 11:08:41 +02:00
public $brouillon ;
2018-10-25 21:36:01 +02:00
/**
* @ var int warehouse id
*/
2018-09-02 11:08:41 +02:00
public $entrepot_id ;
2018-10-25 21:36:01 +02:00
/**
* @ var string Tracking number
*/
2018-09-02 11:08:41 +02:00
public $tracking_number ;
2018-10-25 21:36:01 +02:00
/**
* @ var string Tracking url
*/
2018-09-02 11:08:41 +02:00
public $tracking_url ;
public $billed ;
2018-10-25 21:36:01 +02:00
/**
* @ var string name of pdf model
*/
2018-09-02 11:08:41 +02:00
public $model_pdf ;
public $trueWeight ;
public $weight_units ;
public $trueWidth ;
public $width_units ;
public $trueHeight ;
public $height_units ;
public $trueDepth ;
public $depth_units ;
2010-05-13 01:03:33 +02:00
// A denormalized value
2018-09-02 11:08:41 +02:00
public $trueSize ;
2019-11-10 12:00:19 +01:00
2019-11-10 12:01:34 +01:00
/**
* @ var integer | string Date delivery planed
*/
public $date_delivery ;
2010-05-13 01:03:33 +02:00
2015-04-23 23:21:06 +02:00
/**
* @ deprecated
2019-04-04 18:33:12 +02:00
* @ see $date_shipping
2015-04-23 23:21:06 +02:00
*/
2018-09-02 11:08:41 +02:00
public $date ;
2015-04-23 23:21:06 +02:00
/**
* @ deprecated
2019-04-04 18:33:12 +02:00
* @ see $date_shipping
2015-04-23 23:21:06 +02:00
*/
2018-09-02 11:08:41 +02:00
public $date_expedition ;
2015-04-23 23:21:06 +02:00
/**
* Effective delivery date
2019-11-10 12:01:34 +01:00
* @ var integer | string
2015-04-23 23:21:06 +02:00
*/
public $date_shipping ;
2012-03-14 14:00:20 +01:00
2019-11-01 10:48:21 +01:00
/**
2020-10-28 17:49:52 +01:00
* @ var integer | string date_creation
*/
2018-09-02 11:08:41 +02:00
public $date_creation ;
2019-11-01 10:48:58 +01:00
2019-11-10 12:01:34 +01:00
/**
* @ var integer | string date_valid
*/
2018-09-02 11:08:41 +02:00
public $date_valid ;
public $meths ;
2019-11-13 19:37:08 +01:00
public $listmeths ; // List of carriers
2013-04-11 21:53:41 +02:00
2020-11-28 14:47:39 +01:00
public $lines = array ();
2020-10-28 17:49:52 +01:00
/**
2018-10-04 09:33:30 +02:00
* Draft status
*/
2016-06-09 22:40:21 +02:00
const STATUS_DRAFT = 0 ;
2018-10-04 09:33:30 +02:00
/**
* Validated status
*/
2016-06-09 22:40:21 +02:00
const STATUS_VALIDATED = 1 ;
2018-10-04 09:33:30 +02:00
/**
* Closed status
*/
2016-06-09 22:40:21 +02:00
const STATUS_CLOSED = 2 ;
2016-09-07 12:41:32 +02:00
2020-04-23 07:49:31 +02:00
/**
* Canceled status
*/
const STATUS_CANCELED = - 1 ;
2016-09-07 12:41:32 +02:00
2008-10-25 13:16:39 +02:00
/**
2011-09-29 22:32:28 +02:00
* Constructor
*
2012-03-14 14:00:20 +01:00
* @ param DoliDB $db Database handler
2008-10-25 13:16:39 +02:00
*/
2019-02-24 23:32:09 +01:00
public function __construct ( $db )
2008-10-25 13:16:39 +02:00
{
2018-02-15 15:27:06 +01:00
global $conf ;
2012-03-14 14:00:20 +01:00
$this -> db = $db ;
2010-01-05 21:03:37 +01:00
2009-12-17 16:52:37 +01:00
// List of long language codes for status
2014-04-23 18:16:22 +02:00
$this -> statuts = array ();
2009-12-17 16:52:37 +01:00
$this -> statuts [ - 1 ] = 'StatusSendingCanceled' ;
$this -> statuts [ 0 ] = 'StatusSendingDraft' ;
$this -> statuts [ 1 ] = 'StatusSendingValidated' ;
2012-03-13 17:28:55 +01:00
$this -> statuts [ 2 ] = 'StatusSendingProcessed' ;
2018-02-15 15:27:06 +01:00
// List of short language codes for status
$this -> statutshorts = array ();
$this -> statutshorts [ - 1 ] = 'StatusSendingCanceledShort' ;
$this -> statutshorts [ 0 ] = 'StatusSendingDraftShort' ;
$this -> statutshorts [ 1 ] = 'StatusSendingValidatedShort' ;
$this -> statutshorts [ 2 ] = 'StatusSendingProcessedShort' ;
2008-10-25 13:16:39 +02:00
}
2011-02-20 23:53:59 +01:00
2011-09-29 22:32:28 +02:00
/**
2022-01-04 16:44:13 +01:00
* Return next expedition ref
2011-09-29 22:32:28 +02:00
*
2014-12-20 15:42:03 +01:00
* @ param Societe $soc Thirdparty object
2022-01-04 16:44:13 +01:00
* @ return string Free reference for expedition
2011-02-20 01:20:45 +01:00
*/
2019-02-24 23:32:09 +01:00
public function getNextNumRef ( $soc )
2011-02-20 01:20:45 +01:00
{
2016-05-06 22:43:50 +02:00
global $langs , $conf ;
2011-02-20 01:20:45 +01:00
$langs -> load ( " sendings " );
2021-02-25 22:38:35 +01:00
if ( ! empty ( $conf -> global -> EXPEDITION_ADDON_NUMBER )) {
2015-01-17 18:58:05 +01:00
$mybool = false ;
$file = $conf -> global -> EXPEDITION_ADDON_NUMBER . " .php " ;
$classname = $conf -> global -> EXPEDITION_ADDON_NUMBER ;
2017-10-07 13:09:31 +02:00
// Include file with class
$dirmodels = array_merge ( array ( '/' ), ( array ) $conf -> modules_parts [ 'models' ]);
2011-02-20 01:20:45 +01:00
2017-10-07 13:09:31 +02:00
foreach ( $dirmodels as $reldir ) {
$dir = dol_buildpath ( $reldir . " core/modules/expedition/ " );
2015-01-17 18:58:05 +01:00
2017-10-07 13:09:31 +02:00
// Load file with numbering class (if found)
2019-11-13 19:37:08 +01:00
$mybool |= @ include_once $dir . $file ;
2017-10-07 13:09:31 +02:00
}
2015-01-17 18:58:05 +01:00
2021-02-25 22:38:35 +01:00
if ( ! $mybool ) {
2019-01-27 11:55:16 +01:00
dol_print_error ( '' , " Failed to include file " . $file );
2017-10-07 13:09:31 +02:00
return '' ;
}
2008-10-25 13:16:39 +02:00
2011-02-20 23:53:59 +01:00
$obj = new $classname ();
$numref = " " ;
2019-01-27 11:55:16 +01:00
$numref = $obj -> getNextValue ( $soc , $this );
2011-02-20 23:53:59 +01:00
2021-02-25 22:38:35 +01:00
if ( $numref != " " ) {
2011-02-20 23:53:59 +01:00
return $numref ;
2020-05-21 15:05:19 +02:00
} else {
2019-01-27 11:55:16 +01:00
dol_print_error ( $this -> db , get_class ( $this ) . " ::getNextNumRef " . $obj -> error );
2011-02-20 01:20:45 +01:00
return " " ;
}
2020-05-21 15:05:19 +02:00
} else {
2017-10-07 13:09:31 +02:00
print $langs -> trans ( " Error " ) . " " . $langs -> trans ( " Error_EXPEDITION_ADDON_NUMBER_NotDefined " );
return " " ;
}
2011-02-20 01:20:45 +01:00
}
2011-02-20 23:53:59 +01:00
2008-10-25 13:16:39 +02:00
/**
2011-09-29 22:32:28 +02:00
* Create expedition en base
*
* @ param User $user Objet du user qui cree
2017-10-07 13:09:31 +02:00
* @ param int $notrigger 1 = Does not execute triggers , 0 = execute triggers
2011-09-29 22:32:28 +02:00
* @ return int < 0 si erreur , id expedition creee si ok
2008-10-25 13:16:39 +02:00
*/
2019-02-24 23:32:09 +01:00
public function create ( $user , $notrigger = 0 )
2008-10-25 13:16:39 +02:00
{
2016-05-06 22:43:50 +02:00
global $conf , $hookmanager ;
2012-07-29 12:54:19 +02:00
2019-11-13 19:37:08 +01:00
$now = dol_now ();
2013-08-07 15:08:30 +02:00
2019-11-13 19:37:08 +01:00
require_once DOL_DOCUMENT_ROOT . '/product/stock/class/mouvementstock.class.php' ;
2008-10-25 13:16:39 +02:00
$error = 0 ;
2009-02-03 03:39:28 +01:00
// Clean parameters
$this -> brouillon = 1 ;
2009-04-29 20:02:50 +02:00
$this -> tracking_number = dol_sanitizeFileName ( $this -> tracking_number );
2021-02-25 22:38:35 +01:00
if ( empty ( $this -> fk_project )) {
$this -> fk_project = 0 ;
}
2009-02-04 23:12:23 +01:00
2008-10-25 13:16:39 +02:00
$this -> user = $user ;
$this -> db -> begin ();
2009-04-30 18:28:53 +02:00
$sql = " INSERT INTO " . MAIN_DB_PREFIX . " expedition ( " ;
2020-03-12 12:45:44 +01:00
$sql .= " ref " ;
$sql .= " , entity " ;
$sql .= " , ref_customer " ;
$sql .= " , ref_int " ;
2020-05-23 16:46:42 +02:00
$sql .= " , ref_ext " ;
2020-03-12 12:45:44 +01:00
$sql .= " , date_creation " ;
$sql .= " , fk_user_author " ;
$sql .= " , date_expedition " ;
$sql .= " , date_delivery " ;
$sql .= " , fk_soc " ;
$sql .= " , fk_projet " ;
$sql .= " , fk_address " ;
$sql .= " , fk_shipping_method " ;
$sql .= " , tracking_number " ;
$sql .= " , weight " ;
$sql .= " , size " ;
$sql .= " , width " ;
$sql .= " , height " ;
$sql .= " , weight_units " ;
$sql .= " , size_units " ;
$sql .= " , note_private " ;
$sql .= " , note_public " ;
$sql .= " , model_pdf " ;
$sql .= " , fk_incoterms, location_incoterms " ;
$sql .= " ) VALUES ( " ;
$sql .= " '(PROV)' " ;
2021-09-03 21:25:17 +02:00
$sql .= " , " . (( int ) $conf -> entity );
2020-03-12 12:45:44 +01:00
$sql .= " , " . ( $this -> ref_customer ? " ' " . $this -> db -> escape ( $this -> ref_customer ) . " ' " : " null " );
$sql .= " , " . ( $this -> ref_int ? " ' " . $this -> db -> escape ( $this -> ref_int ) . " ' " : " null " );
2020-05-23 16:46:42 +02:00
$sql .= " , " . ( $this -> ref_ext ? " ' " . $this -> db -> escape ( $this -> ref_ext ) . " ' " : " null " );
2020-03-12 12:45:44 +01:00
$sql .= " , ' " . $this -> db -> idate ( $now ) . " ' " ;
2021-09-03 21:25:17 +02:00
$sql .= " , " . (( int ) $user -> id );
2020-03-12 12:45:44 +01:00
$sql .= " , " . ( $this -> date_expedition > 0 ? " ' " . $this -> db -> idate ( $this -> date_expedition ) . " ' " : " null " );
$sql .= " , " . ( $this -> date_delivery > 0 ? " ' " . $this -> db -> idate ( $this -> date_delivery ) . " ' " : " null " );
2021-09-03 21:25:17 +02:00
$sql .= " , " . ( $this -> socid > 0 ? (( int ) $this -> socid ) : " null " );
$sql .= " , " . ( $this -> fk_project > 0 ? (( int ) $this -> fk_project ) : " null " );
2020-03-12 12:45:44 +01:00
$sql .= " , " . ( $this -> fk_delivery_address > 0 ? $this -> fk_delivery_address : " null " );
2021-09-03 21:25:17 +02:00
$sql .= " , " . ( $this -> shipping_method_id > 0 ? (( int ) $this -> shipping_method_id ) : " null " );
2020-03-12 12:45:44 +01:00
$sql .= " , ' " . $this -> db -> escape ( $this -> tracking_number ) . " ' " ;
2020-10-31 14:32:18 +01:00
$sql .= " , " . ( is_numeric ( $this -> weight ) ? $this -> weight : 'NULL' );
$sql .= " , " . ( is_numeric ( $this -> sizeS ) ? $this -> sizeS : 'NULL' ); // TODO Should use this->trueDepth
$sql .= " , " . ( is_numeric ( $this -> sizeW ) ? $this -> sizeW : 'NULL' ); // TODO Should use this->trueWidth
$sql .= " , " . ( is_numeric ( $this -> sizeH ) ? $this -> sizeH : 'NULL' ); // TODO Should use this->trueHeight
2020-03-12 12:45:44 +01:00
$sql .= " , " . ( $this -> weight_units != '' ? ( int ) $this -> weight_units : 'NULL' );
$sql .= " , " . ( $this -> size_units != '' ? ( int ) $this -> size_units : 'NULL' );
$sql .= " , " . ( ! empty ( $this -> note_private ) ? " ' " . $this -> db -> escape ( $this -> note_private ) . " ' " : " null " );
$sql .= " , " . ( ! empty ( $this -> note_public ) ? " ' " . $this -> db -> escape ( $this -> note_public ) . " ' " : " null " );
$sql .= " , " . ( ! empty ( $this -> model_pdf ) ? " ' " . $this -> db -> escape ( $this -> model_pdf ) . " ' " : " null " );
$sql .= " , " . ( int ) $this -> fk_incoterms ;
$sql .= " , ' " . $this -> db -> escape ( $this -> location_incoterms ) . " ' " ;
$sql .= " ) " ;
2008-10-25 13:16:39 +02:00
2014-06-12 11:31:53 +02:00
dol_syslog ( get_class ( $this ) . " ::create " , LOG_DEBUG );
2020-03-12 12:45:44 +01:00
$resql = $this -> db -> query ( $sql );
2021-02-25 22:38:35 +01:00
if ( $resql ) {
2008-10-25 13:16:39 +02:00
$this -> id = $this -> db -> last_insert_id ( MAIN_DB_PREFIX . " expedition " );
2009-04-30 18:28:53 +02:00
$sql = " UPDATE " . MAIN_DB_PREFIX . " expedition " ;
2020-03-12 12:45:44 +01:00
$sql .= " SET ref = '(PROV " . $this -> id . " )' " ;
2021-08-27 16:33:03 +02:00
$sql .= " WHERE rowid = " . (( int ) $this -> id );
2010-01-05 21:03:37 +01:00
2014-06-12 11:31:53 +02:00
dol_syslog ( get_class ( $this ) . " ::create " , LOG_DEBUG );
2021-02-25 22:38:35 +01:00
if ( $this -> db -> query ( $sql )) {
2019-06-29 16:29:32 +02:00
// Insert of lines
2020-03-12 12:45:44 +01:00
$num = count ( $this -> lines );
2021-02-25 22:38:35 +01:00
for ( $i = 0 ; $i < $num ; $i ++ ) {
2022-03-01 01:28:47 +01:00
if ( empty ( $this -> lines [ $i ] -> product_type ) || ! empty ( $conf -> global -> STOCK_SUPPORTS_SERVICES )) {
if ( ! isset ( $this -> lines [ $i ] -> detail_batch )) { // no batch management
if ( $this -> create_line ( $this -> lines [ $i ] -> entrepot_id , $this -> lines [ $i ] -> origin_line_id , $this -> lines [ $i ] -> qty , $this -> lines [ $i ] -> rang , $this -> lines [ $i ] -> array_options ) <= 0 ) {
$error ++ ;
}
} else { // with batch management
if ( $this -> create_line_batch ( $this -> lines [ $i ], $this -> lines [ $i ] -> array_options ) <= 0 ) {
$error ++ ;
}
2014-03-07 11:35:16 +01:00
}
}
2009-12-12 10:13:41 +01:00
}
2010-01-05 21:03:37 +01:00
2021-02-25 22:38:35 +01:00
if ( ! $error && $this -> id && $this -> origin_id ) {
2009-12-12 10:13:41 +01:00
$ret = $this -> add_object_linked ();
2021-02-25 22:38:35 +01:00
if ( ! $ret ) {
2009-12-12 10:13:41 +01:00
$error ++ ;
}
}
2016-09-07 12:41:32 +02:00
2018-04-10 12:03:01 +02:00
// Actions on extra fields
2021-02-25 22:38:35 +01:00
if ( ! $error ) {
2019-11-13 19:37:08 +01:00
$result = $this -> insertExtraFields ();
2021-02-25 22:38:35 +01:00
if ( $result < 0 ) {
2018-04-10 12:03:01 +02:00
$error ++ ;
2015-12-16 16:18:29 +01:00
}
}
2010-01-05 21:03:37 +01:00
2021-02-25 22:38:35 +01:00
if ( ! $error && ! $notrigger ) {
2017-10-07 13:09:31 +02:00
// Call trigger
2019-11-13 19:37:08 +01:00
$result = $this -> call_trigger ( 'SHIPPING_CREATE' , $user );
2021-02-25 22:38:35 +01:00
if ( $result < 0 ) {
$error ++ ;
}
2017-10-07 13:09:31 +02:00
// End call triggers
2011-08-31 16:42:47 +02:00
2021-02-25 22:38:35 +01:00
if ( ! $error ) {
2014-06-10 12:05:31 +02:00
$this -> db -> commit ();
return $this -> id ;
2020-05-21 15:05:19 +02:00
} else {
2021-02-25 22:38:35 +01:00
foreach ( $this -> errors as $errmsg ) {
2014-06-10 12:05:31 +02:00
dol_syslog ( get_class ( $this ) . " ::create " . $errmsg , LOG_ERR );
2019-11-13 19:37:08 +01:00
$this -> error .= ( $this -> error ? ', ' . $errmsg : $errmsg );
2014-06-10 12:05:31 +02:00
}
$this -> db -> rollback ();
2019-11-13 19:37:08 +01:00
return - 1 * $error ;
2014-06-10 12:05:31 +02:00
}
2020-05-21 15:05:19 +02:00
} else {
2009-12-12 10:13:41 +01:00
$error ++ ;
$this -> db -> rollback ();
return - 3 ;
}
2020-05-21 15:05:19 +02:00
} else {
2009-12-12 10:13:41 +01:00
$error ++ ;
2019-11-13 19:37:08 +01:00
$this -> error = $this -> db -> lasterror () . " - sql= $sql " ;
2009-12-12 10:13:41 +01:00
$this -> db -> rollback ();
return - 2 ;
}
2020-05-21 15:05:19 +02:00
} else {
2008-10-25 13:16:39 +02:00
$error ++ ;
2019-11-13 19:37:08 +01:00
$this -> error = $this -> db -> error () . " - sql= $sql " ;
2008-10-25 13:16:39 +02:00
$this -> db -> rollback ();
return - 1 ;
}
}
2020-10-28 17:49:52 +01:00
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
2008-10-25 13:16:39 +02:00
/**
2011-12-16 15:29:58 +01:00
* Create a expedition line
2012-01-04 23:56:10 +01:00
*
* @ param int $entrepot_id Id of warehouse
* @ param int $origin_line_id Id of source line
* @ param int $qty Quantity
2019-08-06 15:33:26 +02:00
* @ param int $rang Rang
2016-09-12 02:05:38 +02:00
* @ param array $array_options extrafields array
2016-09-07 14:07:29 +02:00
* @ return int < 0 if KO , line_id if OK
2008-10-25 13:16:39 +02:00
*/
2021-10-25 11:52:24 +02:00
public function create_line ( $entrepot_id , $origin_line_id , $qty , $rang = 0 , $array_options = null )
2008-10-25 13:16:39 +02:00
{
2019-06-12 22:55:08 +02:00
//phpcs:enable
global $user ;
2017-10-18 17:01:17 +02:00
$expeditionline = new ExpeditionLigne ( $this -> db );
$expeditionline -> fk_expedition = $this -> id ;
$expeditionline -> entrepot_id = $entrepot_id ;
$expeditionline -> fk_origin_line = $origin_line_id ;
$expeditionline -> qty = $qty ;
2019-08-06 15:10:13 +02:00
$expeditionline -> rang = $rang ;
2017-10-31 17:20:29 +01:00
$expeditionline -> array_options = $array_options ;
2017-06-23 11:12:17 +02:00
2021-02-25 22:38:35 +01:00
if (( $lineId = $expeditionline -> insert ( $user )) < 0 ) {
2019-11-13 19:37:08 +01:00
$this -> errors [] = $expeditionline -> error ;
2015-12-16 16:18:29 +01:00
}
2017-10-18 17:01:17 +02:00
return $lineId ;
2008-10-25 13:16:39 +02:00
}
2015-02-16 20:14:16 +01:00
2020-10-28 17:49:52 +01:00
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
2014-03-07 11:35:16 +01:00
/**
2021-06-04 10:29:30 +02:00
* Create the detail of the expedition line . Create 1 record into expeditiondet for each warehouse and n record for each lot in this warehouse into expeditiondet_batch .
2014-03-07 11:35:16 +01:00
*
2021-06-04 10:29:30 +02:00
* @ param object $line_ext Objet with full information of line . $line_ext -> detail_batch must be an array of ExpeditionLineBatch
2015-12-16 16:18:29 +01:00
* @ param array $array_options extrafields array
2021-06-04 10:29:30 +02:00
* @ return int < 0 if KO , > 0 if OK
2014-03-07 11:35:16 +01:00
*/
2019-02-24 23:32:09 +01:00
public function create_line_batch ( $line_ext , $array_options = 0 )
2014-03-07 11:35:16 +01:00
{
2020-10-28 17:49:52 +01:00
// phpcs:enable
2014-03-07 11:35:16 +01:00
$error = 0 ;
2015-12-18 18:00:31 +01:00
$stockLocationQty = array (); // associated array with batch qty in stock location
2016-09-07 12:41:32 +02:00
2019-11-13 19:37:08 +01:00
$tab = $line_ext -> detail_batch ;
2015-12-18 18:00:31 +01:00
// create stockLocation Qty array
2021-02-25 22:38:35 +01:00
foreach ( $tab as $detbatch ) {
if ( $detbatch -> entrepot_id ) {
2018-10-11 11:56:52 +02:00
$stockLocationQty [ $detbatch -> entrepot_id ] += $detbatch -> qty ;
2015-12-18 18:00:31 +01:00
}
2015-02-16 20:14:16 +01:00
}
2015-12-18 18:00:31 +01:00
// create shipment lines
2021-02-25 22:38:35 +01:00
foreach ( $stockLocationQty as $stockLocation => $qty ) {
2021-01-07 18:24:44 +01:00
$line_id = $this -> create_line ( $stockLocation , $line_ext -> origin_line_id , $qty , $line_ext -> rang , $array_options );
if ( $line_id < 0 ) {
2015-12-18 18:00:31 +01:00
$error ++ ;
2020-05-21 15:05:19 +02:00
} else {
2015-12-18 18:00:31 +01:00
// create shipment batch lines for stockLocation
2021-02-25 22:38:35 +01:00
foreach ( $tab as $detbatch ) {
2019-11-13 19:37:08 +01:00
if ( $detbatch -> entrepot_id == $stockLocation ) {
2021-06-04 10:29:30 +02:00
if ( ! ( $detbatch -> create ( $line_id ) > 0 )) { // Create an ExpeditionLineBatch
2015-12-18 18:00:31 +01:00
$error ++ ;
}
2016-09-07 12:41:32 +02:00
}
2014-03-07 11:35:16 +01:00
}
}
}
2015-02-16 20:14:16 +01:00
2021-02-25 22:38:35 +01:00
if ( ! $error ) {
return 1 ;
} else {
return - 1 ;
}
2014-03-07 11:35:16 +01:00
}
2008-10-25 13:16:39 +02:00
/**
2011-05-26 17:33:33 +02:00
* Get object and lines from database
2011-09-29 22:32:28 +02:00
*
* @ param int $id Id of object to load
* @ param string $ref Ref of object
* @ param string $ref_ext External reference of object
2020-03-06 14:38:06 +01:00
* @ param string $notused Internal reference of other object
2015-02-16 19:14:34 +01:00
* @ return int > 0 if OK , 0 if not found , < 0 if KO
2008-10-25 13:16:39 +02:00
*/
2020-03-06 14:38:06 +01:00
public function fetch ( $id , $ref = '' , $ref_ext = '' , $notused = '' )
2008-10-25 13:16:39 +02:00
{
global $conf ;
2011-05-26 17:33:33 +02:00
// Check parameters
2021-02-25 22:38:35 +01:00
if ( empty ( $id ) && empty ( $ref ) && empty ( $ref_ext )) {
return - 1 ;
}
2010-06-06 17:53:49 +02:00
2020-05-18 15:50:36 +02:00
$sql = " SELECT e.rowid, e.entity, e.ref, e.fk_soc as socid, e.date_creation, e.ref_customer, e.ref_ext, e.ref_int, e.fk_user_author, e.fk_statut, e.fk_projet as fk_project, e.billed " ;
2020-10-28 17:49:52 +01:00
$sql .= " , e.date_valid " ;
2020-03-12 12:45:44 +01:00
$sql .= " , e.weight, e.weight_units, e.size, e.size_units, e.width, e.height " ;
$sql .= " , e.date_expedition as date_expedition, e.model_pdf, e.fk_address, e.date_delivery " ;
$sql .= " , e.fk_shipping_method, e.tracking_number " ;
$sql .= " , e.note_private, e.note_public " ;
$sql .= ', e.fk_incoterms, e.location_incoterms' ;
$sql .= ', i.libelle as label_incoterms' ;
$sql .= ', s.libelle as shipping_method' ;
$sql .= " , el.fk_source as origin_id, el.sourcetype as origin " ;
$sql .= " FROM " . MAIN_DB_PREFIX . " expedition as e " ;
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . " element_element as el ON el.fk_target = e.rowid AND el.targettype = ' " . $this -> db -> escape ( $this -> element ) . " ' " ;
$sql .= ' LEFT JOIN ' . MAIN_DB_PREFIX . 'c_incoterms as i ON e.fk_incoterms = i.rowid' ;
$sql .= ' LEFT JOIN ' . MAIN_DB_PREFIX . 'c_shipment_mode as s ON e.fk_shipping_method = s.rowid' ;
$sql .= " WHERE e.entity IN ( " . getEntity ( 'expedition' ) . " ) " ;
2021-02-25 22:38:35 +01:00
if ( $id ) {
2021-04-24 20:18:11 +02:00
$sql .= " AND e.rowid = " . (( int ) $id );
2021-02-25 22:38:35 +01:00
}
if ( $ref ) {
$sql .= " AND e.ref=' " . $this -> db -> escape ( $ref ) . " ' " ;
}
if ( $ref_ext ) {
$sql .= " AND e.ref_ext=' " . $this -> db -> escape ( $ref_ext ) . " ' " ;
}
if ( $notused ) {
$sql .= " AND e.ref_int=' " . $this -> db -> escape ( $notused ) . " ' " ;
}
2008-10-25 13:16:39 +02:00
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 );
2021-02-25 22:38:35 +01:00
if ( $result ) {
if ( $this -> db -> num_rows ( $result )) {
2009-01-29 21:56:14 +01:00
$obj = $this -> db -> fetch_object ( $result );
$this -> id = $obj -> rowid ;
2020-05-18 11:03:32 +02:00
$this -> entity = $obj -> entity ;
2009-01-29 21:56:14 +01:00
$this -> ref = $obj -> ref ;
$this -> socid = $obj -> socid ;
2020-03-12 12:45:44 +01:00
$this -> ref_customer = $obj -> ref_customer ;
2018-08-30 13:54:10 +02:00
$this -> ref_ext = $obj -> ref_ext ;
$this -> ref_int = $obj -> ref_int ;
2009-01-29 21:56:14 +01:00
$this -> statut = $obj -> fk_statut ;
$this -> user_author_id = $obj -> fk_user_author ;
2010-05-13 01:03:33 +02:00
$this -> date_creation = $this -> db -> jdate ( $obj -> date_creation );
2020-10-28 17:49:52 +01:00
$this -> date_valid = $this -> db -> jdate ( $obj -> date_valid );
2020-03-12 12:45:44 +01:00
$this -> date = $this -> db -> jdate ( $obj -> date_expedition ); // TODO deprecated
$this -> date_expedition = $this -> db -> jdate ( $obj -> date_expedition ); // TODO deprecated
$this -> date_shipping = $this -> db -> jdate ( $obj -> date_expedition ); // Date real
$this -> date_delivery = $this -> db -> jdate ( $obj -> date_delivery ); // Date planed
2010-07-29 14:37:09 +02:00
$this -> fk_delivery_address = $obj -> fk_address ;
2020-08-18 14:48:38 +02:00
$this -> model_pdf = $obj -> model_pdf ;
2021-02-08 18:30:09 +01:00
$this -> modelpdf = $obj -> model_pdf ; // deprecated
2018-08-30 13:54:10 +02:00
$this -> shipping_method_id = $obj -> fk_shipping_method ;
2020-03-12 12:45:44 +01:00
$this -> shipping_method = $obj -> shipping_method ;
2009-01-29 21:56:14 +01:00
$this -> tracking_number = $obj -> tracking_number ;
2020-03-12 12:45:44 +01:00
$this -> origin = ( $obj -> origin ? $obj -> origin : 'commande' ); // For compatibility
2010-03-13 16:52:30 +01:00
$this -> origin_id = $obj -> origin_id ;
2017-10-12 21:19:24 +02:00
$this -> billed = $obj -> billed ;
2020-03-12 12:45:44 +01:00
$this -> fk_project = $obj -> fk_project ;
2009-01-29 21:56:14 +01:00
$this -> trueWeight = $obj -> weight ;
$this -> weight_units = $obj -> weight_units ;
$this -> trueWidth = $obj -> width ;
$this -> width_units = $obj -> size_units ;
$this -> trueHeight = $obj -> height ;
$this -> height_units = $obj -> size_units ;
$this -> trueDepth = $obj -> size ;
$this -> depth_units = $obj -> size_units ;
2013-04-11 21:53:41 +02:00
2013-04-09 17:18:07 +02:00
$this -> note_public = $obj -> note_public ;
$this -> note_private = $obj -> note_private ;
2009-01-29 21:56:14 +01:00
// A denormalized value
2018-08-30 13:54:10 +02:00
$this -> trueSize = $obj -> size . " x " . $obj -> width . " x " . $obj -> height ;
2009-01-29 21:56:14 +01:00
$this -> size_units = $obj -> size_units ;
2015-02-23 09:16:14 +01:00
//Incoterms
2018-08-30 13:54:10 +02:00
$this -> fk_incoterms = $obj -> fk_incoterms ;
$this -> location_incoterms = $obj -> location_incoterms ;
2019-09-27 14:11:14 +02:00
$this -> label_incoterms = $obj -> label_incoterms ;
2015-04-07 02:44:30 +02:00
2009-01-29 21:56:14 +01:00
$this -> db -> free ( $result );
2021-02-25 22:38:35 +01:00
if ( $this -> statut == self :: STATUS_DRAFT ) {
$this -> brouillon = 1 ;
}
2009-01-29 21:56:14 +01:00
2011-06-19 21:47:09 +02:00
// Tracking url
2018-12-15 18:30:35 +01:00
$this -> getUrlTrackingStatus ( $obj -> tracking_number );
2009-01-29 21:56:14 +01:00
2020-11-16 16:31:05 +01:00
// Thirdparty
2020-12-01 02:41:19 +01:00
$result = $this -> fetch_thirdparty (); // TODO Remove this
2016-09-07 12:41:32 +02:00
2020-10-23 20:08:35 +02:00
// Retrieve extrafields
2018-02-20 19:38:18 +01:00
$this -> fetch_optionals ();
2020-03-31 11:04:46 +02:00
2020-03-31 10:57:52 +02:00
// Fix Get multicurrency param for transmited
2021-02-25 22:38:35 +01:00
if ( ! empty ( $conf -> multicurrency -> enabled )) {
if ( ! empty ( $this -> multicurrency_code )) {
$this -> multicurrency_code = $this -> thirdparty -> multicurrency_code ;
}
if ( ! empty ( $conf -> global -> MULTICURRENCY_USE_ORIGIN_TX ) && ! empty ( $this -> thirdparty -> multicurrency_tx )) {
$this -> multicurrency_tx = $this -> thirdparty -> multicurrency_tx ;
}
2020-03-31 10:57:52 +02:00
}
2020-03-31 11:04:46 +02:00
2009-01-29 21:56:14 +01:00
/*
2010-03-13 16:52:30 +01:00
* Lines
2009-01-29 21:56:14 +01:00
*/
2019-11-13 19:37:08 +01:00
$result = $this -> fetch_lines ();
2021-02-25 22:38:35 +01:00
if ( $result < 0 ) {
2009-01-29 21:56:14 +01:00
return - 3 ;
}
return 1 ;
2020-05-21 15:05:19 +02:00
} else {
2015-02-16 19:14:34 +01:00
dol_syslog ( get_class ( $this ) . '::Fetch no expedition found' , LOG_ERR );
2019-11-13 19:37:08 +01:00
$this -> error = 'Delivery with id ' . $id . ' not found' ;
2015-02-16 19:14:34 +01:00
return 0 ;
2009-01-29 21:56:14 +01:00
}
2020-05-21 15:05:19 +02:00
} else {
2019-11-13 19:37:08 +01:00
$this -> error = $this -> db -> error ();
2008-10-25 13:16:39 +02:00
return - 1 ;
}
}
/**
2011-11-08 00:03:19 +01:00
* Validate object and update stock if option enabled
2011-09-29 22:32:28 +02:00
*
2011-11-08 00:03:19 +01:00
* @ param User $user Object user that validate
2017-10-07 13:09:31 +02:00
* @ param int $notrigger 1 = Does not execute triggers , 0 = execute triggers
2011-11-08 00:03:19 +01:00
* @ return int < 0 if OK , > 0 if KO
2008-10-25 13:16:39 +02:00
*/
2019-02-24 23:32:09 +01:00
public function valid ( $user , $notrigger = 0 )
2008-10-25 13:16:39 +02:00
{
2011-05-30 20:49:31 +02:00
global $conf , $langs ;
2011-08-31 16:42:47 +02:00
2017-10-07 13:09:31 +02:00
require_once DOL_DOCUMENT_ROOT . '/core/lib/files.lib.php' ;
2008-10-25 13:16:39 +02:00
2012-01-04 23:56:10 +01:00
dol_syslog ( get_class ( $this ) . " ::valid " );
2008-10-25 13:16:39 +02:00
2009-05-07 23:38:56 +02:00
// Protection
2021-02-25 22:38:35 +01:00
if ( $this -> statut ) {
2021-01-08 01:56:23 +01:00
dol_syslog ( get_class ( $this ) . " ::valid not in draft status " , LOG_WARNING );
2009-05-07 23:38:56 +02:00
return 0 ;
}
2019-11-13 19:37:08 +01:00
if ( ! (( empty ( $conf -> global -> MAIN_USE_ADVANCED_PERMS ) && ! empty ( $user -> rights -> expedition -> creer ))
2021-02-25 22:38:35 +01:00
|| ( ! empty ( $conf -> global -> MAIN_USE_ADVANCED_PERMS ) && ! empty ( $user -> rights -> expedition -> shipping_advance -> validate )))) {
2019-11-13 19:37:08 +01:00
$this -> error = 'Permission denied' ;
2012-01-04 23:56:10 +01:00
dol_syslog ( get_class ( $this ) . " ::valid " . $this -> error , LOG_ERR );
2009-05-07 23:38:56 +02:00
return - 1 ;
}
2008-10-25 13:16:39 +02:00
$this -> db -> begin ();
2010-06-17 22:24:11 +02:00
$error = 0 ;
2009-05-07 23:38:56 +02:00
// Define new ref
2011-02-20 01:20:45 +01:00
$soc = new Societe ( $this -> db );
$soc -> fetch ( $this -> socid );
2008-10-25 13:16:39 +02:00
2011-02-20 01:20:45 +01:00
// Class of company linked to order
2019-11-13 19:37:08 +01:00
$result = $soc -> set_as_client ();
2011-02-20 01:20:45 +01:00
// Define new ref
2021-02-25 22:38:35 +01:00
if ( ! $error && ( preg_match ( '/^[\(]?PROV/i' , $this -> ref ) || empty ( $this -> ref ))) { // empty should not happened, but when it occurs, the test save life
2011-06-15 21:53:37 +02:00
$numref = $this -> getNextNumRef ( $soc );
2020-05-21 15:05:19 +02:00
} else {
2011-06-15 21:53:37 +02:00
$numref = " EXP " . $this -> id ;
2011-02-20 01:20:45 +01:00
}
2020-03-03 11:49:17 +01:00
$this -> newref = dol_sanitizeFileName ( $numref );
2011-02-20 23:53:59 +01:00
2019-11-13 19:37:08 +01:00
$now = dol_now ();
2010-05-18 09:22:58 +02:00
2009-05-07 23:38:56 +02:00
// Validate
2010-03-13 16:52:30 +01:00
$sql = " UPDATE " . MAIN_DB_PREFIX . " expedition SET " ;
2020-09-20 02:30:53 +02:00
$sql .= " ref=' " . $this -> db -> escape ( $numref ) . " ' " ;
2019-11-13 19:37:08 +01:00
$sql .= " , fk_statut = 1 " ;
$sql .= " , date_valid = ' " . $this -> db -> idate ( $now ) . " ' " ;
$sql .= " , fk_user_valid = " . $user -> id ;
2021-08-27 16:33:03 +02:00
$sql .= " WHERE rowid = " . (( int ) $this -> id );
2008-10-25 13:16:39 +02:00
2014-06-12 11:31:53 +02:00
dol_syslog ( get_class ( $this ) . " ::valid update expedition " , LOG_DEBUG );
2019-11-13 19:37:08 +01:00
$resql = $this -> db -> query ( $sql );
2021-02-25 22:38:35 +01:00
if ( ! $resql ) {
2019-11-13 19:37:08 +01:00
$this -> error = $this -> db -> lasterror ();
2009-05-07 23:38:56 +02:00
$error ++ ;
}
2009-01-29 13:39:52 +01:00
2010-06-17 22:24:11 +02:00
// If stock increment is done on sending (recommanded choice)
2021-02-25 22:38:35 +01:00
if ( ! $error && ! empty ( $conf -> stock -> enabled ) && ! empty ( $conf -> global -> STOCK_CALCULATE_ON_SHIPMENT )) {
2012-08-22 23:11:24 +02:00
require_once DOL_DOCUMENT_ROOT . '/product/stock/class/mouvementstock.class.php' ;
2011-08-31 16:42:47 +02:00
2011-05-30 20:49:31 +02:00
$langs -> load ( " agenda " );
2010-06-17 22:24:11 +02:00
// Loop on each product line to add a stock movement
2015-08-14 23:53:59 +02:00
$sql = " SELECT cd.fk_product, cd.subprice, " ;
2019-11-13 19:37:08 +01:00
$sql .= " ed.rowid, ed.qty, ed.fk_entrepot, " ;
$sql .= " edb.rowid as edbrowid, edb.eatby, edb.sellby, edb.batch, edb.qty as edbqty, edb.fk_origin_stock " ;
$sql .= " FROM " . MAIN_DB_PREFIX . " commandedet as cd, " ;
$sql .= " " . MAIN_DB_PREFIX . " expeditiondet as ed " ;
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . " expeditiondet_batch as edb on edb.fk_expeditiondet = ed.rowid " ;
2021-08-23 19:33:24 +02:00
$sql .= " WHERE ed.fk_expedition = " . (( int ) $this -> id );
2019-11-13 19:37:08 +01:00
$sql .= " AND cd.rowid = ed.fk_origin_line " ;
2010-06-17 22:24:11 +02:00
2014-06-12 11:31:53 +02:00
dol_syslog ( get_class ( $this ) . " ::valid select details " , LOG_DEBUG );
2019-11-13 19:37:08 +01:00
$resql = $this -> db -> query ( $sql );
2021-02-25 22:38:35 +01:00
if ( $resql ) {
2015-08-19 10:42:54 +02:00
$cpt = $this -> db -> num_rows ( $resql );
2021-02-25 22:38:35 +01:00
for ( $i = 0 ; $i < $cpt ; $i ++ ) {
2014-10-06 14:10:27 +02:00
$obj = $this -> db -> fetch_object ( $resql );
2021-02-25 22:38:35 +01:00
if ( empty ( $obj -> edbrowid )) {
2015-08-27 19:52:43 +02:00
$qty = $obj -> qty ;
2020-05-21 15:05:19 +02:00
} else {
2015-08-27 19:52:43 +02:00
$qty = $obj -> edbqty ;
}
2021-02-25 22:38:35 +01:00
if ( $qty <= 0 ) {
continue ;
}
2015-08-14 23:53:59 +02:00
dol_syslog ( get_class ( $this ) . " ::valid movement index " . $i . " ed.rowid= " . $obj -> rowid . " edb.rowid= " . $obj -> edbrowid );
2010-06-17 22:24:11 +02:00
2011-05-24 01:46:39 +02:00
//var_dump($this->lines[$i]);
$mouvS = new MouvementStock ( $this -> db );
2022-05-18 11:23:21 +02:00
//$mouvS->origin = dol_clone($this, 1);
2022-03-22 13:46:55 +01:00
$mouvS -> setOrigin ( $this -> element , $this -> id );
2016-09-07 12:41:32 +02:00
2021-02-25 22:38:35 +01:00
if ( empty ( $obj -> edbrowid )) {
2015-08-14 23:53:59 +02:00
// line without batch detail
2016-09-07 12:41:32 +02:00
2016-05-27 16:49:55 +02:00
// We decrement stock of product (and sub-products) -> update table llx_product_stock (key of this table is fk_product+fk_entrepot) and add a movement record.
2022-06-25 04:15:04 +02:00
$result = $mouvS -> livraison ( $user , $obj -> fk_product , $obj -> fk_entrepot , $qty , $obj -> subprice , $langs -> trans ( " ShipmentValidatedInDolibarr " , $numref ), '' , '' , '' , '' , 0 , '' , 1 );
2021-01-08 01:56:23 +01:00
2015-08-19 10:42:54 +02:00
if ( $result < 0 ) {
2016-09-07 12:41:32 +02:00
$error ++ ;
2019-05-07 22:57:27 +02:00
$this -> error = $mouvS -> error ;
2017-07-04 21:45:38 +02:00
$this -> errors = array_merge ( $this -> errors , $mouvS -> errors );
2016-05-17 01:10:11 +02:00
break ;
2015-08-15 11:21:50 +02:00
}
2020-05-21 15:05:19 +02:00
} else {
2015-08-14 23:53:59 +02:00
// line with batch detail
2016-09-07 12:41:32 +02:00
2016-05-27 16:49:55 +02:00
// We decrement stock of product (and sub-products) -> update table llx_product_stock (key of this table is fk_product+fk_entrepot) and add a movement record.
2017-10-07 13:09:31 +02:00
// Note: ->fk_origin_stock = id into table llx_product_batch (may be rename into llx_product_stock_batch in another version)
2022-06-25 04:15:04 +02:00
$result = $mouvS -> livraison ( $user , $obj -> fk_product , $obj -> fk_entrepot , $qty , $obj -> subprice , $langs -> trans ( " ShipmentValidatedInDolibarr " , $numref ), '' , $this -> db -> jdate ( $obj -> eatby ), $this -> db -> jdate ( $obj -> sellby ), $obj -> batch , $obj -> fk_origin_stock , '' , 1 );
2015-08-14 23:53:59 +02:00
if ( $result < 0 ) {
2016-09-07 12:41:32 +02:00
$error ++ ;
2019-05-07 22:57:27 +02:00
$this -> error = $mouvS -> error ;
2017-07-04 21:48:38 +02:00
$this -> errors = array_merge ( $this -> errors , $mouvS -> errors );
2016-05-17 01:10:11 +02:00
break ;
2014-03-07 11:35:16 +01:00
}
}
2009-05-07 23:38:56 +02:00
}
2022-06-25 04:15:04 +02:00
// If some stock lines are now 0, we can remove entry into llx_product_stock, but only if there is no child lines into llx_product_batch (detail of batch, because we can imagine
// having a lot1/qty=X and lot2/qty=-X, so 0 but we must not loose repartition of different lot.
$sql = " DELETE FROM " . MAIN_DB_PREFIX . " product_stock WHERE reel = 0 AND rowid NOT IN (SELECT fk_product_stock FROM " . MAIN_DB_PREFIX . " product_batch as pb) " ;
$resql = $this -> db -> query ( $sql );
// We do not test error, it can fails if there is child in batch details
2020-05-21 15:05:19 +02:00
} else {
2010-06-17 22:24:11 +02:00
$this -> db -> rollback ();
2019-11-13 19:37:08 +01:00
$this -> error = $this -> db -> error ();
2010-06-17 22:24:11 +02:00
return - 2 ;
2009-05-07 23:38:56 +02:00
}
2016-05-27 16:49:55 +02:00
}
// Change status of order to "shipment in process"
$ret = $this -> setStatut ( Commande :: STATUS_SHIPMENTONPROCESS , $this -> origin_id , $this -> origin );
2021-02-25 22:38:35 +01:00
if ( ! $ret ) {
2017-10-07 13:09:31 +02:00
$error ++ ;
2009-05-07 23:38:56 +02:00
}
2016-09-07 12:41:32 +02:00
2021-02-25 22:38:35 +01:00
if ( ! $error && ! $notrigger ) {
2017-10-07 13:09:31 +02:00
// Call trigger
2019-11-13 19:37:08 +01:00
$result = $this -> call_trigger ( 'SHIPPING_VALIDATE' , $user );
2021-02-25 22:38:35 +01:00
if ( $result < 0 ) {
$error ++ ;
}
2017-10-07 13:09:31 +02:00
// End call triggers
2014-10-27 03:24:45 +01:00
}
2021-02-25 22:38:35 +01:00
if ( ! $error ) {
2017-10-07 13:09:31 +02:00
$this -> oldref = $this -> ref ;
2012-08-22 23:11:24 +02:00
// Rename directory if dir was a temporary ref
2021-02-25 22:38:35 +01:00
if ( preg_match ( '/^[\(]?PROV/i' , $this -> ref )) {
2019-07-28 22:26:55 +02:00
// Now we rename also files into index
2020-03-12 12:45:44 +01:00
$sql = 'UPDATE ' . MAIN_DB_PREFIX . " ecm_files set filename = CONCAT(' " . $this -> db -> escape ( $this -> newref ) . " ', SUBSTR(filename, " . ( strlen ( $this -> ref ) + 1 ) . " )), filepath = 'expedition/sending/ " . $this -> db -> escape ( $this -> newref ) . " ' " ;
2021-08-23 19:33:24 +02:00
$sql .= " WHERE filename LIKE ' " . $this -> db -> escape ( $this -> ref ) . " %' AND filepath = 'expedition/sending/ " . $this -> db -> escape ( $this -> ref ) . " ' and entity = " . (( int ) $conf -> entity );
2019-07-28 22:26:55 +02:00
$resql = $this -> db -> query ( $sql );
2021-02-25 22:38:35 +01:00
if ( ! $resql ) {
$error ++ ; $this -> error = $this -> db -> lasterror ();
}
2019-07-28 22:26:55 +02:00
// We rename directory ($this->ref = old ref, $num = new ref) in order not to lose the attachments
2012-08-22 23:11:24 +02:00
$oldref = dol_sanitizeFileName ( $this -> ref );
$newref = dol_sanitizeFileName ( $numref );
$dirsource = $conf -> expedition -> dir_output . '/sending/' . $oldref ;
$dirdest = $conf -> expedition -> dir_output . '/sending/' . $newref ;
2021-02-25 22:38:35 +01:00
if ( ! $error && file_exists ( $dirsource )) {
2012-08-22 23:11:24 +02:00
dol_syslog ( get_class ( $this ) . " ::valid rename dir " . $dirsource . " into " . $dirdest );
2021-02-25 22:38:35 +01:00
if ( @ rename ( $dirsource , $dirdest )) {
2017-10-07 13:09:31 +02:00
dol_syslog ( " Rename ok " );
// Rename docs starting with $oldref with $newref
2019-11-13 19:37:08 +01:00
$listoffiles = dol_dir_list ( $conf -> expedition -> dir_output . '/sending/' . $newref , 'files' , 1 , '^' . preg_quote ( $oldref , '/' ));
2021-02-25 22:38:35 +01:00
foreach ( $listoffiles as $fileentry ) {
2019-11-13 19:37:08 +01:00
$dirsource = $fileentry [ 'name' ];
$dirdest = preg_replace ( '/^' . preg_quote ( $oldref , '/' ) . '/' , $newref , $dirsource );
$dirsource = $fileentry [ 'path' ] . '/' . $dirsource ;
$dirdest = $fileentry [ 'path' ] . '/' . $dirdest ;
2017-10-07 13:09:31 +02:00
@ rename ( $dirsource , $dirdest );
}
2012-08-22 23:11:24 +02:00
}
}
2009-05-07 23:38:56 +02:00
}
}
2011-06-17 15:39:38 +02:00
// Set new ref and current status
2021-02-25 22:38:35 +01:00
if ( ! $error ) {
2011-06-15 21:53:37 +02:00
$this -> ref = $numref ;
2019-02-05 11:58:49 +01:00
$this -> statut = self :: STATUS_VALIDATED ;
2009-05-07 23:38:56 +02:00
}
2021-02-25 22:38:35 +01:00
if ( ! $error ) {
2009-05-07 23:38:56 +02:00
$this -> db -> commit ();
return 1 ;
2020-05-21 15:05:19 +02:00
} else {
2008-10-25 13:16:39 +02:00
$this -> db -> rollback ();
2020-03-12 12:45:44 +01:00
return - 1 * $error ;
2008-10-25 13:16:39 +02:00
}
}
2020-10-28 17:49:52 +01:00
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
2008-10-25 13:16:39 +02:00
/**
2016-01-13 20:41:32 +01:00
* Create a delivery receipt from a shipment
2011-09-29 22:32:28 +02:00
*
2016-01-13 20:41:32 +01:00
* @ param User $user User
2011-09-29 22:32:28 +02:00
* @ return int < 0 if KO , >= 0 if OK
2008-10-25 13:16:39 +02:00
*/
2019-02-24 23:32:09 +01:00
public function create_delivery ( $user )
2008-10-25 13:16:39 +02:00
{
2020-10-28 17:49:52 +01:00
// phpcs:enable
2008-10-25 13:16:39 +02:00
global $conf ;
2021-02-25 22:38:35 +01:00
if ( $conf -> delivery_note -> enabled ) {
if ( $this -> statut == self :: STATUS_VALIDATED || $this -> statut == self :: STATUS_CLOSED ) {
2009-11-12 14:33:55 +01:00
// Expedition validee
2020-10-05 13:59:06 +02:00
include_once DOL_DOCUMENT_ROOT . '/delivery/class/delivery.class.php' ;
$delivery = new Delivery ( $this -> db );
2019-11-13 19:37:08 +01:00
$result = $delivery -> create_from_sending ( $user , $this -> id );
2021-02-25 22:38:35 +01:00
if ( $result > 0 ) {
2009-08-05 18:42:04 +02:00
return $result ;
2020-05-21 15:05:19 +02:00
} else {
2019-11-13 19:37:08 +01:00
$this -> error = $delivery -> error ;
2009-08-05 18:42:04 +02:00
return $result ;
}
2021-02-25 22:38:35 +01:00
} else {
return 0 ;
}
} else {
return 0 ;
}
2008-10-25 13:16:39 +02:00
}
/**
2016-11-14 13:40:41 +01:00
* Add an expedition line .
2015-02-16 20:46:54 +01:00
* If STOCK_WAREHOUSE_NOT_REQUIRED_FOR_SHIPMENTS is set , you can add a shipment line , with no stock source defined
* If STOCK_MUST_BE_ENOUGH_FOR_SHIPMENT is not set , you can add a shipment line , even if not enough into stock
2022-07-10 18:35:23 +02:00
* Note : For product that need a batch number , you must use addline_batch ()
2012-01-04 23:56:10 +01:00
*
* @ param int $entrepot_id Id of warehouse
2015-02-16 20:46:54 +01:00
* @ param int $id Id of source line ( order line )
2012-01-04 23:56:10 +01:00
* @ param int $qty Quantity
2016-11-14 13:40:41 +01:00
* @ param array $array_options extrafields array
2012-01-04 23:56:10 +01:00
* @ return int < 0 if KO , > 0 if OK
2008-10-25 13:16:39 +02:00
*/
2019-02-24 23:32:09 +01:00
public function addline ( $entrepot_id , $id , $qty , $array_options = 0 )
2008-10-25 13:16:39 +02:00
{
2014-03-15 14:59:27 +01:00
global $conf , $langs ;
2014-10-18 16:27:15 +02:00
2011-09-17 21:49:50 +02:00
$num = count ( $this -> lines );
2010-03-13 16:52:30 +01:00
$line = new ExpeditionLigne ( $this -> db );
2008-10-25 13:16:39 +02:00
2010-03-13 16:52:30 +01:00
$line -> entrepot_id = $entrepot_id ;
$line -> origin_line_id = $id ;
2020-11-16 16:31:05 +01:00
$line -> fk_origin_line = $id ;
2010-03-13 16:52:30 +01:00
$line -> qty = $qty ;
2014-10-18 16:27:15 +02:00
2015-02-16 20:46:54 +01:00
$orderline = new OrderLine ( $this -> db );
$orderline -> fetch ( $id );
2014-10-18 16:27:15 +02:00
2019-08-06 15:10:13 +02:00
// Copy the rang of the order line to the expedition line
$line -> rang = $orderline -> rang ;
2022-03-01 01:28:47 +01:00
$line -> product_type = $orderline -> product_type ;
2019-08-06 15:10:13 +02:00
2021-02-25 22:38:35 +01:00
if ( ! empty ( $conf -> stock -> enabled ) && ! empty ( $orderline -> fk_product )) {
2015-06-03 21:21:20 +02:00
$fk_product = $orderline -> fk_product ;
2020-11-16 16:31:05 +01:00
if ( ! ( $entrepot_id > 0 ) && empty ( $conf -> global -> STOCK_WAREHOUSE_NOT_REQUIRED_FOR_SHIPMENTS )) {
2017-10-07 13:09:31 +02:00
$langs -> load ( " errors " );
2019-11-13 19:37:08 +01:00
$this -> error = $langs -> trans ( " ErrorWarehouseRequiredIntoShipmentLine " );
2015-02-16 20:46:54 +01:00
return - 1 ;
}
2014-10-18 16:27:15 +02:00
2022-06-27 09:00:57 +02:00
if ( ! empty ( $conf -> global -> STOCK_MUST_BE_ENOUGH_FOR_SHIPMENT )) {
2019-11-13 19:37:08 +01:00
$product = new Product ( $this -> db );
2020-11-16 16:31:05 +01:00
$product -> fetch ( $fk_product );
2014-10-18 16:27:15 +02:00
2020-11-16 16:31:05 +01:00
// Check must be done for stock of product into warehouse if $entrepot_id defined
2016-02-14 22:20:42 +01:00
if ( $entrepot_id > 0 ) {
2016-12-05 18:14:03 +01:00
$product -> load_stock ( 'warehouseopen' );
2016-02-01 13:40:02 +01:00
$product_stock = $product -> stock_warehouse [ $entrepot_id ] -> real ;
2020-11-16 16:31:05 +01:00
} else {
$product_stock = $product -> stock_reel ;
}
2014-10-18 16:27:15 +02:00
2019-11-13 19:37:08 +01:00
$product_type = $product -> type ;
2020-11-16 16:31:05 +01:00
if ( $product_type == 0 || ! empty ( $conf -> global -> STOCK_SUPPORTS_SERVICES )) {
$isavirtualproduct = ( $product -> hasFatherOrChild ( 1 ) > 0 );
// The product is qualified for a check of quantity (must be enough in stock to be added into shipment).
if ( ! $isavirtualproduct || empty ( $conf -> global -> PRODUIT_SOUSPRODUITS ) || ( $isavirtualproduct && empty ( $conf -> global -> STOCK_EXCLUDE_VIRTUAL_PRODUCTS ))) { // If STOCK_EXCLUDE_VIRTUAL_PRODUCTS is set, we do not manage stock for kits/virtual products.
if ( $product_stock < $qty ) {
$langs -> load ( " errors " );
$this -> error = $langs -> trans ( 'ErrorStockIsNotEnoughToAddProductOnShipment' , $product -> ref );
$this -> errorhidden = 'ErrorStockIsNotEnoughToAddProductOnShipment' ;
2020-11-22 02:32:47 +01:00
2020-11-16 16:31:05 +01:00
$this -> db -> rollback ();
return - 3 ;
}
}
2014-03-15 14:59:27 +01:00
}
}
}
2016-09-07 12:41:32 +02:00
2016-11-14 13:40:41 +01:00
// If product need a batch number, we should not have called this function but addline_batch instead.
2021-02-25 22:38:35 +01:00
if ( ! empty ( $conf -> productbatch -> enabled ) && ! empty ( $orderline -> fk_product ) && ! empty ( $orderline -> product_tobatch )) {
2019-11-13 19:37:08 +01:00
$this -> error = 'ADDLINE_WAS_CALLED_INSTEAD_OF_ADDLINEBATCH' ;
2017-10-07 13:09:31 +02:00
return - 4 ;
2016-11-14 13:40:41 +01:00
}
2017-06-23 11:12:17 +02:00
2015-12-16 16:18:29 +01:00
// extrafields
2021-02-25 22:38:35 +01:00
if ( empty ( $conf -> global -> MAIN_EXTRAFIELDS_DISABLED ) && is_array ( $array_options ) && count ( $array_options ) > 0 ) { // For avoid conflicts if trigger used
2015-12-16 16:18:29 +01:00
$line -> array_options = $array_options ;
2021-02-25 22:38:35 +01:00
}
2016-09-07 12:41:32 +02:00
2010-12-15 08:12:28 +01:00
$this -> lines [ $num ] = $line ;
2022-03-01 01:28:47 +01:00
return 1 ;
2008-10-25 13:16:39 +02:00
}
2020-10-28 17:49:52 +01:00
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
2017-10-07 13:09:31 +02:00
/**
2014-03-07 11:35:16 +01:00
* Add a shipment line with batch record
*
* @ param array $dbatch Array of value ( key 'detail' -> Array , key 'qty' total quantity for line , key ix_l : original line index )
2015-12-16 16:18:29 +01:00
* @ param array $array_options extrafields array
2015-02-16 20:14:16 +01:00
* @ return int < 0 if KO , > 0 if OK
2014-03-07 11:35:16 +01:00
*/
2019-02-24 23:32:09 +01:00
public function addline_batch ( $dbatch , $array_options = 0 )
2014-03-07 11:35:16 +01:00
{
2020-10-28 17:49:52 +01:00
// phpcs:enable
2019-11-13 19:37:08 +01:00
global $conf , $langs ;
2016-02-15 01:37:23 +01:00
2014-03-07 11:35:16 +01:00
$num = count ( $this -> lines );
2021-02-25 22:38:35 +01:00
if ( $dbatch [ 'qty' ] > 0 ) {
2014-03-07 11:35:16 +01:00
$line = new ExpeditionLigne ( $this -> db );
2019-11-13 19:37:08 +01:00
$tab = array ();
2021-02-25 22:38:35 +01:00
foreach ( $dbatch [ 'detail' ] as $key => $value ) {
if ( $value [ 'q' ] > 0 ) {
2015-08-14 23:53:59 +02:00
// $value['q']=qty to move
// $value['id_batch']=id into llx_product_batch of record to move
2015-08-19 10:42:54 +02:00
//var_dump($value);
2015-08-20 14:36:32 +02:00
2017-10-07 13:09:31 +02:00
$linebatch = new ExpeditionLineBatch ( $this -> db );
2019-11-13 19:37:08 +01:00
$ret = $linebatch -> fetchFromStock ( $value [ 'id_batch' ]); // load serial, sellby, eatby
2021-02-25 22:38:35 +01:00
if ( $ret < 0 ) {
2019-11-13 19:37:08 +01:00
$this -> error = $linebatch -> error ;
2014-03-07 11:35:16 +01:00
return - 1 ;
}
2019-11-13 19:37:08 +01:00
$linebatch -> qty = $value [ 'q' ];
$tab [] = $linebatch ;
2015-02-16 20:51:05 +01:00
2021-02-25 22:38:35 +01:00
if ( $conf -> global -> STOCK_MUST_BE_ENOUGH_FOR_SHIPMENT ) {
2016-02-03 11:33:13 +01:00
require_once DOL_DOCUMENT_ROOT . '/product/class/productbatch.class.php' ;
$prod_batch = new Productbatch ( $this -> db );
$prod_batch -> fetch ( $value [ 'id_batch' ]);
2021-02-25 22:38:35 +01:00
if ( $prod_batch -> qty < $linebatch -> qty ) {
2017-10-07 13:09:31 +02:00
$langs -> load ( " errors " );
2019-11-13 19:37:08 +01:00
$this -> errors [] = $langs -> trans ( 'ErrorStockIsNotEnoughToAddProductOnShipment' , $prod_batch -> fk_product );
2016-02-03 11:33:13 +01:00
dol_syslog ( get_class ( $this ) . " ::addline_batch error=Product " . $prod_batch -> batch . " : " . $this -> errorsToString (), LOG_ERR );
$this -> db -> rollback ();
return - 1 ;
}
2015-02-16 20:51:05 +01:00
}
2016-09-07 12:41:32 +02:00
2015-08-14 23:53:59 +02:00
//var_dump($linebatch);
2014-03-07 11:35:16 +01:00
}
}
$line -> entrepot_id = $linebatch -> entrepot_id ;
2020-04-25 13:52:07 +02:00
$line -> origin_line_id = $dbatch [ 'ix_l' ]; // deprecated
2020-04-23 13:21:39 +02:00
$line -> fk_origin_line = $dbatch [ 'ix_l' ];
2014-03-07 11:35:16 +01:00
$line -> qty = $dbatch [ 'qty' ];
2019-11-13 19:37:08 +01:00
$line -> detail_batch = $tab ;
2015-08-14 23:53:59 +02:00
2015-12-16 16:18:29 +01:00
// extrafields
2021-02-25 22:38:35 +01:00
if ( empty ( $conf -> global -> MAIN_EXTRAFIELDS_DISABLED ) && is_array ( $array_options ) && count ( $array_options ) > 0 ) { // For avoid conflicts if trigger used
2015-12-16 16:18:29 +01:00
$line -> array_options = $array_options ;
2021-02-25 22:38:35 +01:00
}
2016-09-07 12:41:32 +02:00
2015-08-14 23:53:59 +02:00
//var_dump($line);
2014-03-07 11:35:16 +01:00
$this -> lines [ $num ] = $line ;
2016-02-03 11:33:13 +01:00
return 1 ;
2014-03-07 11:35:16 +01:00
}
}
2017-10-07 13:09:31 +02: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
*/
2019-02-24 23:32:09 +01:00
public function update ( $user = null , $notrigger = 0 )
2017-10-07 13:09:31 +02:00
{
global $conf ;
2019-11-13 19:37:08 +01:00
$error = 0 ;
2010-05-17 16:13:03 +02:00
// Clean parameters
2021-02-25 22:38:35 +01:00
if ( isset ( $this -> ref )) {
$this -> ref = trim ( $this -> ref );
}
if ( isset ( $this -> entity )) {
$this -> entity = ( int ) $this -> entity ;
}
if ( isset ( $this -> ref_customer )) {
$this -> ref_customer = trim ( $this -> ref_customer );
}
if ( isset ( $this -> socid )) {
$this -> socid = ( int ) $this -> socid ;
}
if ( isset ( $this -> fk_user_author )) {
$this -> fk_user_author = ( int ) $this -> fk_user_author ;
}
if ( isset ( $this -> fk_user_valid )) {
$this -> fk_user_valid = ( int ) $this -> fk_user_valid ;
}
if ( isset ( $this -> fk_delivery_address )) {
$this -> fk_delivery_address = ( int ) $this -> fk_delivery_address ;
}
if ( isset ( $this -> shipping_method_id )) {
$this -> shipping_method_id = ( int ) $this -> shipping_method_id ;
}
if ( isset ( $this -> tracking_number )) {
$this -> tracking_number = trim ( $this -> tracking_number );
}
if ( isset ( $this -> statut )) {
$this -> statut = ( int ) $this -> statut ;
}
if ( isset ( $this -> trueDepth )) {
$this -> trueDepth = trim ( $this -> trueDepth );
}
if ( isset ( $this -> trueWidth )) {
$this -> trueWidth = trim ( $this -> trueWidth );
}
if ( isset ( $this -> trueHeight )) {
$this -> trueHeight = trim ( $this -> trueHeight );
}
if ( isset ( $this -> size_units )) {
$this -> size_units = trim ( $this -> size_units );
}
if ( isset ( $this -> weight_units )) {
$this -> weight_units = trim ( $this -> weight_units );
}
if ( isset ( $this -> trueWeight )) {
$this -> weight = trim ( $this -> trueWeight );
}
if ( isset ( $this -> note_private )) {
$this -> note_private = trim ( $this -> note_private );
}
if ( isset ( $this -> note_public )) {
$this -> note_public = trim ( $this -> note_public );
}
if ( isset ( $this -> model_pdf )) {
$this -> model_pdf = trim ( $this -> model_pdf );
}
2010-05-17 16:13:03 +02:00
// Check parameters
// Put here code to add control on parameters values
2017-10-07 13:09:31 +02:00
// Update request
$sql = " UPDATE " . MAIN_DB_PREFIX . " expedition SET " ;
2010-05-17 16:13:03 +02:00
2019-11-13 19:37:08 +01:00
$sql .= " ref= " . ( isset ( $this -> ref ) ? " ' " . $this -> db -> escape ( $this -> ref ) . " ' " : " null " ) . " , " ;
2020-05-23 16:46:42 +02:00
$sql .= " ref_ext= " . ( isset ( $this -> ref_ext ) ? " ' " . $this -> db -> escape ( $this -> ref_ext ) . " ' " : " null " ) . " , " ;
2019-11-13 19:37:08 +01:00
$sql .= " ref_customer= " . ( isset ( $this -> ref_customer ) ? " ' " . $this -> db -> escape ( $this -> ref_customer ) . " ' " : " null " ) . " , " ;
$sql .= " fk_soc= " . ( isset ( $this -> socid ) ? $this -> socid : " null " ) . " , " ;
$sql .= " date_creation= " . ( dol_strlen ( $this -> date_creation ) != 0 ? " ' " . $this -> db -> idate ( $this -> date_creation ) . " ' " : 'null' ) . " , " ;
$sql .= " fk_user_author= " . ( isset ( $this -> fk_user_author ) ? $this -> fk_user_author : " null " ) . " , " ;
$sql .= " date_valid= " . ( dol_strlen ( $this -> date_valid ) != 0 ? " ' " . $this -> db -> idate ( $this -> date_valid ) . " ' " : 'null' ) . " , " ;
$sql .= " fk_user_valid= " . ( isset ( $this -> fk_user_valid ) ? $this -> fk_user_valid : " null " ) . " , " ;
$sql .= " date_expedition= " . ( dol_strlen ( $this -> date_expedition ) != 0 ? " ' " . $this -> db -> idate ( $this -> date_expedition ) . " ' " : 'null' ) . " , " ;
$sql .= " date_delivery= " . ( dol_strlen ( $this -> date_delivery ) != 0 ? " ' " . $this -> db -> idate ( $this -> date_delivery ) . " ' " : 'null' ) . " , " ;
$sql .= " fk_address= " . ( isset ( $this -> fk_delivery_address ) ? $this -> fk_delivery_address : " null " ) . " , " ;
$sql .= " fk_shipping_method= " . (( isset ( $this -> shipping_method_id ) && $this -> shipping_method_id > 0 ) ? $this -> shipping_method_id : " null " ) . " , " ;
$sql .= " tracking_number= " . ( isset ( $this -> tracking_number ) ? " ' " . $this -> db -> escape ( $this -> tracking_number ) . " ' " : " null " ) . " , " ;
$sql .= " fk_statut= " . ( isset ( $this -> statut ) ? $this -> statut : " null " ) . " , " ;
$sql .= " fk_projet= " . ( isset ( $this -> fk_project ) ? $this -> fk_project : " null " ) . " , " ;
$sql .= " height= " . (( $this -> trueHeight != '' ) ? $this -> trueHeight : " null " ) . " , " ;
$sql .= " width= " . (( $this -> trueWidth != '' ) ? $this -> trueWidth : " null " ) . " , " ;
$sql .= " size_units= " . ( isset ( $this -> size_units ) ? $this -> size_units : " null " ) . " , " ;
$sql .= " size= " . (( $this -> trueDepth != '' ) ? $this -> trueDepth : " null " ) . " , " ;
$sql .= " weight_units= " . ( isset ( $this -> weight_units ) ? $this -> weight_units : " null " ) . " , " ;
$sql .= " weight= " . (( $this -> trueWeight != '' ) ? $this -> trueWeight : " 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 " ) . " , " ;
2021-02-08 18:30:09 +01:00
$sql .= " model_pdf= " . ( isset ( $this -> model_pdf ) ? " ' " . $this -> db -> escape ( $this -> model_pdf ) . " ' " : " null " ) . " , " ;
2019-11-13 19:37:08 +01:00
$sql .= " entity= " . $conf -> entity ;
2021-03-14 12:20:23 +01:00
$sql .= " WHERE rowid= " . (( int ) $this -> id );
2010-05-17 16:13:03 +02:00
$this -> db -> begin ();
2014-06-12 11:31:53 +02:00
dol_syslog ( get_class ( $this ) . " ::update " , LOG_DEBUG );
2017-10-07 13:09:31 +02:00
$resql = $this -> db -> query ( $sql );
2021-02-25 22:38:35 +01:00
if ( ! $resql ) {
$error ++ ; $this -> errors [] = " Error " . $this -> db -> lasterror ();
}
2010-05-17 16:13:03 +02:00
2020-11-15 16:58:40 +01:00
if ( ! $error && ! $notrigger ) {
// Call trigger
$result = $this -> call_trigger ( 'SHIPPING_MODIFY' , $user );
2021-02-25 22:38:35 +01:00
if ( $result < 0 ) {
$error ++ ;
}
2020-11-15 16:58:40 +01:00
// End call triggers
2010-05-17 16:13:03 +02:00
}
2017-10-07 13:09:31 +02:00
// Commit or rollback
2021-02-25 22:38:35 +01:00
if ( $error ) {
foreach ( $this -> errors as $errmsg ) {
2017-10-07 13:09:31 +02:00
dol_syslog ( get_class ( $this ) . " ::update " . $errmsg , LOG_ERR );
2019-11-13 19:37:08 +01:00
$this -> error .= ( $this -> error ? ', ' . $errmsg : $errmsg );
2010-05-17 16:13:03 +02:00
}
$this -> db -> rollback ();
2019-11-13 19:37:08 +01:00
return - 1 * $error ;
2020-05-21 15:05:19 +02:00
} else {
2010-05-17 16:13:03 +02:00
$this -> db -> commit ();
return 1 ;
}
2017-10-07 13:09:31 +02:00
}
2010-05-17 16:13:03 +02:00
2020-04-23 07:54:13 +02:00
2020-04-23 07:49:31 +02:00
/**
* Cancel shipment .
*
* @ param int $notrigger Disable triggers
2020-10-28 17:49:52 +01:00
* @ param bool $also_update_stock true if the stock should be increased back ( false by default )
2020-04-23 07:49:31 +02:00
* @ return int > 0 if OK , 0 if deletion done but failed to delete files , < 0 if KO
*/
public function cancel ( $notrigger = 0 , $also_update_stock = false )
{
global $conf , $langs , $user ;
require_once DOL_DOCUMENT_ROOT . '/core/lib/files.lib.php' ;
2020-10-31 14:32:18 +01:00
$error = 0 ;
$this -> error = '' ;
2020-04-23 07:49:31 +02:00
$this -> db -> begin ();
// Add a protection to refuse deleting if shipment has at least one delivery
2020-10-31 14:32:18 +01:00
$this -> fetchObjectLinked ( $this -> id , 'shipping' , 0 , 'delivery' ); // Get deliveries linked to this shipment
2020-11-15 16:58:40 +01:00
if ( count ( $this -> linkedObjectsIds ) > 0 ) {
2020-10-31 14:32:18 +01:00
$this -> error = 'ErrorThereIsSomeDeliveries' ;
2020-04-23 07:49:31 +02:00
$error ++ ;
}
2020-11-15 16:58:40 +01:00
if ( ! $error && ! $notrigger ) {
// Call trigger
$result = $this -> call_trigger ( 'SHIPPING_CANCEL' , $user );
2021-02-25 22:38:35 +01:00
if ( $result < 0 ) {
$error ++ ;
}
2020-11-15 16:58:40 +01:00
// End call triggers
2020-04-23 07:49:31 +02:00
}
// Stock control
2020-10-31 14:32:18 +01:00
if ( ! $error && $conf -> stock -> enabled &&
2020-04-23 07:49:31 +02:00
(( $conf -> global -> STOCK_CALCULATE_ON_SHIPMENT && $this -> statut > self :: STATUS_DRAFT ) ||
2021-02-25 22:38:35 +01:00
( $conf -> global -> STOCK_CALCULATE_ON_SHIPMENT_CLOSE && $this -> statut == self :: STATUS_CLOSED && $also_update_stock ))) {
2020-04-23 07:49:31 +02:00
require_once DOL_DOCUMENT_ROOT . " /product/stock/class/mouvementstock.class.php " ;
$langs -> load ( " agenda " );
// Loop on each product line to add a stock movement and delete features
$sql = " SELECT cd.fk_product, cd.subprice, ed.qty, ed.fk_entrepot, ed.rowid as expeditiondet_id " ;
$sql .= " FROM " . MAIN_DB_PREFIX . " commandedet as cd, " ;
$sql .= " " . MAIN_DB_PREFIX . " expeditiondet as ed " ;
2021-08-23 19:33:24 +02:00
$sql .= " WHERE ed.fk_expedition = " . (( int ) $this -> id );
2020-04-23 07:49:31 +02:00
$sql .= " AND cd.rowid = ed.fk_origin_line " ;
dol_syslog ( get_class ( $this ) . " ::delete select details " , LOG_DEBUG );
$resql = $this -> db -> query ( $sql );
2021-02-25 22:38:35 +01:00
if ( $resql ) {
2020-04-23 07:49:31 +02:00
$cpt = $this -> db -> num_rows ( $resql );
2021-09-27 15:41:58 +02:00
$shipmentlinebatch = new ExpeditionLineBatch ( $this -> db );
2021-02-25 22:38:35 +01:00
for ( $i = 0 ; $i < $cpt ; $i ++ ) {
2020-04-23 07:49:31 +02:00
dol_syslog ( get_class ( $this ) . " ::delete movement index " . $i );
$obj = $this -> db -> fetch_object ( $resql );
$mouvS = new MouvementStock ( $this -> db );
// we do not log origin because it will be deleted
$mouvS -> origin = null ;
// get lot/serial
$lotArray = null ;
2022-06-21 20:54:28 +02:00
if ( isModEnabled ( 'productbatch' )) {
2021-09-27 20:09:43 +02:00
$lotArray = $shipmentlinebatch -> fetchAll ( $obj -> expeditiondet_id );
2021-02-25 22:38:35 +01:00
if ( ! is_array ( $lotArray )) {
2022-06-02 10:15:04 +02:00
$error ++ ;
$this -> errors [] = " Error " . $this -> db -> lasterror ();
2020-04-23 07:49:31 +02:00
}
}
2021-09-27 20:09:43 +02:00
2020-04-23 07:49:31 +02:00
if ( empty ( $lotArray )) {
// no lot/serial
// We increment stock of product (and sub-products)
// We use warehouse selected for each line
$result = $mouvS -> reception ( $user , $obj -> fk_product , $obj -> fk_entrepot , $obj -> qty , 0 , $langs -> trans ( " ShipmentCanceledInDolibarr " , $this -> ref )); // Price is set to 0, because we don't want to see WAP changed
2021-02-25 22:38:35 +01:00
if ( $result < 0 ) {
2022-06-02 10:15:04 +02:00
$error ++ ;
$this -> errors = array_merge ( $this -> errors , $mouvS -> errors );
2020-04-23 07:49:31 +02:00
break ;
}
2020-05-21 15:05:19 +02:00
} else {
2020-04-23 07:49:31 +02:00
// We increment stock of batches
// We use warehouse selected for each line
2021-02-25 22:38:35 +01:00
foreach ( $lotArray as $lot ) {
2020-04-23 07:49:31 +02:00
$result = $mouvS -> reception ( $user , $obj -> fk_product , $obj -> fk_entrepot , $lot -> qty , 0 , $langs -> trans ( " ShipmentCanceledInDolibarr " , $this -> ref ), $lot -> eatby , $lot -> sellby , $lot -> batch ); // Price is set to 0, because we don't want to see WAP changed
2021-02-25 22:38:35 +01:00
if ( $result < 0 ) {
2022-06-02 10:15:04 +02:00
$error ++ ;
$this -> errors = array_merge ( $this -> errors , $mouvS -> errors );
2020-04-23 07:49:31 +02:00
break ;
}
}
2021-02-25 22:38:35 +01:00
if ( $error ) {
break ; // break for loop incase of error
}
2020-04-23 07:49:31 +02:00
}
}
2020-05-21 15:05:19 +02:00
} else {
2020-04-23 07:49:31 +02:00
$error ++ ; $this -> errors [] = " Error " . $this -> db -> lasterror ();
}
}
// delete batch expedition line
2021-02-25 22:38:35 +01:00
if ( ! $error && $conf -> productbatch -> enabled ) {
2021-09-27 15:41:58 +02:00
$shipmentlinebatch = new ExpeditionLineBatch ( $this -> db );
if ( $shipmentlinebatch -> deleteFromShipment ( $this -> id ) < 0 ) {
2020-04-23 07:49:31 +02:00
$error ++ ; $this -> errors [] = " Error " . $this -> db -> lasterror ();
}
}
2020-04-23 07:54:13 +02:00
2021-02-25 22:38:35 +01:00
if ( ! $error ) {
2020-04-23 07:49:31 +02:00
$sql = " DELETE FROM " . MAIN_DB_PREFIX . " expeditiondet " ;
2021-08-23 19:33:24 +02:00
$sql .= " WHERE fk_expedition = " . (( int ) $this -> id );
2020-04-23 07:49:31 +02:00
2021-02-25 22:38:35 +01:00
if ( $this -> db -> query ( $sql )) {
2020-04-23 07:49:31 +02:00
// Delete linked object
$res = $this -> deleteObjectLinked ();
2021-02-25 22:38:35 +01:00
if ( $res < 0 ) {
$error ++ ;
}
2020-04-23 07:49:31 +02:00
// No delete expedition
2021-02-25 22:38:35 +01:00
if ( ! $error ) {
2020-04-23 07:49:31 +02:00
$sql = " SELECT rowid FROM " . MAIN_DB_PREFIX . " expedition " ;
2021-08-27 16:33:03 +02:00
$sql .= " WHERE rowid = " . (( int ) $this -> id );
2020-04-23 07:49:31 +02:00
2021-02-25 22:38:35 +01:00
if ( $this -> db -> query ( $sql )) {
if ( ! empty ( $this -> origin ) && $this -> origin_id > 0 ) {
2020-04-23 07:49:31 +02:00
$this -> fetch_origin ();
$origin = $this -> origin ;
2021-02-25 22:38:35 +01:00
if ( $this -> $origin -> statut == Commande :: STATUS_SHIPMENTONPROCESS ) { // If order source of shipment is "shipment in progress"
2020-04-23 07:49:31 +02:00
// Check if there is no more shipment. If not, we can move back status of order to "validated" instead of "shipment in progress"
$this -> $origin -> loadExpeditions ();
//var_dump($this->$origin->expeditions);exit;
2021-02-25 22:38:35 +01:00
if ( count ( $this -> $origin -> expeditions ) <= 0 ) {
2020-04-23 07:49:31 +02:00
$this -> $origin -> setStatut ( Commande :: STATUS_VALIDATED );
}
}
}
2021-02-25 22:38:35 +01:00
if ( ! $error ) {
2020-04-23 07:49:31 +02:00
$this -> db -> commit ();
// We delete PDFs
$ref = dol_sanitizeFileName ( $this -> ref );
2021-02-25 22:38:35 +01:00
if ( ! empty ( $conf -> expedition -> dir_output )) {
2020-04-23 07:49:31 +02:00
$dir = $conf -> expedition -> dir_output . '/sending/' . $ref ;
$file = $dir . '/' . $ref . '.pdf' ;
2021-02-25 22:38:35 +01:00
if ( file_exists ( $file )) {
if ( ! dol_delete_file ( $file )) {
2020-04-23 07:49:31 +02:00
return 0 ;
}
}
2021-02-25 22:38:35 +01:00
if ( file_exists ( $dir )) {
if ( ! dol_delete_dir_recursive ( $dir )) {
2020-04-23 07:49:31 +02:00
$this -> error = $langs -> trans ( " ErrorCanNotDeleteDir " , $dir );
return 0 ;
}
}
}
return 1 ;
2020-05-21 15:05:19 +02:00
} else {
2020-04-23 07:49:31 +02:00
$this -> db -> rollback ();
return - 1 ;
}
2020-05-21 15:05:19 +02:00
} else {
2020-04-23 07:49:31 +02:00
$this -> error = $this -> db -> lasterror () . " - sql= $sql " ;
$this -> db -> rollback ();
return - 3 ;
}
2020-05-21 15:05:19 +02:00
} else {
2020-04-23 07:49:31 +02:00
$this -> error = $this -> db -> lasterror () . " - sql= $sql " ;
$this -> db -> rollback ();
return - 2 ;
} //*/
2020-05-21 15:05:19 +02:00
} else {
2020-04-23 07:49:31 +02:00
$this -> error = $this -> db -> lasterror () . " - sql= $sql " ;
$this -> db -> rollback ();
return - 1 ;
}
2020-05-21 15:05:19 +02:00
} else {
2020-04-23 07:49:31 +02:00
$this -> db -> rollback ();
return - 1 ;
}
}
2020-04-23 07:54:13 +02:00
2015-10-14 12:16:54 +02:00
/**
2014-04-26 17:27:59 +02:00
* Delete shipment .
2018-03-11 00:00:24 +01:00
* Warning , do not delete a shipment if a delivery is linked to ( with table llx_element_element )
2011-09-29 22:32:28 +02:00
*
2019-07-18 18:09:37 +02:00
* @ param int $notrigger Disable triggers
2020-10-28 17:49:52 +01:00
* @ param bool $also_update_stock true if the stock should be increased back ( false by default )
2019-07-18 18:09:37 +02:00
* @ return int > 0 if OK , 0 if deletion done but failed to delete files , < 0 if KO
2008-10-25 13:16:39 +02:00
*/
2019-07-18 18:09:37 +02:00
public function delete ( $notrigger = 0 , $also_update_stock = false )
2008-10-25 13:16:39 +02:00
{
2011-06-02 19:20:24 +02:00
global $conf , $langs , $user ;
2018-03-11 00:00:24 +01:00
2015-10-14 12:16:54 +02:00
require_once DOL_DOCUMENT_ROOT . '/core/lib/files.lib.php' ;
2018-03-11 00:00:24 +01:00
2020-03-12 12:45:44 +01:00
$error = 0 ;
$this -> error = '' ;
2013-08-07 15:08:30 +02:00
2018-03-10 23:40:56 +01:00
$this -> db -> begin ();
2018-03-11 00:00:24 +01:00
// Add a protection to refuse deleting if shipment has at least one delivery
2020-03-12 12:45:44 +01:00
$this -> fetchObjectLinked ( $this -> id , 'shipping' , 0 , 'delivery' ); // Get deliveries linked to this shipment
2021-02-25 22:38:35 +01:00
if ( count ( $this -> linkedObjectsIds ) > 0 ) {
2020-03-12 12:45:44 +01:00
$this -> error = 'ErrorThereIsSomeDeliveries' ;
2018-03-11 00:00:24 +01:00
$error ++ ;
}
2020-11-15 16:58:40 +01:00
if ( ! $error && ! $notrigger ) {
// Call trigger
$result = $this -> call_trigger ( 'SHIPPING_DELETE' , $user );
2021-02-25 22:38:35 +01:00
if ( $result < 0 ) {
$error ++ ;
}
2020-11-15 16:58:40 +01:00
// End call triggers
2018-03-10 23:40:56 +01:00
}
2013-06-20 18:37:23 +02:00
// Stock control
2020-03-12 12:45:44 +01:00
if ( ! $error && $conf -> stock -> enabled &&
2019-07-01 10:18:04 +02:00
(( $conf -> global -> STOCK_CALCULATE_ON_SHIPMENT && $this -> statut > self :: STATUS_DRAFT ) ||
2021-02-25 22:38:35 +01:00
( $conf -> global -> STOCK_CALCULATE_ON_SHIPMENT_CLOSE && $this -> statut == self :: STATUS_CLOSED && $also_update_stock ))) {
2018-07-26 11:57:25 +02:00
require_once DOL_DOCUMENT_ROOT . " /product/stock/class/mouvementstock.class.php " ;
2013-08-07 15:08:30 +02:00
2013-06-20 18:37:23 +02:00
$langs -> load ( " agenda " );
2013-08-07 15:08:30 +02:00
2021-12-06 14:43:11 +01:00
// we try deletion of batch line even if module batch not enabled in case of the module were enabled and disabled previously
$shipmentlinebatch = new ExpeditionLineBatch ( $this -> db );
2013-06-20 18:37:23 +02:00
// Loop on each product line to add a stock movement
2015-10-14 12:16:54 +02:00
$sql = " SELECT cd.fk_product, cd.subprice, ed.qty, ed.fk_entrepot, ed.rowid as expeditiondet_id " ;
2019-11-13 19:37:08 +01:00
$sql .= " FROM " . MAIN_DB_PREFIX . " commandedet as cd, " ;
$sql .= " " . MAIN_DB_PREFIX . " expeditiondet as ed " ;
2021-08-23 19:33:24 +02:00
$sql .= " WHERE ed.fk_expedition = " . (( int ) $this -> id );
2019-11-13 19:37:08 +01:00
$sql .= " AND cd.rowid = ed.fk_origin_line " ;
2013-08-07 15:08:30 +02:00
2014-06-12 11:31:53 +02:00
dol_syslog ( get_class ( $this ) . " ::delete select details " , LOG_DEBUG );
2019-11-13 19:37:08 +01:00
$resql = $this -> db -> query ( $sql );
2021-02-25 22:38:35 +01:00
if ( $resql ) {
2013-06-20 18:37:23 +02:00
$cpt = $this -> db -> num_rows ( $resql );
2021-02-25 22:38:35 +01:00
for ( $i = 0 ; $i < $cpt ; $i ++ ) {
2013-06-20 18:37:23 +02:00
dol_syslog ( get_class ( $this ) . " ::delete movement index " . $i );
$obj = $this -> db -> fetch_object ( $resql );
2016-09-07 12:41:32 +02:00
2013-06-20 18:37:23 +02:00
$mouvS = new MouvementStock ( $this -> db );
2015-10-14 12:16:54 +02:00
// we do not log origin because it will be deleted
$mouvS -> origin = null ;
// get lot/serial
2021-12-06 14:43:11 +01:00
$lotArray = $shipmentlinebatch -> fetchAll ( $obj -> expeditiondet_id );
if ( ! is_array ( $lotArray )) {
$error ++ ; $this -> errors [] = " Error " . $this -> db -> lasterror ();
2013-06-20 18:37:23 +02:00
}
2015-10-14 12:16:54 +02:00
if ( empty ( $lotArray )) {
// no lot/serial
// We increment stock of product (and sub-products)
// We use warehouse selected for each line
2019-11-13 19:37:08 +01:00
$result = $mouvS -> reception ( $user , $obj -> fk_product , $obj -> fk_entrepot , $obj -> qty , 0 , $langs -> trans ( " ShipmentDeletedInDolibarr " , $this -> ref )); // Price is set to 0, because we don't want to see WAP changed
2021-02-25 22:38:35 +01:00
if ( $result < 0 ) {
2022-06-02 10:15:04 +02:00
$error ++ ;
$this -> errors = array_merge ( $this -> errors , $mouvS -> errors );
2015-10-14 12:16:54 +02:00
break ;
}
2020-05-21 15:05:19 +02:00
} else {
2015-10-14 12:16:54 +02:00
// We increment stock of batches
// We use warehouse selected for each line
2021-02-25 22:38:35 +01:00
foreach ( $lotArray as $lot ) {
2019-11-13 19:37:08 +01:00
$result = $mouvS -> reception ( $user , $obj -> fk_product , $obj -> fk_entrepot , $lot -> qty , 0 , $langs -> trans ( " ShipmentDeletedInDolibarr " , $this -> ref ), $lot -> eatby , $lot -> sellby , $lot -> batch ); // Price is set to 0, because we don't want to see WAP changed
2021-02-25 22:38:35 +01:00
if ( $result < 0 ) {
2022-06-02 10:15:04 +02:00
$error ++ ;
$this -> errors = array_merge ( $this -> errors , $mouvS -> errors );
2015-10-14 12:16:54 +02:00
break ;
}
}
2021-02-25 22:38:35 +01:00
if ( $error ) {
break ; // break for loop incase of error
}
2016-09-07 12:41:32 +02:00
}
2013-06-20 18:37:23 +02:00
}
2020-05-21 15:05:19 +02:00
} else {
2019-11-13 19:37:08 +01:00
$error ++ ; $this -> errors [] = " Error " . $this -> db -> lasterror ();
2013-06-20 18:37:23 +02:00
}
}
2016-09-07 12:41:32 +02:00
2021-12-06 14:43:11 +01:00
// delete batch expedition line
2021-09-15 13:29:19 +02:00
if ( ! $error ) {
2022-01-01 15:27:20 +01:00
$shipmentlinebatch = new ExpeditionLineBatch ( $this -> db );
2021-09-27 15:41:58 +02:00
if ( $shipmentlinebatch -> deleteFromShipment ( $this -> id ) < 0 ) {
2019-11-13 19:37:08 +01:00
$error ++ ; $this -> errors [] = " Error " . $this -> db -> lasterror ();
2015-10-14 12:16:54 +02:00
}
}
2016-09-07 12:41:32 +02:00
2021-02-25 22:38:35 +01:00
if ( ! $error ) {
2021-09-27 15:41:58 +02:00
$main = MAIN_DB_PREFIX . 'expeditiondet' ;
$ef = $main . " _extrafields " ;
$sqlef = " DELETE FROM $ef WHERE fk_object IN (SELECT rowid FROM $main WHERE fk_expedition = " . (( int ) $this -> id ) . " ) " ;
2020-04-23 19:09:05 +02:00
2013-06-20 18:37:23 +02:00
$sql = " DELETE FROM " . MAIN_DB_PREFIX . " expeditiondet " ;
2021-08-23 19:33:24 +02:00
$sql .= " WHERE fk_expedition = " . (( int ) $this -> id );
2013-08-07 15:08:30 +02:00
2021-02-25 22:38:35 +01:00
if ( $this -> db -> query ( $sqlef ) && $this -> db -> query ( $sql )) {
2013-06-20 18:37:23 +02:00
// Delete linked object
$res = $this -> deleteObjectLinked ();
2021-02-25 22:38:35 +01:00
if ( $res < 0 ) {
$error ++ ;
}
2013-08-07 15:08:30 +02:00
2021-09-27 15:41:58 +02:00
// delete extrafields
$res = $this -> deleteExtraFields ();
2021-02-25 22:38:35 +01:00
if ( $res < 0 ) {
$error ++ ;
}
2020-04-23 19:09:05 +02:00
2021-02-25 22:38:35 +01:00
if ( ! $error ) {
2013-06-20 18:37:23 +02:00
$sql = " DELETE FROM " . MAIN_DB_PREFIX . " expedition " ;
2021-08-27 16:33:03 +02:00
$sql .= " WHERE rowid = " . (( int ) $this -> id );
2013-08-07 15:08:30 +02:00
2021-02-25 22:38:35 +01:00
if ( $this -> db -> query ( $sql )) {
if ( ! empty ( $this -> origin ) && $this -> origin_id > 0 ) {
2017-10-07 13:09:31 +02:00
$this -> fetch_origin ();
2019-11-13 19:37:08 +01:00
$origin = $this -> origin ;
2021-02-25 22:38:35 +01:00
if ( $this -> $origin -> statut == Commande :: STATUS_SHIPMENTONPROCESS ) { // If order source of shipment is "shipment in progress"
2017-10-07 13:09:31 +02:00
// Check if there is no more shipment. If not, we can move back status of order to "validated" instead of "shipment in progress"
$this -> $origin -> loadExpeditions ();
//var_dump($this->$origin->expeditions);exit;
2021-02-25 22:38:35 +01:00
if ( count ( $this -> $origin -> expeditions ) <= 0 ) {
2017-10-07 13:09:31 +02:00
$this -> $origin -> setStatut ( Commande :: STATUS_VALIDATED );
}
}
2016-04-01 16:59:08 +02:00
}
2016-09-07 12:41:32 +02:00
2021-02-25 22:38:35 +01:00
if ( ! $error ) {
2014-04-26 17:27:59 +02:00
$this -> db -> commit ();
2020-09-12 04:25:54 +02:00
// Delete record into ECM index (Note that delete is also done when deleting files with the dol_delete_dir_recursive
$this -> deleteEcmFiles ();
2020-09-03 12:43:38 +02:00
2014-04-26 17:27:59 +02:00
// We delete PDFs
$ref = dol_sanitizeFileName ( $this -> ref );
2021-02-25 22:38:35 +01:00
if ( ! empty ( $conf -> expedition -> dir_output )) {
2019-11-13 19:37:08 +01:00
$dir = $conf -> expedition -> dir_output . '/sending/' . $ref ;
$file = $dir . '/' . $ref . '.pdf' ;
2021-02-25 22:38:35 +01:00
if ( file_exists ( $file )) {
if ( ! dol_delete_file ( $file )) {
2014-04-26 17:27:59 +02:00
return 0 ;
}
2013-06-20 18:37:23 +02:00
}
2021-02-25 22:38:35 +01:00
if ( file_exists ( $dir )) {
if ( ! dol_delete_dir_recursive ( $dir )) {
2019-11-13 19:37:08 +01:00
$this -> error = $langs -> trans ( " ErrorCanNotDeleteDir " , $dir );
2014-04-26 17:27:59 +02:00
return 0 ;
}
2013-06-20 18:37:23 +02:00
}
2009-04-05 21:30:37 +02:00
}
2013-08-07 15:08:30 +02:00
2014-04-26 17:27:59 +02:00
return 1 ;
2020-05-21 15:05:19 +02:00
} else {
2014-04-26 17:27:59 +02:00
$this -> db -> rollback ();
return - 1 ;
}
2020-05-21 15:05:19 +02:00
} else {
2019-11-13 19:37:08 +01:00
$this -> error = $this -> db -> lasterror () . " - sql= $sql " ;
2013-06-20 18:37:23 +02:00
$this -> db -> rollback ();
return - 3 ;
2008-05-26 23:27:50 +02:00
}
2020-05-21 15:05:19 +02:00
} else {
2019-11-13 19:37:08 +01:00
$this -> error = $this -> db -> lasterror () . " - sql= $sql " ;
2009-04-05 21:30:37 +02:00
$this -> db -> rollback ();
2013-06-20 18:37:23 +02:00
return - 2 ;
2009-04-05 21:30:37 +02:00
}
2020-05-21 15:05:19 +02:00
} else {
2019-11-13 19:37:08 +01:00
$this -> error = $this -> db -> lasterror () . " - sql= $sql " ;
2008-05-26 23:27:50 +02:00
$this -> db -> rollback ();
2013-06-20 18:37:23 +02:00
return - 1 ;
2008-05-26 23:27:50 +02:00
}
2020-05-21 15:05:19 +02:00
} else {
2008-05-26 23:27:50 +02:00
$this -> db -> rollback ();
return - 1 ;
}
}
2020-10-28 17:49:52 +01:00
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
2009-11-12 14:33:55 +01:00
/**
2011-09-29 22:32:28 +02:00
* Load lines
2009-11-12 14:33:55 +01:00
*
2011-12-16 15:29:58 +01:00
* @ return int > 0 if OK , Otherwise if KO
2009-11-12 14:33:55 +01:00
*/
2019-02-24 23:32:09 +01:00
public function fetch_lines ()
2006-08-26 16:13:37 +02:00
{
2020-10-28 17:49:52 +01:00
// phpcs:enable
2015-12-17 19:37:24 +01:00
global $conf , $mysoc ;
2022-03-28 13:50:47 +02:00
2020-03-12 12:45:44 +01:00
$this -> lines = array ();
2010-09-07 00:31:36 +02:00
2022-03-28 13:50:47 +02:00
// NOTE: This fetch_lines is special because it groups all lines with the same origin_line_id into one line.
// TODO: See if we can restore a common fetch_lines (one line = one record)
2020-03-31 10:54:14 +02:00
$sql = " SELECT cd.rowid, cd.fk_product, cd.label as custom_label, cd.description, cd.qty as qty_asked, cd.product_type, cd.fk_unit " ;
2020-03-12 12:45:44 +01:00
$sql .= " , cd.total_ht, cd.total_localtax1, cd.total_localtax2, cd.total_ttc, cd.total_tva " ;
$sql .= " , cd.vat_src_code, cd.tva_tx, cd.localtax1_tx, cd.localtax2_tx, cd.localtax1_type, cd.localtax2_type, cd.info_bits, cd.price, cd.subprice, cd.remise_percent,cd.buy_price_ht as pa_ht " ;
$sql .= " , cd.fk_multicurrency, cd.multicurrency_code, cd.multicurrency_subprice, cd.multicurrency_total_ht, cd.multicurrency_total_tva, cd.multicurrency_total_ttc, cd.rang " ;
$sql .= " , ed.rowid as line_id, ed.qty as qty_shipped, ed.fk_origin_line, ed.fk_entrepot " ;
$sql .= " , p.ref as product_ref, p.label as product_label, p.fk_product_type " ;
2020-11-16 16:31:05 +01:00
$sql .= " , p.weight, p.weight_units, p.length, p.length_units, p.surface, p.surface_units, p.volume, p.volume_units, p.tosell as product_tosell, p.tobuy as product_tobuy, p.tobatch as product_tobatch " ;
2020-03-12 12:45:44 +01:00
$sql .= " FROM " . MAIN_DB_PREFIX . " expeditiondet as ed, " . MAIN_DB_PREFIX . " commandedet as cd " ;
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . " product as p ON p.rowid = cd.fk_product " ;
2021-08-23 19:33:24 +02:00
$sql .= " WHERE ed.fk_expedition = " . (( int ) $this -> id );
2020-03-12 12:45:44 +01:00
$sql .= " AND ed.fk_origin_line = cd.rowid " ;
2022-03-28 13:50:47 +02:00
$sql .= " ORDER BY cd.rang, ed.fk_origin_line " ; // We need after a break on fk_origin_line but when there is no break on fk_origin_line, cd.rang is same so we can add it as first order criteria.
2008-05-26 23:27:50 +02:00
2014-06-12 11:31:53 +02:00
dol_syslog ( get_class ( $this ) . " ::fetch_lines " , LOG_DEBUG );
2006-08-26 16:13:37 +02:00
$resql = $this -> db -> query ( $sql );
2021-02-25 22:38:35 +01:00
if ( $resql ) {
2012-08-23 02:04:35 +02:00
include_once DOL_DOCUMENT_ROOT . '/core/lib/price.lib.php' ;
2012-03-14 14:00:20 +01:00
2006-08-26 16:13:37 +02:00
$num = $this -> db -> num_rows ( $resql );
$i = 0 ;
2014-10-03 12:20:02 +02:00
$lineindex = 0 ;
$originline = 0 ;
2012-03-14 14:00:20 +01:00
2012-07-02 19:30:37 +02:00
$this -> total_ht = 0 ;
$this -> total_tva = 0 ;
$this -> total_ttc = 0 ;
$this -> total_localtax1 = 0 ;
2012-03-08 22:30:45 +01:00
$this -> total_localtax2 = 0 ;
2012-03-14 14:00:20 +01:00
2021-09-27 15:41:58 +02:00
$shipmentlinebatch = new ExpeditionLineBatch ( $this -> db );
2019-06-12 22:05:10 +02:00
2021-02-25 22:38:35 +01:00
while ( $i < $num ) {
2014-10-18 16:27:15 +02:00
$obj = $this -> db -> fetch_object ( $resql );
2022-03-28 13:50:47 +02:00
if ( $originline > 0 && $originline == $obj -> fk_origin_line ) {
2019-11-13 19:37:08 +01:00
$line -> entrepot_id = 0 ; // entrepod_id in details_entrepot
$line -> qty_shipped += $obj -> qty_shipped ;
2014-10-03 12:20:02 +02:00
} else {
2017-10-07 13:09:31 +02:00
$line = new ExpeditionLigne ( $this -> db );
2022-03-28 13:50:47 +02:00
$line -> entrepot_id = $obj -> fk_entrepot ; // this is a property of a shipment line
$line -> qty_shipped = $obj -> qty_shipped ; // this is a property of a shipment line
2014-10-03 12:20:02 +02:00
}
2014-10-18 16:27:15 +02:00
2022-03-28 13:50:47 +02:00
$detail_entrepot = new stdClass ();
2014-10-03 12:20:02 +02:00
$detail_entrepot -> entrepot_id = $obj -> fk_entrepot ;
$detail_entrepot -> qty_shipped = $obj -> qty_shipped ;
2017-10-23 22:16:00 +02:00
$detail_entrepot -> line_id = $obj -> line_id ;
2014-10-03 12:20:02 +02:00
$line -> details_entrepot [] = $detail_entrepot ;
2014-10-18 16:27:15 +02:00
2017-10-07 13:09:31 +02:00
$line -> line_id = $obj -> line_id ;
2019-11-13 19:37:08 +01:00
$line -> rowid = $obj -> line_id ; // TODO deprecated
2017-10-07 13:09:31 +02:00
$line -> id = $obj -> line_id ;
2017-06-27 16:41:57 +02:00
2019-11-13 19:37:08 +01:00
$line -> fk_origin = 'orderline' ;
2017-10-07 13:09:31 +02:00
$line -> fk_origin_line = $obj -> fk_origin_line ;
2019-11-13 19:37:08 +01:00
$line -> origin_line_id = $obj -> fk_origin_line ; // TODO deprecated
2017-06-27 16:41:57 +02:00
2019-11-13 19:37:08 +01:00
$line -> fk_expedition = $this -> id ; // id of parent
2017-06-27 16:41:57 +02:00
2016-06-20 02:34:00 +02:00
$line -> product_type = $obj -> product_type ;
2010-03-13 16:52:30 +01:00
$line -> fk_product = $obj -> fk_product ;
$line -> fk_product_type = $obj -> fk_product_type ;
2019-11-13 19:37:08 +01:00
$line -> ref = $obj -> product_ref ; // TODO deprecated
$line -> product_ref = $obj -> product_ref ;
$line -> product_label = $obj -> product_label ;
$line -> libelle = $obj -> product_label ; // TODO deprecated
2020-11-16 16:31:05 +01:00
$line -> product_tosell = $obj -> product_tosell ;
$line -> product_tobuy = $obj -> product_tobuy ;
2019-11-13 19:37:08 +01:00
$line -> product_tobatch = $obj -> product_tobatch ;
$line -> label = $obj -> custom_label ;
2010-03-13 16:52:30 +01:00
$line -> description = $obj -> description ;
$line -> qty_asked = $obj -> qty_asked ;
2020-03-12 12:45:44 +01:00
$line -> rang = $obj -> rang ;
2010-03-13 16:52:30 +01:00
$line -> weight = $obj -> weight ;
$line -> weight_units = $obj -> weight_units ;
2012-11-18 16:21:38 +01:00
$line -> length = $obj -> length ;
$line -> length_units = $obj -> length_units ;
$line -> surface = $obj -> surface ;
2019-11-13 19:37:08 +01:00
$line -> surface_units = $obj -> surface_units ;
2010-03-13 16:52:30 +01:00
$line -> volume = $obj -> volume ;
$line -> volume_units = $obj -> volume_units ;
2020-04-10 10:59:32 +02:00
$line -> fk_unit = $obj -> fk_unit ;
2012-03-14 14:00:20 +01:00
2019-11-13 19:37:08 +01:00
$line -> pa_ht = $obj -> pa_ht ;
2016-09-07 12:41:32 +02:00
2017-10-18 12:10:00 +02:00
// Local taxes
2019-11-13 19:37:08 +01:00
$localtax_array = array ( 0 => $obj -> localtax1_type , 1 => $obj -> localtax1_tx , 2 => $obj -> localtax2_type , 3 => $obj -> localtax2_tx );
2017-10-18 12:10:00 +02:00
$localtax1_tx = get_localtax ( $obj -> tva_tx , 1 , $this -> thirdparty );
$localtax2_tx = get_localtax ( $obj -> tva_tx , 2 , $this -> thirdparty );
2017-06-23 11:12:17 +02:00
2013-02-17 18:40:09 +01:00
// For invoicing
2019-11-13 19:37:08 +01:00
$tabprice = calcul_price_total ( $obj -> qty_shipped , $obj -> subprice , $obj -> remise_percent , $obj -> tva_tx , $localtax1_tx , $localtax2_tx , 0 , 'HT' , $obj -> info_bits , $obj -> fk_product_type , $mysoc , $localtax_array ); // We force type to 0
$line -> desc = $obj -> description ; // We need ->desc because some code into CommonObject use desc (property defined for other elements)
$line -> qty = $line -> qty_shipped ;
$line -> total_ht = $tabprice [ 0 ];
2013-07-19 17:27:08 +02:00
$line -> total_localtax1 = $tabprice [ 9 ];
$line -> total_localtax2 = $tabprice [ 10 ];
$line -> total_ttc = $tabprice [ 2 ];
$line -> total_tva = $tabprice [ 1 ];
2019-11-13 19:37:08 +01:00
$line -> vat_src_code = $obj -> vat_src_code ;
$line -> tva_tx = $obj -> tva_tx ;
2012-03-08 22:30:45 +01:00
$line -> localtax1_tx = $obj -> localtax1_tx ;
$line -> localtax2_tx = $obj -> localtax2_tx ;
2019-11-13 19:37:08 +01:00
$line -> info_bits = $obj -> info_bits ;
$line -> price = $obj -> price ;
$line -> subprice = $obj -> subprice ;
$line -> remise_percent = $obj -> remise_percent ;
2012-03-14 14:00:20 +01:00
2019-11-13 19:37:08 +01:00
$this -> total_ht += $tabprice [ 0 ];
$this -> total_tva += $tabprice [ 1 ];
$this -> total_ttc += $tabprice [ 2 ];
$this -> total_localtax1 += $tabprice [ 9 ];
$this -> total_localtax2 += $tabprice [ 10 ];
2016-09-07 12:41:32 +02:00
2017-06-23 11:12:17 +02:00
// Multicurrency
2019-11-13 19:37:08 +01:00
$this -> fk_multicurrency = $obj -> fk_multicurrency ;
$this -> multicurrency_code = $obj -> multicurrency_code ;
2017-06-23 11:12:17 +02:00
$this -> multicurrency_subprice = $obj -> multicurrency_subprice ;
$this -> multicurrency_total_ht = $obj -> multicurrency_total_ht ;
$this -> multicurrency_total_tva = $obj -> multicurrency_total_tva ;
$this -> multicurrency_total_ttc = $obj -> multicurrency_total_ttc ;
2021-02-25 22:38:35 +01:00
if ( $originline != $obj -> fk_origin_line ) {
2015-12-18 18:00:31 +01:00
$line -> detail_batch = array ();
}
2017-12-02 10:43:01 +01:00
// Detail of batch
2021-02-25 22:38:35 +01:00
if ( ! empty ( $conf -> productbatch -> enabled ) && $obj -> line_id > 0 && $obj -> product_tobatch > 0 ) {
2021-09-27 15:41:58 +02:00
$newdetailbatch = $shipmentlinebatch -> fetchAll ( $obj -> line_id , $obj -> fk_product );
2017-10-07 13:09:31 +02:00
2021-02-25 22:38:35 +01:00
if ( is_array ( $newdetailbatch )) {
if ( $originline != $obj -> fk_origin_line ) {
2017-10-07 13:09:31 +02:00
$line -> detail_batch = $newdetailbatch ;
2020-05-21 15:05:19 +02:00
} else {
2017-10-07 13:09:31 +02:00
$line -> detail_batch = array_merge ( $line -> detail_batch , $newdetailbatch );
}
}
2014-10-03 12:20:02 +02:00
}
2015-07-13 11:22:18 +02:00
2022-03-28 13:50:47 +02:00
$line -> fetch_optionals ();
2021-02-25 22:38:35 +01:00
if ( $originline != $obj -> fk_origin_line ) {
2017-10-07 13:09:31 +02:00
$this -> lines [ $lineindex ] = $line ;
$lineindex ++ ;
2020-05-21 15:05:19 +02:00
} else {
2019-11-13 19:37:08 +01:00
$line -> total_ht += $tabprice [ 0 ];
2017-10-07 13:09:31 +02:00
$line -> total_localtax1 += $tabprice [ 9 ];
$line -> total_localtax2 += $tabprice [ 10 ];
$line -> total_ttc += $tabprice [ 2 ];
$line -> total_tva += $tabprice [ 1 ];
2014-03-07 11:35:16 +01:00
}
2022-03-28 13:50:47 +02:00
2006-08-26 16:13:37 +02:00
$i ++ ;
2014-10-18 16:27:15 +02:00
$originline = $obj -> fk_origin_line ;
2006-08-26 16:13:37 +02:00
}
$this -> db -> free ( $resql );
2007-05-16 00:47:58 +02:00
return 1 ;
2020-05-21 15:05:19 +02:00
} else {
2019-11-13 19:37:08 +01:00
$this -> error = $this -> db -> error ();
2008-05-26 23:27:50 +02:00
return - 3 ;
}
}
2017-12-21 16:50:18 +01:00
/**
* Delete detail line
*
* @ param User $user User making deletion
* @ param int $lineid Id of line to delete
* @ return int > 0 if OK , < 0 if KO
*/
2019-02-24 23:32:09 +01:00
public function deleteline ( $user , $lineid )
2017-12-21 16:50:18 +01:00
{
global $user ;
2021-02-25 22:38:35 +01:00
if ( $this -> statut == self :: STATUS_DRAFT ) {
2017-12-21 16:50:18 +01:00
$this -> db -> begin ();
2019-11-13 19:37:08 +01:00
$line = new ExpeditionLigne ( $this -> db );
2017-12-21 16:50:18 +01:00
// For triggers
$line -> fetch ( $lineid );
2021-02-25 22:38:35 +01:00
if ( $line -> delete ( $user ) > 0 ) {
2017-12-21 16:50:18 +01:00
//$this->update_price(1);
$this -> db -> commit ();
return 1 ;
2020-05-21 15:05:19 +02:00
} else {
2017-12-21 16:50:18 +01:00
$this -> db -> rollback ();
return - 1 ;
}
2020-05-21 15:05:19 +02:00
} else {
2019-11-13 19:37:08 +01:00
$this -> error = 'ErrorDeleteLineNotAllowedByObjectStatus' ;
2017-12-21 16:50:18 +01:00
return - 2 ;
}
}
2010-05-27 00:06:27 +02:00
/**
2017-10-07 13:09:31 +02:00
* Return clicable link of object ( with eventually picto )
*
* @ param int $withpicto Add picto into link
* @ param string $option Where the link point to
* @ param int $max Max length to show
* @ param int $short Use short labels
* @ param int $notooltip 1 = No tooltip
* @ param int $save_lastsearch_value - 1 = Auto , 0 = No save of lastsearch_values when clicking , 1 = Save lastsearch_values whenclicking
* @ return string String with URL
*/
2019-02-24 23:32:09 +01:00
public function getNomUrl ( $withpicto = 0 , $option = '' , $max = 0 , $short = 0 , $notooltip = 0 , $save_lastsearch_value = - 1 )
2010-05-27 00:06:27 +02:00
{
2022-02-15 18:14:44 +01:00
global $langs , $conf , $hookmanager ;
2010-05-27 00:06:27 +02:00
2019-11-13 19:37:08 +01:00
$result = '' ;
2020-04-20 15:57:15 +02:00
$label = '<u>' . $langs -> trans ( " Shipment " ) . '</u>' ;
2019-11-13 19:37:08 +01:00
$label .= '<br><b>' . $langs -> trans ( 'Ref' ) . ':</b> ' . $this -> ref ;
2017-10-07 13:09:31 +02:00
$label .= '<br><b>' . $langs -> trans ( 'RefCustomer' ) . ':</b> ' . ( $this -> ref_customer ? $this -> ref_customer : $this -> ref_client );
2017-06-23 11:12:17 +02:00
2014-09-18 21:18:25 +02:00
$url = DOL_URL_ROOT . '/expedition/card.php?id=' . $this -> id ;
2011-08-31 16:42:47 +02:00
2021-02-25 22:38:35 +01:00
if ( $short ) {
return $url ;
}
2010-05-27 00:06:27 +02:00
2021-02-25 22:38:35 +01:00
if ( $option !== 'nolink' ) {
2017-10-03 16:00:52 +02:00
// Add param to save lastsearch_values or not
2019-11-13 19:37:08 +01:00
$add_save_lastsearch_values = ( $save_lastsearch_value == 1 ? 1 : 0 );
2021-02-25 22:38:35 +01:00
if ( $save_lastsearch_value == - 1 && preg_match ( '/list\.php/' , $_SERVER [ " PHP_SELF " ])) {
$add_save_lastsearch_values = 1 ;
}
if ( $add_save_lastsearch_values ) {
$url .= '&save_lastsearch_values=1' ;
}
2017-10-03 16:00:52 +02:00
}
2019-11-13 19:37:08 +01:00
$linkclose = '' ;
2021-02-25 22:38:35 +01:00
if ( empty ( $notooltip )) {
if ( ! empty ( $conf -> global -> MAIN_OPTIMIZEFORTEXTBROWSER )) {
2020-04-20 15:57:15 +02:00
$label = $langs -> trans ( " Shipment " );
2019-11-13 19:37:08 +01:00
$linkclose .= ' alt="' . dol_escape_htmltag ( $label , 1 ) . '"' ;
2017-10-07 13:09:31 +02:00
}
2019-11-13 19:37:08 +01:00
$linkclose .= ' title="' . dol_escape_htmltag ( $label , 1 ) . '"' ;
$linkclose .= ' class="classfortooltip"' ;
2016-11-02 10:29:14 +01:00
}
2017-06-23 11:12:17 +02:00
2020-04-20 15:57:15 +02:00
$linkstart = '<a href="' . $url . '"' ;
$linkstart .= $linkclose . '>' ;
2019-11-13 19:37:08 +01:00
$linkend = '</a>' ;
2010-05-27 00:06:27 +02:00
2017-11-02 15:03:09 +01:00
$result .= $linkstart ;
2021-02-25 22:38:35 +01:00
if ( $withpicto ) {
$result .= img_object (( $notooltip ? '' : $label ), $this -> picto , ( $notooltip ? (( $withpicto != 2 ) ? 'class="paddingright"' : '' ) : 'class="' . (( $withpicto != 2 ) ? 'paddingright ' : '' ) . 'classfortooltip"' ), 0 , 0 , $notooltip ? 0 : 1 );
}
if ( $withpicto != 2 ) {
$result .= $this -> ref ;
}
2017-11-02 15:03:09 +01:00
$result .= $linkend ;
2022-02-15 11:15:34 +01:00
global $action ;
$hookmanager -> initHooks ( array ( $this -> element . 'dao' ));
2022-02-15 18:31:05 +01:00
$parameters = array ( 'id' => $this -> id , 'getnomurl' => & $result );
2022-02-15 11:15:34 +01:00
$reshook = $hookmanager -> executeHooks ( 'getNomUrl' , $parameters , $this , $action ); // Note that $action and $object may have been modified by some hooks
if ( $reshook > 0 ) {
$result = $hookmanager -> resPrint ;
} else {
$result .= $hookmanager -> resPrint ;
}
2010-05-27 00:06:27 +02:00
return $result ;
}
2012-01-04 23:56:10 +01:00
2008-05-26 23:27:50 +02:00
/**
2017-10-07 13:09:31 +02:00
* Return status label
*
* @ param int $mode 0 = Long label , 1 = Short label , 2 = Picto + Short label , 3 = Picto , 4 = Picto + Long label , 5 = Short label + Picto
* @ return string Libelle
*/
2019-02-24 23:32:09 +01:00
public function getLibStatut ( $mode = 0 )
2008-05-26 23:27:50 +02:00
{
2019-01-27 11:55:16 +01:00
return $this -> LibStatut ( $this -> statut , $mode );
2006-08-26 16:13:37 +02:00
}
2008-05-26 23:27:50 +02:00
2020-10-28 17:49:52 +01:00
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
2006-07-14 15:26:19 +02:00
/**
2011-09-29 22:32:28 +02:00
* Return label of a status
*
2019-11-04 19:28:04 +01:00
* @ param int $status Id statut
* @ param int $mode 0 = long label , 1 = short label , 2 = Picto + short label , 3 = Picto , 4 = Picto + long label , 5 = Short label + Picto , 6 = Long label + Picto
* @ return string Label of status
2006-07-14 15:26:19 +02:00
*/
2019-11-01 23:58:14 +01:00
public function LibStatut ( $status , $mode )
2008-05-26 23:27:50 +02:00
{
2020-10-28 17:49:52 +01:00
// phpcs:enable
global $langs ;
2006-07-14 15:26:19 +02:00
2021-10-16 19:37:57 +02:00
$labelStatus = $langs -> transnoentitiesnoconv ( $this -> statuts [ $status ]);
$labelStatusShort = $langs -> transnoentitiesnoconv ( $this -> statutshorts [ $status ]);
2019-11-04 19:28:04 +01:00
$statusType = 'status' . $status ;
2021-02-25 22:38:35 +01:00
if ( $status == self :: STATUS_VALIDATED ) {
$statusType = 'status4' ;
}
if ( $status == self :: STATUS_CLOSED ) {
$statusType = 'status6' ;
}
if ( $status == self :: STATUS_CANCELED ) {
$statusType = 'status9' ;
}
2019-11-04 19:28:04 +01:00
return dolGetStatus ( $labelStatus , $labelStatusShort , '' , $statusType , $mode );
2008-05-26 23:27:50 +02:00
}
2006-08-26 15:47:10 +02:00
/**
2017-10-07 13:09:31 +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
2006-08-26 15:47:10 +02:00
*/
2019-02-24 23:32:09 +01:00
public function initAsSpecimen ()
2006-08-26 15:47:10 +02:00
{
2016-05-06 22:43:50 +02:00
global $langs ;
2006-08-26 15:47:10 +02:00
2019-11-13 19:37:08 +01:00
$now = dol_now ();
2011-08-31 16:42:47 +02:00
2012-01-04 23:56:10 +01:00
dol_syslog ( get_class ( $this ) . " ::initAsSpecimen " );
2008-10-25 13:16:39 +02:00
2017-10-07 13:09:31 +02:00
// Load array of products prodids
2016-06-28 02:36:40 +02:00
$num_prods = 0 ;
2006-08-26 15:47:10 +02:00
$prodids = array ();
2009-04-30 18:28:53 +02:00
$sql = " SELECT rowid " ;
2019-11-13 19:37:08 +01:00
$sql .= " FROM " . MAIN_DB_PREFIX . " product " ;
$sql .= " WHERE entity IN ( " . getEntity ( 'product' ) . " ) " ;
2006-08-26 15:47:10 +02:00
$resql = $this -> db -> query ( $sql );
2021-02-25 22:38:35 +01:00
if ( $resql ) {
2006-08-26 15:47:10 +02:00
$num_prods = $this -> db -> num_rows ( $resql );
$i = 0 ;
2021-02-25 22:38:35 +01:00
while ( $i < $num_prods ) {
2006-08-26 15:47:10 +02:00
$i ++ ;
$row = $this -> db -> fetch_row ( $resql );
$prodids [ $i ] = $row [ 0 ];
}
}
2019-11-13 19:37:08 +01:00
$order = new Commande ( $this -> db );
2008-05-17 03:52:24 +02:00
$order -> initAsSpecimen ();
2008-05-26 23:27:50 +02:00
2009-11-12 14:33:55 +01:00
// Initialise parametres
2019-11-13 19:37:08 +01:00
$this -> id = 0 ;
2012-04-22 00:41:13 +02:00
$this -> ref = 'SPECIMEN' ;
2019-11-13 19:37:08 +01:00
$this -> specimen = 1 ;
2019-02-05 11:58:49 +01:00
$this -> statut = self :: STATUS_VALIDATED ;
2011-08-31 16:42:47 +02:00
$this -> livraison_id = 0 ;
$this -> date = $now ;
$this -> date_creation = $now ;
$this -> date_valid = $now ;
$this -> date_delivery = $now ;
2019-11-13 19:37:08 +01:00
$this -> date_expedition = $now + 24 * 3600 ;
2011-08-31 16:42:47 +02:00
2008-05-26 23:27:50 +02:00
$this -> entrepot_id = 0 ;
2009-07-08 12:02:57 +02:00
$this -> fk_delivery_address = 0 ;
2010-09-19 18:25:24 +02:00
$this -> socid = 1 ;
2006-08-26 15:47:10 +02:00
2008-05-17 03:52:24 +02:00
$this -> commande_id = 0 ;
$this -> commande = $order ;
2008-05-26 23:27:50 +02:00
2017-10-07 13:09:31 +02:00
$this -> origin_id = 1 ;
$this -> origin = 'commande' ;
2013-04-11 21:53:41 +02:00
2020-03-12 12:45:44 +01:00
$this -> note_private = 'Private note' ;
$this -> note_public = 'Public note' ;
2010-09-19 18:25:24 +02:00
2006-08-26 15:47:10 +02:00
$nbp = 5 ;
$xnbp = 0 ;
2021-02-25 22:38:35 +01:00
while ( $xnbp < $nbp ) {
2020-03-12 12:45:44 +01:00
$line = new ExpeditionLigne ( $this -> db );
$line -> desc = $langs -> trans ( " Description " ) . " " . $xnbp ;
$line -> libelle = $langs -> trans ( " Description " ) . " " . $xnbp ; // deprecated
$line -> label = $langs -> trans ( " Description " ) . " " . $xnbp ;
$line -> qty = 10 ;
$line -> qty_asked = 5 ;
$line -> qty_shipped = 4 ;
$line -> fk_product = $this -> commande -> lines [ $xnbp ] -> fk_product ;
$this -> lines [] = $line ;
2006-08-26 15:47:10 +02:00
$xnbp ++ ;
}
2008-05-26 23:27:50 +02:00
}
2009-03-23 18:38:04 +01:00
2020-10-26 16:50:52 +01:00
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
2010-05-13 01:03:33 +02:00
/**
2020-10-26 16:50:52 +01:00
* Set delivery date
*
* @ param User $user Object user that modify
* @ param int $delivery_date Delivery date
* @ return int < 0 if ko , > 0 if ok
* @ deprecated Use setDeliveryDate
*/
2020-10-26 18:21:47 +01:00
public function set_date_livraison ( $user , $delivery_date )
2020-10-26 16:50:52 +01:00
{
2020-10-26 18:13:25 +01:00
// phpcs:enable
2020-10-26 16:59:25 +01:00
return $this -> setDeliveryDate ( $user , $delivery_date );
2020-10-26 16:50:52 +01:00
}
2020-10-31 14:32:18 +01:00
/**
2011-12-16 15:29:58 +01:00
* Set the planned delivery date
2011-09-29 22:32:28 +02:00
*
2019-04-04 18:33:12 +02:00
* @ param User $user Objet user that modify
2020-10-06 11:37:55 +02:00
* @ param integer $delivery_date Date of delivery
2012-01-04 23:56:10 +01:00
* @ return int < 0 if KO , > 0 if OK
2010-05-13 01:03:33 +02:00
*/
2020-10-26 16:50:52 +01:00
public function setDeliveryDate ( $user , $delivery_date )
2010-05-13 01:03:33 +02:00
{
2021-02-25 22:38:35 +01:00
if ( $user -> rights -> expedition -> creer ) {
2010-05-13 01:03:33 +02:00
$sql = " UPDATE " . MAIN_DB_PREFIX . " expedition " ;
2020-10-06 11:37:55 +02:00
$sql .= " SET date_delivery = " . ( $delivery_date ? " ' " . $this -> db -> idate ( $delivery_date ) . " ' " : 'null' );
2021-08-27 16:33:03 +02:00
$sql .= " WHERE rowid = " . (( int ) $this -> id );
2010-05-13 01:03:33 +02:00
2020-10-26 16:50:52 +01:00
dol_syslog ( get_class ( $this ) . " ::setDeliveryDate " , LOG_DEBUG );
2019-11-13 19:37:08 +01:00
$resql = $this -> db -> query ( $sql );
2021-02-25 22:38:35 +01:00
if ( $resql ) {
2020-10-06 11:37:55 +02:00
$this -> date_delivery = $delivery_date ;
2010-05-13 01:03:33 +02:00
return 1 ;
2020-05-21 15:05:19 +02:00
} else {
2019-11-13 19:37:08 +01:00
$this -> error = $this -> db -> error ();
2010-05-13 01:03:33 +02:00
return - 1 ;
}
2020-05-21 15:05:19 +02:00
} else {
2010-05-13 01:03:33 +02:00
return - 2 ;
}
}
2020-10-28 17:49:52 +01:00
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
2009-03-23 18:38:04 +01:00
/**
2011-12-16 15:29:58 +01:00
* Fetch deliveries method and return an array . Load array this -> meths ( rowid => label ) .
2011-09-29 22:32:28 +02:00
*
2011-12-16 15:29:58 +01:00
* @ return void
2008-10-25 23:18:53 +02:00
*/
2019-02-24 23:32:09 +01:00
public function fetch_delivery_methods ()
2008-10-25 13:16:39 +02:00
{
2020-10-31 14:32:18 +01:00
// phpcs:enable
2009-03-23 18:38:04 +01:00
global $langs ;
2016-05-06 22:43:50 +02:00
$this -> meths = array ();
2008-10-25 13:16:39 +02:00
2019-11-02 12:59:38 +01:00
$sql = " SELECT em.rowid, em.code, em.libelle as label " ;
2020-03-12 12:45:44 +01:00
$sql .= " FROM " . MAIN_DB_PREFIX . " c_shipment_mode as em " ;
$sql .= " WHERE em.active = 1 " ;
$sql .= " ORDER BY em.libelle ASC " ;
2008-10-25 13:16:39 +02:00
$resql = $this -> db -> query ( $sql );
2021-02-25 22:38:35 +01:00
if ( $resql ) {
while ( $obj = $this -> db -> fetch_object ( $resql )) {
2020-03-12 12:45:44 +01:00
$label = $langs -> trans ( 'SendingMethod' . $obj -> code );
$this -> meths [ $obj -> rowid ] = ( $label != 'SendingMethod' . $obj -> code ? $label : $obj -> label );
2008-10-29 11:51:52 +01:00
}
2008-10-25 13:16:39 +02:00
}
}
2009-01-29 13:39:52 +01:00
2020-10-28 17:49:52 +01:00
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
2017-10-07 13:09:31 +02:00
/**
* Fetch all deliveries method and return an array . Load array this -> listmeths .
*
2019-04-04 18:33:12 +02:00
* @ param int $id only this carrier , all if none
2017-10-07 13:09:31 +02:00
* @ return void
*/
2019-02-24 23:32:09 +01:00
public function list_delivery_methods ( $id = '' )
2017-10-07 13:09:31 +02:00
{
2020-10-28 17:49:52 +01:00
// phpcs:enable
2017-10-07 13:09:31 +02:00
global $langs ;
$this -> listmeths = array ();
2020-03-12 12:45:44 +01:00
$i = 0 ;
2017-10-07 13:09:31 +02:00
2019-11-02 12:59:38 +01:00
$sql = " SELECT em.rowid, em.code, em.libelle as label, em.description, em.tracking, em.active " ;
2020-03-12 12:45:44 +01:00
$sql .= " FROM " . MAIN_DB_PREFIX . " c_shipment_mode as em " ;
2021-02-25 22:38:35 +01:00
if ( $id != '' ) {
2021-04-24 20:18:11 +02:00
$sql .= " WHERE em.rowid= " . (( int ) $id );
2021-02-25 22:38:35 +01:00
}
2017-10-07 13:09:31 +02:00
$resql = $this -> db -> query ( $sql );
2021-02-25 22:38:35 +01:00
if ( $resql ) {
while ( $obj = $this -> db -> fetch_object ( $resql )) {
2017-10-07 13:09:31 +02:00
$this -> listmeths [ $i ][ 'rowid' ] = $obj -> rowid ;
$this -> listmeths [ $i ][ 'code' ] = $obj -> code ;
2020-03-12 12:45:44 +01:00
$label = $langs -> trans ( 'SendingMethod' . $obj -> code );
$this -> listmeths [ $i ][ 'libelle' ] = ( $label != 'SendingMethod' . $obj -> code ? $label : $obj -> label );
2017-10-07 13:09:31 +02:00
$this -> listmeths [ $i ][ 'description' ] = $obj -> description ;
$this -> listmeths [ $i ][ 'tracking' ] = $obj -> tracking ;
$this -> listmeths [ $i ][ 'active' ] = $obj -> active ;
$i ++ ;
}
}
}
2009-02-03 03:39:28 +01:00
/**
2015-01-23 18:33:33 +01:00
* Forge an set tracking url
2012-01-04 23:56:10 +01:00
*
* @ param string $value Value
* @ return void
2008-10-25 23:18:53 +02:00
*/
2019-02-24 23:32:09 +01:00
public function getUrlTrackingStatus ( $value = '' )
2008-10-25 13:16:39 +02:00
{
2021-02-25 22:38:35 +01:00
if ( ! empty ( $this -> shipping_method_id )) {
2013-02-22 14:18:51 +01:00
$sql = " SELECT em.code, em.tracking " ;
2019-11-13 19:37:08 +01:00
$sql .= " FROM " . MAIN_DB_PREFIX . " c_shipment_mode as em " ;
2021-06-09 15:36:47 +02:00
$sql .= " WHERE em.rowid = " . (( int ) $this -> shipping_method_id );
2011-06-19 21:47:09 +02:00
2011-05-25 18:53:39 +02:00
$resql = $this -> db -> query ( $sql );
2021-02-25 22:38:35 +01:00
if ( $resql ) {
if ( $obj = $this -> db -> fetch_object ( $resql )) {
2013-04-19 20:20:10 +02:00
$tracking = $obj -> tracking ;
2011-05-25 18:53:39 +02:00
}
2008-10-29 13:04:37 +01:00
}
2008-10-25 13:16:39 +02:00
}
2021-02-25 22:38:35 +01:00
if ( ! empty ( $tracking ) && ! empty ( $value )) {
2013-04-19 20:20:10 +02:00
$url = str_replace ( '{TRACKID}' , $value , $tracking );
2021-11-22 02:35:55 +01:00
$this -> tracking_url = sprintf ( '<a target="_blank" rel="noopener noreferrer" href="%s">' . ( $value ? $value : 'url' ) . '</a>' , $url , $url );
2020-05-21 15:05:19 +02:00
} else {
2013-04-19 20:20:10 +02:00
$this -> tracking_url = $value ;
}
}
2012-03-14 14:00:20 +01:00
2012-07-02 19:30:37 +02:00
/**
2016-06-09 22:40:21 +02:00
* Classify the shipping as closed .
2012-07-02 19:30:37 +02:00
*
2016-06-09 22:40:21 +02:00
* @ return int < 0 if KO , > 0 if OK
2012-07-02 19:30:37 +02:00
*/
2019-02-24 23:32:09 +01:00
public function setClosed ()
2012-07-02 19:30:37 +02:00
{
2019-11-13 19:37:08 +01:00
global $conf , $langs , $user ;
2012-07-02 19:30:37 +02:00
2019-11-13 19:37:08 +01:00
$error = 0 ;
2016-09-07 12:41:32 +02:00
2019-12-17 18:05:59 +01:00
// Protection. This avoid to move stock later when we should not
2021-02-25 22:38:35 +01:00
if ( $this -> statut == self :: STATUS_CLOSED ) {
2019-12-23 15:51:23 +01:00
return 0 ;
}
2019-12-17 18:05:59 +01:00
2016-05-23 09:16:47 +02:00
$this -> db -> begin ();
2016-09-07 12:41:32 +02:00
2022-04-11 17:34:19 +02:00
$sql = " UPDATE " . MAIN_DB_PREFIX . " expedition SET fk_statut = " . self :: STATUS_CLOSED ;
$sql .= " WHERE rowid = " . (( int ) $this -> id ) . " AND fk_statut > 0 " ;
2014-10-18 16:27:15 +02:00
2019-11-13 19:37:08 +01:00
$resql = $this -> db -> query ( $sql );
2021-02-25 22:38:35 +01:00
if ( $resql ) {
2016-06-09 22:40:21 +02:00
// Set order billed if 100% of order is shipped (qty in shipment lines match qty in order lines)
2021-02-25 22:38:35 +01:00
if ( $this -> origin == 'commande' && $this -> origin_id > 0 ) {
2016-06-09 22:40:21 +02:00
$order = new Commande ( $this -> db );
$order -> fetch ( $this -> origin_id );
2016-09-07 12:41:32 +02:00
2019-11-13 19:37:08 +01:00
$order -> loadExpeditions ( self :: STATUS_CLOSED ); // Fill $order->expeditions = array(orderlineid => qty)
2016-09-07 12:41:32 +02:00
2016-06-09 22:40:21 +02:00
$shipments_match_order = 1 ;
2021-02-25 22:38:35 +01:00
foreach ( $order -> lines as $line ) {
2016-06-09 22:40:21 +02:00
$lineid = $line -> id ;
$qty = $line -> qty ;
2021-02-25 22:38:35 +01:00
if (( $line -> product_type == 0 || ! empty ( $conf -> global -> STOCK_SUPPORTS_SERVICES )) && $order -> expeditions [ $lineid ] != $qty ) {
2016-06-09 22:40:21 +02:00
$shipments_match_order = 0 ;
2019-11-13 19:37:08 +01:00
$text = 'Qty for order line id ' . $lineid . ' is ' . $qty . '. However in the shipments with status Expedition::STATUS_CLOSED=' . self :: STATUS_CLOSED . ' we have qty = ' . $order -> expeditions [ $lineid ] . ', so we can t close order' ;
2016-06-09 22:40:21 +02:00
dol_syslog ( $text );
break ;
}
}
2021-02-25 22:38:35 +01:00
if ( $shipments_match_order ) {
2022-10-07 22:44:20 +02:00
dol_syslog ( " Qty for the " . count ( $order -> lines ) . " lines of the origin order is same than qty for lines in the shipment we close (shipments_match_order is true), with new status Expedition::STATUS_CLOSED= " . self :: STATUS_CLOSED . ', so we close order' );
// We close the order
$order -> cloture ( $user ); // Note this may also create an invoice if module workflow ask it
2016-06-09 22:40:21 +02:00
}
}
2016-09-07 12:41:32 +02:00
2022-04-11 17:34:19 +02:00
$this -> statut = self :: STATUS_CLOSED ; // Will be revert to STATUS_VALIDATED at end if there is a rollback
$this -> status = self :: STATUS_CLOSED ; // Will be revert to STATUS_VALIDATED at end if there is a rollback
2016-05-14 19:14:39 +02:00
// If stock increment is done on closing
2021-02-25 22:38:35 +01:00
if ( ! $error && ! empty ( $conf -> stock -> enabled ) && ! empty ( $conf -> global -> STOCK_CALCULATE_ON_SHIPMENT_CLOSE )) {
2016-04-25 18:33:39 +02:00
require_once DOL_DOCUMENT_ROOT . '/product/stock/class/mouvementstock.class.php' ;
2016-09-07 12:41:32 +02:00
2016-04-25 18:33:39 +02:00
$langs -> load ( " agenda " );
2016-09-07 12:41:32 +02:00
2016-04-25 18:33:39 +02:00
// Loop on each product line to add a stock movement
2016-06-09 22:40:21 +02:00
// TODO possibilite d'expedier a partir d'une propale ou autre origine ?
2016-04-25 18:33:39 +02:00
$sql = " SELECT cd.fk_product, cd.subprice, " ;
2019-11-13 19:37:08 +01:00
$sql .= " ed.rowid, ed.qty, ed.fk_entrepot, " ;
2022-04-11 16:48:56 +02:00
$sql .= " e.ref, " ;
2019-11-13 19:37:08 +01:00
$sql .= " edb.rowid as edbrowid, edb.eatby, edb.sellby, edb.batch, edb.qty as edbqty, edb.fk_origin_stock " ;
$sql .= " FROM " . MAIN_DB_PREFIX . " commandedet as cd, " ;
$sql .= " " . MAIN_DB_PREFIX . " expeditiondet as ed " ;
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . " expeditiondet_batch as edb on edb.fk_expeditiondet = ed.rowid " ;
2022-04-11 16:48:56 +02:00
$sql .= " INNER JOIN " . MAIN_DB_PREFIX . " expedition as e ON ed.fk_expedition = e.rowid " ;
2021-08-23 19:33:24 +02:00
$sql .= " WHERE ed.fk_expedition = " . (( int ) $this -> id );
2019-11-13 19:37:08 +01:00
$sql .= " AND cd.rowid = ed.fk_origin_line " ;
2016-09-07 12:41:32 +02:00
2016-04-25 18:33:39 +02:00
dol_syslog ( get_class ( $this ) . " ::valid select details " , LOG_DEBUG );
2019-11-13 19:37:08 +01:00
$resql = $this -> db -> query ( $sql );
2021-02-25 22:38:35 +01:00
if ( $resql ) {
2016-04-25 18:33:39 +02:00
$cpt = $this -> db -> num_rows ( $resql );
2021-02-25 22:38:35 +01:00
for ( $i = 0 ; $i < $cpt ; $i ++ ) {
2016-04-25 18:33:39 +02:00
$obj = $this -> db -> fetch_object ( $resql );
2021-02-25 22:38:35 +01:00
if ( empty ( $obj -> edbrowid )) {
2016-04-25 18:33:39 +02:00
$qty = $obj -> qty ;
2020-05-21 15:05:19 +02:00
} else {
2016-04-25 18:33:39 +02:00
$qty = $obj -> edbqty ;
}
2021-02-25 22:38:35 +01:00
if ( $qty <= 0 ) {
continue ;
}
2016-04-25 18:33:39 +02:00
dol_syslog ( get_class ( $this ) . " ::valid movement index " . $i . " ed.rowid= " . $obj -> rowid . " edb.rowid= " . $obj -> edbrowid );
2016-09-07 12:41:32 +02:00
2016-04-25 18:33:39 +02:00
$mouvS = new MouvementStock ( $this -> db );
$mouvS -> origin = & $this ;
2022-03-22 13:46:55 +01:00
$mouvS -> setOrigin ( $this -> element , $this -> id );
2016-09-07 12:41:32 +02:00
2021-02-25 22:38:35 +01:00
if ( empty ( $obj -> edbrowid )) {
2016-04-25 18:33:39 +02:00
// line without batch detail
2016-09-07 12:41:32 +02:00
2016-04-25 18:33:39 +02:00
// We decrement stock of product (and sub-products) -> update table llx_product_stock (key of this table is fk_product+fk_entrepot) and add a movement record
2022-04-11 16:48:56 +02:00
$result = $mouvS -> livraison ( $user , $obj -> fk_product , $obj -> fk_entrepot , $qty , $obj -> subprice , $langs -> trans ( " ShipmentClassifyClosedInDolibarr " , $obj -> ref ));
2016-04-25 18:33:39 +02:00
if ( $result < 0 ) {
2017-10-07 13:09:31 +02:00
$this -> error = $mouvS -> error ;
$this -> errors = $mouvS -> errors ;
2022-06-02 10:15:04 +02:00
$error ++ ;
break ;
2016-04-25 18:33:39 +02:00
}
2020-05-21 15:05:19 +02:00
} else {
2016-04-25 18:33:39 +02:00
// line with batch detail
2016-09-07 12:41:32 +02:00
2016-04-25 18:33:39 +02:00
// We decrement stock of product (and sub-products) -> update table llx_product_stock (key of this table is fk_product+fk_entrepot) and add a movement record
2022-04-11 16:48:56 +02:00
$result = $mouvS -> livraison ( $user , $obj -> fk_product , $obj -> fk_entrepot , $qty , $obj -> subprice , $langs -> trans ( " ShipmentClassifyClosedInDolibarr " , $obj -> ref ), '' , $this -> db -> jdate ( $obj -> eatby ), $this -> db -> jdate ( $obj -> sellby ), $obj -> batch , $obj -> fk_origin_stock );
2016-04-25 18:33:39 +02:00
if ( $result < 0 ) {
2017-10-07 13:09:31 +02:00
$this -> error = $mouvS -> error ;
$this -> errors = $mouvS -> errors ;
2022-06-02 10:15:04 +02:00
$error ++ ;
break ;
2016-04-25 18:33:39 +02:00
}
}
}
2020-05-21 15:05:19 +02:00
} else {
2019-11-13 19:37:08 +01:00
$this -> error = $this -> db -> lasterror ();
2016-06-02 11:23:49 +02:00
$error ++ ;
2016-04-25 18:33:39 +02:00
}
}
2016-09-07 12:41:32 +02:00
2016-05-20 20:03:29 +02:00
// Call trigger
2021-02-25 22:38:35 +01:00
if ( ! $error ) {
2019-11-13 19:37:08 +01:00
$result = $this -> call_trigger ( 'SHIPPING_CLOSED' , $user );
2017-10-07 13:09:31 +02:00
if ( $result < 0 ) {
$error ++ ;
}
2016-05-20 20:03:29 +02:00
}
2020-05-21 15:05:19 +02:00
} else {
2016-04-26 13:27:32 +02:00
dol_print_error ( $this -> db );
2017-10-07 13:09:31 +02:00
$error ++ ;
2016-05-23 09:16:47 +02:00
}
2016-09-07 12:41:32 +02:00
2021-02-25 22:38:35 +01:00
if ( ! $error ) {
2017-10-07 13:09:31 +02:00
$this -> db -> commit ();
return 1 ;
2020-05-21 15:05:19 +02:00
} else {
2019-02-05 11:58:49 +01:00
$this -> statut = self :: STATUS_VALIDATED ;
2022-04-11 17:34:19 +02:00
$this -> status = self :: STATUS_VALIDATED ;
2017-10-07 13:09:31 +02:00
$this -> db -> rollback ();
return - 1 ;
2016-04-26 13:27:32 +02:00
}
}
2020-10-28 17:49:52 +01:00
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
2016-04-26 13:27:32 +02:00
/**
* Classify the shipping as invoiced ( used when WORKFLOW_BILL_ON_SHIPMENT is on )
*
2021-02-09 13:10:11 +01:00
* @ deprecated
* @ see setBilled ()
2016-04-26 13:27:32 +02:00
* @ return int < 0 if ko , > 0 if ok
*/
2019-02-24 23:32:09 +01:00
public function set_billed ()
2016-04-26 13:27:32 +02:00
{
2020-10-28 17:49:52 +01:00
// phpcs:enable
2021-02-09 13:10:11 +01:00
dol_syslog ( get_class ( $this ) . " ::set_billed is deprecated, use setBilled instead " , LOG_NOTICE );
return $this -> setBilled ();
}
/**
* Classify the shipping as invoiced ( used when WORKFLOW_BILL_ON_SHIPMENT is on )
*
* @ return int < 0 if ko , > 0 if ok
*/
public function setBilled ()
{
2017-10-07 13:09:31 +02:00
global $user ;
2019-11-13 19:37:08 +01:00
$error = 0 ;
2016-09-07 12:41:32 +02:00
2016-05-23 09:16:47 +02:00
$this -> db -> begin ();
2016-04-26 13:27:32 +02:00
2019-11-13 19:37:08 +01:00
$sql = 'UPDATE ' . MAIN_DB_PREFIX . 'expedition SET fk_statut=2, billed=1' ; // TODO Update only billed
2021-08-27 23:36:06 +02:00
$sql .= " WHERE rowid = " . (( int ) $this -> id ) . ' AND fk_statut > 0' ;
2016-04-26 13:27:32 +02:00
2019-11-13 19:37:08 +01:00
$resql = $this -> db -> query ( $sql );
2021-02-25 22:38:35 +01:00
if ( $resql ) {
2019-11-13 19:37:08 +01:00
$this -> statut = self :: STATUS_CLOSED ;
$this -> billed = 1 ;
2016-09-07 12:41:32 +02:00
2016-05-20 20:03:29 +02:00
// Call trigger
2019-11-13 19:37:08 +01:00
$result = $this -> call_trigger ( 'SHIPPING_BILLED' , $user );
2016-09-07 12:41:32 +02:00
if ( $result < 0 ) {
2016-05-23 09:16:47 +02:00
$error ++ ;
2016-05-20 20:03:29 +02:00
}
2016-05-23 09:16:47 +02:00
} else {
$error ++ ;
2019-11-13 19:37:08 +01:00
$this -> errors [] = $this -> db -> lasterror ;
2016-05-23 09:16:47 +02:00
}
2016-09-07 12:41:32 +02:00
2016-05-23 09:16:47 +02:00
if ( empty ( $error )) {
$this -> db -> commit ();
2012-07-02 19:30:37 +02:00
return 1 ;
2020-05-21 15:05:19 +02:00
} else {
2019-11-13 19:37:08 +01:00
$this -> statut = self :: STATUS_VALIDATED ;
$this -> billed = 0 ;
2016-05-23 09:16:47 +02:00
$this -> db -> rollback ();
2012-07-02 19:30:37 +02:00
return - 1 ;
}
}
2012-03-14 14:00:20 +01:00
2016-02-24 13:19:25 +01:00
/**
* Classify the shipping as validated / opened
*
2018-02-15 15:27:06 +01:00
* @ return int < 0 if KO , 0 if already open , > 0 if OK
2016-02-24 13:19:25 +01:00
*/
2019-02-24 23:32:09 +01:00
public function reOpen ()
2016-02-24 13:19:25 +01:00
{
2019-11-13 19:37:08 +01:00
global $conf , $langs , $user ;
2016-02-24 13:19:25 +01:00
2019-11-13 19:37:08 +01:00
$error = 0 ;
2016-09-07 12:41:32 +02:00
2018-02-15 15:27:06 +01:00
// Protection. This avoid to move stock later when we should not
2021-02-25 22:38:35 +01:00
if ( $this -> statut == self :: STATUS_VALIDATED ) {
2018-02-15 15:27:06 +01:00
return 0 ;
}
2016-05-23 09:16:47 +02:00
$this -> db -> begin ();
2016-09-07 12:41:32 +02:00
2019-11-13 19:37:08 +01:00
$oldbilled = $this -> billed ;
2019-02-05 11:58:49 +01:00
2016-02-24 13:19:25 +01:00
$sql = 'UPDATE ' . MAIN_DB_PREFIX . 'expedition SET fk_statut=1' ;
2021-08-27 23:36:06 +02:00
$sql .= " WHERE rowid = " . (( int ) $this -> id ) . ' AND fk_statut > 0' ;
2016-02-24 13:19:25 +01:00
2019-11-13 19:37:08 +01:00
$resql = $this -> db -> query ( $sql );
2021-02-25 22:38:35 +01:00
if ( $resql ) {
2019-11-13 19:37:08 +01:00
$this -> statut = self :: STATUS_VALIDATED ;
$this -> billed = 0 ;
2016-09-07 12:41:32 +02:00
2016-05-14 19:22:27 +02:00
// If stock increment is done on closing
2021-02-25 22:38:35 +01:00
if ( ! $error && ! empty ( $conf -> stock -> enabled ) && ! empty ( $conf -> global -> STOCK_CALCULATE_ON_SHIPMENT_CLOSE )) {
2016-04-25 18:54:28 +02:00
require_once DOL_DOCUMENT_ROOT . '/product/stock/class/mouvementstock.class.php' ;
2016-09-07 12:41:32 +02:00
2016-04-25 18:54:28 +02:00
$langs -> load ( " agenda " );
2016-09-07 12:41:32 +02:00
2016-04-25 18:54:28 +02:00
// Loop on each product line to add a stock movement
// TODO possibilite d'expedier a partir d'une propale ou autre origine
$sql = " SELECT cd.fk_product, cd.subprice, " ;
2019-11-13 19:37:08 +01:00
$sql .= " ed.rowid, ed.qty, ed.fk_entrepot, " ;
$sql .= " edb.rowid as edbrowid, edb.eatby, edb.sellby, edb.batch, edb.qty as edbqty, edb.fk_origin_stock " ;
$sql .= " FROM " . MAIN_DB_PREFIX . " commandedet as cd, " ;
$sql .= " " . MAIN_DB_PREFIX . " expeditiondet as ed " ;
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . " expeditiondet_batch as edb on edb.fk_expeditiondet = ed.rowid " ;
2021-08-23 19:33:24 +02:00
$sql .= " WHERE ed.fk_expedition = " . (( int ) $this -> id );
2019-11-13 19:37:08 +01:00
$sql .= " AND cd.rowid = ed.fk_origin_line " ;
2016-09-07 12:41:32 +02:00
2016-04-25 18:54:28 +02:00
dol_syslog ( get_class ( $this ) . " ::valid select details " , LOG_DEBUG );
2019-11-13 19:37:08 +01:00
$resql = $this -> db -> query ( $sql );
2021-02-25 22:38:35 +01:00
if ( $resql ) {
2016-04-25 18:54:28 +02:00
$cpt = $this -> db -> num_rows ( $resql );
2021-02-25 22:38:35 +01:00
for ( $i = 0 ; $i < $cpt ; $i ++ ) {
2016-04-25 18:54:28 +02:00
$obj = $this -> db -> fetch_object ( $resql );
2021-02-25 22:38:35 +01:00
if ( empty ( $obj -> edbrowid )) {
2016-04-25 18:54:28 +02:00
$qty = $obj -> qty ;
2020-05-21 15:05:19 +02:00
} else {
2016-04-25 18:54:28 +02:00
$qty = $obj -> edbqty ;
}
2021-02-25 22:38:35 +01:00
if ( $qty <= 0 ) {
continue ;
}
2016-04-25 18:54:28 +02:00
dol_syslog ( get_class ( $this ) . " ::reopen expedition movement index " . $i . " ed.rowid= " . $obj -> rowid . " edb.rowid= " . $obj -> edbrowid );
2016-09-07 12:41:32 +02:00
2016-04-25 18:54:28 +02:00
//var_dump($this->lines[$i]);
$mouvS = new MouvementStock ( $this -> db );
$mouvS -> origin = & $this ;
2022-03-22 13:46:55 +01:00
$mouvS -> setOrigin ( $this -> element , $this -> id );
2016-09-07 12:41:32 +02:00
2021-02-25 22:38:35 +01:00
if ( empty ( $obj -> edbrowid )) {
2016-04-25 18:54:28 +02:00
// line without batch detail
2016-09-07 12:41:32 +02:00
2016-04-25 18:54:28 +02:00
// We decrement stock of product (and sub-products) -> update table llx_product_stock (key of this table is fk_product+fk_entrepot) and add a movement record
2019-11-13 19:37:08 +01:00
$result = $mouvS -> livraison ( $user , $obj -> fk_product , $obj -> fk_entrepot , - $qty , $obj -> subprice , $langs -> trans ( " ShipmentUnClassifyCloseddInDolibarr " , $numref ));
2016-04-25 18:54:28 +02:00
if ( $result < 0 ) {
2017-10-07 13:09:31 +02:00
$this -> error = $mouvS -> error ;
$this -> errors = $mouvS -> errors ;
2022-06-02 10:15:04 +02:00
$error ++ ;
break ;
2016-04-25 18:54:28 +02:00
}
2020-05-21 15:05:19 +02:00
} else {
2016-04-25 18:54:28 +02:00
// line with batch detail
2016-09-07 12:41:32 +02:00
2016-04-25 18:54:28 +02:00
// We decrement stock of product (and sub-products) -> update table llx_product_stock (key of this table is fk_product+fk_entrepot) and add a movement record
2019-11-13 19:37:08 +01:00
$result = $mouvS -> livraison ( $user , $obj -> fk_product , $obj -> fk_entrepot , - $qty , $obj -> subprice , $langs -> trans ( " ShipmentUnClassifyCloseddInDolibarr " , $numref ), '' , $this -> db -> jdate ( $obj -> eatby ), $this -> db -> jdate ( $obj -> sellby ), $obj -> batch , $obj -> fk_origin_stock );
2016-04-25 18:54:28 +02:00
if ( $result < 0 ) {
2017-10-07 13:09:31 +02:00
$this -> error = $mouvS -> error ;
$this -> errors = $mouvS -> errors ;
2022-06-02 10:15:04 +02:00
$error ++ ;
break ;
2016-04-25 18:54:28 +02:00
}
}
}
2020-05-21 15:05:19 +02:00
} else {
2019-11-13 19:37:08 +01:00
$this -> error = $this -> db -> lasterror ();
2016-06-02 11:23:49 +02:00
$error ++ ;
2016-04-25 18:54:28 +02:00
}
2016-05-20 20:03:29 +02:00
}
2016-09-07 12:41:32 +02:00
2020-10-28 17:49:52 +01:00
if ( ! $error ) {
2017-10-07 13:09:31 +02:00
// Call trigger
2019-11-13 19:37:08 +01:00
$result = $this -> call_trigger ( 'SHIPPING_REOPEN' , $user );
2017-10-07 13:09:31 +02:00
if ( $result < 0 ) {
$error ++ ;
}
2020-10-28 17:49:52 +01:00
}
2016-05-23 09:16:47 +02:00
} else {
$error ++ ;
2019-11-13 19:37:08 +01:00
$this -> errors [] = $this -> db -> lasterror ();
2016-05-23 09:16:47 +02:00
}
2016-09-07 12:41:32 +02:00
2021-02-25 22:38:35 +01:00
if ( ! $error ) {
2016-05-23 09:16:47 +02:00
$this -> db -> commit ();
2016-02-24 13:19:25 +01:00
return 1 ;
2020-05-21 15:05:19 +02:00
} else {
2019-11-13 19:37:08 +01:00
$this -> statut = self :: STATUS_CLOSED ;
$this -> billed = $oldbilled ;
2016-05-23 09:16:47 +02:00
$this -> db -> rollback ();
2016-02-24 13:19:25 +01:00
return - 1 ;
}
}
2016-09-07 12:41:32 +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
/**
2015-05-07 13:28:03 +02:00
* Create a document onto disk according to template module .
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-05-06 23:13:33 +02:00
* @ param string $modele Force the model to using ( '' to not force )
* @ param Translate $outputlangs object lang to use for translations
* @ param int $hidedetails Hide details of lines
* @ param int $hidedesc Hide description
* @ param int $hideref Hide ref
2020-10-28 17:49:52 +01:00
* @ param null | array $moreparams Array to provide more information
2015-05-06 23:13:33 +02:00
* @ return int 0 if KO , 1 if OK
Created a method generateDocument for several classes
Which are: Commande, Contrat, Livraison, Facture, Projet, Propal, Task, Expedition, CommandeFournisseur, FactureFournisseur and therefore deprecated the following methods supplier_order_pdf_create, supplier_invoice_pdf_create, delivery_order_pdf_create, task_pdf_create, propale_pdf_create, project_pdf_create, facture_pdf_create, expedition_pdf_create, commande_pdf_create
2014-09-16 12:30:37 +02:00
*/
2019-01-27 15:20:16 +01:00
public function generateDocument ( $modele , $outputlangs , $hidedetails = 0 , $hidedesc = 0 , $hideref = 0 , $moreparams = null )
Created a method generateDocument for several classes
Which are: Commande, Contrat, Livraison, Facture, Projet, Propal, Task, Expedition, CommandeFournisseur, FactureFournisseur and therefore deprecated the following methods supplier_order_pdf_create, supplier_invoice_pdf_create, delivery_order_pdf_create, task_pdf_create, propale_pdf_create, project_pdf_create, facture_pdf_create, expedition_pdf_create, commande_pdf_create
2014-09-16 12:30:37 +02:00
{
2020-12-13 13:34:21 +01:00
global $conf ;
Created a method generateDocument for several classes
Which are: Commande, Contrat, Livraison, Facture, Projet, Propal, Task, Expedition, CommandeFournisseur, FactureFournisseur and therefore deprecated the following methods supplier_order_pdf_create, supplier_invoice_pdf_create, delivery_order_pdf_create, task_pdf_create, propale_pdf_create, project_pdf_create, facture_pdf_create, expedition_pdf_create, commande_pdf_create
2014-09-16 12:30:37 +02:00
2020-08-04 11:02:16 +02:00
$outputlangs -> load ( " products " );
Created a method generateDocument for several classes
Which are: Commande, Contrat, Livraison, Facture, Projet, Propal, Task, Expedition, CommandeFournisseur, FactureFournisseur and therefore deprecated the following methods supplier_order_pdf_create, supplier_invoice_pdf_create, delivery_order_pdf_create, task_pdf_create, propale_pdf_create, project_pdf_create, facture_pdf_create, expedition_pdf_create, commande_pdf_create
2014-09-16 12:30:37 +02:00
2020-03-12 12:45:44 +01:00
if ( ! dol_strlen ( $modele )) {
2017-01-16 21:16:05 +01:00
$modele = 'rouget' ;
2020-12-13 13:34:21 +01:00
if ( ! empty ( $this -> model_pdf )) {
$modele = $this -> model_pdf ;
} elseif ( ! empty ( $this -> modelpdf )) { // deprecated
2017-01-16 21:16:05 +01:00
$modele = $this -> modelpdf ;
2020-03-12 12:45:44 +01:00
} elseif ( ! empty ( $conf -> global -> EXPEDITION_ADDON_PDF )) {
Created a method generateDocument for several classes
Which are: Commande, Contrat, Livraison, Facture, Projet, Propal, Task, Expedition, CommandeFournisseur, FactureFournisseur and therefore deprecated the following methods supplier_order_pdf_create, supplier_invoice_pdf_create, delivery_order_pdf_create, task_pdf_create, propale_pdf_create, project_pdf_create, facture_pdf_create, expedition_pdf_create, commande_pdf_create
2014-09-16 12:30:37 +02:00
$modele = $conf -> global -> EXPEDITION_ADDON_PDF ;
}
}
2014-09-21 18:16:14 +02:00
$modelpath = " core/modules/expedition/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-22 00:07:10 +02:00
$this -> fetch_origin ();
2019-01-27 11:55:16 +01:00
return $this -> commonGenerateDocument ( $modelpath , $modele , $outputlangs , $hidedetails , $hidedesc , $hideref , $moreparams );
Created a method generateDocument for several classes
Which are: Commande, Contrat, Livraison, Facture, Projet, Propal, Task, Expedition, CommandeFournisseur, FactureFournisseur and therefore deprecated the following methods supplier_order_pdf_create, supplier_invoice_pdf_create, delivery_order_pdf_create, task_pdf_create, propale_pdf_create, project_pdf_create, facture_pdf_create, expedition_pdf_create, commande_pdf_create
2014-09-16 12:30:37 +02:00
}
2015-04-18 18:11:01 +02:00
/**
* Function used to replace a thirdparty id with another one .
*
* @ param DoliDB $db Database handler
* @ param int $origin_id Old thirdparty id
* @ param int $dest_id New thirdparty id
* @ return bool
*/
public static function replaceThirdparty ( DoliDB $db , $origin_id , $dest_id )
{
$tables = array (
'expedition'
);
return CommonObject :: commonReplaceThirdparty ( $db , $origin_id , $dest_id , $tables );
}
2003-11-13 18:36:45 +01:00
}
2006-11-11 01:46:15 +01:00
/**
2019-06-29 16:29:32 +02:00
* Classe to manage lines of shipment
2008-05-26 23:27:50 +02:00
*/
2015-12-16 16:18:29 +01:00
class ExpeditionLigne extends CommonObjectLine
2003-11-13 18:36:45 +01:00
{
2018-08-23 18:35:45 +02:00
/**
* @ var string ID to identify managed object
*/
2019-11-13 19:37:08 +01:00
public $element = 'expeditiondet' ;
2018-09-01 23:46:13 +02:00
2018-08-22 18:48:53 +02:00
/**
* @ var string Name of table without prefix where object is stored
*/
2019-11-13 19:37:08 +01:00
public $table_element = 'expeditiondet' ;
2017-10-15 17:58:22 +02:00
2018-10-25 21:36:01 +02:00
/**
* @ deprecated
2019-04-04 18:33:12 +02:00
* @ see $fk_origin_line
2018-10-25 21:36:01 +02:00
*/
public $origin_line_id ;
2018-10-10 11:30:33 +02:00
/**
2020-10-28 17:49:52 +01:00
* @ var int ID
*/
2017-10-15 17:58:22 +02:00
public $fk_origin_line ;
/**
2018-10-25 21:36:01 +02:00
* @ var int Id of shipment
2017-10-15 17:58:22 +02:00
*/
public $fk_expedition ;
2018-08-22 11:11:59 +02:00
/**
2020-10-28 17:49:52 +01:00
* @ var DoliDB Database handler .
*/
public $db ;
2008-05-26 23:27:50 +02:00
2020-10-28 17:49:52 +01:00
/**
* @ var float qty asked From llx_expeditiondet
*/
public $qty ;
2017-11-02 12:38:36 +01:00
2020-10-28 17:49:52 +01:00
/**
* @ var float qty shipped
*/
public $qty_shipped ;
2008-05-26 23:27:50 +02:00
2020-10-28 17:49:52 +01:00
/**
* @ var int Id of product
*/
public $fk_product ;
public $detail_batch ;
2015-04-23 23:21:06 +02:00
2020-10-28 17:49:52 +01:00
/**
* @ var int Id of warehouse
*/
2018-10-25 21:36:01 +02:00
public $entrepot_id ;
2012-03-14 14:00:20 +01:00
2006-11-11 01:46:15 +01:00
2020-10-28 17:49:52 +01:00
/**
* @ var float qty asked From llx_commandedet or llx_propaldet
*/
2018-10-25 21:36:01 +02:00
public $qty_asked ;
2017-11-02 12:38:36 +01:00
2020-10-28 17:49:52 +01:00
/**
* @ deprecated
* @ see $product_ref
*/
public $ref ;
2015-04-23 23:21:06 +02:00
/**
2018-10-25 21:36:01 +02:00
* @ var string product ref
2015-04-23 23:21:06 +02:00
*/
2018-10-25 21:36:01 +02:00
public $product_ref ;
2015-04-23 23:21:06 +02:00
/**
* @ deprecated
2019-04-04 18:33:12 +02:00
* @ see $product_label
2015-04-23 23:21:06 +02:00
*/
2018-10-25 21:36:01 +02:00
public $libelle ;
2020-10-28 17:49:52 +01:00
/**
* @ var string product label
*/
2018-10-25 21:36:01 +02:00
public $product_label ;
2020-10-28 17:49:52 +01:00
/**
* @ var string product description
* @ deprecated
* @ see $product_desc
*/
public $desc ;
2018-10-25 21:36:01 +02:00
2020-10-28 17:49:52 +01:00
/**
* @ var string product description
*/
2018-10-25 21:36:01 +02:00
public $product_desc ;
2022-03-01 01:28:47 +01:00
/**
* Type of the product . 0 for product , 1 for service
* @ var int
*/
public $product_type = 0 ;
2020-10-28 17:49:52 +01:00
/**
* @ var int rang of line
*/
public $rang ;
2019-08-06 15:10:13 +02:00
2020-10-28 17:49:52 +01:00
/**
* @ var float weight
*/
public $weight ;
public $weight_units ;
2018-10-25 21:36:01 +02:00
2020-10-28 17:49:52 +01:00
/**
* @ var float weight
*/
public $length ;
public $length_units ;
2018-10-25 21:36:01 +02:00
2020-10-28 17:49:52 +01:00
/**
* @ var float weight
*/
public $surface ;
public $surface_units ;
2018-10-25 21:36:01 +02:00
2020-10-28 17:49:52 +01:00
/**
* @ var float weight
*/
public $volume ;
public $volume_units ;
2018-10-25 21:36:01 +02:00
// Invoicing
public $remise_percent ;
2020-10-28 17:49:52 +01:00
public $tva_tx ;
2018-10-25 21:36:01 +02:00
2020-10-28 17:49:52 +01:00
/**
* @ var float total without tax
*/
public $total_ht ;
2018-10-25 21:36:01 +02:00
2020-10-28 17:49:52 +01:00
/**
* @ var float total with tax
*/
public $total_ttc ;
2018-10-25 21:36:01 +02:00
2020-10-28 17:49:52 +01:00
/**
* @ var float total vat
*/
public $total_tva ;
2018-10-25 21:36:01 +02:00
2020-10-28 17:49:52 +01:00
/**
* @ var float total localtax 1
*/
public $total_localtax1 ;
2018-10-25 21:36:01 +02:00
2020-10-28 17:49:52 +01:00
/**
* @ var float total localtax 2
*/
public $total_localtax2 ;
2018-10-25 21:36:01 +02:00
2012-01-04 23:56:10 +01:00
2020-10-28 17:49:52 +01:00
/**
* Constructor
*
* @ param DoliDB $db Database handler
*/
2019-02-24 23:32:09 +01:00
public function __construct ( $db )
2017-10-15 17:58:22 +02:00
{
2019-11-13 19:37:08 +01:00
$this -> db = $db ;
2017-10-15 17:58:22 +02:00
}
2017-10-30 12:39:06 +01:00
/**
* Load line expedition
*
* @ param int $rowid Id line order
* @ return int < 0 if KO , > 0 if OK
*/
2019-02-24 23:32:09 +01:00
public function fetch ( $rowid )
2017-10-30 12:39:06 +01:00
{
$sql = 'SELECT ed.rowid, ed.fk_expedition, ed.fk_entrepot, ed.fk_origin_line, ed.qty, ed.rang' ;
2019-11-13 19:37:08 +01:00
$sql .= ' FROM ' . MAIN_DB_PREFIX . $this -> table_element . ' as ed' ;
2021-03-29 15:32:09 +02:00
$sql .= ' WHERE ed.rowid = ' . (( int ) $rowid );
2017-10-30 12:39:06 +01:00
$result = $this -> db -> query ( $sql );
2021-02-25 22:38:35 +01:00
if ( $result ) {
2017-10-30 12:39:06 +01:00
$objp = $this -> db -> fetch_object ( $result );
2019-11-13 19:37:08 +01:00
$this -> id = $objp -> rowid ;
$this -> fk_expedition = $objp -> fk_expedition ;
$this -> entrepot_id = $objp -> fk_entrepot ;
$this -> fk_origin_line = $objp -> fk_origin_line ;
$this -> qty = $objp -> qty ;
$this -> rang = $objp -> rang ;
2017-10-30 12:39:06 +01:00
$this -> db -> free ( $result );
return 1 ;
2020-05-21 15:05:19 +02:00
} else {
2017-10-30 12:39:06 +01:00
$this -> errors [] = $this -> db -> lasterror ();
$this -> error = $this -> db -> lasterror ();
return - 1 ;
}
}
2017-10-07 13:09:31 +02:00
/**
2017-10-15 17:58:22 +02:00
* Insert line into database
2017-10-07 13:09:31 +02:00
*
2017-10-18 17:01:17 +02:00
* @ param User $user User that modify
2017-10-15 17:58:22 +02:00
* @ param int $notrigger 1 = disable triggers
2018-10-25 21:36:01 +02:00
* @ return int < 0 if KO , line id > 0 if OK
2017-10-07 13:09:31 +02:00
*/
2019-06-12 22:55:08 +02:00
public function insert ( $user , $notrigger = 0 )
2006-05-30 15:49:03 +02:00
{
2017-10-15 17:58:22 +02:00
global $langs , $conf ;
2020-03-12 12:45:44 +01:00
$error = 0 ;
2017-10-15 17:58:22 +02:00
// Check parameters
2021-02-25 22:38:35 +01:00
if ( empty ( $this -> fk_expedition ) || empty ( $this -> fk_origin_line ) || ! is_numeric ( $this -> qty )) {
2018-03-04 12:35:32 +01:00
$this -> error = 'ErrorMandatoryParametersNotProvided' ;
2017-10-15 17:58:22 +02:00
return - 1 ;
}
2017-10-18 17:01:17 +02:00
$this -> db -> begin ();
2017-10-15 17:58:22 +02:00
2021-02-25 22:38:35 +01:00
if ( empty ( $this -> rang )) {
$this -> rang = 0 ;
}
2019-08-06 15:10:13 +02:00
// Rank to use
2019-08-10 00:46:20 +02:00
$ranktouse = $this -> rang ;
2021-02-25 22:38:35 +01:00
if ( $ranktouse == - 1 ) {
2021-01-07 18:24:44 +01:00
$rangmax = $this -> line_max ( $this -> fk_expedition );
2019-08-10 00:46:20 +02:00
$ranktouse = $rangmax + 1 ;
2019-08-06 15:10:13 +02:00
}
2017-10-15 17:58:22 +02:00
$sql = " INSERT INTO " . MAIN_DB_PREFIX . " expeditiondet ( " ;
2020-03-12 12:45:44 +01:00
$sql .= " fk_expedition " ;
$sql .= " , fk_entrepot " ;
$sql .= " , fk_origin_line " ;
$sql .= " , qty " ;
$sql .= " , rang " ;
$sql .= " ) VALUES ( " ;
$sql .= $this -> fk_expedition ;
$sql .= " , " . ( empty ( $this -> entrepot_id ) ? 'NULL' : $this -> entrepot_id );
2021-09-03 21:25:17 +02:00
$sql .= " , " . (( int ) $this -> fk_origin_line );
$sql .= " , " . price2num ( $this -> qty , 'MS' );
$sql .= " , " . (( int ) $ranktouse );
2020-03-12 12:45:44 +01:00
$sql .= " ) " ;
2017-10-15 17:58:22 +02:00
dol_syslog ( get_class ( $this ) . " ::insert " , LOG_DEBUG );
$resql = $this -> db -> query ( $sql );
2021-02-25 22:38:35 +01:00
if ( $resql ) {
2017-10-15 17:58:22 +02:00
$this -> id = $this -> db -> last_insert_id ( MAIN_DB_PREFIX . " expeditiondet " );
2018-08-12 16:29:26 +02:00
2021-02-25 22:38:35 +01:00
if ( ! $error ) {
2019-11-13 19:37:08 +01:00
$result = $this -> insertExtraFields ();
2021-02-25 22:38:35 +01:00
if ( $result < 0 ) {
2017-10-15 17:58:22 +02:00
$error ++ ;
}
}
2021-02-25 22:38:35 +01:00
if ( ! $error && ! $notrigger ) {
2017-10-18 17:01:17 +02:00
// Call trigger
2019-11-13 19:37:08 +01:00
$result = $this -> call_trigger ( 'LINESHIPPING_INSERT' , $user );
2021-02-25 22:38:35 +01:00
if ( $result < 0 ) {
2017-10-18 17:01:17 +02:00
$error ++ ;
}
// End call triggers
}
2021-11-19 10:06:35 +01:00
if ( $error ) {
foreach ( $this -> errors as $errmsg ) {
dol_syslog ( get_class ( $this ) . " ::delete " . $errmsg , LOG_ERR );
$this -> error .= ( $this -> error ? ', ' . $errmsg : $errmsg );
}
2017-10-18 17:01:17 +02:00
}
2021-11-19 10:06:35 +01:00
} else {
$error ++ ;
}
2018-03-10 23:40:56 +01:00
2021-11-19 10:06:35 +01:00
if ( $error ) {
2017-10-18 17:01:17 +02:00
$this -> db -> rollback ();
2021-11-19 10:06:35 +01:00
return - 1 ;
2020-05-21 15:05:19 +02:00
} else {
2021-11-19 10:06:35 +01:00
$this -> db -> commit ();
return $this -> id ;
2017-10-15 17:58:22 +02:00
}
2017-10-18 17:01:17 +02:00
}
2017-10-15 17:58:22 +02:00
/**
* Delete shipment line .
2017-11-02 12:38:36 +01:00
*
2017-10-18 17:01:17 +02:00
* @ param User $user User that modify
* @ param int $notrigger 0 = launch triggers after , 1 = disable triggers
2017-10-15 17:58:22 +02:00
* @ return int > 0 if OK , < 0 if KO
*/
2019-02-24 23:32:09 +01:00
public function delete ( $user = null , $notrigger = 0 )
2017-10-15 17:58:22 +02:00
{
global $conf ;
2019-11-13 19:37:08 +01:00
$error = 0 ;
2017-10-18 17:01:17 +02:00
2017-10-15 17:58:22 +02:00
$this -> db -> begin ();
2017-11-02 12:38:36 +01:00
2017-10-15 17:58:22 +02:00
// delete batch expedition line
2022-06-21 20:54:28 +02:00
if ( isModEnabled ( 'productbatch' )) {
2017-10-15 17:58:22 +02:00
$sql = " DELETE FROM " . MAIN_DB_PREFIX . " expeditiondet_batch " ;
2021-08-27 18:18:50 +02:00
$sql .= " WHERE fk_expeditiondet = " . (( int ) $this -> id );
2017-10-15 17:58:22 +02:00
2021-02-25 22:38:35 +01:00
if ( ! $this -> db -> query ( $sql )) {
2019-11-13 19:37:08 +01:00
$this -> errors [] = $this -> db -> lasterror () . " - sql= $sql " ;
2017-10-18 17:01:17 +02:00
$error ++ ;
2017-10-15 17:58:22 +02:00
}
}
2017-11-02 12:38:36 +01:00
2017-10-15 17:58:22 +02:00
$sql = " DELETE FROM " . MAIN_DB_PREFIX . " expeditiondet " ;
2021-08-27 16:33:03 +02:00
$sql .= " WHERE rowid = " . (( int ) $this -> id );
2017-10-15 17:58:22 +02:00
2021-02-25 22:38:35 +01:00
if ( ! $error && $this -> db -> query ( $sql )) {
2017-10-15 17:58:22 +02:00
// Remove extrafields
2021-02-25 22:38:35 +01:00
if ( ! $error ) {
2019-11-13 19:37:08 +01:00
$result = $this -> deleteExtraFields ();
2021-02-25 22:38:35 +01:00
if ( $result < 0 ) {
2019-11-13 19:37:08 +01:00
$this -> errors [] = $this -> error ;
2017-10-18 17:01:17 +02:00
$error ++ ;
2017-10-15 17:58:22 +02:00
}
2017-10-18 17:01:17 +02:00
}
2021-02-25 22:38:35 +01:00
if ( ! $error && ! $notrigger ) {
2017-10-18 17:01:17 +02:00
// Call trigger
2019-11-13 19:37:08 +01:00
$result = $this -> call_trigger ( 'LINESHIPPING_DELETE' , $user );
2021-02-25 22:38:35 +01:00
if ( $result < 0 ) {
2019-11-13 19:37:08 +01:00
$this -> errors [] = $this -> error ;
2017-10-18 17:01:17 +02:00
$error ++ ;
2017-10-15 17:58:22 +02:00
}
2017-10-18 17:01:17 +02:00
// End call triggers
2017-10-15 17:58:22 +02:00
}
2020-05-21 15:05:19 +02:00
} else {
2019-11-13 19:37:08 +01:00
$this -> errors [] = $this -> db -> lasterror () . " - sql= $sql " ;
2017-10-18 17:01:17 +02:00
$error ++ ;
}
2019-11-13 19:37:08 +01:00
if ( ! $error ) {
2017-10-18 17:01:17 +02:00
$this -> db -> commit ();
return 1 ;
2020-05-21 15:05:19 +02:00
} else {
2021-02-25 22:38:35 +01:00
foreach ( $this -> errors as $errmsg ) {
2017-10-18 17:01:17 +02:00
dol_syslog ( get_class ( $this ) . " ::delete " . $errmsg , LOG_ERR );
2019-11-13 19:37:08 +01:00
$this -> error .= ( $this -> error ? ', ' . $errmsg : $errmsg );
2017-10-18 17:01:17 +02:00
}
2017-10-15 17:58:22 +02:00
$this -> db -> rollback ();
2019-11-13 19:37:08 +01:00
return - 1 * $error ;
2017-10-15 17:58:22 +02:00
}
2006-05-30 15:49:03 +02:00
}
2017-11-02 12:38:36 +01:00
2017-10-15 17:58:22 +02:00
/**
* Update a line in database
2017-11-02 12:38:36 +01:00
*
2017-10-24 15:48:22 +02:00
* @ param User $user User that modify
* @ param int $notrigger 1 = disable triggers
2017-10-15 17:58:22 +02:00
* @ return int < 0 if KO , > 0 if OK
*/
2019-02-24 23:32:09 +01:00
public function update ( $user = null , $notrigger = 0 )
2017-10-18 17:01:17 +02:00
{
global $conf ;
2017-11-02 12:38:36 +01:00
2019-11-13 19:37:08 +01:00
$error = 0 ;
2017-10-15 17:58:22 +02:00
2017-10-18 17:01:17 +02:00
dol_syslog ( get_class ( $this ) . " ::update id= $this->id , entrepot_id= $this->entrepot_id , product_id= $this->fk_product , qty= $this->qty " );
$this -> db -> begin ();
// Clean parameters
2021-02-25 22:38:35 +01:00
if ( empty ( $this -> qty )) {
$this -> qty = 0 ;
}
2019-11-13 19:37:08 +01:00
$qty = price2num ( $this -> qty );
2017-10-18 17:01:17 +02:00
$remainingQty = 0 ;
$batch = null ;
$batch_id = null ;
2017-10-23 22:16:00 +02:00
$expedition_batch_id = null ;
2021-02-25 22:38:35 +01:00
if ( is_array ( $this -> detail_batch )) { // array of ExpeditionLineBatch
if ( count ( $this -> detail_batch ) > 1 ) {
2017-10-18 17:01:17 +02:00
dol_syslog ( get_class ( $this ) . '::update only possible for one batch' , LOG_ERR );
2019-11-13 19:37:08 +01:00
$this -> errors [] = 'ErrorBadParameters' ;
2017-10-18 17:01:17 +02:00
$error ++ ;
2020-05-21 15:05:19 +02:00
} else {
2017-10-18 17:01:17 +02:00
$batch = $this -> detail_batch [ 0 ] -> batch ;
$batch_id = $this -> detail_batch [ 0 ] -> fk_origin_stock ;
2017-10-23 22:16:00 +02:00
$expedition_batch_id = $this -> detail_batch [ 0 ] -> id ;
2021-02-25 22:38:35 +01:00
if ( $this -> entrepot_id != $this -> detail_batch [ 0 ] -> entrepot_id ) {
2017-10-30 12:39:06 +01:00
dol_syslog ( get_class ( $this ) . '::update only possible for batch of same warehouse' , LOG_ERR );
2019-11-13 19:37:08 +01:00
$this -> errors [] = 'ErrorBadParameters' ;
2017-10-30 12:39:06 +01:00
$error ++ ;
}
2018-10-11 11:56:52 +02:00
$qty = price2num ( $this -> detail_batch [ 0 ] -> qty );
2017-10-18 17:01:17 +02:00
}
2021-02-25 22:38:35 +01:00
} elseif ( ! empty ( $this -> detail_batch )) {
2017-10-18 17:01:17 +02:00
$batch = $this -> detail_batch -> batch ;
$batch_id = $this -> detail_batch -> fk_origin_stock ;
2017-10-23 22:16:00 +02:00
$expedition_batch_id = $this -> detail_batch -> id ;
2021-02-25 22:38:35 +01:00
if ( $this -> entrepot_id != $this -> detail_batch -> entrepot_id ) {
2017-10-30 12:39:06 +01:00
dol_syslog ( get_class ( $this ) . '::update only possible for batch of same warehouse' , LOG_ERR );
2019-11-13 19:37:08 +01:00
$this -> errors [] = 'ErrorBadParameters' ;
2017-10-30 12:39:06 +01:00
$error ++ ;
}
2018-10-11 11:56:52 +02:00
$qty = price2num ( $this -> detail_batch -> qty );
2017-10-30 12:39:06 +01:00
}
// check parameters
2021-02-25 22:38:35 +01:00
if ( ! isset ( $this -> id ) || ! isset ( $this -> entrepot_id )) {
2017-10-30 12:39:06 +01:00
dol_syslog ( get_class ( $this ) . '::update missing line id and/or warehouse id' , LOG_ERR );
2019-11-13 19:37:08 +01:00
$this -> errors [] = 'ErrorMandatoryParametersNotProvided' ;
2017-10-30 12:39:06 +01:00
$error ++ ;
return - 1 ;
2017-10-18 17:01:17 +02:00
}
2017-10-15 17:58:22 +02:00
// update lot
2021-02-25 22:38:35 +01:00
if ( ! empty ( $batch ) && $conf -> productbatch -> enabled ) {
2017-12-01 14:33:06 +01:00
dol_syslog ( get_class ( $this ) . " ::update expedition batch id= $expedition_batch_id , batch_id= $batch_id , batch= $batch " );
2017-11-02 11:44:36 +01:00
if ( empty ( $batch_id ) || empty ( $this -> fk_product )) {
2017-10-15 17:58:22 +02:00
dol_syslog ( get_class ( $this ) . '::update missing fk_origin_stock (batch_id) and/or fk_product' , LOG_ERR );
2019-11-13 19:37:08 +01:00
$this -> errors [] = 'ErrorMandatoryParametersNotProvided' ;
2017-10-18 17:01:17 +02:00
$error ++ ;
2017-10-15 17:58:22 +02:00
}
2017-10-18 17:01:17 +02:00
2017-10-15 17:58:22 +02:00
// fetch remaining lot qty
2021-09-27 15:41:58 +02:00
$shipmentlinebatch = new ExpeditionLineBatch ( $this -> db );
if ( ! $error && ( $lotArray = $shipmentlinebatch -> fetchAll ( $this -> id )) < 0 ) {
2019-11-13 19:37:08 +01:00
$this -> errors [] = $this -> db -> lasterror () . " - ExpeditionLineBatch::fetchAll " ;
2017-10-18 17:01:17 +02:00
$error ++ ;
2020-05-21 15:05:19 +02:00
} else {
2017-10-30 12:39:06 +01:00
// caculate new total line qty
2021-02-25 22:38:35 +01:00
foreach ( $lotArray as $lot ) {
if ( $expedition_batch_id != $lot -> id ) {
2018-10-11 11:56:52 +02:00
$remainingQty += $lot -> qty ;
2017-10-18 17:01:17 +02:00
}
}
2017-10-30 12:39:06 +01:00
$qty += $remainingQty ;
2017-11-02 12:38:36 +01:00
2017-10-18 17:01:17 +02:00
//fetch lot details
2017-11-02 12:38:36 +01:00
2017-10-18 17:01:17 +02:00
// fetch from product_lot
require_once DOL_DOCUMENT_ROOT . '/product/stock/class/productlot.class.php' ;
$lot = new Productlot ( $this -> db );
2021-02-25 22:38:35 +01:00
if ( $lot -> fetch ( 0 , $this -> fk_product , $batch ) < 0 ) {
2017-10-18 17:01:17 +02:00
$this -> errors [] = $lot -> errors ;
$error ++ ;
}
2021-02-25 22:38:35 +01:00
if ( ! $error && ! empty ( $expedition_batch_id )) {
2017-10-18 17:01:17 +02:00
// delete lot expedition line
$sql = " DELETE FROM " . MAIN_DB_PREFIX . " expeditiondet_batch " ;
2021-08-27 18:18:50 +02:00
$sql .= " WHERE fk_expeditiondet = " . (( int ) $this -> id );
2021-04-24 20:18:11 +02:00
$sql .= " AND rowid = " . (( int ) $expedition_batch_id );
2017-11-02 12:38:36 +01:00
2021-02-25 22:38:35 +01:00
if ( ! $this -> db -> query ( $sql )) {
2019-11-13 19:37:08 +01:00
$this -> errors [] = $this -> db -> lasterror () . " - sql= $sql " ;
2017-10-18 17:01:17 +02:00
$error ++ ;
}
2017-11-02 11:44:36 +01:00
}
2021-02-25 22:38:35 +01:00
if ( ! $error && $this -> detail_batch -> qty > 0 ) {
2017-11-02 11:44:36 +01:00
// create lot expedition line
2021-02-25 22:38:35 +01:00
if ( isset ( $lot -> id )) {
2017-11-02 11:44:36 +01:00
$shipmentLot = new ExpeditionLineBatch ( $this -> db );
$shipmentLot -> batch = $lot -> batch ;
$shipmentLot -> eatby = $lot -> eatby ;
$shipmentLot -> sellby = $lot -> sellby ;
$shipmentLot -> entrepot_id = $this -> detail_batch -> entrepot_id ;
2018-10-11 11:56:52 +02:00
$shipmentLot -> qty = $this -> detail_batch -> qty ;
2017-11-02 11:44:36 +01:00
$shipmentLot -> fk_origin_stock = $batch_id ;
2021-02-25 22:38:35 +01:00
if ( $shipmentLot -> create ( $this -> id ) < 0 ) {
2019-11-13 19:37:08 +01:00
$this -> errors [] = $shipmentLot -> errors ;
2017-11-02 11:44:36 +01:00
$error ++ ;
2017-10-18 17:01:17 +02:00
}
}
2017-10-15 17:58:22 +02:00
}
}
2017-10-18 17:01:17 +02:00
}
2021-02-25 22:38:35 +01:00
if ( ! $error ) {
2017-10-18 17:01:17 +02:00
// update line
$sql = " UPDATE " . MAIN_DB_PREFIX . $this -> table_element . " SET " ;
2019-11-13 19:37:08 +01:00
$sql .= " fk_entrepot = " . ( $this -> entrepot_id > 0 ? $this -> entrepot_id : 'null' );
2021-06-09 15:36:47 +02:00
$sql .= " , qty = " . (( float ) price2num ( $qty , 'MS' ));
$sql .= " WHERE rowid = " . (( int ) $this -> id );
2017-11-02 12:38:36 +01:00
2021-02-25 22:38:35 +01:00
if ( ! $this -> db -> query ( $sql )) {
2019-11-13 19:37:08 +01:00
$this -> errors [] = $this -> db -> lasterror () . " - sql= $sql " ;
2017-10-18 17:01:17 +02:00
$error ++ ;
2017-10-15 17:58:22 +02:00
}
2018-04-10 12:03:01 +02:00
}
2021-02-25 22:38:35 +01:00
if ( ! $error ) {
if ( ! $error ) {
2019-11-13 19:37:08 +01:00
$result = $this -> insertExtraFields ();
2021-02-25 22:38:35 +01:00
if ( $result < 0 ) {
2019-11-13 19:37:08 +01:00
$this -> errors [] = $this -> error ;
2018-04-10 12:03:01 +02:00
$error ++ ;
2017-10-15 17:58:22 +02:00
}
}
}
2018-04-10 12:03:01 +02:00
2021-02-25 22:38:35 +01:00
if ( ! $error && ! $notrigger ) {
2017-10-18 17:01:17 +02:00
// Call trigger
2022-04-02 10:31:58 +02:00
$result = $this -> call_trigger ( 'LINESHIPPING_MODIFY' , $user );
2021-02-25 22:38:35 +01:00
if ( $result < 0 ) {
2019-11-13 19:37:08 +01:00
$this -> errors [] = $this -> error ;
2017-10-18 17:01:17 +02:00
$error ++ ;
2017-10-15 17:58:22 +02:00
}
2017-10-18 17:01:17 +02:00
// End call triggers
}
if ( ! $error ) {
2017-10-15 17:58:22 +02:00
$this -> db -> commit ();
return 1 ;
2020-05-21 15:05:19 +02:00
} else {
2021-02-25 22:38:35 +01:00
foreach ( $this -> errors as $errmsg ) {
2017-10-18 17:01:17 +02:00
dol_syslog ( get_class ( $this ) . " ::update " . $errmsg , LOG_ERR );
2019-11-13 19:37:08 +01:00
$this -> error .= ( $this -> error ? ', ' . $errmsg : $errmsg );
2017-10-18 17:01:17 +02:00
}
$this -> db -> rollback ();
2019-11-13 19:37:08 +01:00
return - 1 * $error ;
2017-10-18 17:01:17 +02:00
}
2017-10-15 17:58:22 +02:00
}
2003-11-13 18:36:45 +01:00
}