mirror of
https://github.com/Dolibarr/dolibarr.git
synced 2025-02-20 13:46:52 +01:00
* Update replenishment.lib.php * Fix wrong table column name from fk_command to fk_element for table receptiondet_batch * use error free getDolGlobalString to access global variable to replace $conf->global access. * Update replenishment.lib.php Fix typo * Update replenishment.lib.php Use getDolGlobalInt instead of getDolGlobalString for numeric constant * Update replenishment.lib.php --------- Co-authored-by: Laurent Destailleur <eldy@destailleur.fr>
169 lines
4.7 KiB
PHP
169 lines
4.7 KiB
PHP
<?php
|
|
/*
|
|
* Copyright (C) 2013 Cédric Salvador <csalvador@gpcsolutions.fr>
|
|
*
|
|
* 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
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (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
|
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
/**
|
|
* \file htdocs/product/stock/lib/replenishment.lib.php
|
|
* \ingroup produit
|
|
* \brief Contains functions used in replenish.php and replenishorders.php
|
|
*/
|
|
|
|
require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.commande.class.php';
|
|
|
|
/**
|
|
* Check if there is still some dispatching of stock to do.
|
|
*
|
|
* @param int $order_id Id of order to check
|
|
* @return boolean True = There is some dispatching to do, False = All dispatching is done (may be we receive more) or is not required
|
|
*/
|
|
function dolDispatchToDo($order_id)
|
|
{
|
|
global $db, $conf;
|
|
|
|
$dispatched = array();
|
|
$ordered = array();
|
|
|
|
// Count nb of quantity dispatched per product
|
|
$sql = 'SELECT fk_product, SUM(qty) as qtydispatched FROM '.MAIN_DB_PREFIX.'receptiondet_batch';
|
|
$sql .= " WHERE fk_element = ".((int) $order_id)." AND element_type = 'supplier_order'";
|
|
$sql .= ' GROUP BY fk_product';
|
|
$sql .= ' ORDER by fk_product';
|
|
$resql = $db->query($sql);
|
|
if ($resql && $db->num_rows($resql)) {
|
|
while ($obj = $db->fetch_object($resql)) {
|
|
$dispatched[$obj->fk_product] = $obj->qtydispatched;
|
|
}
|
|
}
|
|
|
|
// Count nb of quantity to dispatch per product
|
|
$sql = 'SELECT fk_product, SUM(qty) as qtyordered FROM '.MAIN_DB_PREFIX.'commande_fournisseurdet';
|
|
$sql .= ' WHERE fk_commande = '.((int) $order_id);
|
|
$sql .= ' AND fk_product > 0';
|
|
if (!getDolGlobalString('STOCK_SUPPORTS_SERVICES')) {
|
|
$sql .= ' AND product_type = 0';
|
|
}
|
|
$sql .= ' GROUP BY fk_product';
|
|
$sql .= ' ORDER by fk_product';
|
|
$resql = $db->query($sql);
|
|
if ($resql && $db->num_rows($resql)) {
|
|
while ($obj = $db->fetch_object($resql)) {
|
|
$ordered[$obj->fk_product] = $obj->qtyordered;
|
|
}
|
|
}
|
|
|
|
$todispatch = 0;
|
|
foreach ($ordered as $key => $val) {
|
|
if ((empty($ordered[$key]) ? 0 : $ordered[$key]) > (empty($dispatched[$key]) ? 0 : $dispatched[$key])) {
|
|
$todispatch++;
|
|
}
|
|
}
|
|
|
|
return ($todispatch ? true : false);
|
|
//return true;
|
|
}
|
|
|
|
/**
|
|
* dispatchedOrders
|
|
*
|
|
* @return string Array of id of orders with all dispatching already done or not required
|
|
*/
|
|
function dispatchedOrders()
|
|
{
|
|
global $db;
|
|
|
|
$sql = 'SELECT rowid FROM '.MAIN_DB_PREFIX.'commande_fournisseur';
|
|
$resql = $db->query($sql);
|
|
$resarray = array();
|
|
if ($resql && $db->num_rows($resql) > 0) {
|
|
while ($obj = $db->fetch_object($resql)) {
|
|
if (!dolDispatchToDo($obj->rowid)) {
|
|
$resarray[] = $obj->rowid;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (count($resarray)) {
|
|
$res = '('.implode(',', $resarray).')';
|
|
} else {
|
|
//hack to make sure ordered SQL request won't syntax error
|
|
$res = '(0)';
|
|
}
|
|
return $res;
|
|
}
|
|
|
|
/**
|
|
* ordered
|
|
*
|
|
* @param int $product_id Product id
|
|
* @return string|null
|
|
*/
|
|
function ordered($product_id)
|
|
{
|
|
global $db, $conf;
|
|
|
|
$sql = 'SELECT DISTINCT cfd.fk_product, SUM(cfd.qty) as qty FROM';
|
|
$sql .= ' '.MAIN_DB_PREFIX.'commande_fournisseurdet as cfd ';
|
|
$sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'commande_fournisseur as cf';
|
|
$sql .= ' ON cfd.fk_commande = cf.rowid WHERE';
|
|
if (getDolGlobalInt("STOCK_CALCULATE_ON_SUPPLIER_VALIDATE_ORDER")) {
|
|
$sql .= ' cf.fk_statut < 3';
|
|
} elseif (getDolGlobalInt("STOCK_CALCULATE_ON_SUPPLIER_DISPATCH_ORDER")) {
|
|
$sql .= ' cf.fk_statut < 6 AND cf.rowid NOT IN '.dispatchedOrders();
|
|
} else {
|
|
$sql .= ' cf.fk_statut < 5';
|
|
}
|
|
$sql .= ' AND cfd.fk_product = '.((int) $product_id);
|
|
$sql .= ' GROUP BY cfd.fk_product';
|
|
|
|
$resql = $db->query($sql);
|
|
if ($resql) {
|
|
$exists = $db->num_rows($resql);
|
|
if ($exists && $obj = $db->fetch_array($resql)) {
|
|
return $obj['qty']; //. ' ' . img_picto('','tick');
|
|
} else {
|
|
return null; //img_picto('', 'stcomm-1');
|
|
}
|
|
} else {
|
|
dol_print_error($db);
|
|
|
|
return 'Error '.$db->lasterror();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* getProducts
|
|
*
|
|
* @param int $order_id Order id
|
|
* @return array|integer[]
|
|
*/
|
|
function getProducts($order_id)
|
|
{
|
|
global $db;
|
|
|
|
$order = new CommandeFournisseur($db);
|
|
$f = $order->fetch($order_id);
|
|
$products = array();
|
|
if ($f) {
|
|
foreach ($order->lines as $line) {
|
|
if (!in_array($line->fk_product, $products)) {
|
|
$products[] = $line->fk_product;
|
|
}
|
|
}
|
|
}
|
|
return $products;
|
|
}
|