Merge pull request #12855 from Dolibarr/scrutinizer-patch-3
Scrutinizer Auto-Fixes
This commit is contained in:
commit
cadad6aed9
@ -45,10 +45,10 @@ function moPrepareHead($object)
|
||||
$head[$h][1] = $langs->trans("Production");
|
||||
$arrayproduced = $object->fetchLinesLinked('produced', 0);
|
||||
$nbProduced = 0;
|
||||
foreach($arrayproduced as $lineproduced) {
|
||||
foreach ($arrayproduced as $lineproduced) {
|
||||
$nbProduced += $lineproduced['qty'];
|
||||
}
|
||||
$head[$h][1].= '<span class="badge marginleftonlyshort">'.$nbProduced.' / '.$object->qty.'</span>';
|
||||
$head[$h][1] .= '<span class="badge marginleftonlyshort">'.$nbProduced.' / '.$object->qty.'</span>';
|
||||
$head[$h][2] = 'production';
|
||||
$h++;
|
||||
|
||||
@ -59,19 +59,19 @@ function moPrepareHead($object)
|
||||
if (!empty($object->note_public)) $nbNote++;
|
||||
$head[$h][0] = dol_buildpath('/mrp/mo_note.php', 1).'?id='.$object->id;
|
||||
$head[$h][1] = $langs->trans('Notes');
|
||||
if ($nbNote > 0) $head[$h][1].= '<span class="badge marginleftonlyshort">'.$nbNote.'</span>';
|
||||
if ($nbNote > 0) $head[$h][1] .= '<span class="badge marginleftonlyshort">'.$nbNote.'</span>';
|
||||
$head[$h][2] = 'note';
|
||||
$h++;
|
||||
}
|
||||
|
||||
require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
|
||||
require_once DOL_DOCUMENT_ROOT.'/core/class/link.class.php';
|
||||
$upload_dir = $conf->mrp->dir_output . "/mo/" . dol_sanitizeFileName($object->ref);
|
||||
$upload_dir = $conf->mrp->dir_output."/mo/".dol_sanitizeFileName($object->ref);
|
||||
$nbFiles = count(dol_dir_list($upload_dir, 'files', 0, '', '(\.meta|_preview.*\.png)$'));
|
||||
$nbLinks=Link::count($db, $object->element, $object->id);
|
||||
$nbLinks = Link::count($db, $object->element, $object->id);
|
||||
$head[$h][0] = dol_buildpath("/mrp/mo_document.php", 1).'?id='.$object->id;
|
||||
$head[$h][1] = $langs->trans('Documents');
|
||||
if (($nbFiles+$nbLinks) > 0) $head[$h][1].= '<span class="badge marginleftonlyshort">'.($nbFiles+$nbLinks).'</span>';
|
||||
if (($nbFiles + $nbLinks) > 0) $head[$h][1] .= '<span class="badge marginleftonlyshort">'.($nbFiles + $nbLinks).'</span>';
|
||||
$head[$h][2] = 'document';
|
||||
$h++;
|
||||
|
||||
|
||||
@ -136,7 +136,7 @@ if (empty($reshook))
|
||||
else $backtopage = DOL_URL_ROOT.'/mrp/mo_card.php?id='.($id > 0 ? $id : '__ID__');
|
||||
}
|
||||
}
|
||||
if ($cancel && ! empty($backtopageforcancel)) {
|
||||
if ($cancel && !empty($backtopageforcancel)) {
|
||||
$backtopage = $backtopageforcancel;
|
||||
}
|
||||
|
||||
@ -522,7 +522,7 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea
|
||||
if (!empty($object->lines))
|
||||
{
|
||||
$i = 0;
|
||||
foreach($object->lines as $line) {
|
||||
foreach ($object->lines as $line) {
|
||||
if ($line->role == 'toconsume') {
|
||||
if ($i) print ', ';
|
||||
$tmpproduct = new Product($db);
|
||||
@ -541,7 +541,7 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea
|
||||
if (!empty($object->lines))
|
||||
{
|
||||
$i = 0;
|
||||
foreach($object->lines as $line) {
|
||||
foreach ($object->lines as $line) {
|
||||
if ($line->role == 'toproduce') {
|
||||
if ($i) print ', ';
|
||||
$tmpproduct = new Product($db);
|
||||
|
||||
@ -124,19 +124,19 @@ class MouvementStock extends CommonObject
|
||||
dol_syslog(get_class($this)."::_create start userid=$user->id, fk_product=$fk_product, warehouse_id=$entrepot_id, qty=$qty, type=$type, price=$price, label=$label, inventorycode=$inventorycode, datem=".$datem.", eatby=".$eatby.", sellby=".$sellby.", batch=".$batch.", skip_batch=".$skip_batch);
|
||||
|
||||
// Clean parameters
|
||||
if (empty($price)) $price=0;
|
||||
$now=(! empty($datem) ? $datem : dol_now());
|
||||
if (empty($price)) $price = 0;
|
||||
$now = (!empty($datem) ? $datem : dol_now());
|
||||
|
||||
// Check parameters
|
||||
if (empty($fk_product)) return 0;
|
||||
if ($eatby < 0)
|
||||
{
|
||||
$this->errors[]='ErrorBadValueForParameterEatBy';
|
||||
$this->errors[] = 'ErrorBadValueForParameterEatBy';
|
||||
return -1;
|
||||
}
|
||||
if ($sellby < 0)
|
||||
{
|
||||
$this->errors[]='ErrorBadValueForParameterSellBy';
|
||||
$this->errors[] = 'ErrorBadValueForParameterSellBy';
|
||||
return -1;
|
||||
}
|
||||
|
||||
@ -155,7 +155,7 @@ class MouvementStock extends CommonObject
|
||||
$mvid = 0;
|
||||
|
||||
$product = new Product($this->db);
|
||||
$result=$product->fetch($fk_product);
|
||||
$result = $product->fetch($fk_product);
|
||||
if ($result < 0)
|
||||
{
|
||||
dol_print_error('', "Failed to fetch product");
|
||||
@ -167,11 +167,11 @@ class MouvementStock extends CommonObject
|
||||
$product->load_stock('novirtual');
|
||||
|
||||
// Test if product require batch data. If yes, and there is not, we throw an error.
|
||||
if (! empty($conf->productbatch->enabled) && $product->hasbatch() && ! $skip_batch)
|
||||
if (!empty($conf->productbatch->enabled) && $product->hasbatch() && !$skip_batch)
|
||||
{
|
||||
if (empty($batch))
|
||||
{
|
||||
$this->errors[]=$langs->trans("ErrorTryToMakeMoveOnProductRequiringBatchData", $product->ref);
|
||||
$this->errors[] = $langs->trans("ErrorTryToMakeMoveOnProductRequiringBatchData", $product->ref);
|
||||
dol_syslog("Try to make a movement of a product with status_batch on without any batch data");
|
||||
|
||||
$this->db->rollback();
|
||||
@ -185,13 +185,13 @@ class MouvementStock extends CommonObject
|
||||
// If found and eatby/sellby not defined into table and not provided, we do nothing
|
||||
// If not found, we add record
|
||||
$sql = "SELECT pb.rowid, pb.batch, pb.eatby, pb.sellby FROM ".MAIN_DB_PREFIX."product_lot as pb";
|
||||
$sql.= " WHERE pb.fk_product = ".$fk_product." AND pb.batch = '".$this->db->escape($batch)."'";
|
||||
$sql .= " WHERE pb.fk_product = ".$fk_product." AND pb.batch = '".$this->db->escape($batch)."'";
|
||||
dol_syslog(get_class($this)."::_create scan serial for this product to check if eatby and sellby match", LOG_DEBUG);
|
||||
$resql = $this->db->query($sql);
|
||||
if ($resql)
|
||||
{
|
||||
$num = $this->db->num_rows($resql);
|
||||
$i=0;
|
||||
$i = 0;
|
||||
if ($num > 0)
|
||||
{
|
||||
while ($i < $num)
|
||||
@ -201,12 +201,12 @@ class MouvementStock extends CommonObject
|
||||
{
|
||||
if ($eatby)
|
||||
{
|
||||
$tmparray=dol_getdate($eatby, true);
|
||||
$eatbywithouthour=dol_mktime(0, 0, 0, $tmparray['mon'], $tmparray['mday'], $tmparray['year']);
|
||||
$tmparray = dol_getdate($eatby, true);
|
||||
$eatbywithouthour = dol_mktime(0, 0, 0, $tmparray['mon'], $tmparray['mday'], $tmparray['year']);
|
||||
if ($this->db->jdate($obj->eatby) != $eatby && $this->db->jdate($obj->eatby) != $eatbywithouthour) // We test date without hours and with hours for backward compatibility
|
||||
{
|
||||
// If found and eatby/sellby defined into table and provided and differs, return error
|
||||
$this->errors[]=$langs->trans("ThisSerialAlreadyExistWithDifferentDate", $batch, dol_print_date($this->db->jdate($obj->eatby), 'dayhour'), dol_print_date($eatby, 'dayhour'));
|
||||
$this->errors[] = $langs->trans("ThisSerialAlreadyExistWithDifferentDate", $batch, dol_print_date($this->db->jdate($obj->eatby), 'dayhour'), dol_print_date($eatby, 'dayhour'));
|
||||
dol_syslog("ThisSerialAlreadyExistWithDifferentDate batch=".$batch.", eatby found into product_lot = ".$obj->eatby." = ".dol_print_date($this->db->jdate($obj->eatby), 'dayhourrfc')." so eatbywithouthour = ".$eatbywithouthour." = ".dol_print_date($eatbywithouthour)." - eatby provided = ".$eatby." = ".dol_print_date($eatby, 'dayhourrfc'), LOG_ERR);
|
||||
$this->db->rollback();
|
||||
return -3;
|
||||
@ -238,12 +238,12 @@ class MouvementStock extends CommonObject
|
||||
{
|
||||
if ($sellby)
|
||||
{
|
||||
$tmparray=dol_getdate($sellby, true);
|
||||
$sellbywithouthour=dol_mktime(0, 0, 0, $tmparray['mon'], $tmparray['mday'], $tmparray['year']);
|
||||
$tmparray = dol_getdate($sellby, true);
|
||||
$sellbywithouthour = dol_mktime(0, 0, 0, $tmparray['mon'], $tmparray['mday'], $tmparray['year']);
|
||||
if ($this->db->jdate($obj->sellby) != $sellby && $this->db->jdate($obj->sellby) != $sellbywithouthour) // We test date without hours and with hours for backward compatibility
|
||||
{
|
||||
// If found and eatby/sellby defined into table and provided and differs, return error
|
||||
$this->errors[]=$langs->trans("ThisSerialAlreadyExistWithDifferentDate", $batch, dol_print_date($this->db->jdate($obj->sellby)), dol_print_date($sellby));
|
||||
$this->errors[] = $langs->trans("ThisSerialAlreadyExistWithDifferentDate", $batch, dol_print_date($this->db->jdate($obj->sellby)), dol_print_date($sellby));
|
||||
dol_syslog($langs->transnoentities("ThisSerialAlreadyExistWithDifferentDate", $batch, dol_print_date($this->db->jdate($obj->sellby)), dol_print_date($sellby)), LOG_ERR);
|
||||
$this->db->rollback();
|
||||
return -3;
|
||||
@ -303,25 +303,25 @@ class MouvementStock extends CommonObject
|
||||
}
|
||||
|
||||
// Define if we must make the stock change (If product type is a service or if stock is used also for services)
|
||||
$movestock=0;
|
||||
if ($product->type != Product::TYPE_SERVICE || ! empty($conf->global->STOCK_SUPPORTS_SERVICES)) $movestock=1;
|
||||
$movestock = 0;
|
||||
if ($product->type != Product::TYPE_SERVICE || !empty($conf->global->STOCK_SUPPORTS_SERVICES)) $movestock = 1;
|
||||
|
||||
// Check if stock is enough when qty is < 0
|
||||
// Note that qty should be > 0 with type 0 or 3, < 0 with type 1 or 2.
|
||||
if ($movestock && $qty < 0 && empty($conf->global->STOCK_ALLOW_NEGATIVE_TRANSFER))
|
||||
{
|
||||
if (! empty($conf->productbatch->enabled) && $product->hasbatch() && ! $skip_batch)
|
||||
if (!empty($conf->productbatch->enabled) && $product->hasbatch() && !$skip_batch)
|
||||
{
|
||||
$foundforbatch=0;
|
||||
$qtyisnotenough=0;
|
||||
foreach($product->stock_warehouse[$entrepot_id]->detail_batch as $batchcursor => $prodbatch)
|
||||
$foundforbatch = 0;
|
||||
$qtyisnotenough = 0;
|
||||
foreach ($product->stock_warehouse[$entrepot_id]->detail_batch as $batchcursor => $prodbatch)
|
||||
{
|
||||
if ($batch != $batchcursor) continue;
|
||||
$foundforbatch=1;
|
||||
$foundforbatch = 1;
|
||||
if ($prodbatch->qty < abs($qty)) $qtyisnotenough = $prodbatch->qty;
|
||||
break;
|
||||
}
|
||||
if (! $foundforbatch || $qtyisnotenough)
|
||||
if (!$foundforbatch || $qtyisnotenough)
|
||||
{
|
||||
$langs->load("stocks");
|
||||
include_once DOL_DOCUMENT_ROOT.'/product/stock/class/entrepot.class.php';
|
||||
@ -350,10 +350,10 @@ class MouvementStock extends CommonObject
|
||||
if ($movestock && $entrepot_id > 0) // Change stock for current product, change for subproduct is done after
|
||||
{
|
||||
$fk_project = 0;
|
||||
if(!empty($this->origin)) { // This is set by caller for tracking reason
|
||||
if (!empty($this->origin)) { // This is set by caller for tracking reason
|
||||
$origintype = $this->origin->element;
|
||||
$fk_origin = $this->origin->id;
|
||||
if($origintype == 'project') $fk_project = $fk_origin;
|
||||
if ($origintype == 'project') $fk_project = $fk_origin;
|
||||
else
|
||||
{
|
||||
$res = $this->origin->fetch($fk_origin);
|
||||
@ -372,22 +372,22 @@ class MouvementStock extends CommonObject
|
||||
}
|
||||
|
||||
$sql = "INSERT INTO ".MAIN_DB_PREFIX."stock_mouvement(";
|
||||
$sql.= " datem, fk_product, batch, eatby, sellby,";
|
||||
$sql.= " fk_entrepot, value, type_mouvement, fk_user_author, label, inventorycode, price, fk_origin, origintype, fk_projet";
|
||||
$sql.= ")";
|
||||
$sql.= " VALUES ('".$this->db->idate($now)."', ".$this->product_id.", ";
|
||||
$sql.= " ".($batch?"'".$batch."'":"null").", ";
|
||||
$sql.= " ".($eatby?"'".$this->db->idate($eatby)."'":"null").", ";
|
||||
$sql.= " ".($sellby?"'".$this->db->idate($sellby)."'":"null").", ";
|
||||
$sql.= " ".$this->entrepot_id.", ".$this->qty.", ".$this->type.",";
|
||||
$sql.= " ".$user->id.",";
|
||||
$sql.= " '".$this->db->escape($label)."',";
|
||||
$sql.= " ".($inventorycode?"'".$this->db->escape($inventorycode)."'":"null").",";
|
||||
$sql.= " '".price2num($price)."',";
|
||||
$sql.= " '".$fk_origin."',";
|
||||
$sql.= " '".$origintype."',";
|
||||
$sql.= " ". $fk_project;
|
||||
$sql.= ")";
|
||||
$sql .= " datem, fk_product, batch, eatby, sellby,";
|
||||
$sql .= " fk_entrepot, value, type_mouvement, fk_user_author, label, inventorycode, price, fk_origin, origintype, fk_projet";
|
||||
$sql .= ")";
|
||||
$sql .= " VALUES ('".$this->db->idate($now)."', ".$this->product_id.", ";
|
||||
$sql .= " ".($batch ? "'".$batch."'" : "null").", ";
|
||||
$sql .= " ".($eatby ? "'".$this->db->idate($eatby)."'" : "null").", ";
|
||||
$sql .= " ".($sellby ? "'".$this->db->idate($sellby)."'" : "null").", ";
|
||||
$sql .= " ".$this->entrepot_id.", ".$this->qty.", ".$this->type.",";
|
||||
$sql .= " ".$user->id.",";
|
||||
$sql .= " '".$this->db->escape($label)."',";
|
||||
$sql .= " ".($inventorycode ? "'".$this->db->escape($inventorycode)."'" : "null").",";
|
||||
$sql .= " '".price2num($price)."',";
|
||||
$sql .= " '".$fk_origin."',";
|
||||
$sql .= " '".$origintype."',";
|
||||
$sql .= " ".$fk_project;
|
||||
$sql .= ")";
|
||||
|
||||
dol_syslog(get_class($this)."::_create insert record into stock_mouvement", LOG_DEBUG);
|
||||
$resql = $this->db->query($sql);
|
||||
@ -399,24 +399,24 @@ class MouvementStock extends CommonObject
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->errors[]=$this->db->lasterror();
|
||||
$this->errors[] = $this->db->lasterror();
|
||||
$error = -1;
|
||||
}
|
||||
|
||||
// Define current values for qty and pmp
|
||||
$oldqty=$product->stock_reel;
|
||||
$oldpmp=$product->pmp;
|
||||
$oldqtywarehouse=0;
|
||||
$oldqty = $product->stock_reel;
|
||||
$oldpmp = $product->pmp;
|
||||
$oldqtywarehouse = 0;
|
||||
|
||||
// Test if there is already a record for couple (warehouse / product)
|
||||
$alreadyarecord = 0;
|
||||
if (! $error)
|
||||
if (!$error)
|
||||
{
|
||||
$sql = "SELECT rowid, reel FROM ".MAIN_DB_PREFIX."product_stock";
|
||||
$sql.= " WHERE fk_entrepot = ".$entrepot_id." AND fk_product = ".$fk_product; // This is a unique key
|
||||
$sql .= " WHERE fk_entrepot = ".$entrepot_id." AND fk_product = ".$fk_product; // This is a unique key
|
||||
|
||||
dol_syslog(get_class($this)."::_create check if a record already exists in product_stock", LOG_DEBUG);
|
||||
$resql=$this->db->query($sql);
|
||||
$resql = $this->db->query($sql);
|
||||
if ($resql)
|
||||
{
|
||||
$obj = $this->db->fetch_object($resql);
|
||||
@ -430,25 +430,25 @@ class MouvementStock extends CommonObject
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->errors[]=$this->db->lasterror();
|
||||
$this->errors[] = $this->db->lasterror();
|
||||
$error = -2;
|
||||
}
|
||||
}
|
||||
|
||||
// Calculate new PMP.
|
||||
$newpmp=0;
|
||||
if (! $error)
|
||||
$newpmp = 0;
|
||||
if (!$error)
|
||||
{
|
||||
// Note: PMP is calculated on stock input only (type of movement = 0 or 3). If type == 0 or 3, qty should be > 0.
|
||||
// Note: Price should always be >0 or 0. PMP should be always >0 (calculated on input)
|
||||
if (($type == 0 || $type == 3) && $price > 0)
|
||||
{
|
||||
$oldqtytouse=($oldqty >= 0?$oldqty:0);
|
||||
$oldqtytouse = ($oldqty >= 0 ? $oldqty : 0);
|
||||
// We make a test on oldpmp>0 to avoid to use normal rule on old data with no pmp field defined
|
||||
if ($oldpmp > 0) $newpmp=price2num((($oldqtytouse * $oldpmp) + ($qty * $price)) / ($oldqtytouse + $qty), 'MU');
|
||||
if ($oldpmp > 0) $newpmp = price2num((($oldqtytouse * $oldpmp) + ($qty * $price)) / ($oldqtytouse + $qty), 'MU');
|
||||
else
|
||||
{
|
||||
$newpmp=$price; // For this product, PMP was not yet set. We set it to input price.
|
||||
$newpmp = $price; // For this product, PMP was not yet set. We set it to input price.
|
||||
}
|
||||
//print "oldqtytouse=".$oldqtytouse." oldpmp=".$oldpmp." oldqtywarehousetouse=".$oldqtywarehousetouse." ";
|
||||
//print "qty=".$qty." newpmp=".$newpmp;
|
||||
@ -465,25 +465,25 @@ class MouvementStock extends CommonObject
|
||||
}
|
||||
}
|
||||
// Update stock quantity
|
||||
if (! $error)
|
||||
if (!$error)
|
||||
{
|
||||
if ($alreadyarecord > 0)
|
||||
{
|
||||
$sql = "UPDATE ".MAIN_DB_PREFIX."product_stock SET reel = reel + ".$qty;
|
||||
$sql.= " WHERE fk_entrepot = ".$entrepot_id." AND fk_product = ".$fk_product;
|
||||
$sql .= " WHERE fk_entrepot = ".$entrepot_id." AND fk_product = ".$fk_product;
|
||||
}
|
||||
else
|
||||
{
|
||||
$sql = "INSERT INTO ".MAIN_DB_PREFIX."product_stock";
|
||||
$sql.= " (reel, fk_entrepot, fk_product) VALUES ";
|
||||
$sql.= " (".$qty.", ".$entrepot_id.", ".$fk_product.")";
|
||||
$sql .= " (reel, fk_entrepot, fk_product) VALUES ";
|
||||
$sql .= " (".$qty.", ".$entrepot_id.", ".$fk_product.")";
|
||||
}
|
||||
|
||||
dol_syslog(get_class($this)."::_create update stock value", LOG_DEBUG);
|
||||
$resql=$this->db->query($sql);
|
||||
if (! $resql)
|
||||
$resql = $this->db->query($sql);
|
||||
if (!$resql)
|
||||
{
|
||||
$this->errors[]=$this->db->lasterror();
|
||||
$this->errors[] = $this->db->lasterror();
|
||||
$error = -3;
|
||||
}
|
||||
elseif (empty($fk_product_stock))
|
||||
@ -493,61 +493,61 @@ class MouvementStock extends CommonObject
|
||||
}
|
||||
|
||||
// Update detail stock for batch product
|
||||
if (! $error && ! empty($conf->productbatch->enabled) && $product->hasbatch() && ! $skip_batch)
|
||||
if (!$error && !empty($conf->productbatch->enabled) && $product->hasbatch() && !$skip_batch)
|
||||
{
|
||||
if ($id_product_batch > 0)
|
||||
{
|
||||
$result=$this->createBatch($id_product_batch, $qty);
|
||||
$result = $this->createBatch($id_product_batch, $qty);
|
||||
}
|
||||
else
|
||||
{
|
||||
$param_batch=array('fk_product_stock' =>$fk_product_stock, 'batchnumber'=>$batch);
|
||||
$result=$this->createBatch($param_batch, $qty);
|
||||
$param_batch = array('fk_product_stock' =>$fk_product_stock, 'batchnumber'=>$batch);
|
||||
$result = $this->createBatch($param_batch, $qty);
|
||||
}
|
||||
if ($result<0) $error++;
|
||||
if ($result < 0) $error++;
|
||||
}
|
||||
|
||||
// Update PMP and denormalized value of stock qty at product level
|
||||
if (! $error)
|
||||
if (!$error)
|
||||
{
|
||||
// $sql = "UPDATE ".MAIN_DB_PREFIX."product SET pmp = ".$newpmp.", stock = ".$this->db->ifsql("stock IS NULL", 0, "stock") . " + ".$qty;
|
||||
// $sql.= " WHERE rowid = ".$fk_product;
|
||||
// Update pmp + denormalized fields because we change content of produt_stock. Warning: Do not use "SET p.stock", does not works with pgsql
|
||||
$sql = "UPDATE ".MAIN_DB_PREFIX."product as p SET pmp = ".$newpmp.", ";
|
||||
$sql.= " stock=(SELECT SUM(ps.reel) FROM ".MAIN_DB_PREFIX."product_stock as ps WHERE ps.fk_product = p.rowid)";
|
||||
$sql.= " WHERE rowid = ".$fk_product;
|
||||
$sql .= " stock=(SELECT SUM(ps.reel) FROM ".MAIN_DB_PREFIX."product_stock as ps WHERE ps.fk_product = p.rowid)";
|
||||
$sql .= " WHERE rowid = ".$fk_product;
|
||||
|
||||
dol_syslog(get_class($this)."::_create update AWP", LOG_DEBUG);
|
||||
$resql=$this->db->query($sql);
|
||||
if (! $resql)
|
||||
$resql = $this->db->query($sql);
|
||||
if (!$resql)
|
||||
{
|
||||
$this->errors[]=$this->db->lasterror();
|
||||
$this->errors[] = $this->db->lasterror();
|
||||
$error = -4;
|
||||
}
|
||||
}
|
||||
|
||||
// If stock is 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);
|
||||
$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
|
||||
}
|
||||
|
||||
// Add movement for sub products (recursive call)
|
||||
if (! $error && ! empty($conf->global->PRODUIT_SOUSPRODUITS) && empty($conf->global->INDEPENDANT_SUBPRODUCT_STOCK))
|
||||
if (!$error && !empty($conf->global->PRODUIT_SOUSPRODUITS) && empty($conf->global->INDEPENDANT_SUBPRODUCT_STOCK))
|
||||
{
|
||||
$error = $this->_createSubProduct($user, $fk_product, $entrepot_id, $qty, $type, 0, $label, $inventorycode); // we use 0 as price, because pmp is not changed for subproduct
|
||||
$error = $this->_createSubProduct($user, $fk_product, $entrepot_id, $qty, $type, 0, $label, $inventorycode); // we use 0 as price, because pmp is not changed for subproduct
|
||||
}
|
||||
|
||||
if ($movestock && ! $error)
|
||||
if ($movestock && !$error)
|
||||
{
|
||||
// Call trigger
|
||||
$result=$this->call_trigger('STOCK_MOVEMENT', $user);
|
||||
$result = $this->call_trigger('STOCK_MOVEMENT', $user);
|
||||
if ($result < 0) $error++;
|
||||
// End call triggers
|
||||
}
|
||||
|
||||
if (! $error)
|
||||
if (!$error)
|
||||
{
|
||||
$this->db->commit();
|
||||
return $mvid;
|
||||
@ -591,12 +591,12 @@ class MouvementStock extends CommonObject
|
||||
$sql .= " t.eatby,";
|
||||
$sql .= " t.sellby,";
|
||||
$sql .= " t.fk_projet as fk_project";
|
||||
$sql .= ' FROM ' . MAIN_DB_PREFIX . $this->table_element . ' as t';
|
||||
$sql.= ' WHERE 1 = 1';
|
||||
$sql .= ' FROM '.MAIN_DB_PREFIX.$this->table_element.' as t';
|
||||
$sql .= ' WHERE 1 = 1';
|
||||
//if (null !== $ref) {
|
||||
//$sql .= ' AND t.ref = ' . '\'' . $ref . '\'';
|
||||
//} else {
|
||||
$sql .= ' AND t.rowid = ' . $id;
|
||||
$sql .= ' AND t.rowid = '.$id;
|
||||
//}
|
||||
|
||||
$resql = $this->db->query($sql);
|
||||
@ -640,10 +640,10 @@ class MouvementStock extends CommonObject
|
||||
return 0;
|
||||
}
|
||||
} else {
|
||||
$this->errors[] = 'Error ' . $this->db->lasterror();
|
||||
dol_syslog(__METHOD__ . ' ' . implode(',', $this->errors), LOG_ERR);
|
||||
$this->errors[] = 'Error '.$this->db->lasterror();
|
||||
dol_syslog(__METHOD__.' '.implode(',', $this->errors), LOG_ERR);
|
||||
|
||||
return - 1;
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
@ -672,19 +672,19 @@ class MouvementStock extends CommonObject
|
||||
$pqtys = array();
|
||||
|
||||
$sql = "SELECT fk_product_pere, fk_product_fils, qty";
|
||||
$sql.= " FROM ".MAIN_DB_PREFIX."product_association";
|
||||
$sql.= " WHERE fk_product_pere = ".$idProduct;
|
||||
$sql.= " AND incdec = 1";
|
||||
$sql .= " FROM ".MAIN_DB_PREFIX."product_association";
|
||||
$sql .= " WHERE fk_product_pere = ".$idProduct;
|
||||
$sql .= " AND incdec = 1";
|
||||
|
||||
dol_syslog(get_class($this)."::_createSubProduct for parent product ".$idProduct, LOG_DEBUG);
|
||||
$resql=$this->db->query($sql);
|
||||
$resql = $this->db->query($sql);
|
||||
if ($resql)
|
||||
{
|
||||
$i=0;
|
||||
while ($obj=$this->db->fetch_object($resql))
|
||||
$i = 0;
|
||||
while ($obj = $this->db->fetch_object($resql))
|
||||
{
|
||||
$pids[$i]=$obj->fk_product_fils;
|
||||
$pqtys[$i]=$obj->qty;
|
||||
$pids[$i] = $obj->fk_product_fils;
|
||||
$pqtys[$i] = $obj->qty;
|
||||
$i++;
|
||||
}
|
||||
$this->db->free($resql);
|
||||
@ -695,12 +695,12 @@ class MouvementStock extends CommonObject
|
||||
}
|
||||
|
||||
// Create movement for each subproduct
|
||||
foreach($pids as $key => $value)
|
||||
foreach ($pids as $key => $value)
|
||||
{
|
||||
if (! $error)
|
||||
if (!$error)
|
||||
{
|
||||
$tmpmove = clone $this;
|
||||
$result = $tmpmove->_create($user, $pids[$key], $entrepot_id, ($qty * $pqtys[$key]), $type, 0, $label, $inventorycode); // This will also call _createSubProduct making this recursive
|
||||
$result = $tmpmove->_create($user, $pids[$key], $entrepot_id, ($qty * $pqtys[$key]), $type, 0, $label, $inventorycode); // This will also call _createSubProduct making this recursive
|
||||
if ($result < 0)
|
||||
{
|
||||
$this->error = $tmpmove->error;
|
||||
@ -736,7 +736,7 @@ class MouvementStock extends CommonObject
|
||||
* @param string $inventorycode Inventory code
|
||||
* @return int <0 if KO, >0 if OK
|
||||
*/
|
||||
public function livraison($user, $fk_product, $entrepot_id, $qty, $price = 0, $label = '', $datem = '', $eatby = '', $sellby = '', $batch = '', $id_product_batch = 0, $inventorycode='')
|
||||
public function livraison($user, $fk_product, $entrepot_id, $qty, $price = 0, $label = '', $datem = '', $eatby = '', $sellby = '', $batch = '', $id_product_batch = 0, $inventorycode = '')
|
||||
{
|
||||
global $conf;
|
||||
|
||||
@ -762,7 +762,7 @@ class MouvementStock extends CommonObject
|
||||
* @param string $inventorycode Inventory code
|
||||
* @return int <0 if KO, >0 if OK
|
||||
*/
|
||||
public function reception($user, $fk_product, $entrepot_id, $qty, $price = 0, $label = '', $eatby = '', $sellby = '', $batch = '', $datem = '', $id_product_batch = 0, $inventorycode='')
|
||||
public function reception($user, $fk_product, $entrepot_id, $qty, $price = 0, $label = '', $eatby = '', $sellby = '', $batch = '', $datem = '', $id_product_batch = 0, $inventorycode = '')
|
||||
{
|
||||
global $conf;
|
||||
|
||||
@ -803,19 +803,19 @@ class MouvementStock extends CommonObject
|
||||
*/
|
||||
public function calculateBalanceForProductBefore($productidselected, $datebefore)
|
||||
{
|
||||
$nb=0;
|
||||
$nb = 0;
|
||||
|
||||
$sql = 'SELECT SUM(value) as nb from '.MAIN_DB_PREFIX.'stock_mouvement';
|
||||
$sql.= ' WHERE fk_product = '.$productidselected;
|
||||
$sql.= " AND datem < '".$this->db->idate($datebefore)."'";
|
||||
$sql .= ' WHERE fk_product = '.$productidselected;
|
||||
$sql .= " AND datem < '".$this->db->idate($datebefore)."'";
|
||||
|
||||
dol_syslog(get_class($this).__METHOD__.'', LOG_DEBUG);
|
||||
$resql=$this->db->query($sql);
|
||||
$resql = $this->db->query($sql);
|
||||
if ($resql)
|
||||
{
|
||||
$obj=$this->db->fetch_object($resql);
|
||||
$obj = $this->db->fetch_object($resql);
|
||||
if ($obj) $nb = $obj->nb;
|
||||
return (empty($nb)?0:$nb);
|
||||
return (empty($nb) ? 0 : $nb);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -837,14 +837,14 @@ class MouvementStock extends CommonObject
|
||||
{
|
||||
global $user;
|
||||
|
||||
$pdluo=new Productbatch($this->db);
|
||||
$pdluo = new Productbatch($this->db);
|
||||
|
||||
$result=0;
|
||||
$result = 0;
|
||||
|
||||
// Try to find an existing record with same batch number or id
|
||||
if (is_numeric($dluo))
|
||||
{
|
||||
$result=$pdluo->fetch($dluo);
|
||||
$result = $pdluo->fetch($dluo);
|
||||
if (empty($pdluo->id))
|
||||
{
|
||||
// We didn't find the line. May be it was deleted before by a previous move in same transaction.
|
||||
@ -857,10 +857,10 @@ class MouvementStock extends CommonObject
|
||||
{
|
||||
if (isset($dluo['fk_product_stock']))
|
||||
{
|
||||
$vfk_product_stock=$dluo['fk_product_stock'];
|
||||
$vfk_product_stock = $dluo['fk_product_stock'];
|
||||
$vbatchnumber = $dluo['batchnumber'];
|
||||
|
||||
$result = $pdluo->find($vfk_product_stock, '', '', $vbatchnumber); // Search on batch number only (eatby and sellby are deprecated here)
|
||||
$result = $pdluo->find($vfk_product_stock, '', '', $vbatchnumber); // Search on batch number only (eatby and sellby are deprecated here)
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -883,24 +883,24 @@ class MouvementStock extends CommonObject
|
||||
$pdluo->qty += $qty;
|
||||
if ($pdluo->qty == 0)
|
||||
{
|
||||
$result=$pdluo->delete($user, 1);
|
||||
$result = $pdluo->delete($user, 1);
|
||||
} else {
|
||||
$result=$pdluo->update($user, 1);
|
||||
$result = $pdluo->update($user, 1);
|
||||
}
|
||||
}
|
||||
else // product_batch record not found
|
||||
{
|
||||
$pdluo->fk_product_stock=$vfk_product_stock;
|
||||
$pdluo->fk_product_stock = $vfk_product_stock;
|
||||
$pdluo->qty = $qty;
|
||||
$pdluo->eatby = $veatby;
|
||||
$pdluo->sellby = $vsellby;
|
||||
$pdluo->batch = $vbatchnumber;
|
||||
|
||||
$result=$pdluo->create($user, 1);
|
||||
$result = $pdluo->create($user, 1);
|
||||
if ($result < 0)
|
||||
{
|
||||
$this->error=$pdluo->error;
|
||||
$this->errors=$pdluo->errors;
|
||||
$this->error = $pdluo->error;
|
||||
$this->errors = $pdluo->errors;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -919,7 +919,7 @@ class MouvementStock extends CommonObject
|
||||
public function get_origin($fk_origin, $origintype)
|
||||
{
|
||||
// phpcs:enable
|
||||
$origin='';
|
||||
$origin = '';
|
||||
|
||||
switch ($origintype) {
|
||||
case 'commande':
|
||||
@ -954,7 +954,7 @@ class MouvementStock extends CommonObject
|
||||
default:
|
||||
if ($origintype)
|
||||
{
|
||||
$result=dol_include_once('/'.$origintype.'/class/'.$origintype.'.class.php');
|
||||
$result = dol_include_once('/'.$origintype.'/class/'.$origintype.'.class.php');
|
||||
if ($result)
|
||||
{
|
||||
$classname = ucfirst($origintype);
|
||||
@ -964,7 +964,7 @@ class MouvementStock extends CommonObject
|
||||
break;
|
||||
}
|
||||
|
||||
if (empty($origin) || ! is_object($origin)) return '';
|
||||
if (empty($origin) || !is_object($origin)) return '';
|
||||
|
||||
if ($origin->fetch($fk_origin) > 0) {
|
||||
return $origin->getNomUrl(1);
|
||||
@ -985,7 +985,7 @@ class MouvementStock extends CommonObject
|
||||
{
|
||||
if (!empty($origin_element) && $origin_id > 0)
|
||||
{
|
||||
$origin='';
|
||||
$origin = '';
|
||||
if ($origin_element == 'project')
|
||||
{
|
||||
if (!class_exists('Project')) require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
|
||||
@ -1010,10 +1010,10 @@ class MouvementStock extends CommonObject
|
||||
*/
|
||||
public function initAsSpecimen()
|
||||
{
|
||||
global $user,$langs,$conf,$mysoc;
|
||||
global $user, $langs, $conf, $mysoc;
|
||||
|
||||
// Initialize parameters
|
||||
$this->id=0;
|
||||
$this->id = 0;
|
||||
|
||||
// There is no specific properties. All data into insert are provided as method parameter.
|
||||
}
|
||||
@ -1036,23 +1036,23 @@ class MouvementStock extends CommonObject
|
||||
$result = '';
|
||||
$companylink = '';
|
||||
|
||||
$label = '<u>' . $langs->trans("Movement") . ' '.$this->id.'</u>';
|
||||
$label.= '<div width="100%">';
|
||||
$label.= '<b>' . $langs->trans('Label') . ':</b> ' . $this->label;
|
||||
$label.= '<br><b>' . $langs->trans('Qty') . ':</b> ' .$this->qty;
|
||||
$label.= '</div>';
|
||||
$label = '<u>'.$langs->trans("Movement").' '.$this->id.'</u>';
|
||||
$label .= '<div width="100%">';
|
||||
$label .= '<b>'.$langs->trans('Label').':</b> '.$this->label;
|
||||
$label .= '<br><b>'.$langs->trans('Qty').':</b> '.$this->qty;
|
||||
$label .= '</div>';
|
||||
|
||||
$link = '<a href="'.DOL_URL_ROOT.'/product/stock/movement_list.php?id='.$this->warehouse_id.'&msid='.$this->id.'"';
|
||||
$link.= ($notooltip?'':' title="'.dol_escape_htmltag($label, 1).'" class="classfortooltip'.($morecss?' '.$morecss:'').'"');
|
||||
$link.= '>';
|
||||
$linkend='</a>';
|
||||
$link .= ($notooltip ? '' : ' title="'.dol_escape_htmltag($label, 1).'" class="classfortooltip'.($morecss ? ' '.$morecss : '').'"');
|
||||
$link .= '>';
|
||||
$linkend = '</a>';
|
||||
|
||||
if ($withpicto)
|
||||
{
|
||||
$result.=($link.img_object(($notooltip?'':$label), 'stock', ($notooltip?'':'class="classfortooltip"')).$linkend);
|
||||
if ($withpicto != 2) $result.=' ';
|
||||
$result .= ($link.img_object(($notooltip ? '' : $label), 'stock', ($notooltip ? '' : 'class="classfortooltip"')).$linkend);
|
||||
if ($withpicto != 2) $result .= ' ';
|
||||
}
|
||||
$result.= $link . $this->id . $linkend;
|
||||
$result .= $link.$this->id.$linkend;
|
||||
return $result;
|
||||
}
|
||||
|
||||
@ -1113,16 +1113,16 @@ class MouvementStock extends CommonObject
|
||||
*/
|
||||
public function generateDocument($modele, $outputlangs = '', $hidedetails = 0, $hidedesc = 0, $hideref = 0)
|
||||
{
|
||||
global $conf,$user,$langs;
|
||||
global $conf, $user, $langs;
|
||||
|
||||
$langs->load("stocks");
|
||||
|
||||
if (! dol_strlen($modele)) {
|
||||
if (!dol_strlen($modele)) {
|
||||
$modele = 'stdmovement';
|
||||
|
||||
if ($this->modelpdf) {
|
||||
$modele = $this->modelpdf;
|
||||
} elseif (! empty($conf->global->MOUVEMENT_ADDON_PDF)) {
|
||||
} elseif (!empty($conf->global->MOUVEMENT_ADDON_PDF)) {
|
||||
$modele = $conf->global->MOUVEMENT_ADDON_PDF;
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user