From 65ea83fa06574c22d0b267471ec2e6e857b168f0 Mon Sep 17 00:00:00 2001 From: fappels Date: Wed, 27 Apr 2016 16:51:51 +0200 Subject: [PATCH] NEW prepare for additional warehouse statuses Add additional warehouse statuses, so you can add extra filter possibility. For example hide warehouses with damaged stock from shipping. Feature is still hidden by conf ENTREPOT_EXTRA_STATUS Still TODO: config all $formproduct->selectWarehouses --- htdocs/langs/en_US/stocks.lang | 4 + .../product/class/html.formproduct.class.php | 30 ++++--- htdocs/product/stock/card.php | 34 ++++++-- htdocs/product/stock/class/entrepot.class.php | 83 ++++++++++++++----- 4 files changed, 107 insertions(+), 44 deletions(-) diff --git a/htdocs/langs/en_US/stocks.lang b/htdocs/langs/en_US/stocks.lang index e6b9f82730c..3416d1b1909 100644 --- a/htdocs/langs/en_US/stocks.lang +++ b/htdocs/langs/en_US/stocks.lang @@ -139,3 +139,7 @@ WarehouseMustBeSelectedAtFirstStepWhenProductBatchModuleOn=Source warehouse must InventoryCodeShort=Inv./Mov. code NoPendingReceptionOnSupplierOrder=No pending reception due to open supplier order ThisSerialAlreadyExistWithDifferentDate=This lot/serial number (%s) already exists but with different eatby or sellby date (found %s but you enter %s). +OpenAll=Open for all actions +OpenInternal=Open for internal actions +OpenShipping=Open for shippings +OpenDispatch=Open for dispatch \ No newline at end of file diff --git a/htdocs/product/class/html.formproduct.class.php b/htdocs/product/class/html.formproduct.class.php index 24a7506882b..a69880f7fa5 100644 --- a/htdocs/product/class/html.formproduct.class.php +++ b/htdocs/product/class/html.formproduct.class.php @@ -1,5 +1,6 @@ + * Copyright (C) 2016 Francis Appels * * 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 @@ -53,20 +54,20 @@ class FormProduct * * @param int $fk_product Add quantity of stock in label for product with id fk_product. Nothing if 0. * @param string $batch Add quantity of batch stock in label for product with batch name batch, batch name precedes batch_id. Nothing if ''. - * @param int $fk_product_batch Add quantity of batch stock in label for product with batch id fk_product_batch. Nothing if 0. + * @param int $status additional filter on status other then 1 * @param boolean $sumStock sum total stock of a warehouse, default true * @return int Nb of loaded lines, 0 if already loaded, <0 if KO */ - function loadWarehouses($fk_product=0, $batch = '', $fk_product_batch=0, $sumStock = true) + function loadWarehouses($fk_product=0, $batch = '', $status=null, $sumStock = true) { global $conf, $langs; if (empty($fk_product) && count($this->cache_warehouses)) return 0; // Cache already loaded and we do not want a list with information specific to a product - $sql = "SELECT e.rowid, e.label"; + $sql = "SELECT e.rowid, e.label, e.description"; if (!empty($fk_product)) { - if (!empty($fk_product_batch) || !empty($batch)) + if (!empty($batch)) { $sql.= ", pb.qty as stock"; } @@ -87,13 +88,18 @@ class FormProduct if (!empty($batch)) { $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."product_batch as pb on pb.fk_product_stock = ps.rowid AND pb.batch = '".$batch."'"; - } else if (!empty($fk_product_batch)) - { - $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."product_batch as pb on pb.fk_product_stock = ps.rowid AND pb.rowid = '".$fk_product_batch."'"; - } + } } $sql.= " WHERE e.entity IN (".getEntity('stock', 1).")"; - $sql.= " AND e.statut = 1"; + if (!empty($status)) + { + $sql.= " AND e.statut IN (1, ".$status.")"; + } + else + { + $sql.= " AND e.statut = 1"; + } + if ($sumStock && empty($fk_product)) $sql.= " GROUP BY e.rowid, e.label, e.description"; $sql.= " ORDER BY e.label"; @@ -127,7 +133,7 @@ class FormProduct * * @param int $selected Id of preselected warehouse ('' for no value, 'ifone'=select value if one value otherwise no value) * @param string $htmlname Name of html select html - * @param string $filtertype For filter + * @param string $filtertype For filter, additional filter on status other then 1 * @param int $empty 1=Can be empty, 0 if not * @param int $disabled 1=Select is disabled * @param int $fk_product Add quantity of stock in label for product with id fk_product. Nothing if 0. @@ -142,11 +148,11 @@ class FormProduct { global $conf,$langs,$user; - dol_syslog(get_class($this)."::selectWarehouses $selected, $htmlname, $filtertype, $empty, $disabled, $fk_product",LOG_DEBUG); + dol_syslog(get_class($this)."::selectWarehouses $selected, $htmlname, $filtertype, $empty, $disabled, $fk_product, $empty_label, $showstock, $forcecombo, $morecss",LOG_DEBUG); $out=''; - $this->loadWarehouses($fk_product); + $this->loadWarehouses($fk_product, '', + $filtertype); // filter on numeric status $nbofwarehouses=count($this->cache_warehouses); if ($conf->use_javascript_ajax && ! $forcecombo) diff --git a/htdocs/product/stock/card.php b/htdocs/product/stock/card.php index 430e042c202..f34f4482a49 100644 --- a/htdocs/product/stock/card.php +++ b/htdocs/product/stock/card.php @@ -3,6 +3,7 @@ * Copyright (C) 2004-2011 Laurent Destailleur * Copyright (C) 2005 Simon Tosser * Copyright (C) 2005-2014 Regis Houssin + * Copyright (C) 2016 Francis Appels * * 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 @@ -53,6 +54,7 @@ $result=restrictedArea($user,'stock'); // Initialize technical object to manage hooks of thirdparties. Note that conf->hooks_modules contains array array $hookmanager->initHooks(array('warehousecard','globalcard')); +$object = new Entrepot($db); /* * Actions @@ -61,8 +63,6 @@ $hookmanager->initHooks(array('warehousecard','globalcard')); // Ajout entrepot if ($action == 'add' && $user->rights->stock->creer) { - $object = new Entrepot($db); - $object->ref = GETPOST("ref"); $object->libelle = GETPOST("libelle"); $object->description = GETPOST("desc"); @@ -107,7 +107,6 @@ if ($action == 'add' && $user->rights->stock->creer) // Delete warehouse if ($action == 'confirm_delete' && $confirm == 'yes' && $user->rights->stock->supprimer) { - $object = new Entrepot($db); $object->fetch($_REQUEST["id"]); $result=$object->delete($user); if ($result > 0) @@ -125,7 +124,6 @@ if ($action == 'confirm_delete' && $confirm == 'yes' && $user->rights->stock->su // Modification entrepot if ($action == 'update' && $cancel <> $langs->trans("Cancel")) { - $object = new Entrepot($db); if ($object->fetch($id)) { $object->libelle = GETPOST("libelle"); @@ -215,11 +213,20 @@ if ($action == 'create') print $form->select_country((!empty($object->country_id)?$object->country_id:$mysoc->country_code),'country_id'); if ($user->admin) print info_admin($langs->trans("YouCanChangeValuesForThisListFromDictionarySetup"),1); print ''; - + // Status print ''.$langs->trans("Status").''; print ''; print ''; @@ -558,8 +565,17 @@ else print ''.$langs->trans("Status").''; print ''; print ''; diff --git a/htdocs/product/stock/class/entrepot.class.php b/htdocs/product/stock/class/entrepot.class.php index 0f88792f2e4..afcaec0bc6b 100644 --- a/htdocs/product/stock/class/entrepot.class.php +++ b/htdocs/product/stock/class/entrepot.class.php @@ -3,6 +3,7 @@ * Copyright (C) 2004-2010 Laurent Destailleur * Copyright (C) 2005-2008 Regis Houssin * Copyright (C) 2011 Juanjo Menent + * Copyright (C) 2016 Francis Appels * * 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 @@ -34,18 +35,45 @@ class Entrepot extends CommonObject { public $element='stock'; public $table_element='entrepot'; + + /** + * Warehouse closed, inactive + */ + const STATUS_CLOSED = 0; + + /** + * Warehouse open and operations for customer shipping, supplier dispatch, internal stock transfers/corrections allowed. + */ + const STATUS_OPEN_ALL = 1; + + /** + * Warehouse open and operations for stock transfers/corrections allowed (not for customer shipping and supplier dispatch). + */ + const STATUS_OPEN_INTERNAL = 2; + + /** + * Warehouse open and operations for customer shipping and internal stock transfers/corrections allowed (not for supplier dispatch). + */ + const STATUS_OPEN_SHIPPING = 3; + + /** + * Warehouse open and operations for supplier dispatch internal stock transfers/corrections allowed (not for customer shipping). + */ + const STATUS_OPEN_DISPATCH = 4; + var $libelle; var $description; - //! Statut 1 pour ouvert, 0 pour ferme var $statut; var $lieu; var $address; //! Code Postal var $zip; var $town; - - + + // List of short language codes for status + var $statuts = array(); + /** * Constructor * @@ -53,11 +81,22 @@ class Entrepot extends CommonObject */ function __construct($db) { + global $conf; $this->db = $db; - // List of short language codes for status - $this->statuts[0] = 'Closed2'; - $this->statuts[1] = 'Opened'; + $this->statuts[self::STATUS_CLOSED] = 'Closed2'; + if ($conf->global->ENTREPOT_EXTRA_STATUS) + { + $this->statuts[self::STATUS_OPEN_ALL] = 'OpenAll'; + $this->statuts[self::STATUS_OPEN_INTERNAL] = 'OpenInternal'; + $this->statuts[self::STATUS_OPEN_SHIPPING] = 'OpenShipping'; + $this->statuts[self::STATUS_OPEN_DISPATCH] = 'OpenDispatch'; + } + else + { + $this->statuts[self::STATUS_OPEN_ALL] = 'Opened'; + } + } /** @@ -455,42 +494,40 @@ class Entrepot extends CommonObject function LibStatut($statut,$mode=0) { global $langs; + $langs->load('stocks'); + + $picto = 'statut5'; + $label = $langs->trans($this->statuts[$statut]); + if ($mode == 0) { - $prefix=''; - if ($statut == 0) return $langs->trans($this->statuts[$statut]); - if ($statut == 1) return $langs->trans($this->statuts[$statut]); + return $label; } if ($mode == 1) { - $prefix='Short'; - if ($statut == 0) return $langs->trans($this->statuts[$statut]); - if ($statut == 1) return $langs->trans($this->statuts[$statut]); + return $label; } if ($mode == 2) { - $prefix='Short'; - if ($statut == 0) return img_picto($langs->trans($this->statuts[$statut]),'statut5').' '.$langs->trans($this->statuts[$statut]); - if ($statut == 1) return img_picto($langs->trans($this->statuts[$statut]),'statut4').' '.$langs->trans($this->statuts[$statut]); + if ($statut > 0) $picto = 'statut4'; + return img_picto($label, $picto).' '.$label; } if ($mode == 3) { - $prefix='Short'; - if ($statut == 0) return img_picto($langs->trans($this->statuts[$statut]),'statut5'); - if ($statut == 1) return img_picto($langs->trans($this->statuts[$statut]),'statut4'); + if ($statut > 0) $picto = 'statut4'; + return img_picto($label, $picto).' '.$label; } if ($mode == 4) { - if ($statut == 0) return img_picto($langs->trans($this->statuts[$statut]),'statut5').' '.$langs->trans($this->statuts[$statut]); - if ($statut == 1) return img_picto($langs->trans($this->statuts[$statut]),'statut4').' '.$langs->trans($this->statuts[$statut]); + if ($statut > 0) $picto = 'statut4'; + return img_picto($label, $picto).' '.$label; } if ($mode == 5) { - $prefix='Short'; - if ($statut == 0) return $langs->trans($this->statuts[$statut]).' '.img_picto($langs->trans($this->statuts[$statut]),'statut5'); - if ($statut == 1) return $langs->trans($this->statuts[$statut]).' '.img_picto($langs->trans($this->statuts[$statut]),'statut4'); + if ($statut > 0) $picto = 'statut4'; + return $label.' '.img_picto($label, $picto); } }