mirror of
https://github.com/Dolibarr/dolibarr.git
synced 2025-02-20 13:46:52 +01:00
Debug serial/lot management
This commit is contained in:
parent
9a9a1f3983
commit
213c818204
|
|
@ -1232,14 +1232,16 @@ $formorder = new FormOrder($db);
|
|||
*
|
||||
* *******************************************************************
|
||||
*/
|
||||
if ($action == 'create' && $user->rights->commande->creer) {
|
||||
if ($action == 'create' && $user->rights->commande->creer)
|
||||
{
|
||||
print_fiche_titre($langs->trans('CreateOrder'));
|
||||
|
||||
$soc = new Societe($db);
|
||||
if ($socid > 0)
|
||||
$res = $soc->fetch($socid);
|
||||
|
||||
if (! empty($origin) && ! empty($originid)) {
|
||||
if (! empty($origin) && ! empty($originid))
|
||||
{
|
||||
// Parse element/subelement (ex: project_task)
|
||||
$element = $subelement = $origin;
|
||||
if (preg_match('/^([^_]+)_([^_]+)/i', $origin, $regs)) {
|
||||
|
|
@ -1353,7 +1355,7 @@ if ($action == 'create' && $user->rights->commande->creer) {
|
|||
|
||||
/*
|
||||
* Contact de la commande
|
||||
*/
|
||||
*/
|
||||
if ($socid > 0) {
|
||||
print "<tr><td>" . $langs->trans("DefaultContact") . '</td><td colspan="2">';
|
||||
$form->select_contacts($soc->id, $setcontact, 'contactid', 1, $srccontactslist);
|
||||
|
|
|
|||
|
|
@ -2480,12 +2480,13 @@ abstract class CommonObject
|
|||
$tplpath = 'comm/'.$element;
|
||||
if (empty($conf->propal->enabled)) continue; // Do not show if module disabled
|
||||
}
|
||||
else if ($objecttype == 'shipping') {
|
||||
else if ($objecttype == 'shipping' || $objecttype == 'shipment') {
|
||||
$tplpath = 'expedition';
|
||||
if (empty($conf->expedition->enabled)) continue; // Do not show if module disabled
|
||||
}
|
||||
else if ($objecttype == 'delivery') {
|
||||
$tplpath = 'livraison';
|
||||
if (empty($conf->expedition->enabled)) continue; // Do not show if module disabled
|
||||
}
|
||||
else if ($objecttype == 'invoice_supplier') {
|
||||
$tplpath = 'fourn/facture';
|
||||
|
|
|
|||
|
|
@ -52,7 +52,7 @@ function commande_prepare_head($object)
|
|||
|| ($conf->livraison_bon->enabled && $user->rights->expedition->livraison->lire))
|
||||
{
|
||||
$head[$h][0] = DOL_URL_ROOT.'/expedition/shipment.php?id='.$object->id;
|
||||
if ($conf->expedition_bon->enabled) $text=$langs->trans("Shipment");
|
||||
if ($conf->expedition_bon->enabled) $text=$langs->trans("Shipments");
|
||||
if ($conf->expedition_bon->enabled && $conf->livraison_bon->enabled) $text.='/';
|
||||
if ($conf->livraison_bon->enabled) $text.=$langs->trans("Receivings");
|
||||
$head[$h][1] = $text;
|
||||
|
|
|
|||
|
|
@ -144,45 +144,59 @@ if (empty($reshook))
|
|||
$object->note_private = GETPOST('note_private');
|
||||
$object->note_public = GETPOST('note_public');
|
||||
|
||||
$batch_line = array();
|
||||
|
||||
$num=count($objectsrc->lines);
|
||||
$totalqty=0;
|
||||
for ($i = 0; $i < $num; $i++)
|
||||
{
|
||||
$qty = "qtyl".$i;
|
||||
$j=0;
|
||||
$idl="idl".$i;
|
||||
|
||||
$sub_qty=array();
|
||||
$subtotalqty=0;
|
||||
$idl="idl".$i;
|
||||
|
||||
$j=0;
|
||||
$batch="batchl".$i."_0";
|
||||
if (isset($_POST[$batch])) {
|
||||
$qty = "qtyl".$i;
|
||||
|
||||
if (isset($_POST[$batch]))
|
||||
{
|
||||
//shipment line with batch-enable product
|
||||
$qty .= '_'.$j;
|
||||
while (isset($_POST[$batch])) {
|
||||
while (isset($_POST[$batch]))
|
||||
{
|
||||
// save line of detail into sub_qty
|
||||
$sub_qty[$j]['q']=GETPOST($qty,'int');
|
||||
$sub_qty[$j]['id_batch']=GETPOST($batch,'int');
|
||||
|
||||
$subtotalqty+=$sub_qty[$j]['q'];
|
||||
|
||||
$j++;
|
||||
$batch="batchl".$i."_".$j;
|
||||
$qty = "qtyl".$i.'_'.$j;
|
||||
|
||||
}
|
||||
$batch_line[$i]['detail']=$sub_qty;
|
||||
|
||||
$batch_line[$i]['detail']=$sub_qty; // array of details
|
||||
$batch_line[$i]['qty']=$subtotalqty;
|
||||
$batch_line[$i]['ix_l']=GETPOST($idl,'int');
|
||||
|
||||
$totalqty+=$subtotalqty;
|
||||
} else {
|
||||
//Standard product
|
||||
}
|
||||
else
|
||||
{
|
||||
//shipment line for product with no batch management
|
||||
if (GETPOST($qty,'int') > 0) $totalqty+=GETPOST($qty,'int');
|
||||
}
|
||||
}
|
||||
|
||||
if ($totalqty > 0)
|
||||
if ($totalqty > 0) // There is at least one thing to ship
|
||||
{
|
||||
//var_dump($_POST);exit;
|
||||
for ($i = 0; $i < $num; $i++)
|
||||
{
|
||||
$qty = "qtyl".$i;
|
||||
if (! isset($batch_line[$i])) {
|
||||
if (! isset($batch_line[$i]))
|
||||
{ // not batch mode
|
||||
if (GETPOST($qty,'int') > 0 || (GETPOST($qty,'int') == 0 && $conf->global->SHIPMENT_GETS_ALL_ORDER_PRODUCTS))
|
||||
{
|
||||
$ent = "entl".$i;
|
||||
|
|
@ -197,8 +211,11 @@ if (empty($reshook))
|
|||
$error++;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if ($batch_line[$i]['qty']>0) {
|
||||
}
|
||||
else
|
||||
{ // batch mode
|
||||
if ($batch_line[$i]['qty']>0)
|
||||
{
|
||||
$ret=$object->addline_batch($batch_line[$i]);
|
||||
if ($ret < 0)
|
||||
{
|
||||
|
|
@ -211,7 +228,7 @@ if (empty($reshook))
|
|||
|
||||
if (! $error)
|
||||
{
|
||||
$ret=$object->create($user);
|
||||
$ret=$object->create($user); // This create shipment (like Odoo picking) and line of shipments. Stock movement will when validating shipment.
|
||||
if ($ret <= 0)
|
||||
{
|
||||
$mesg='<div class="error">'.$object->error.'</div>';
|
||||
|
|
|
|||
|
|
@ -255,13 +255,16 @@ class Expedition extends CommonObject
|
|||
$num=count($this->lines);
|
||||
for ($i = 0; $i < $num; $i++)
|
||||
{
|
||||
if (! isset($this->lines[$i]->detail_batch)) {
|
||||
if (! $this->create_line($this->lines[$i]->entrepot_id, $this->lines[$i]->origin_line_id, $this->lines[$i]->qty) > 0)
|
||||
{
|
||||
$error++;
|
||||
if (! isset($this->lines[$i]->detail_batch))
|
||||
{ // no batch management
|
||||
if (! $this->create_line($this->lines[$i]->entrepot_id, $this->lines[$i]->origin_line_id, $this->lines[$i]->qty) > 0)
|
||||
{
|
||||
$error++;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (! $this->create_line_ext($this->lines[$i]) > 0)
|
||||
else
|
||||
{ // with batch management
|
||||
if (! $this->create_line_batch($this->lines[$i]) > 0)
|
||||
{
|
||||
$error++;
|
||||
}
|
||||
|
|
@ -366,28 +369,37 @@ class Expedition extends CommonObject
|
|||
if (! $error) return 1;
|
||||
else return -1;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Create a expedition line with eat-by date
|
||||
*
|
||||
* @param object $line_ext full line informations
|
||||
* @return int <0 if KO, >0 if OK
|
||||
*/
|
||||
function create_line_ext($line_ext)
|
||||
function create_line_batch($line_ext)
|
||||
{
|
||||
$error = 0;
|
||||
|
||||
if ( $this->create_line(($line_ext->entrepot_id?$line_ext->entrepot_id:'null'),$line_ext->origin_line_id,$line_ext->qty)<0)
|
||||
if ($this->create_line(($line_ext->entrepot_id?$line_ext->entrepot_id:'null'),$line_ext->origin_line_id,$line_ext->qty) < 0)
|
||||
{
|
||||
$error++;
|
||||
} else {
|
||||
}
|
||||
|
||||
if (! $error)
|
||||
{
|
||||
$line_id= $this->db->last_insert_id(MAIN_DB_PREFIX."expeditiondet");
|
||||
$tab=$line_ext->detail_batch;
|
||||
foreach ($tab as $detbatch) {
|
||||
if (! ($detbatch->create($line_id) >0)) {
|
||||
foreach ($tab as $detbatch)
|
||||
{
|
||||
if (! ($detbatch->create($line_id) >0)) // Create an expeditionlinebatch
|
||||
{
|
||||
$error++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (! $error) return 1;
|
||||
else return -1;
|
||||
}
|
||||
|
|
@ -612,10 +624,13 @@ class Expedition extends CommonObject
|
|||
$result=$mouvS->livraison($user, $obj->fk_product, $obj->fk_entrepot, $obj->qty, $obj->subprice, $langs->trans("ShipmentValidatedInDolibarr",$numref));
|
||||
if ($result < 0) { $error++; break; }
|
||||
|
||||
if (! empty($conf->productbatch->enabled)) {
|
||||
$details=ExpeditionLigneBatch::fetchAll($this->db,$obj->rowid);
|
||||
if (! empty($details)) {
|
||||
foreach ($details as $dbatch) {
|
||||
if (! empty($conf->productbatch->enabled))
|
||||
{
|
||||
$details=ExpeditionLineBatch::fetchAll($this->db,$obj->rowid);
|
||||
if (! empty($details))
|
||||
{
|
||||
foreach ($details as $dbatch)
|
||||
{
|
||||
$result=$mouvS->livraison_batch($dbatch->fk_origin_stock,$dbatch->dluo_qty);
|
||||
if ($result < 0) { $error++; $this->errors[]=$mouvS->$error; break 2; }
|
||||
}
|
||||
|
|
@ -751,7 +766,8 @@ class Expedition extends CommonObject
|
|||
$line->origin_line_id = $id;
|
||||
$line->qty = $qty;
|
||||
|
||||
if($conf->global->STOCK_MUST_BE_ENOUGH_FOR_SHIPMENT) {
|
||||
if ($conf->global->STOCK_MUST_BE_ENOUGH_FOR_SHIPMENT)
|
||||
{
|
||||
$orderline = new OrderLine($this->db);
|
||||
$orderline->fetch($id);
|
||||
$fk_product = $orderline->fk_product;
|
||||
|
|
@ -762,7 +778,8 @@ class Expedition extends CommonObject
|
|||
$result=$product->fetch($fk_product);
|
||||
$product_type=$product->type;
|
||||
|
||||
if($product_type == 0 && $product->stock_reel < $qty) {
|
||||
if($product_type == 0 && $product->stock_reel < $qty)
|
||||
{
|
||||
$this->error=$langs->trans('ErrorStockIsNotEnough');
|
||||
$this->db->rollback();
|
||||
return -3;
|
||||
|
|
@ -777,19 +794,23 @@ class Expedition extends CommonObject
|
|||
* Add a shipment line with batch record
|
||||
*
|
||||
* @param array $dbatch Array of value (key 'detail' -> Array, key 'qty' total quantity for line, key ix_l : original line index)
|
||||
* @return int <0 if KO, >0 if OK
|
||||
* @return int <0 if KO, >0 if OK
|
||||
*/
|
||||
function addline_batch($dbatch)
|
||||
{
|
||||
$num = count($this->lines);
|
||||
if ($dbatch['qty']>0) {
|
||||
if ($dbatch['qty']>0)
|
||||
{
|
||||
$line = new ExpeditionLigne($this->db);
|
||||
$tab=array();
|
||||
foreach ($dbatch['detail'] as $key=>$value) {
|
||||
if ($value['q']>0) {
|
||||
$linebatch = new ExpeditionLigneBatch($this->db);
|
||||
$ret=$linebatch->fetchFromStock($value['id_batch']);
|
||||
if ($ret<0) {
|
||||
foreach ($dbatch['detail'] as $key=>$value)
|
||||
{
|
||||
if ($value['q']>0)
|
||||
{
|
||||
$linebatch = new ExpeditionLineBatch($this->db);
|
||||
$ret=$linebatch->fetchFromStock($value['id_batch']); // load serial, sellby, eatby
|
||||
if ($ret<0)
|
||||
{
|
||||
$this->error=$linebatch->error;
|
||||
return -1;
|
||||
}
|
||||
|
|
@ -932,10 +953,13 @@ class Expedition extends CommonObject
|
|||
|
||||
$this->db->begin();
|
||||
|
||||
if ($conf->productbatch->enabled) {
|
||||
if ($conf->productbatch->enabled)
|
||||
{
|
||||
require_once DOL_DOCUMENT_ROOT.'/expedition/class/expeditionbatch.class.php';
|
||||
if ( ExpeditionLigneBatch::deletefromexp($this->db,$this->id)<0)
|
||||
{$error++;$this->errors[]="Error ".$this->db->lasterror();}
|
||||
if (ExpeditionLineBatch::deletefromexp($this->db,$this->id) < 0)
|
||||
{
|
||||
$error++;$this->errors[]="Error ".$this->db->lasterror();
|
||||
}
|
||||
}
|
||||
// Stock control
|
||||
if ($conf->stock->enabled && $conf->global->STOCK_CALCULATE_ON_SHIPMENT && $this->statut > 0)
|
||||
|
|
@ -1174,10 +1198,11 @@ class Expedition extends CommonObject
|
|||
* May be conf is not well initialized for dark reason
|
||||
*/
|
||||
require_once DOL_DOCUMENT_ROOT.'/expedition/class/expeditionbatch.class.php';
|
||||
if ($originline != $obj->fk_origin_line) {
|
||||
$line->detail_batch = ExpeditionLigneBatch::fetchAll($this->db,$obj->line_id);
|
||||
if ($originline != $obj->fk_origin_line)
|
||||
{
|
||||
$line->detail_batch = ExpeditionLineBatch::fetchAll($this->db,$obj->line_id);
|
||||
} else {
|
||||
$line->detail_batch = array_merge($line->detail_batch,ExpeditionLigneBatch::fetchAll($this->db,$obj->line_id));
|
||||
$line->detail_batch = array_merge($line->detail_batch,ExpeditionLineBatch::fetchAll($this->db,$obj->line_id));
|
||||
}
|
||||
}
|
||||
if ($originline != $obj->fk_origin_line) {
|
||||
|
|
|
|||
|
|
@ -17,16 +17,16 @@
|
|||
*/
|
||||
|
||||
/**
|
||||
* \file expedition/class/productbatch.class.php
|
||||
* \file expedition/class/expeditionbatch.class.php
|
||||
* \ingroup productbatch
|
||||
* \brief This file implements CRUD method for managing product's shipment
|
||||
* \brief This file implements CRUD method for managing shipment batch lines
|
||||
* with batch record
|
||||
*/
|
||||
|
||||
/**
|
||||
* CRUD class for batch number management within shipment
|
||||
*/
|
||||
class ExpeditionLigneBatch extends CommonObject
|
||||
class ExpeditionLineBatch extends CommonObject
|
||||
{
|
||||
var $element='expeditionlignebatch'; //!< Id that identify managed objects
|
||||
private static $_table_element='expeditiondet_batch'; //!< Name of table without prefix where object is stored
|
||||
|
|
@ -115,9 +115,9 @@ class ExpeditionLigneBatch extends CommonObject
|
|||
$sql.= ", fk_origin_stock";
|
||||
$sql.= ") VALUES (";
|
||||
$sql.= $id_line_expdet.",";
|
||||
$sql.= " ".(! isset($this->sellby) || dol_strlen($this->sellby)==0?'NULL':"'".$this->db->idate($this->sellby))."',";
|
||||
$sql.= " ".(! isset($this->eatby) || dol_strlen($this->eatby)==0?'NULL':"'".$this->db->idate($this->eatby))."',";
|
||||
$sql.= " ".(! isset($this->batch)?'NULL':"'".$this->db->escape($this->batch)."'").",";
|
||||
$sql.= " ".(! isset($this->sellby) || dol_strlen($this->sellby)==0?'NULL':("'".$this->db->idate($this->sellby))."'").",";
|
||||
$sql.= " ".(! isset($this->eatby) || dol_strlen($this->eatby)==0?'NULL':("'".$this->db->idate($this->eatby))."'").",";
|
||||
$sql.= " ".(! isset($this->batch)?'NULL':("'".$this->db->escape($this->batch)."'")).",";
|
||||
$sql.= " ".(! isset($this->dluo_qty)?'NULL':$this->dluo_qty).",";
|
||||
$sql.= " ".(! isset($this->fk_origin_stock)?'NULL':$this->fk_origin_stock);
|
||||
$sql.= ")";
|
||||
|
|
@ -174,7 +174,7 @@ class ExpeditionLigneBatch extends CommonObject
|
|||
*
|
||||
* @param object $db Database object
|
||||
* @param int $id_line_expdet id of shipment line
|
||||
* @return variant -1 if KO, array of ExpeditionLigneBatch if OK
|
||||
* @return variant -1 if KO, array of ExpeditionLineBatch if OK
|
||||
*/
|
||||
static function fetchAll($db,$id_line_expdet)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -73,6 +73,18 @@ delete from llx_livraisondet where fk_livraison not in (select fk_target from ll
|
|||
delete from llx_livraison where rowid not in (select fk_target from llx_element_element where targettype = 'delivery') AND rowid not in (select fk_source from llx_element_element where sourcetype = 'delivery');
|
||||
|
||||
|
||||
-- Fix delete element_element orphelins (right side)
|
||||
delete from llx_element_element where targettype='shipping' and fk_target not in (select rowid from llx_expedition);
|
||||
delete from llx_element_element where targettype='propal' and fk_target not in (select rowid from llx_propal);
|
||||
delete from llx_element_element where targettype='facture' and fk_target not in (select rowid from llx_facture);
|
||||
delete from llx_element_element where targettype='commande' and fk_target not in (select rowid from llx_commande);
|
||||
-- Fix delete element_element orphelins (left side)
|
||||
delete from llx_element_element where sourcetype='shipping' and fk_source not in (select rowid from llx_expedition);
|
||||
delete from llx_element_element where sourcetype='propal' and fk_source not in (select rowid from llx_propal);
|
||||
delete from llx_element_element where sourcetype='facture' and fk_source not in (select rowid from llx_facture);
|
||||
delete from llx_element_element where sourcetype='commande' and fk_source not in (select rowid from llx_commande);
|
||||
|
||||
|
||||
UPDATE llx_product SET canvas = NULL where canvas = 'default@product';
|
||||
UPDATE llx_product SET canvas = NULL where canvas = 'service@product';
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user