2004-10-19 22:24:10 +00:00
< ? php
2006-12-04 11:31:06 +00:00
/* Copyright ( C ) 2003 - 2006 Rodolphe Quiedeville < rodolphe @ quiedeville . org >
2008-03-31 05:56:45 +00:00
* Copyright ( C ) 2004 - 2008 Laurent Destailleur < eldy @ users . sourceforge . net >
2018-10-27 12:43:12 +00:00
* Copyright ( C ) 2005 - 2009 Regis Houssin < regis . houssin @ inodbox . com >
2012-10-13 16:02:43 +00:00
* Copyright ( C ) 2012 Juanjo Menent < jmenent @ 2 byte . es >
2021-07-28 08:45:47 +00:00
* Copyright ( C ) 2021 Ferran Marcet < fmarcet @ 2 byte . es >
2024-03-12 23:31:53 +00:00
* Copyright ( C ) 2024 MDW < mdeweerd @ users . noreply . github . com >
2026-04-11 15:40:53 +00:00
* Copyright ( C ) 2024 - 2026 Frédéric France < frederic . france @ free . fr >
2003-11-13 15:12:07 +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
2003-11-13 15:12:07 +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 />.
2003-11-13 15:12:07 +00:00
*/
2005-03-31 22:17:49 +00:00
/**
2009-07-29 22:52:08 +00:00
* \defgroup stock Module stocks
2008-12-04 20:27:01 +00:00
* \brief Module pour gerer la tenue de stocks produits
2011-10-24 12:11:49 +00:00
* \file htdocs / core / modules / modStock . class . php
2008-12-04 20:27:01 +00:00
* \ingroup stock
2021-03-20 12:55:43 +00:00
* \brief Description and activation file for the module Stock
2008-10-01 19:10:17 +00:00
*/
2004-08-14 12:21:24 +00:00
2020-04-10 08:59:32 +00:00
include_once DOL_DOCUMENT_ROOT . '/core/modules/DolibarrModules.class.php' ;
2007-10-09 23:15:25 +00:00
2003-11-13 15:12:07 +00:00
2005-03-31 22:17:49 +00:00
/**
2015-09-07 13:55:26 +00:00
* Class to describe and enable module Stock
2008-10-01 19:10:17 +00:00
*/
2003-11-13 15:12:07 +00:00
class modStock extends DolibarrModules
{
2008-10-01 19:10:17 +00:00
/**
2011-09-26 14:22:35 +00:00
* Constructor . Define names , constants , directories , boxes , permissions
*
2012-01-04 20:23:50 +00:00
* @ param DoliDB $db Database handler
2008-10-01 19:10:17 +00:00
*/
2019-02-25 19:35:59 +00:00
public function __construct ( $db )
2008-10-01 19:10:17 +00:00
{
2024-12-11 18:40:39 +00:00
global $conf , $langs ; // $conf is used by inc.php
2009-05-04 11:40:00 +00:00
2012-01-04 20:23:50 +00:00
$this -> db = $db ;
$this -> numero = 52 ;
2008-10-01 19:10:17 +00:00
$this -> family = " products " ;
2020-05-01 22:41:27 +00:00
$this -> module_position = '39' ;
2008-10-01 19:10:17 +00:00
// Module label (no space allowed), used if translation string 'ModuleXXXName' not found (where XXX is value of numeric property 'numero' of module)
2019-01-27 10:55:16 +00:00
$this -> name = preg_replace ( '/^mod/i' , '' , get_class ( $this ));
2008-10-01 19:10:17 +00:00
$this -> description = " Gestion des stocks " ;
2008-12-15 22:25:59 +00:00
// Possible values for version are: 'development', 'experimental', 'dolibarr' or version
$this -> version = 'dolibarr' ;
2009-05-04 11:40:00 +00:00
2008-10-06 07:39:52 +00:00
$this -> const_name = 'MAIN_MODULE_' . strtoupper ( $this -> name );
2020-04-10 08:59:32 +00:00
$this -> picto = 'stock' ;
2008-10-01 19:10:17 +00:00
2009-05-04 11:40:00 +00:00
// Data directories to create when module is enabled
2018-05-05 12:33:34 +00:00
$this -> dirs = array ( " /stock/temp " );
2008-10-01 19:10:17 +00:00
$this -> config_page_url = array ( " stock.php " );
// Dependencies
2020-04-10 08:59:32 +00:00
$this -> hidden = false ; // A condition to hide module
$this -> depends = array ( " modProduct " ); // List of module class names as string that must be enabled if this module is enabled
$this -> requiredby = array ( " modProductBatch " ); // List of module ids to disable if this one is disabled
2026-04-12 09:59:56 +00:00
$this -> conflictwith = []; // List of module class names as string this module is in conflict with
2008-10-01 19:10:17 +00:00
$this -> langfiles = array ( " stocks " );
2009-05-04 11:40:00 +00:00
// Constants
2026-04-11 15:40:53 +00:00
$this -> const = [
[
'STOCK_DISALLOW_NEGATIVE_TRANSFER' ,
'chaine' ,
'1' ,
'' ,
0 ,
],
[
" STOCK_ADDON_PDF " ,
" chaine " ,
" standard_stock " ,
'Name of PDF model of stock' ,
0 ,
],
[
" MOUVEMENT_ADDON_PDF " ,
" chaine " ,
" standard_movement_stock " ,
'Name of PDF model of stock movement' ,
0 ,
],
[
" STOCK_ADDON_PDF_ODT_PATH " ,
" chaine " ,
" DOL_DATA_ROOT " . ( $conf -> entity > 1 ? '/' . $conf -> entity : '' ) . " /doctemplates/stocks " ,
" " ,
0 ,
],
[
" MOUVEMENT_ADDON_PDF_ODT_PATH " ,
" chaine " ,
" DOL_DATA_ROOT " . ( $conf -> entity > 1 ? '/' . $conf -> entity : '' ) . " /doctemplates/stocks/movements " ,
" " ,
0 ,
],
];
2008-10-01 19:10:17 +00:00
// Boxes
2026-04-12 09:59:56 +00:00
$this -> boxes = [];
2008-10-01 19:10:17 +00:00
// Permissions
2026-04-12 09:59:56 +00:00
$this -> rights = [];
2008-10-01 19:10:17 +00:00
$this -> rights_class = 'stock' ;
2024-03-27 00:14:05 +00:00
$r = 0 ;
$this -> rights [ $r ][ 0 ] = 1001 ;
2024-03-27 09:59:05 +00:00
$this -> rights [ $r ][ 1 ] = 'Read stocks' ;
2024-03-27 00:14:05 +00:00
$this -> rights [ $r ][ 2 ] = 'r' ;
$this -> rights [ $r ][ 3 ] = 0 ;
$this -> rights [ $r ][ 4 ] = 'lire' ;
$this -> rights [ $r ][ 5 ] = '' ;
$r ++ ;
$this -> rights [ $r ][ 0 ] = 1002 ;
2024-03-27 09:59:05 +00:00
$this -> rights [ $r ][ 1 ] = 'Create/Modify stocks' ;
2024-03-27 00:14:05 +00:00
$this -> rights [ $r ][ 2 ] = 'w' ;
$this -> rights [ $r ][ 3 ] = 0 ;
$this -> rights [ $r ][ 4 ] = 'creer' ;
$this -> rights [ $r ][ 5 ] = '' ;
$r ++ ;
$this -> rights [ $r ][ 0 ] = 1003 ;
2024-03-27 09:59:05 +00:00
$this -> rights [ $r ][ 1 ] = 'Delete stock' ;
2024-03-27 00:14:05 +00:00
$this -> rights [ $r ][ 2 ] = 'd' ;
$this -> rights [ $r ][ 3 ] = 0 ;
$this -> rights [ $r ][ 4 ] = 'supprimer' ;
$this -> rights [ $r ][ 5 ] = '' ;
$r ++ ;
$this -> rights [ $r ][ 0 ] = 1004 ;
2024-03-27 09:59:05 +00:00
$this -> rights [ $r ][ 1 ] = 'Read stock movements' ;
2024-03-27 00:14:05 +00:00
$this -> rights [ $r ][ 2 ] = 'r' ;
$this -> rights [ $r ][ 3 ] = 0 ;
$this -> rights [ $r ][ 4 ] = 'mouvement' ;
$this -> rights [ $r ][ 5 ] = 'lire' ;
2023-11-16 14:31:20 +00:00
2024-03-27 00:14:05 +00:00
$r ++ ;
$this -> rights [ $r ][ 0 ] = 1005 ;
2024-03-27 09:59:05 +00:00
$this -> rights [ $r ][ 1 ] = 'Create/modify stock movements' ;
2024-03-27 00:14:05 +00:00
$this -> rights [ $r ][ 2 ] = 'w' ;
$this -> rights [ $r ][ 3 ] = 0 ;
$this -> rights [ $r ][ 4 ] = 'mouvement' ;
$this -> rights [ $r ][ 5 ] = 'creer' ;
2024-12-11 16:51:16 +00:00
if ( getDolGlobalInt ( 'MAIN_FEATURES_LEVEL' ) >= 2 ) {
// Not yet implemented. TODO
$r ++ ;
$this -> rights [ $r ][ 0 ] = 1008 ;
$this -> rights [ $r ][ 1 ] = 'Read stock value' ;
$this -> rights [ $r ][ 2 ] = 'w' ;
$this -> rights [ $r ][ 3 ] = 0 ;
$this -> rights [ $r ][ 4 ] = 'value_advance' ;
$this -> rights [ $r ][ 5 ] = 'read' ;
}
2024-03-27 00:14:05 +00:00
$r ++ ;
$this -> rights [ $r ][ 0 ] = 1011 ;
$this -> rights [ $r ][ 1 ] = 'inventoryReadPermission' ; // Permission label
$this -> rights [ $r ][ 3 ] = 0 ; // Permission by default for new user (0/1)
$this -> rights [ $r ][ 4 ] = 'inventory_advance' ; // In php code, permission will be checked by test if ($user->rights->permkey->level1->level2)
$this -> rights [ $r ][ 5 ] = 'read' ; // In php code, permission will be checked by test if ($user->rights->permkey->level1->level2)
$r ++ ;
$this -> rights [ $r ][ 0 ] = 1012 ;
$this -> rights [ $r ][ 1 ] = 'inventoryCreatePermission' ; // Permission label
$this -> rights [ $r ][ 3 ] = 0 ; // Permission by default for new user (0/1)
$this -> rights [ $r ][ 4 ] = 'inventory_advance' ; // In php code, permission will be checked by test if ($user->rights->permkey->level1->level2)
$this -> rights [ $r ][ 5 ] = 'write' ; // In php code, permission will be checked by test if ($user->rights->permkey->level1->level2)
$r ++ ;
$this -> rights [ $r ][ 0 ] = 1013 ;
$this -> rights [ $r ][ 1 ] = 'inventoryDeletePermission' ; // Permission label
$this -> rights [ $r ][ 3 ] = 0 ; // Permission by default for new user (0/1)
$this -> rights [ $r ][ 4 ] = 'inventory_advance' ; // In php code, permission will be checked by test if ($user->rights->permkey->level1->level2)
$this -> rights [ $r ][ 5 ] = 'delete' ; // In php code, permission will be checked by test if ($user->rights->permkey->level1->level2)
2023-11-16 14:31:20 +00:00
2023-11-27 11:24:18 +00:00
if ( getDolGlobalInt ( 'MAIN_FEATURES_LEVEL' ) >= 2 ) {
2024-03-27 00:14:05 +00:00
$r ++ ;
$this -> rights [ $r ][ 0 ] = 1014 ;
$this -> rights [ $r ][ 1 ] = 'inventoryValidatePermission' ; // Permission label
$this -> rights [ $r ][ 3 ] = 0 ; // Permission by default for new user (0/1)
$this -> rights [ $r ][ 4 ] = 'inventory_advance' ; // In php code, permission will be checked by test if ($user->rights->permkey->level1->level2)
$this -> rights [ $r ][ 5 ] = 'validate' ; // In php code, permission will be checked by test if ($user->rights->permkey->level1->level2)
$r ++ ;
$this -> rights [ $r ][ 0 ] = 1015 ;
$this -> rights [ $r ][ 1 ] = 'inventoryChangePMPPermission' ; // Permission label
$this -> rights [ $r ][ 3 ] = 0 ; // Permission by default for new user (0/1)
$this -> rights [ $r ][ 4 ] = 'inventory_advance' ; // In php code, permission will be checked by test if ($user->rights->permkey->level1->level2)
$this -> rights [ $r ][ 5 ] = 'changePMP' ; // In php code, permission will be checked by test if ($user->rights->permkey->level1->level2)
2017-05-02 13:25:30 +00:00
}
2017-10-20 12:52:01 +00:00
2017-04-29 19:53:01 +00:00
// Main menu entries
2026-04-12 09:59:56 +00:00
$this -> menu = []; // List of menus to add
2020-04-10 08:59:32 +00:00
$r = 0 ;
2017-10-20 12:52:01 +00:00
2016-09-30 11:02:13 +00:00
// Menus
//-------
2020-04-10 08:59:32 +00:00
$this -> menu = 1 ; // This module add menu entries. They are coded into menu manager.
2017-10-20 12:52:01 +00:00
2008-10-01 19:10:17 +00:00
// Exports
//--------
2024-05-30 11:37:17 +00:00
$r = 0 ;
2008-10-01 19:10:17 +00:00
2020-12-07 23:50:27 +00:00
// Export warehouses
$r ++ ;
2020-12-13 15:27:44 +00:00
$this -> export_code [ $r ] = $this -> rights_class . '_emplacement' ;
2020-12-07 23:50:27 +00:00
$this -> export_label [ $r ] = " Warehouses " ; // Translation key (used only if key ExportDataset_xxx_z not found)
$this -> export_icon [ $r ] = " warehouse " ;
$this -> export_permission [ $r ] = array ( array ( " stock " , " lire " ));
$this -> export_fields_array [ $r ] = array (
2024-03-12 23:31:53 +00:00
'e.rowid' => 'IdWarehouse' , 'e.ref' => 'LocationSummary' , 'e.description' => 'DescWareHouse' , 'e.lieu' => 'LieuWareHouse' , 'e.address' => 'Address' , 'e.zip' => 'Zip' , 'e.town' => 'Town' ,
'd.code_departement' => 'Departement' , 'c.code' => 'CountryCode' ,
'e.phone' => 'Phone' , 'e.fax' => 'Fax' , 'e.statut' => 'Status' , 'pe.rowid' => 'ParentWarehouse' , 'pe.ref' => 'LocationSummary'
2020-12-07 23:50:27 +00:00
);
$this -> export_TypeFields_array [ $r ] = array (
2024-03-12 23:31:53 +00:00
'e.ref' => 'Text' , 'e.description' => 'Text' , 'e.lieu' => 'Text' , 'e.address' => 'Text' , 'e.zip' => 'Text' , 'e.town' => 'Text' ,
'd.code_departement' => 'List:c_departements:code_departement:code_departement:' , 'c.code' => 'List:c_country:code:code:' ,
'e.phone' => 'Text' , 'e.fax' => 'Text' , 'e.statut' => 'Text' , 'pe.rowid' => 'List:entrepot:ref:rowid:stock' , 'pe.ref' => 'Text'
2020-12-07 23:50:27 +00:00
);
2026-04-12 09:59:56 +00:00
$this -> export_entities_array [ $r ] = []; // We define here only fields that use another icon that the one defined into export_icon
$this -> export_aggregate_array [ $r ] = []; // TODO Not used yet
2026-02-17 13:36:54 +00:00
$keyforselect = 'entrepot' ;
$keyforelement = 'entrepot' ;
2021-03-01 19:37:16 +00:00
$keyforaliasextra = 'extra' ;
2020-12-07 23:50:27 +00:00
include DOL_DOCUMENT_ROOT . '/core/extrafieldsinexport.inc.php' ;
$this -> export_sql_start [ $r ] = 'SELECT DISTINCT ' ;
$this -> export_sql_end [ $r ] = ' FROM ' . MAIN_DB_PREFIX . 'entrepot as e' ;
$this -> export_sql_end [ $r ] .= ' LEFT JOIN ' . MAIN_DB_PREFIX . 'c_departements as d ON d.rowid = e.fk_departement' ;
$this -> export_sql_end [ $r ] .= ' LEFT JOIN ' . MAIN_DB_PREFIX . 'c_country as c ON c.rowid = e.fk_pays' ;
$this -> export_sql_end [ $r ] .= ' LEFT JOIN ' . MAIN_DB_PREFIX . 'entrepot as pe ON pe.rowid = e.fk_parent' ;
$this -> export_sql_end [ $r ] .= ' LEFT JOIN ' . MAIN_DB_PREFIX . 'entrepot_extrafields as extra ON extra.fk_object = e.rowid' ;
$this -> export_sql_end [ $r ] .= ' WHERE e.entity IN (' . getEntity ( 'stock' ) . ')' ;
2020-12-03 18:45:36 +00:00
// Export stock (without batch number)
2008-10-01 19:10:17 +00:00
$r ++ ;
2020-12-13 15:27:44 +00:00
$this -> export_code [ $r ] = $this -> rights_class . '_emplacement_product' ;
2020-12-03 18:45:36 +00:00
$this -> export_label [ $r ] = " Stocks " ; // Translation key (used only if key ExportDataset_xxx_z not found)
$this -> export_icon [ $r ] = " warehouse " ;
2020-04-10 08:59:32 +00:00
$this -> export_permission [ $r ] = array ( array ( " stock " , " lire " ));
$this -> export_fields_array [ $r ] = array (
2024-03-12 23:31:53 +00:00
'e.rowid' => 'IdWarehouse' , 'e.ref' => 'LocationSummary' , 'e.description' => 'DescWareHouse' , 'e.lieu' => 'LieuWareHouse' , 'e.address' => 'Address' , 'e.zip' => 'Zip' , 'e.town' => 'Town' ,
'p.rowid' => " ProductId " , 'p.ref' => " Ref " , 'p.fk_product_type' => " Type " , 'p.label' => " Label " , 'p.description' => " Description " , 'p.note' => " Note " ,
'p.price' => " Price " , 'p.tva_tx' => 'VAT' , 'p.tosell' => " OnSell " , 'p.tobuy' => 'OnBuy' , 'p.duration' => " Duration " ,
'p.datec' => 'DateCreation' , 'p.tms' => 'DateModification' , 'p.pmp' => 'PMPValue' , 'p.cost_price' => 'CostPrice' ,
'p.seuil_stock_alerte' => 'StockLimit' , 'p.barcode' => 'BarCode' , 'bt.libelle' => 'BarcodeType' ,
2018-05-27 13:04:12 +00:00
);
2023-06-30 09:01:57 +00:00
if ( isModEnabled ( 'barcode' )) {
2024-03-12 23:31:53 +00:00
$this -> export_fields_array [ $r ] = array_merge ( $this -> export_fields_array [ $r ], array ( 'p.barcode' => 'BarCode' ));
2023-06-30 09:01:57 +00:00
}
2020-04-10 08:59:32 +00:00
$this -> export_TypeFields_array [ $r ] = array (
2024-03-12 23:31:53 +00:00
'e.rowid' => 'List:entrepot:ref::stock' , 'e.ref' => 'Text' , 'e.lieu' => 'Text' , 'e.address' => 'Text' , 'e.zip' => 'Text' , 'e.town' => 'Text' ,
'p.rowid' => " Numeric " , 'p.ref' => " Text " , 'p.fk_product_type' => " Text " , 'p.label' => " Text " , 'p.description' => " Text " , 'p.note' => " Text " ,
'p.price' => " Numeric " , 'p.tva_tx' => 'Numeric' , 'p.tosell' => " Boolean " , 'p.tobuy' => " Boolean " , 'p.duration' => " Duree " ,
'p.datec' => 'Date' , 'p.tms' => 'Date' , 'p.pmp' => 'Numeric' , 'p.cost_price' => 'Numeric' ,
'ps.reel' => 'Numeric' ,
'p.seuil_stock_alerte' => 'Numeric' , 'p.barcode' => 'Text' , 'bt.libelle' => 'List:c_barcode_type:libelle' ,
2018-05-27 13:04:12 +00:00
);
2023-06-30 09:01:57 +00:00
if ( isModEnabled ( 'barcode' )) {
2024-03-12 23:31:53 +00:00
$this -> export_TypeFields_array [ $r ] = array_merge ( $this -> export_TypeFields_array [ $r ], array ( 'p.barcode' => 'Text' ));
2023-06-30 09:01:57 +00:00
}
2020-04-10 08:59:32 +00:00
$this -> export_entities_array [ $r ] = array (
2024-03-12 23:31:53 +00:00
'p.rowid' => " product " , 'p.ref' => " product " , 'p.fk_product_type' => " product " , 'p.label' => " product " , 'p.description' => " product " , 'p.note' => " product " ,
'p.price' => " product " , 'p.tva_tx' => 'product' , 'p.tosell' => " product " , 'p.tobuy' => " product " , 'p.duration' => " product " ,
'p.datec' => 'product' , 'p.tms' => 'product' , 'p.pmp' => 'product' , 'p.cost_price' => 'product' ,
'ps.reel' => 'stock' ,
2024-03-16 23:35:06 +00:00
'p.seuil_stock_alerte' => 'product' , 'p.barcode' => 'product' , 'bt.libelle' => 'product' ,
2020-12-03 18:45:36 +00:00
); // We define here only fields that use another icon that the one defined into export_icon
2023-06-30 09:01:57 +00:00
if ( isModEnabled ( 'barcode' )) {
2024-03-12 23:31:53 +00:00
$this -> export_entities_array [ $r ] = array_merge ( $this -> export_entities_array [ $r ], array ( 'p.barcode' => 'product' ));
2023-06-30 09:01:57 +00:00
}
2024-03-12 23:31:53 +00:00
$this -> export_aggregate_array [ $r ] = array ( 'ps.reel' => 'SUM' ); // TODO Not used yet
$this -> export_dependencies_array [ $r ] = array ( 'stock' => array ( 'p.rowid' , 'e.rowid' )); // We must keep this until the aggregate_array is used. To have a unique key, if we ask a field of a child, to avoid the DISTINCT to discard them.
2021-03-01 19:37:16 +00:00
$keyforselect = 'product' ;
$keyforelement = 'product' ;
2024-05-30 11:37:17 +00:00
$keyforaliasextra = 'extra' ;
2018-05-23 15:48:18 +00:00
include DOL_DOCUMENT_ROOT . '/core/extrafieldsinexport.inc.php' ;
2024-03-12 23:31:53 +00:00
$this -> export_fields_array [ $r ] = array_merge ( $this -> export_fields_array [ $r ], array ( 'ps.reel' => 'Stock' ));
2018-05-23 16:00:27 +00:00
2020-04-10 08:59:32 +00:00
$this -> export_sql_start [ $r ] = 'SELECT DISTINCT ' ;
2023-08-08 18:39:37 +00:00
$this -> export_sql_end [ $r ] = ' FROM ' . MAIN_DB_PREFIX . 'product as p' ;
$this -> export_sql_end [ $r ] .= ' LEFT JOIN ' . MAIN_DB_PREFIX . 'product_extrafields as extra ON extra.fk_object = p.rowid' ;
$this -> export_sql_end [ $r ] .= ' LEFT JOIN ' . MAIN_DB_PREFIX . 'c_barcode_type as bt ON bt.rowid = p.fk_barcode_type' ;
$this -> export_sql_end [ $r ] .= ', ' . MAIN_DB_PREFIX . 'product_stock as ps, ' . MAIN_DB_PREFIX . 'entrepot as e' ;
2020-04-10 08:59:32 +00:00
$this -> export_sql_end [ $r ] .= ' WHERE p.rowid = ps.fk_product AND ps.fk_entrepot = e.rowid' ;
$this -> export_sql_end [ $r ] .= ' AND e.entity IN (' . getEntity ( 'stock' ) . ')' ;
2020-12-03 18:45:36 +00:00
// Export stock including batch number
2022-08-31 19:55:55 +00:00
if ( isModEnabled ( 'productbatch' )) {
2015-04-08 16:40:10 +00:00
$langs -> load ( " productbatch " );
// This request is same than previous but without field ps.stock (real stock in warehouse) and with link to subtable productbatch
$r ++ ;
2020-12-13 15:27:44 +00:00
$this -> export_code [ $r ] = $this -> rights_class . '_emplacement_product_lot' ;
2020-12-03 18:45:36 +00:00
$this -> export_label [ $r ] = " StocksWithBatch " ; // Translation key (used only if key ExportDataset_xxx_z not found)
$this -> export_icon [ $r ] = " warehouse " ;
2020-04-10 08:59:32 +00:00
$this -> export_permission [ $r ] = array ( array ( " stock " , " lire " ));
$this -> export_fields_array [ $r ] = array (
2024-03-12 23:31:53 +00:00
'e.rowid' => 'IdWarehouse' , 'e.ref' => 'LocationSummary' , 'e.description' => 'DescWareHouse' , 'e.lieu' => 'LieuWareHouse' , 'e.address' => 'Address' , 'e.zip' => 'Zip' , 'e.town' => 'Town' ,
'p.rowid' => " ProductId " , 'p.ref' => " Ref " , 'p.fk_product_type' => " Type " , 'p.label' => " Label " , 'p.description' => " Description " , 'p.note' => " Note " ,
'p.price' => " Price " , 'p.tva_tx' => 'VAT' , 'p.tosell' => " OnSell " , 'p.tobuy' => 'OnBuy' , 'p.duration' => " Duration " ,
2024-08-10 21:44:52 +00:00
'p.datec' => 'DateCreation' , 'p.tms' => 'DateModification' , 'p.pmp' => 'PMPValue' , 'p.cost_price' => 'CostPrice' , 'lcpn.label' => 'Nature' ,
2024-03-12 23:31:53 +00:00
'pb.rowid' => 'Id' , 'pb.batch' => 'Batch' , 'pb.qty' => 'Qty' ,
2024-08-10 21:44:52 +00:00
'pl.eatby' => 'EatByDate' , 'pl.sellby' => 'SellByDate' , 'none.dateLastMovement' => 'LastMovement'
2018-05-27 13:04:12 +00:00
);
2023-06-30 09:01:57 +00:00
if ( isModEnabled ( 'barcode' )) {
2024-03-12 23:31:53 +00:00
$this -> export_fields_array [ $r ] = array_merge ( $this -> export_fields_array [ $r ], array ( 'p.barcode' => 'BarCode' ));
2023-06-30 09:01:57 +00:00
}
2020-04-10 08:59:32 +00:00
$this -> export_TypeFields_array [ $r ] = array (
2024-03-12 23:31:53 +00:00
'e.rowid' => 'List:entrepot:ref::stock' , 'e.ref' => 'Text' , 'e.lieu' => 'Text' , 'e.description' => 'Text' , 'e.address' => 'Text' , 'e.zip' => 'Text' , 'e.town' => 'Text' ,
'p.rowid' => " Numeric " , 'p.ref' => " Text " , 'p.fk_product_type' => " Text " , 'p.label' => " Text " , 'p.description' => " Text " , 'p.note' => " Text " ,
'p.price' => " Numeric " , 'p.tva_tx' => 'Numeric' , 'p.tosell' => " Boolean " , 'p.tobuy' => " Boolean " , 'p.duration' => " Duree " ,
2024-11-12 18:41:21 +00:00
'p.datec' => 'Date' , 'p.tms' => 'Date' , 'p.pmp' => 'PMPValue' , 'p.cost_price' => 'CostPrice' , 'lcpn.label' => 'Text' ,
2024-03-12 23:31:53 +00:00
'pb.batch' => 'Text' , 'pb.qty' => 'Numeric' ,
2024-08-10 21:44:52 +00:00
'pl.eatby' => 'Date' , 'pl.sellby' => 'Date' , 'none.dateLastMovement' => 'Date'
2018-05-27 13:04:12 +00:00
);
2023-06-30 09:01:57 +00:00
if ( isModEnabled ( 'barcode' )) {
2024-03-12 23:31:53 +00:00
$this -> export_TypeFields_array [ $r ] = array_merge ( $this -> export_TypeFields_array [ $r ], array ( 'p.barcode' => 'Text' ));
2023-06-30 09:01:57 +00:00
}
2020-04-10 08:59:32 +00:00
$this -> export_entities_array [ $r ] = array (
2024-03-12 23:31:53 +00:00
'p.rowid' => " product " , 'p.ref' => " product " , 'p.fk_product_type' => " product " , 'p.label' => " product " , 'p.description' => " product " , 'p.note' => " product " ,
'p.price' => " product " , 'p.tva_tx' => 'product' , 'p.tosell' => " product " , 'p.tobuy' => " product " , 'p.duration' => " product " ,
2024-08-10 21:44:52 +00:00
'p.datec' => 'product' , 'p.tms' => 'product' , 'p.pmp' => 'product' , 'p.cost_price' => 'product' , 'lcpn.label' => 'product' ,
'pb.rowid' => 'batch' , 'pb.batch' => 'batch' , 'pb.qty' => 'batch' , 'none.dateLastMovement' => 'movement' ,
2024-03-12 23:31:53 +00:00
'pl.eatby' => 'batch' , 'pl.sellby' => 'batch'
2020-12-03 18:45:36 +00:00
); // We define here only fields that use another icon that the one defined into export_icon
2024-08-10 21:44:52 +00:00
$this -> export_special_array [ $r ] = array (
'none.dateLastMovement' => array ( 'rule' => 'compute' , 'classfile' => '/product/stock/class/mouvementstock.class.php' , 'class' => 'MouvementStock' , 'method' => 'getDateLastMovementProductBatch' , 'method_params' => [ 'e_rowid' , 'p_rowid' , 'pb_batch' ]),
);
2023-06-30 09:01:57 +00:00
if ( isModEnabled ( 'barcode' )) {
2024-03-12 23:31:53 +00:00
$this -> export_entities_array [ $r ] = array_merge ( $this -> export_entities_array [ $r ], array ( 'p.barcode' => 'product' ));
2023-06-30 09:01:57 +00:00
}
2024-03-12 23:31:53 +00:00
$this -> export_aggregate_array [ $r ] = array ( 'ps.reel' => 'SUM' ); // TODO Not used yet
$this -> export_dependencies_array [ $r ] = array ( 'stockbatch' => array ( 'pb.rowid' ), 'batch' => array ( 'pb.rowid' )); // We must keep this until the aggregate_array is used. To add unique key if we ask a field of a child to avoid the DISTINCT to discard them.
2021-03-01 19:37:16 +00:00
$keyforselect = 'product_lot' ;
$keyforelement = 'batch' ;
2024-05-30 11:37:17 +00:00
$keyforaliasextra = 'extra' ;
2017-11-24 16:44:19 +00:00
include DOL_DOCUMENT_ROOT . '/core/extrafieldsinexport.inc.php' ;
2020-12-03 18:45:36 +00:00
2020-04-10 08:59:32 +00:00
$this -> export_sql_start [ $r ] = 'SELECT DISTINCT ' ;
2020-12-23 15:13:45 +00:00
$this -> export_sql_end [ $r ] = ' FROM ' . MAIN_DB_PREFIX . 'product_batch as pb' ;
$this -> export_sql_end [ $r ] .= ' INNER JOIN ' . MAIN_DB_PREFIX . 'product_stock as ps ON ps.rowid = pb.fk_product_stock' ;
$this -> export_sql_end [ $r ] .= ' INNER JOIN ' . MAIN_DB_PREFIX . 'product as p ON p.rowid = ps.fk_product' ;
2020-04-10 08:59:32 +00:00
$this -> export_sql_end [ $r ] .= ' LEFT JOIN ' . MAIN_DB_PREFIX . 'product_lot as pl ON pl.fk_product = p.rowid AND pl.batch = pb.batch' ;
2024-08-10 21:44:52 +00:00
$this -> export_sql_end [ $r ] .= ' LEFT JOIN ' . MAIN_DB_PREFIX . 'product_lot_extrafields as extra ON extra.fk_object = pl.rowid' ;
$this -> export_sql_end [ $r ] .= ' LEFT JOIN ' . MAIN_DB_PREFIX . 'c_product_nature as lcpn on lcpn.code = p.finished,' ;
2020-04-10 08:59:32 +00:00
$this -> export_sql_end [ $r ] .= ' ' . MAIN_DB_PREFIX . 'entrepot as e' ;
2020-12-23 15:13:45 +00:00
$this -> export_sql_end [ $r ] .= ' WHERE ps.fk_entrepot = e.rowid' ;
$this -> export_sql_end [ $r ] .= ' AND e.entity IN (' . getEntity ( 'stock' ) . ')' ;
}
2012-10-25 20:30:17 +00:00
2020-12-03 18:45:36 +00:00
// Export of stock movements
2017-10-20 12:52:01 +00:00
$r ++ ;
2020-04-10 08:59:32 +00:00
$this -> export_code [ $r ] = $this -> rights_class . '_movement' ;
$this -> export_label [ $r ] = " StockMovements " ; // Translation key (used only if key ExportDataset_xxx_z not found)
2020-12-03 18:45:36 +00:00
$this -> export_icon [ $r ] = " movement " ;
2020-04-10 08:59:32 +00:00
$this -> export_permission [ $r ] = array ( array ( " stock " , " lire " ));
$this -> export_fields_array [ $r ] = array (
2024-03-12 23:31:53 +00:00
'sm.rowid' => 'MovementId' , 'sm.value' => 'Qty' , 'sm.datem' => 'DateMovement' , 'sm.label' => 'MovementLabel' , 'sm.inventorycode' => 'InventoryCode' ,
'e.rowid' => 'IdWarehouse' , 'e.ref' => 'LocationSummary' , 'e.description' => 'DescWareHouse' , 'e.lieu' => 'LieuWareHouse' , 'e.address' => 'Address' , 'e.zip' => 'Zip' , 'e.town' => 'Town' ,
'p.rowid' => " ProductId " , 'p.ref' => " Ref " , 'p.fk_product_type' => " Type " , 'p.label' => " Label " , 'p.description' => " Description " , 'p.note' => " Note " ,
'p.price' => " Price " , 'p.tva_tx' => 'VAT' , 'p.tosell' => " OnSell " , 'p.tobuy' => 'OnBuy' , 'p.duration' => " Duration " , 'p.datec' => 'DateCreation' , 'p.tms' => 'DateModification'
2018-05-27 13:04:12 +00:00
);
2023-06-30 09:01:57 +00:00
if ( isModEnabled ( 'barcode' )) {
2024-03-12 23:31:53 +00:00
$this -> export_fields_array [ $r ] = array_merge ( $this -> export_fields_array [ $r ], array ( 'p.barcode' => 'BarCode' ));
2023-06-30 09:01:57 +00:00
}
2020-04-10 08:59:32 +00:00
$this -> export_TypeFields_array [ $r ] = array (
2024-03-12 23:31:53 +00:00
'sm.rowid' => 'Numeric' , 'sm.value' => 'Numeric' , 'sm.datem' => 'Date' , 'sm.batch' => 'Text' , 'sm.label' => 'Text' , 'sm.inventorycode' => 'Text' ,
'e.rowid' => 'List:entrepot:ref::stock' , 'e.ref' => 'Text' , 'e.description' => 'Text' , 'e.lieu' => 'Text' , 'e.address' => 'Text' , 'e.zip' => 'Text' , 'e.town' => 'Text' ,
'p.rowid' => " Numeric " , 'p.ref' => " Text " , 'p.fk_product_type' => " Text " , 'p.label' => " Text " , 'p.description' => " Text " , 'p.note' => " Text " ,
'p.price' => " Numeric " , 'p.tva_tx' => 'Numeric' , 'p.tosell' => " Boolean " , 'p.tobuy' => " Boolean " , 'p.duration' => " Duree " , 'p.datec' => 'Date' , 'p.tms' => 'Date'
2018-05-27 13:04:12 +00:00
);
2023-06-30 09:01:57 +00:00
if ( isModEnabled ( 'barcode' )) {
2024-03-12 23:31:53 +00:00
$this -> export_TypeFields_array [ $r ] = array_merge ( $this -> export_TypeFields_array [ $r ], array ( 'p.barcode' => 'Text' ));
2023-06-30 09:01:57 +00:00
}
2020-04-10 08:59:32 +00:00
$this -> export_entities_array [ $r ] = array (
2024-03-12 23:31:53 +00:00
'e.rowid' => 'warehouse' , 'e.ref' => 'warehouse' , 'e.description' => 'warehouse' , 'e.lieu' => 'warehouse' , 'e.address' => 'warehouse' , 'e.zip' => 'warehouse' , 'e.town' => 'warehouse' ,
'p.rowid' => " product " , 'p.ref' => " product " , 'p.fk_product_type' => " product " , 'p.label' => " product " , 'p.description' => " product " , 'p.note' => " product " ,
'p.price' => " product " , 'p.tva_tx' => 'product' , 'p.tosell' => " product " , 'p.tobuy' => " product " , 'p.duration' => " product " , 'p.datec' => 'product' , 'p.tms' => 'product'
2020-12-03 18:45:36 +00:00
); // We define here only fields that use another icon that the one defined into export_icon
2022-08-31 19:55:55 +00:00
if ( isModEnabled ( 'productbatch' )) {
2020-04-10 08:59:32 +00:00
$this -> export_fields_array [ $r ][ 'sm.batch' ] = 'Batch' ;
$this -> export_TypeFields_array [ $r ][ 'sm.batch' ] = 'Text' ;
$this -> export_entities_array [ $r ][ 'sm.batch' ] = 'movement' ;
2017-10-20 12:52:01 +00:00
}
2023-06-30 09:01:57 +00:00
if ( isModEnabled ( 'barcode' )) {
2024-03-12 23:31:53 +00:00
$this -> export_entities_array [ $r ] = array_merge ( $this -> export_entities_array [ $r ], array ( 'p.barcode' => 'product' ));
2023-06-30 09:01:57 +00:00
}
2024-03-12 23:31:53 +00:00
$this -> export_aggregate_array [ $r ] = array ( 'sm.value' => 'SUM' ); // TODO Not used yet
$this -> export_dependencies_array [ $r ] = array ( 'movement' => array ( 'sm.rowid' )); // We must keep this until the aggregate_array is used. To add unique key if we ask a field of a child to avoid the DISTINCT to discard them.
2020-12-03 18:45:36 +00:00
2020-04-10 08:59:32 +00:00
$this -> export_sql_start [ $r ] = 'SELECT DISTINCT ' ;
$this -> export_sql_end [ $r ] = ' FROM ' . MAIN_DB_PREFIX . 'product as p, ' . MAIN_DB_PREFIX . 'stock_mouvement as sm, ' . MAIN_DB_PREFIX . 'entrepot as e' ;
$this -> export_sql_end [ $r ] .= ' WHERE p.rowid = sm.fk_product AND sm.fk_entrepot = e.rowid' ;
$this -> export_sql_end [ $r ] .= ' AND e.entity IN (' . getEntity ( 'stock' ) . ')' ;
2017-10-20 12:52:01 +00:00
2024-07-17 22:45:23 +00:00
2024-09-23 13:04:16 +00:00
// Export inventories
2024-05-31 16:23:32 +00:00
$r ++ ;
2024-07-17 22:45:23 +00:00
$this -> export_code [ $r ] = $this -> rights_class . '_inventory' ;
2024-05-31 16:23:32 +00:00
$this -> export_label [ $r ] = " Inventories " ; // Translation key (used only if key ExportDataset_xxx_z not found)
2024-07-17 22:45:23 +00:00
$this -> export_icon [ $r ] = " inventory " ;
2024-05-31 16:23:32 +00:00
$this -> export_permission [ $r ] = array ( array ( " stock " , " lire " ));
$this -> export_fields_array [ $r ] = array (
2024-07-17 22:45:23 +00:00
'i.rowid' => 'InventoryId' , 'i.ref' => 'InventoryRef' , 'i.date_inventory' => 'DateInventory' , 'i.status' => 'InventoryStatus' , 'i.title' => 'InventoryTitle' ,
2024-09-23 13:04:16 +00:00
'id.rowid' => 'InventoryLineId' , 'id.qty_view' => 'QtyViewed' , 'id.qty_stock' => 'QtyStock' , 'id.qty_regulated' => 'QtyRegulated' ,
2024-05-31 16:23:32 +00:00
'id.batch' => 'Lotserial' ,
'e.rowid' => 'IdWarehouse' , 'e.ref' => 'LocationSummary' , 'e.description' => 'DescWareHouse' , 'e.lieu' => 'LieuWareHouse' , 'e.address' => 'Address' , 'e.zip' => 'Zip' , 'e.town' => 'Town' ,
'p.rowid' => " ProductId " , 'p.ref' => " Ref " , 'p.fk_product_type' => " Type " , 'p.label' => " Label " , 'p.description' => " Description " , 'p.note' => " Note " ,
2024-08-23 13:24:40 +00:00
'p.barcode' => " Barcode " , 'p.price' => " Price " , 'p.tva_tx' => 'VAT' , 'p.tosell' => " OnSell " , 'p.tobuy' => 'OnBuy' , 'p.duration' => " Duration " , 'p.datec' => 'DateCreation' , 'p.tms' => 'DateModification'
2024-05-31 16:23:32 +00:00
);
if ( isModEnabled ( 'barcode' )) {
$this -> export_fields_array [ $r ] = array_merge ( $this -> export_fields_array [ $r ], array ( 'p.barcode' => 'BarCode' ));
}
$this -> export_TypeFields_array [ $r ] = array (
2024-07-17 22:45:23 +00:00
'id.rowid' => 'Numeric' ,
2024-05-31 16:23:32 +00:00
'e.rowid' => 'List:entrepot:ref::stock' , 'e.ref' => 'Text' , 'e.description' => 'Text' , 'e.lieu' => 'Text' , 'e.address' => 'Text' , 'e.zip' => 'Text' , 'e.town' => 'Text' ,
'p.rowid' => " Numeric " , 'p.ref' => " Text " , 'p.fk_product_type' => " Text " , 'p.label' => " Text " , 'p.description' => " Text " , 'p.note' => " Text " ,
2024-08-23 13:24:40 +00:00
'p.barcode' => " Text " , 'p.price' => " Numeric " , 'p.tva_tx' => 'Numeric' , 'p.tosell' => " Boolean " , 'p.tobuy' => " Boolean " , 'p.duration' => " Duree " , 'p.datec' => 'Date' , 'p.tms' => 'Date' ,
2024-07-17 22:45:23 +00:00
'i.rowid' => 'Numeric' , 'i.ref' => 'Text' , 'i.date_inventory' => 'Date' , 'i.status' => 'Numeric' , 'i.title' => 'Text' ,
'id.qty_view' => 'Numeric' , 'id.qty_stock' => 'Numeric' , 'id.batch' => 'Text' ,
'id.qty_regulated' => 'Numeric' , 'id.fk_warehouse' => 'Numeric' ,
2024-05-31 16:23:32 +00:00
);
if ( isModEnabled ( 'barcode' )) {
$this -> export_TypeFields_array [ $r ] = array_merge ( $this -> export_TypeFields_array [ $r ], array ( 'p.barcode' => 'Text' ));
}
$this -> export_entities_array [ $r ] = array (
2024-09-23 13:04:16 +00:00
'id.qty_view' => 'inventory_line' , 'id.qty_stock' => 'inventory_line' , 'id.batch' => 'inventory_line' , 'id.qty_regulated' => 'inventory_line' , 'id.fk_warehouse' => 'inventory_line' , 'id.rowid' => 'inventory_line' , 'e.rowid' => 'warehouse' , 'e.ref' => 'warehouse' , 'e.description' => 'warehouse' , 'e.lieu' => 'warehouse' , 'e.address' => 'warehouse' , 'e.zip' => 'warehouse' , 'e.town' => 'warehouse' ,
2024-05-31 16:23:32 +00:00
'p.rowid' => " product " , 'p.ref' => " product " , 'p.fk_product_type' => " product " , 'p.label' => " product " , 'p.description' => " product " , 'p.note' => " product " ,
2024-08-23 13:24:40 +00:00
'p.barcode' => " product " , 'p.price' => " product " , 'p.tva_tx' => 'product' , 'p.tosell' => " product " , 'p.tobuy' => " product " , 'p.duration' => " product " , 'p.datec' => 'product' , 'p.tms' => 'product'
2024-05-31 16:23:32 +00:00
); // We define here only fields that use another icon that the one defined into export_icon
if ( isModEnabled ( 'productbatch' )) {
2024-07-17 22:45:23 +00:00
$this -> export_fields_array [ $r ][ 'id.batch' ] = 'Batch' ;
$this -> export_TypeFields_array [ $r ][ 'id.batch' ] = 'Text' ;
2024-09-23 13:04:16 +00:00
$this -> export_entities_array [ $r ][ 'id.batch' ] = 'inventory_line' ;
2024-05-31 16:23:32 +00:00
}
if ( isModEnabled ( 'barcode' )) {
$this -> export_entities_array [ $r ] = array_merge ( $this -> export_entities_array [ $r ], array ( 'p.barcode' => 'product' ));
}
$this -> export_aggregate_array [ $r ] = array ( 'sm.value' => 'SUM' ); // TODO Not used yet
$this -> export_dependencies_array [ $r ] = array ( 'movement' => array ( 'sm.rowid' )); // We must keep this until the aggregate_array is used. To add unique key if we ask a field of a child to avoid the DISTINCT to discard them.
$this -> export_sql_start [ $r ] = 'SELECT DISTINCT ' ;
$this -> export_sql_end [ $r ] = ' FROM ' . MAIN_DB_PREFIX . 'product as p, ' . MAIN_DB_PREFIX . 'inventory as i, ' . MAIN_DB_PREFIX . 'inventorydet as id, ' . MAIN_DB_PREFIX . 'entrepot as e' ;
2024-07-17 22:45:23 +00:00
$this -> export_sql_end [ $r ] .= ' WHERE p.rowid = id.fk_product AND id.fk_inventory = i.rowid AND id.fk_warehouse = e.rowid' ;
2024-05-31 16:23:32 +00:00
$this -> export_sql_end [ $r ] .= ' AND e.entity IN (' . getEntity ( 'stock' ) . ')' ;
2024-07-17 22:45:23 +00:00
2024-05-31 16:23:32 +00:00
2012-10-18 08:36:53 +00:00
// Imports
//--------
2012-10-25 20:30:17 +00:00
2020-04-10 08:59:32 +00:00
$r = 0 ;
2012-10-25 20:30:17 +00:00
2012-10-27 18:27:07 +00:00
// Import warehouses
2012-10-18 08:36:53 +00:00
$r ++ ;
2020-04-10 08:59:32 +00:00
$this -> import_code [ $r ] = $this -> rights_class . '_' . $r ;
$this -> import_label [ $r ] = " Warehouses " ; // Translation key
2020-12-03 18:45:36 +00:00
$this -> import_icon [ $r ] = " warehouse " ;
2026-04-12 09:59:56 +00:00
$this -> import_entities_array [ $r ] = []; // We define here only fields that use another icon that the one defined into import_icon
2025-11-20 22:52:31 +00:00
$this -> import_tables_array [ $r ] = array ( 'e' => MAIN_DB_PREFIX . 'entrepot' , 'extra' => MAIN_DB_PREFIX . 'entrepot_extrafields' );
2024-03-12 23:31:53 +00:00
$this -> import_tables_creator_array [ $r ] = array ( 'e' => 'fk_user_author' );
$this -> import_fields_array [ $r ] = array ( 'e.ref' => " LocationSummary* " ,
'e.description' => " DescWareHouse " ,
'e.lieu' => " LieuWareHouse " ,
'e.address' => " Address " ,
'e.zip' => 'Zip' ,
'e.fk_departement' => 'StateCode' ,
'e.fk_pays' => 'CountryCode' ,
'e.phone' => 'Phone' ,
'e.fax' => 'Fax' ,
'e.statut' => 'Status' ,
'e.fk_parent' => 'ParentWarehouse'
2012-10-18 08:36:53 +00:00
);
2012-10-25 20:30:17 +00:00
2020-04-10 08:59:32 +00:00
$this -> import_convertvalue_array [ $r ] = array (
2024-03-12 23:31:53 +00:00
'e.fk_departement' => array ( 'rule' => 'fetchidfromcodeid' , 'classfile' => '/core/class/cstate.class.php' , 'class' => 'Cstate' , 'method' => 'fetch' , 'dict' => 'DictionaryStateCode' ),
'e.fk_pays' => array ( 'rule' => 'fetchidfromcodeid' , 'classfile' => '/core/class/ccountry.class.php' , 'class' => 'Ccountry' , 'method' => 'fetch' , 'dict' => 'DictionaryCountry' ),
'e.fk_parent' => array ( 'rule' => 'fetchidfromref' , 'classfile' => '/product/stock/class/entrepot.class.php' , 'class' => 'Entrepot' , 'method' => 'fetch' , 'element' => 'ref' )
2012-10-18 08:36:53 +00:00
);
2024-03-12 23:31:53 +00:00
$this -> import_regex_array [ $r ] = array ( 'e.statut' => '^[0|1]' );
2025-11-20 22:52:31 +00:00
// Add extra fields
2026-04-12 09:59:56 +00:00
$import_extrafield_sample = [];
2025-11-20 22:52:31 +00:00
$sql = " SELECT name, label, fieldrequired FROM " . MAIN_DB_PREFIX . " extrafields WHERE type <> 'separate' AND elementtype = 'entrepot' AND entity IN (0, " . $conf -> entity . " ) " ;
$resql = $this -> db -> query ( $sql );
if ( $resql ) { // This can fail when class is used on old database (during migration for example)
while ( $obj = $this -> db -> fetch_object ( $resql )) {
$fieldname = 'extra.' . $obj -> name ;
$fieldlabel = ucfirst ( $obj -> label );
$this -> import_fields_array [ $r ][ $fieldname ] = $fieldlabel . ( $obj -> fieldrequired ? '*' : '' );
$import_extrafield_sample [ $fieldname ] = $fieldlabel ;
}
}
// End add extra fields
$this -> import_fieldshidden_array [ $r ] = array ( 'extra.fk_object' => 'lastrowid-' . MAIN_DB_PREFIX . 'entrepot' ); // aliastable.field => ('user->id' or 'lastrowid-'.tableparent)
$this -> import_examplevalues_array [ $r ] = array_merge ( array ( 'e.ref' => " ALM001 " ,
2024-03-12 23:31:53 +00:00
'e.description' => " Central Warehouse " ,
'e.lieu' => " Central " ,
'e.address' => " Route 66 " ,
'e.zip' => '28080' ,
'e.fk_departement' => 'matches field "code_departement" in table "' . MAIN_DB_PREFIX . 'c_departements"' ,
'e.fk_pays' => 'US/FR/DE etc. matches field "code" in table "' . MAIN_DB_PREFIX . 'c_country"' ,
'e.phone' => '(+33)(0)123456789' ,
'e.fax' => '(+33)(0)123456790' ,
'e.statut' => '1' ,
'e.fk_parent' => 'id or ref of warehouse'
2025-11-20 22:52:31 +00:00
), $import_extrafield_sample );
2024-03-12 23:31:53 +00:00
$this -> import_updatekeys_array [ $r ] = array ( 'p.ref' => 'Ref' );
2012-10-27 18:27:07 +00:00
2012-10-28 12:57:21 +00:00
// Import stocks
$r ++ ;
2020-04-10 08:59:32 +00:00
$this -> import_code [ $r ] = $this -> rights_class . '_' . $r ;
$this -> import_label [ $r ] = " Stocks " ; // Translation key
2020-12-03 18:45:36 +00:00
$this -> import_icon [ $r ] = " stock " ;
2026-04-12 09:59:56 +00:00
$this -> import_entities_array [ $r ] = []; // We define here only fields that use another icon that the one defined into import_icon
2024-03-12 23:31:53 +00:00
$this -> import_tables_array [ $r ] = array ( 'ps' => MAIN_DB_PREFIX . 'product_stock' );
$this -> import_fields_array [ $r ] = array ( 'ps.fk_product' => " Product* " , 'ps.fk_entrepot' => " Warehouse* " , 'ps.reel' => " Stock* " );
2020-04-10 08:59:32 +00:00
$this -> import_convertvalue_array [ $r ] = array (
2024-03-12 23:31:53 +00:00
'ps.fk_product' => array ( 'rule' => 'fetchidfromref' , 'classfile' => '/product/class/product.class.php' , 'class' => 'Product' , 'method' => 'fetch' , 'element' => 'product' ),
'ps.fk_entrepot' => array ( 'rule' => 'fetchidfromref' , 'classfile' => '/product/stock/class/entrepot.class.php' , 'class' => 'Entrepot' , 'method' => 'fetch' , 'element' => 'ref' )
2016-04-11 16:08:03 +00:00
);
2020-04-10 08:59:32 +00:00
$this -> import_examplevalues_array [ $r ] = array (
2024-03-12 23:31:53 +00:00
'ps.fk_product' => " id or ref of product " , 'ps.fk_entrepot' => " id or ref of warehouse " , 'ps.reel' => " 10 "
2012-10-28 12:57:21 +00:00
);
2024-03-12 23:31:53 +00:00
$this -> import_updatekeys_array [ $r ] = array ( 'ps.fk_product' => 'Product' , 'ps.fk_entrepot' => " Warehouse " );
2020-04-10 08:59:32 +00:00
$this -> import_run_sql_after_array [ $r ] = array ( // Because we may change data that are denormalized, we must update dernormalized data after.
2025-01-06 13:23:13 +00:00
'UPDATE ' . MAIN_DB_PREFIX . 'product as p SET stock = (SELECT SUM(ps.reel) FROM ' . MAIN_DB_PREFIX . 'product_stock ps WHERE ps.fk_product = p.rowid);'
2012-10-28 12:57:21 +00:00
);
2008-10-01 19:10:17 +00:00
}
2018-10-06 09:57:53 +00:00
2018-05-05 12:33:34 +00:00
/**
2019-02-26 20:13:07 +00:00
* Function called when module is enabled .
* The init function add constants , boxes , permissions and menus ( defined in constructor ) into Dolibarr database .
* It also creates data directories
2018-05-05 12:33:34 +00:00
*
2019-02-26 20:13:07 +00:00
* @ param string $options Options when enabling module ( '' , 'noboxes' )
* @ return int 1 if OK , 0 if KO
2018-05-05 12:33:34 +00:00
*/
2019-02-26 20:13:07 +00:00
public function init ( $options = '' )
2018-05-05 12:33:34 +00:00
{
2020-04-10 08:59:32 +00:00
global $conf , $langs ;
2018-05-05 12:33:34 +00:00
2022-05-08 13:18:34 +00:00
$result = $this -> _load_tables ( '/install/mysql/' , 'stock' );
2022-02-06 12:31:44 +00:00
if ( $result < 0 ) {
return - 1 ; // Do not activate module if error 'not allowed' returned when loading module SQL queries (the _load_table run sql with run_sql with the error allowed parameter set to 'default')
}
2018-05-05 12:33:34 +00:00
// Permissions
$this -> remove ( $options );
//ODT template
2020-08-18 12:55:56 +00:00
$src = DOL_DOCUMENT_ROOT . '/install/doctemplates/stocks/template_warehouse.odt' ;
2025-02-13 17:20:47 +00:00
$dirodt = DOL_DATA_ROOT . ( $conf -> entity > 1 ? '/' . $conf -> entity : '' ) . '/doctemplates/stocks' ;
2020-08-18 12:55:56 +00:00
$dest = $dirodt . '/template_warehouse.odt' ;
2018-05-05 12:33:34 +00:00
2021-02-23 21:03:23 +00:00
if ( file_exists ( $src ) && ! file_exists ( $dest )) {
2018-05-05 12:33:34 +00:00
require_once DOL_DOCUMENT_ROOT . '/core/lib/files.lib.php' ;
dol_mkdir ( $dirodt );
2024-09-22 23:59:14 +00:00
$result = dol_copy ( $src , $dest , '0' , 0 );
2021-02-23 21:03:23 +00:00
if ( $result < 0 ) {
2018-05-05 12:33:34 +00:00
$langs -> load ( " errors " );
2020-04-10 08:59:32 +00:00
$this -> error = $langs -> trans ( 'ErrorFailToCopyFile' , $src , $dest );
2018-05-05 12:33:34 +00:00
return 0 ;
}
}
2026-04-12 09:59:56 +00:00
$sql = [];
2018-05-05 12:33:34 +00:00
$sql = array (
2021-08-27 20:42:04 +00:00
" DELETE FROM " . MAIN_DB_PREFIX . " document_model WHERE nom = ' " . $this -> db -> escape ( $this -> const [ 1 ][ 2 ]) . " ' AND type = 'stock' AND entity = " . (( int ) $conf -> entity ),
" INSERT INTO " . MAIN_DB_PREFIX . " document_model (nom, type, entity) VALUES(' " . $this -> db -> escape ( $this -> const [ 1 ][ 2 ]) . " ','stock', " . (( int ) $conf -> entity ) . " ) " ,
" DELETE FROM " . MAIN_DB_PREFIX . " document_model WHERE nom = ' " . $this -> db -> escape ( $this -> const [ 2 ][ 2 ]) . " ' AND type = 'mouvement' AND entity = " . (( int ) $conf -> entity ),
" INSERT INTO " . MAIN_DB_PREFIX . " document_model (nom, type, entity) VALUES(' " . $this -> db -> escape ( $this -> const [ 2 ][ 2 ]) . " ','mouvement', " . (( int ) $conf -> entity ) . " ) " ,
2018-05-05 12:33:34 +00:00
);
2019-01-27 10:55:16 +00:00
return $this -> _init ( $sql , $options );
2018-05-05 12:33:34 +00:00
}
2003-11-13 15:12:07 +00:00
}