2008-05-20 00:09:11 +00:00
< ? php
2012-10-31 08:50:20 +00:00
/* Copyright ( C ) 2008 - 2012 Laurent Destailleur < eldy @ users . sourceforge . net >
2018-10-27 12:43:12 +00:00
* Copyright ( C ) 2012 Regis Houssin < regis . houssin @ inodbox . com >
2026-07-20 13:28:15 +00:00
* Copyright ( C ) 2024 - 2026 MDW < mdeweerd @ users . noreply . github . com >
2025-04-01 18:47:40 +00:00
* Copyright ( C ) 2025 Frédéric France < frederic . france @ free . fr >
2008-05-20 00:09:11 +00: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 14:36:08 +00:00
* the Free Software Foundation ; either version 3 of the License , or
2008-05-20 00:09:11 +00: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 19:55:30 +00:00
* along with this program . If not , see < https :// www . gnu . org / licenses />.
2008-05-20 00:09:11 +00:00
*/
/**
2011-10-24 10:59:44 +00:00
* \file htdocs / core / lib / sendings . lib . php
2008-10-17 14:43:33 +00:00
* \ingroup expedition
* \brief Library for expedition module
2008-05-20 00:09:11 +00:00
*/
2025-08-04 11:12:22 +00:00
require_once DOL_DOCUMENT_ROOT . '/expedition/class/expedition.class.php' ;
require_once DOL_DOCUMENT_ROOT . '/product/class/product.class.php' ;
require_once DOL_DOCUMENT_ROOT . '/product/stock/class/entrepot.class.php' ;
2008-05-20 00:09:11 +00:00
2012-02-04 09:48:47 +00:00
/**
* Prepare array with list of tabs
*
2024-10-03 17:40:34 +00:00
* @ param Expedition $object Object related to tabs
2024-09-22 22:37:30 +00:00
* @ return array < array { 0 : string , 1 : string , 2 : string } > Array of tabs to show
2012-02-04 09:48:47 +00:00
*/
2010-03-13 15:52:30 +00:00
function shipping_prepare_head ( $object )
{
2016-10-24 18:52:21 +00:00
global $db , $langs , $conf , $user ;
2010-05-08 16:45:47 +00:00
2018-09-11 15:30:43 +00:00
// Load translation files required by the page
2025-09-11 11:31:34 +00:00
$langs -> loadLangs ( array ( " sendings " ));
2010-03-13 15:52:30 +00:00
$h = 0 ;
$head = array ();
2025-08-04 11:12:22 +00:00
$head [ $h ][ 0 ] = DOL_URL_ROOT . " /expedition/card.php?id= " . $object -> id ;
2010-03-13 15:52:30 +00:00
$head [ $h ][ 1 ] = $langs -> trans ( " SendingCard " );
$head [ $h ][ 2 ] = 'shipping' ;
$h ++ ;
2025-04-01 18:47:40 +00:00
if ( $object -> status == Expedition :: STATUS_DRAFT ) {
2025-08-04 11:12:22 +00:00
$head [ $h ][ 0 ] = DOL_URL_ROOT . " /expedition/dispatch.php?id= " . $object -> id ;
2023-05-22 13:59:48 +00:00
$head [ $h ][ 1 ] = $langs -> trans ( " ShipmentDistribution " );
2023-05-09 09:04:53 +00:00
$head [ $h ][ 2 ] = 'dispatch' ;
$h ++ ;
}
2023-10-15 13:32:35 +00:00
if ( getDolGlobalInt ( 'MAIN_SUBMODULE_DELIVERY' ) && $user -> hasRight ( 'expedition' , 'delivery' , 'lire' )) {
2012-07-02 17:30:37 +00:00
// delivery link
2019-01-27 10:55:16 +00:00
$object -> fetchObjectLinked ( $object -> id , $object -> element );
2023-02-05 17:05:03 +00:00
if ( isset ( $object -> linkedObjectsIds [ 'delivery' ]) && is_array ( $object -> linkedObjectsIds [ 'delivery' ]) && count ( $object -> linkedObjectsIds [ 'delivery' ]) > 0 ) { // If there is a delivery
2024-03-12 20:59:29 +00:00
// Take first element of array
2020-10-28 16:49:52 +00:00
$tmp = reset ( $object -> linkedObjectsIds [ 'delivery' ]);
2017-12-02 09:43:01 +00:00
2025-08-04 11:12:22 +00:00
$head [ $h ][ 0 ] = DOL_URL_ROOT . " /delivery/card.php?id= " . (( int ) $tmp );
2012-07-02 17:30:37 +00:00
$head [ $h ][ 1 ] = $langs -> trans ( " DeliveryCard " );
$head [ $h ][ 2 ] = 'delivery' ;
2012-07-02 15:07:37 +00:00
$h ++ ;
}
2010-03-13 15:52:30 +00:00
}
2023-11-27 10:39:32 +00:00
if ( ! getDolGlobalString ( 'MAIN_DISABLE_CONTACTS_TAB' )) {
2020-10-28 16:49:52 +00:00
$objectsrc = $object ;
2025-04-01 18:47:40 +00:00
if ( ! getDolGlobalInt ( 'SHIPPING_USE_ITS_OWN_CONTACTS' ) && $object -> origin_type == 'commande' && $object -> origin_id > 0 ) {
2020-10-28 16:49:52 +00:00
$objectsrc = new Commande ( $db );
$objectsrc -> fetch ( $object -> origin_id );
}
$nbContact = count ( $objectsrc -> liste_contact ( - 1 , 'internal' )) + count ( $objectsrc -> liste_contact ( - 1 , 'external' ));
2025-08-04 11:12:22 +00:00
$head [ $h ][ 0 ] = DOL_URL_ROOT . " /expedition/contact.php?id= " . (( int ) $object -> id );
2020-10-28 16:49:52 +00:00
$head [ $h ][ 1 ] = $langs -> trans ( " ContactsAddresses " );
2021-02-23 21:03:23 +00:00
if ( $nbContact > 0 ) {
2025-08-04 11:12:22 +00:00
$head [ $h ][ 1 ] .= '<span class="badge marginleftonlyshort">' . $nbContact . '</span>' ;
2021-02-23 21:03:23 +00:00
}
2020-10-28 16:49:52 +00:00
$head [ $h ][ 2 ] = 'contact' ;
$h ++ ;
2016-06-06 10:29:15 +00:00
}
2017-12-02 09:43:01 +00:00
2025-08-14 13:26:13 +00:00
// Files
2025-08-04 11:12:22 +00:00
require_once DOL_DOCUMENT_ROOT . '/core/lib/files.lib.php' ;
require_once DOL_DOCUMENT_ROOT . '/core/class/link.class.php' ;
$upload_dir = $conf -> expedition -> dir_output . " /sending/ " . dol_sanitizeFileName ( $object -> ref );
2019-01-27 10:55:16 +00:00
$nbFiles = count ( dol_dir_list ( $upload_dir , 'files' , 0 , '' , '(\.meta|_preview.*\.png)$' ));
2020-10-28 16:49:52 +00:00
$nbLinks = Link :: count ( $db , $object -> element , $object -> id );
2025-08-04 11:12:22 +00:00
$head [ $h ][ 0 ] = DOL_URL_ROOT . '/expedition/document.php?id=' . $object -> id ;
2018-02-07 14:56:14 +00:00
$head [ $h ][ 1 ] = $langs -> trans ( 'Documents' );
2021-02-23 21:03:23 +00:00
if (( $nbFiles + $nbLinks ) > 0 ) {
2025-08-04 11:12:22 +00:00
$head [ $h ][ 1 ] .= '<span class="badge marginleftonlyshort">' . ( $nbFiles + $nbLinks ) . '</span>' ;
2021-02-23 21:03:23 +00:00
}
2018-02-07 14:56:14 +00:00
$head [ $h ][ 2 ] = 'documents' ;
$h ++ ;
2025-08-14 13:26:13 +00:00
// Notes
2020-10-28 16:49:52 +00:00
$nbNote = 0 ;
2021-02-23 21:03:23 +00:00
if ( ! empty ( $object -> note_private )) {
$nbNote ++ ;
}
if ( ! empty ( $object -> note_public )) {
$nbNote ++ ;
}
2025-08-04 11:12:22 +00:00
$head [ $h ][ 0 ] = DOL_URL_ROOT . " /expedition/note.php?id= " . $object -> id ;
2013-04-09 15:18:07 +00:00
$head [ $h ][ 1 ] = $langs -> trans ( " Notes " );
2021-02-23 21:03:23 +00:00
if ( $nbNote > 0 ) {
2025-08-04 11:12:22 +00:00
$head [ $h ][ 1 ] .= '<span class="badge marginleftonlyshort">' . $nbNote . '</span>' ;
2021-02-23 21:03:23 +00:00
}
2013-04-09 15:18:07 +00:00
$head [ $h ][ 2 ] = 'note' ;
$h ++ ;
2012-03-14 13:00:20 +00:00
2025-08-14 13:26:13 +00:00
// Events
2025-08-04 11:12:22 +00:00
$head [ $h ][ 0 ] = DOL_URL_ROOT . '/expedition/agenda.php?id=' . $object -> id ;
$head [ $h ][ 1 ] = $langs -> trans ( " Events " );
if ( isModEnabled ( 'agenda' ) && ( $user -> hasRight ( 'agenda' , 'myactions' , 'read' ) || $user -> hasRight ( 'agenda' , 'allactions' , 'read' ))) {
$nbEvent = 0 ;
// Enable caching of thirdparty count actioncomm
require_once DOL_DOCUMENT_ROOT . '/core/lib/memory.lib.php' ;
2025-08-07 10:28:09 +00:00
$cachekey = 'count_events_expedition_' . $object -> id ;
2025-08-04 11:12:22 +00:00
$dataretrieved = dol_getcache ( $cachekey );
if ( ! is_null ( $dataretrieved )) {
$nbEvent = $dataretrieved ;
} else {
$sql = " SELECT COUNT(id) as nb " ;
$sql .= " FROM " . MAIN_DB_PREFIX . " actioncomm " ;
$sql .= " WHERE fk_element = " . (( int ) $object -> id );
2025-08-07 10:28:09 +00:00
$sql .= " AND elementtype = 'shipping' " ;
2025-08-04 11:12:22 +00:00
$resql = $db -> query ( $sql );
if ( $resql ) {
$obj = $db -> fetch_object ( $resql );
$nbEvent = $obj -> nb ;
} else {
dol_syslog ( 'Failed to count actioncomm ' . $db -> lasterror (), LOG_ERR );
}
dol_setcache ( $cachekey , $nbEvent , 120 ); // If setting cache fails, this is not a problem, so we do not test result.
}
$head [ $h ][ 1 ] .= '/' ;
$head [ $h ][ 1 ] .= $langs -> trans ( " Agenda " );
if ( $nbEvent > 0 ) {
$head [ $h ][ 1 ] .= '<span class="badge marginleftonlyshort">' . $nbEvent . '</span>' ;
}
}
$head [ $h ][ 2 ] = 'agenda' ;
$h ++ ;
2012-02-04 09:48:47 +00:00
// Show more tabs from modules
// Entries must be declared in modules descriptor with line
2020-10-28 16:49:52 +00:00
// $this->tabs = array('entity:+tabname:Title:@mymodule:/mymodule/mypage.php?id=__ID__'); to add new tab
// $this->tabs = array('entity:-tabname); to remove a tab
2019-01-27 10:55:16 +00:00
complete_head_from_modules ( $conf , $langs , $object , $head , $h , 'delivery' );
2010-03-13 15:52:30 +00:00
2019-01-27 10:55:16 +00:00
complete_head_from_modules ( $conf , $langs , $object , $head , $h , 'delivery' , 'remove' );
2012-12-01 14:45:05 +00:00
2012-02-04 09:48:47 +00:00
return $head ;
2010-03-13 15:52:30 +00:00
}
2011-01-24 23:35:21 +00:00
2012-02-04 09:48:47 +00:00
/**
* Prepare array with list of tabs
*
2025-04-01 18:47:40 +00:00
* @ param Delivery $object Object related to tabs
2024-09-22 22:37:30 +00:00
* @ return array < array { 0 : string , 1 : string , 2 : string } > Array of tabs to show
2012-02-04 09:48:47 +00:00
*/
2010-03-13 15:52:30 +00:00
function delivery_prepare_head ( $object )
{
2020-01-28 01:21:39 +00:00
global $langs , $db , $conf , $user ;
2010-05-08 16:45:47 +00:00
2018-09-11 15:30:43 +00:00
// Load translation files required by the page
2025-09-11 11:31:34 +00:00
$langs -> loadLangs ( array ( " sendings " ));
2010-03-13 15:52:30 +00:00
$h = 0 ;
$head = array ();
2023-10-15 13:32:35 +00:00
if ( getDolGlobalInt ( 'MAIN_SUBMODULE_EXPEDITION' ) && $user -> hasRight ( 'expedition' , 'lire' )) {
2025-08-04 11:12:22 +00:00
$head [ $h ][ 0 ] = DOL_URL_ROOT . " /expedition/card.php?id= " . $object -> origin_id ;
2010-03-13 15:52:30 +00:00
$head [ $h ][ 1 ] = $langs -> trans ( " SendingCard " );
$head [ $h ][ 2 ] = 'shipping' ;
$h ++ ;
}
2025-08-04 11:12:22 +00:00
$head [ $h ][ 0 ] = DOL_URL_ROOT . " /delivery/card.php?id= " . $object -> id ;
2010-03-13 15:52:30 +00:00
$head [ $h ][ 1 ] = $langs -> trans ( " DeliveryCard " );
$head [ $h ][ 2 ] = 'delivery' ;
$h ++ ;
2020-01-28 01:21:39 +00:00
// Show more tabs from modules
// Entries must be declared in modules descriptor with line
// $this->tabs = array('entity:+tabname:Title:@mymodule:/mymodule/mypage.php?id=__ID__'); to add new tab
// $this->tabs = array('entity:-tabname); to remove a tab
// complete_head_from_modules use $object->id for this link so we temporary change it
$savObjectId = $object -> id ;
// Get parent object
$tmpobject = null ;
2025-04-01 18:47:40 +00:00
if ( $object -> origin_type ) {
2020-01-28 01:21:39 +00:00
$tmpobject = new Expedition ( $db );
$tmpobject -> fetch ( $object -> origin_id );
} else {
$tmpobject = $object ;
}
2023-11-27 10:39:32 +00:00
if ( ! getDolGlobalString ( 'MAIN_DISABLE_CONTACTS_TAB' )) {
2020-10-25 16:19:15 +00:00
$objectsrc = $tmpobject ;
2025-04-01 18:47:40 +00:00
if ( $tmpobject -> origin_type == 'commande' && $tmpobject -> origin_id > 0 ) {
2020-10-25 16:19:15 +00:00
$objectsrc = new Commande ( $db );
$objectsrc -> fetch ( $tmpobject -> origin_id );
}
$nbContact = count ( $objectsrc -> liste_contact ( - 1 , 'internal' )) + count ( $objectsrc -> liste_contact ( - 1 , 'external' ));
2025-08-04 11:12:22 +00:00
$head [ $h ][ 0 ] = DOL_URL_ROOT . " /expedition/contact.php?id= " . $tmpobject -> id ;
2020-10-25 16:19:15 +00:00
$head [ $h ][ 1 ] = $langs -> trans ( " ContactsAddresses " );
2021-02-23 21:03:23 +00:00
if ( $nbContact > 0 ) {
2025-08-04 11:12:22 +00:00
$head [ $h ][ 1 ] .= '<span class="badge marginleftonlyshort">' . $nbContact . '</span>' ;
2021-02-23 21:03:23 +00:00
}
2020-10-25 16:19:15 +00:00
$head [ $h ][ 2 ] = 'contact' ;
$h ++ ;
}
2020-01-28 01:21:39 +00:00
2025-08-14 13:26:13 +00:00
// Files
2025-08-04 11:12:22 +00:00
require_once DOL_DOCUMENT_ROOT . '/core/lib/files.lib.php' ;
require_once DOL_DOCUMENT_ROOT . '/core/class/link.class.php' ;
$upload_dir = $conf -> expedition -> dir_output . " /sending/ " . dol_sanitizeFileName ( $tmpobject -> ref );
2020-01-28 01:21:39 +00:00
$nbFiles = count ( dol_dir_list ( $upload_dir , 'files' , 0 , '' , '(\.meta|_preview.*\.png)$' ));
2020-04-10 08:59:32 +00:00
$nbLinks = Link :: count ( $db , $tmpobject -> element , $tmpobject -> id );
2025-08-04 11:12:22 +00:00
$head [ $h ][ 0 ] = DOL_URL_ROOT . '/expedition/document.php?id=' . $tmpobject -> id ;
2020-01-28 01:21:39 +00:00
$head [ $h ][ 1 ] = $langs -> trans ( 'Documents' );
2021-02-23 21:03:23 +00:00
if (( $nbFiles + $nbLinks ) > 0 ) {
2025-08-04 11:12:22 +00:00
$head [ $h ][ 1 ] .= '<span class="badge marginleftonlyshort">' . ( $nbFiles + $nbLinks ) . '</span>' ;
2021-02-23 21:03:23 +00:00
}
2020-01-28 01:21:39 +00:00
$head [ $h ][ 2 ] = 'documents' ;
$h ++ ;
2025-08-14 13:26:13 +00:00
// Notes
2020-01-28 01:21:39 +00:00
$nbNote = 0 ;
2021-02-23 21:03:23 +00:00
if ( ! empty ( $tmpobject -> note_private )) {
$nbNote ++ ;
}
if ( ! empty ( $tmpobject -> note_public )) {
$nbNote ++ ;
}
2025-08-04 11:12:22 +00:00
$head [ $h ][ 0 ] = DOL_URL_ROOT . " /expedition/note.php?id= " . $tmpobject -> id ;
2013-08-07 13:08:30 +00:00
$head [ $h ][ 1 ] = $langs -> trans ( " Notes " );
2021-02-23 21:03:23 +00:00
if ( $nbNote > 0 ) {
2025-08-04 11:12:22 +00:00
$head [ $h ][ 1 ] .= '<span class="badge marginleftonlyshort">' . $nbNote . '</span>' ;
2021-02-23 21:03:23 +00:00
}
2013-08-07 13:08:30 +00:00
$head [ $h ][ 2 ] = 'note' ;
2014-05-06 11:15:37 +00:00
$h ++ ;
2013-08-07 13:08:30 +00:00
2025-08-14 13:26:13 +00:00
// Events
$head [ $h ][ 0 ] = DOL_URL_ROOT . '/expedition/agenda.php?id=' . $tmpobject -> id ;
$head [ $h ][ 1 ] = $langs -> trans ( " Events " );
if ( isModEnabled ( 'agenda' ) && ( $user -> hasRight ( 'agenda' , 'myactions' , 'read' ) || $user -> hasRight ( 'agenda' , 'allactions' , 'read' ))) {
$nbEvent = 0 ;
// Enable caching of thirdparty count actioncomm
require_once DOL_DOCUMENT_ROOT . '/core/lib/memory.lib.php' ;
$cachekey = 'count_events_expedition_' . $tmpobject -> id ;
$dataretrieved = dol_getcache ( $cachekey );
if ( ! is_null ( $dataretrieved )) {
$nbEvent = $dataretrieved ;
} else {
$sql = " SELECT COUNT(id) as nb " ;
$sql .= " FROM " . MAIN_DB_PREFIX . " actioncomm " ;
$sql .= " WHERE fk_element = " . (( int ) $tmpobject -> id );
$sql .= " AND elementtype = 'shipping' " ;
$resql = $db -> query ( $sql );
if ( $resql ) {
$obj = $db -> fetch_object ( $resql );
$nbEvent = $obj -> nb ;
} else {
dol_syslog ( 'Failed to count actioncomm ' . $db -> lasterror (), LOG_ERR );
}
dol_setcache ( $cachekey , $nbEvent , 120 ); // If setting cache fails, this is not a problem, so we do not test result.
}
$head [ $h ][ 1 ] .= '/' ;
$head [ $h ][ 1 ] .= $langs -> trans ( " Agenda " );
if ( $nbEvent > 0 ) {
$head [ $h ][ 1 ] .= '<span class="badge marginleftonlyshort">' . $nbEvent . '</span>' ;
}
}
$head [ $h ][ 2 ] = 'agenda' ;
$h ++ ;
2020-01-28 01:21:39 +00:00
$object -> id = $tmpobject -> id ;
2013-08-07 13:08:30 +00:00
2020-10-28 16:49:52 +00:00
complete_head_from_modules ( $conf , $langs , $object , $head , $h , 'delivery' );
2010-03-13 15:52:30 +00:00
2019-01-27 10:55:16 +00:00
complete_head_from_modules ( $conf , $langs , $object , $head , $h , 'delivery' , 'remove' );
2013-08-07 13:08:30 +00:00
2020-01-28 01:21:39 +00:00
$object -> id = $savObjectId ;
2012-02-04 09:48:47 +00:00
return $head ;
2010-03-13 15:52:30 +00:00
}
2008-05-20 00:09:11 +00:00
/**
* List sendings and receive receipts
*
2012-02-04 13:39:47 +00:00
* @ param string $origin Origin ( 'commande' , ... )
2011-09-12 17:08:02 +00:00
* @ param int $origin_id Origin id
2023-12-02 15:46:37 +00:00
* @ param string $filter Filter ( Do not use a string from a user input )
2023-12-01 18:51:32 +00:00
* @ return int Return integer < 0 if KO , > 0 if OK
2008-05-20 00:09:11 +00:00
*/
2019-01-27 14:20:16 +00:00
function show_list_sending_receive ( $origin , $origin_id , $filter = '' )
2008-05-20 00:09:11 +00:00
{
2019-04-23 10:32:08 +00:00
global $db , $conf , $langs ;
2011-11-08 09:18:45 +00:00
global $form ;
2009-04-05 19:01:43 +00:00
2020-04-10 08:59:32 +00:00
$product_static = new Product ( $db );
$expedition = new Expedition ( $db );
$warehousestatic = new Entrepot ( $db );
2017-12-02 09:43:01 +00:00
2025-05-10 00:44:31 +00:00
$sql = " SELECT obj.rowid, obj.fk_product, obj.label, obj.description, obj.product_type as fk_product_type, obj.qty as qty_asked, obj.date_start, obj.date_end, obj.special_code, " ;
2024-04-08 10:44:49 +00:00
$sql .= " ed.rowid as edrowid, ed.qty as qty_shipped, ed.fk_expedition as expedition_id, ed.fk_elementdet, ed.fk_entrepot as warehouse_id, " ;
2024-09-13 01:09:53 +00:00
$sql .= " e.rowid as sendingid, e.ref as exp_ref, e.date_creation, e.date_delivery, e.date_expedition, e.billed, e.fk_statut as status, e.signed_status, " ;
2020-04-10 08:59:32 +00:00
$sql .= ' p.label as product_label, p.ref, p.fk_product_type, p.rowid as prodid, p.tobatch as product_tobatch,' ;
$sql .= ' p.description as product_desc' ;
2025-08-04 11:12:22 +00:00
$sql .= " FROM " . MAIN_DB_PREFIX . " expeditiondet as ed, " ;
$sql .= " " . MAIN_DB_PREFIX . " expedition as e, " ;
2026-04-14 17:23:50 +00:00
$sql .= " " . MAIN_DB_PREFIX . $db -> sanitize ( $origin ) . " det as obj " ; // for example llx_commandedet
2025-08-04 11:12:22 +00:00
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . " product as p ON obj.fk_product = p.rowid " ;
2016-11-14 13:34:15 +00:00
//TODO Add link to expeditiondet_batch
2025-08-04 11:12:22 +00:00
$sql .= " WHERE e.entity IN ( " . getEntity ( 'expedition' ) . " ) " ;
2026-04-14 17:23:50 +00:00
$sql .= " AND obj.fk_ " . $db -> sanitize ( $origin ) . " = " . (( int ) $origin_id );
2024-04-08 10:44:49 +00:00
$sql .= " AND obj.rowid = ed.fk_elementdet " ;
2025-05-10 00:44:31 +00:00
if ( isModEnabled ( 'subtotals' )) {
2025-08-04 11:12:22 +00:00
$sql .= " AND obj.special_code <> " . SUBTOTALS_SPECIAL_CODE ;
2025-05-10 00:44:31 +00:00
}
2020-04-10 08:59:32 +00:00
$sql .= " AND ed.fk_expedition = e.rowid " ;
2021-02-23 21:03:23 +00:00
if ( $filter ) {
2026-07-20 13:28:15 +00:00
$sql .= $filter ; // @phan-suppress-current-line SqlInjection
2021-02-23 21:03:23 +00:00
}
2023-12-02 15:46:37 +00:00
$sql .= " ORDER BY obj.rowid, obj.fk_product " ;
2008-05-20 00:09:11 +00:00
2014-06-12 09:31:53 +00:00
dol_syslog ( " show_list_sending_receive " , LOG_DEBUG );
2008-05-20 00:09:11 +00:00
$resql = $db -> query ( $sql );
2021-02-23 21:03:23 +00:00
if ( $resql ) {
2008-05-20 00:09:11 +00:00
$num = $db -> num_rows ( $resql );
$i = 0 ;
2021-02-23 21:03:23 +00:00
if ( $num ) {
if ( $filter ) {
print load_fiche_titre ( $langs -> trans ( " OtherSendingsForSameOrder " ));
} else {
print load_fiche_titre ( $langs -> trans ( " SendingsAndReceivingForSameOrder " ));
}
2009-04-05 19:01:43 +00:00
2025-03-20 12:39:25 +00:00
print '<div class="div-table-responsive-no-min">' ;
2019-11-05 20:24:41 +00:00
print '<table class="liste centpercent">' ;
2008-05-20 00:09:11 +00:00
print '<tr class="liste_titre">' ;
2019-01-19 11:40:17 +00:00
//print '<td class="left">'.$langs->trans("QtyOrdered").'</td>';
2025-08-04 11:12:22 +00:00
print '<td>' . $langs -> trans ( " SendingSheet " ) . '</td>' ;
print '<td>' . $langs -> trans ( " Description " ) . '</td>' ;
print '<td class="center">' . $langs -> trans ( " DateCreation " ) . '</td>' ;
print '<td class="center">' . $langs -> trans ( " DateDeliveryPlanned " ) . '</td>' ;
print '<td class="center">' . $langs -> trans ( " QtyPreparedOrShipped " ) . '</td>' ;
2022-09-25 04:02:37 +00:00
if ( isModEnabled ( 'stock' )) {
2025-08-04 11:12:22 +00:00
print '<td>' . $langs -> trans ( " Warehouse " ) . '</td>' ;
2016-10-29 14:18:39 +00:00
}
2016-11-14 13:34:15 +00:00
/* TODO Add link to expeditiondet_batch
2024-10-07 12:40:29 +00:00
if ( isModEnabled ( 'productbatch' ))
2016-11-14 13:34:15 +00:00
{
2021-02-23 21:03:23 +00:00
print '<td>' ;
print '</td>' ;
2016-11-14 13:34:15 +00:00
} */
2023-04-18 12:04:27 +00:00
if ( getDolGlobalInt ( 'MAIN_SUBMODULE_DELIVERY' )) {
2025-08-04 11:12:22 +00:00
print '<td>' . $langs -> trans ( " DeliveryOrder " ) . '</td>' ;
2019-03-14 13:20:32 +00:00
//print '<td class="center">'.$langs->trans("QtyReceived").'</td>';
2025-08-04 11:12:22 +00:00
print '<td class="right">' . $langs -> trans ( " DeliveryDate " ) . '</td>' ;
2012-02-04 09:48:47 +00:00
}
2008-05-20 00:09:11 +00:00
print " </tr> \n " ;
2021-02-23 21:03:23 +00:00
while ( $i < $num ) {
2008-05-20 00:09:11 +00:00
$objp = $db -> fetch_object ( $resql );
2018-04-22 17:27:37 +00:00
2023-09-19 18:29:24 +00:00
$expedition -> id = $objp -> expedition_id ;
$expedition -> ref = $objp -> exp_ref ;
$expedition -> billed = $objp -> billed ;
$expedition -> statut = $objp -> status ;
$expedition -> status = $objp -> status ;
2024-09-13 01:09:53 +00:00
$expedition -> signed_status = $objp -> signed_status ;
2023-09-19 18:29:24 +00:00
2017-04-14 09:22:48 +00:00
print '<tr class="oddeven">' ;
2009-04-05 19:01:43 +00:00
2010-05-17 14:13:03 +00:00
// Sending id
2025-03-20 12:39:25 +00:00
print '<td class="tdoverflowmax125">' ;
2023-09-19 18:29:24 +00:00
print $expedition -> getNomUrl ( 1 );
//print '<a href="'.DOL_URL_ROOT.'/expedition/card.php?id='.$objp->expedition_id.'">'.img_object($langs->trans("ShowSending"), 'sending').' '.$objp->exp_ref.'<a>';
2016-11-14 13:34:15 +00:00
print '</td>' ;
2010-05-17 14:13:03 +00:00
// Description
2021-02-23 21:03:23 +00:00
if ( $objp -> fk_product > 0 ) {
2012-02-04 09:48:47 +00:00
// Define output language
2023-11-27 10:39:32 +00:00
if ( getDolGlobalInt ( 'MAIN_MULTILANGS' ) && getDolGlobalString ( 'PRODUIT_TEXTS_IN_THIRDPARTY_LANGUAGE' )) {
2012-02-04 09:48:47 +00:00
$object = new $origin ( $db );
2024-10-03 17:40:34 +00:00
'@phan-var-force CommonObject $object' ;
2012-02-04 09:48:47 +00:00
$object -> fetch ( $origin_id );
$object -> fetch_thirdparty ();
2014-03-12 00:21:18 +00:00
$prod = new Product ( $db );
2020-04-10 08:59:32 +00:00
$prod -> id = $objp -> fk_product ;
2014-03-12 00:21:18 +00:00
$prod -> getMultiLangs ();
2012-02-04 09:48:47 +00:00
$outputlangs = $langs ;
2020-04-10 08:59:32 +00:00
$newlang = '' ;
2021-05-17 05:27:02 +00:00
if ( empty ( $newlang ) && GETPOST ( 'lang_id' , 'aZ09' )) {
$newlang = GETPOST ( 'lang_id' , 'aZ09' );
2021-02-23 21:03:23 +00:00
}
if ( empty ( $newlang )) {
$newlang = $object -> thirdparty -> default_lang ;
}
if ( ! empty ( $newlang )) {
2019-01-27 10:55:16 +00:00
$outputlangs = new Translate ( " " , $conf );
2012-02-04 09:48:47 +00:00
$outputlangs -> setDefaultLang ( $newlang );
}
2020-04-10 08:59:32 +00:00
$label = ( ! empty ( $prod -> multilangs [ $outputlangs -> defaultlang ][ " label " ])) ? $prod -> multilangs [ $outputlangs -> defaultlang ][ " label " ] : $objp -> product_label ;
2020-05-21 13:05:19 +00:00
} else {
2020-04-10 08:59:32 +00:00
$label = ( ! empty ( $objp -> label ) ? $objp -> label : $objp -> product_label );
2012-02-04 09:48:47 +00:00
}
2012-01-17 11:03:05 +00:00
2008-05-20 00:09:11 +00:00
print '<td>' ;
2009-04-05 19:01:43 +00:00
// Show product and description
2020-04-10 08:59:32 +00:00
$product_static -> type = $objp -> fk_product_type ;
$product_static -> id = $objp -> fk_product ;
$product_static -> ref = $objp -> ref ;
$product_static -> status_batch = $objp -> product_tobatch ;
2023-09-19 18:29:24 +00:00
2020-04-10 08:59:32 +00:00
$text = $product_static -> getNomUrl ( 1 );
2025-08-04 11:12:22 +00:00
$text .= ' - ' . $label ;
2022-10-21 09:14:28 +00:00
$description = ( getDolGlobalInt ( 'PRODUIT_DESC_IN_FORM_ACCORDING_TO_DEVICE' ) ? '' : dol_htmlentitiesbr ( $objp -> description ));
2025-03-11 00:43:54 +00:00
print $form -> textwithtooltip ( $text , $description , 3 , 0 , '' , ( string ) $i );
2009-04-05 19:01:43 +00:00
// Show range
2019-01-27 10:55:16 +00:00
print_date_range ( $objp -> date_start , $objp -> date_end );
2009-04-05 19:01:43 +00:00
// Add description in form
2022-10-21 09:14:28 +00:00
if ( getDolGlobalInt ( 'PRODUIT_DESC_IN_FORM_ACCORDING_TO_DEVICE' )) {
2025-08-04 11:12:22 +00:00
print ( ! empty ( $objp -> description ) ? (( empty ( $objp -> product ) || $objp -> description != $objp -> product ) ? '<br>' . dol_htmlentitiesbr ( $objp -> description ) : '' ) : '' );
2009-04-05 19:01:43 +00:00
}
2008-05-20 00:09:11 +00:00
print '</td>' ;
2020-05-21 13:05:19 +00:00
} else {
2009-04-05 19:01:43 +00:00
print " <td> " ;
2021-02-23 21:03:23 +00:00
if ( $objp -> fk_product_type == 1 ) {
$text = img_object ( $langs -> trans ( 'Service' ), 'service' );
} else {
$text = img_object ( $langs -> trans ( 'Product' ), 'product' );
}
2012-08-25 13:21:34 +00:00
2020-04-10 08:59:32 +00:00
if ( ! empty ( $objp -> label )) {
2025-08-04 11:12:22 +00:00
$text .= ' <strong>' . $objp -> label . '</strong>' ;
2025-03-11 00:43:54 +00:00
print $form -> textwithtooltip ( $text , $objp -> description , 3 , 0 , '' , ( string ) $i );
2012-08-25 13:21:34 +00:00
} else {
2025-08-04 11:12:22 +00:00
print $text . ' ' . nl2br ( $objp -> description );
2012-08-25 13:21:34 +00:00
}
2009-04-05 19:01:43 +00:00
// Show range
2019-01-27 10:55:16 +00:00
print_date_range ( $objp -> date_start , $objp -> date_end );
2009-04-05 19:01:43 +00:00
print " </td> \n " ;
2008-05-20 00:09:11 +00:00
}
2008-10-17 14:43:33 +00:00
2019-03-14 13:20:32 +00:00
//print '<td class="center">'.$objp->qty_asked.'</td>';
2009-04-05 19:01:43 +00:00
2010-05-26 22:54:48 +00:00
// Date creation
2025-08-04 11:12:22 +00:00
print '<td class="nowrap center">' . dol_print_date ( $db -> jdate ( $objp -> date_creation ), 'day' ) . '</td>' ;
2009-04-05 19:01:43 +00:00
2010-05-26 22:54:48 +00:00
// Date shipping creation
2025-08-04 11:12:22 +00:00
print '<td class="nowrap center">' . dol_print_date ( $db -> jdate ( $objp -> date_delivery ), 'day' ) . '</td>' ;
2010-05-12 23:03:33 +00:00
2010-05-26 22:54:48 +00:00
// Qty shipped
2025-08-04 11:12:22 +00:00
print '<td class="center">' . $objp -> qty_shipped . '</td>' ;
2010-05-12 23:03:33 +00:00
2016-10-29 14:18:39 +00:00
// Warehouse
2022-09-25 04:02:37 +00:00
if ( isModEnabled ( 'stock' )) {
2025-03-20 12:39:25 +00:00
print '<td class="tdoverflowmax125">' ;
2021-02-23 21:03:23 +00:00
if ( $objp -> warehouse_id > 0 ) {
2020-10-28 16:49:52 +00:00
$warehousestatic -> fetch ( $objp -> warehouse_id );
print $warehousestatic -> getNomUrl ( 1 );
}
print '</td>' ;
2016-10-29 14:18:39 +00:00
}
2017-12-02 09:43:01 +00:00
2024-01-13 18:48:20 +00:00
// Batch number management
2016-11-14 13:34:15 +00:00
/* TODO Add link to expeditiondet_batch
2024-10-07 12:40:29 +00:00
if ( isModEnabled ( 'productbatch' ))
2016-11-14 13:34:15 +00:00
{
2022-05-17 12:55:38 +00:00
//var_dump($objp->edrowid);
2021-02-23 21:03:23 +00:00
$lines [ $i ] -> detail_batch
if ( isset ( $lines [ $i ] -> detail_batch ))
{
print '<td>' ;
if ( $lines [ $i ] -> product_tobatch )
{
$detail = '' ;
foreach ( $lines [ $i ] -> detail_batch as $dbatch )
{
2017-12-02 09:43:01 +00:00
$detail .= $langs -> trans ( " Batch " ) . ': ' . $dbatch -> batch ;
$detail .= ' - ' . $langs -> trans ( " SellByDate " ) . ': ' . dol_print_date ( $dbatch -> sellby , " day " );
2017-12-02 10:34:56 +00:00
$detail .= ' - ' . $langs -> trans ( " EatByDate " ) . ': ' . dol_print_date ( $dbatch -> eatby , " day " );
2018-10-11 09:56:52 +00:00
$detail .= ' - ' . $langs -> trans ( " Qty " ) . ': ' . $dbatch -> qty ;
2017-12-02 09:43:01 +00:00
$detail .= '<br>' ;
2021-02-23 21:03:23 +00:00
}
print $form -> textwithtooltip ( img_picto ( '' , 'object_barcode' ) . ' ' . $langs -> trans ( " DetailBatchNumber " ), $detail );
}
else
{
print $langs -> trans ( " NA " );
}
print '</td>' ;
} else {
print '<td></td>' ;
}
2017-12-02 09:43:01 +00:00
} */
2024-01-13 18:48:20 +00:00
// Information on receipt
2023-04-18 12:04:27 +00:00
if ( getDolGlobalInt ( 'MAIN_SUBMODULE_DELIVERY' )) {
2025-08-04 11:12:22 +00:00
include_once DOL_DOCUMENT_ROOT . '/delivery/class/delivery.class.php' ;
2025-03-10 22:53:31 +00:00
$expedition -> fetchObjectLinked ( $expedition -> id , $expedition -> element , null , 'delivery' );
2011-05-06 18:27:18 +00:00
//var_dump($expedition->linkedObjects);
2016-07-01 00:06:30 +00:00
2020-04-10 08:59:32 +00:00
$receiving = '' ;
2021-02-23 21:03:23 +00:00
if ( ! empty ( $expedition -> linkedObjects [ 'delivery' ])) {
$receiving = reset ( $expedition -> linkedObjects [ 'delivery' ]); // Take first link
}
2010-05-26 22:54:48 +00:00
2021-02-23 21:03:23 +00:00
if ( ! empty ( $receiving )) {
2025-04-01 18:47:40 +00:00
/** @var Delivery $receiving */
2024-10-03 17:40:34 +00:00
'@phan-var-force Delivery $receiving' ;
2024-04-08 10:44:49 +00:00
// $expedition->fk_elementdet = id of det line of order
2010-05-26 22:54:48 +00:00
// $receiving->fk_origin_line = id of det line of order
// $receiving->origin may be 'shipping'
// $receiving->origin_id may be id of shipping
2010-05-12 23:03:33 +00:00
// Ref
2010-05-26 22:54:48 +00:00
print '<td>' ;
2025-03-11 00:43:54 +00:00
print $receiving -> getNomUrl ( 1 );
2020-10-05 13:32:29 +00:00
//print '<a href="'.DOL_URL_ROOT.'/delivery/card.php?id='.$livraison_id.'">'.img_object($langs->trans("ShowReceiving"),'sending').' '.$objp->livraison_ref.'<a>';
2010-05-26 22:54:48 +00:00
print '</td>' ;
2010-05-12 23:03:33 +00:00
// Qty received
2019-03-14 13:20:32 +00:00
//print '<td class="center">';
2010-05-26 22:54:48 +00:00
// TODO No solution for the moment to link a line det of receipt with a line det of shipping,
// so no way to know the qty received for this line of shipping.
//print $langs->trans("FeatureNotYetAvailable");
//print '</td>';
2010-05-12 23:03:33 +00:00
// Date shipping real
2019-03-14 13:20:32 +00:00
print '<td class="right">' ;
2019-01-27 10:55:16 +00:00
print dol_print_date ( $receiving -> date_delivery , 'day' );
2010-05-26 22:54:48 +00:00
print '</td>' ;
2020-05-21 13:05:19 +00:00
} else {
2010-07-22 22:51:00 +00:00
//print '<td> </td>';
2008-10-17 14:43:33 +00:00
print '<td> </td>' ;
print '<td> </td>' ;
2008-05-20 00:09:11 +00:00
}
}
print '</tr>' ;
$i ++ ;
}
print '</table>' ;
2025-03-20 12:39:25 +00:00
print '</div>' ;
2008-05-20 00:09:11 +00:00
}
$db -> free ( $resql );
2020-05-21 13:05:19 +00:00
} else {
2009-02-20 22:53:15 +00:00
dol_print_error ( $db );
2008-05-20 00:09:11 +00:00
}
return 1 ;
}