Merge pull request #13706 from leninrivas/develop

Cancel shipping
This commit is contained in:
Laurent Destailleur 2020-04-27 14:06:39 +02:00 committed by GitHub
commit d8ba28185a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 251 additions and 1 deletions

View File

@ -12,6 +12,7 @@
* Copyright (C) 2016-2018 Ferran Marcet <fmarcet@2byte.es>
* Copyright (C) 2016 Yasser Carreón <yacasia@gmail.com>
* Copyright (C) 2018 Frédéric France <frederic.france@netlogic.fr>
* Copyright (C) 2020 Lenin Rivas <lenin@leninrivas.com>
*
* 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
@ -461,6 +462,20 @@ if (empty($reshook))
}
}
elseif ($action == 'confirm_cancel' && $confirm == 'yes' && $user->rights->expedition->supprimer)
{
$also_update_stock = (GETPOST('alsoUpdateStock', 'alpha') ? 1 : 0);
$result = $object->cancel(0, $also_update_stock);
if ($result > 0)
{
$result = $object->setStatut(-1);
}
else
{
setEventMessages($object->error, $object->errors, 'errors');
}
}
elseif ($action == 'confirm_delete' && $confirm == 'yes' && $user->rights->expedition->supprimer)
{
$also_update_stock = (GETPOST('alsoUpdateStock', 'alpha') ? 1 : 0);
@ -1689,7 +1704,7 @@ elseif ($id || $ref)
$formconfirm = $form->formconfirm($_SERVER['PHP_SELF'].'?id='.$object->id, $langs->trans('ValidateSending'), $text, 'confirm_valid', '', 0, 1);
}
// Confirm cancelation
if ($action == 'annuler')
if ($action == 'cancel')
{
$formconfirm = $form->formconfirm($_SERVER['PHP_SELF'].'?id='.$object->id, $langs->trans('CancelSending'), $langs->trans("ConfirmCancelSending", $object->ref), 'confirm_cancel', '', 0, 1);
}
@ -2575,6 +2590,16 @@ elseif ($id || $ref)
}
}
// Cancel
if ($object->statut == Expedition::STATUS_VALIDATED)
{
if ($user->rights->expedition->supprimer)
{
print '<a class="butActionDelete" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&amp;action=cancel">'.$langs->trans("Cancel").'</a>';
}
}
// Delete
if ($user->rights->expedition->supprimer)
{
print '<a class="butActionDelete" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&amp;action=delete">'.$langs->trans("Delete").'</a>';

View File

@ -12,6 +12,7 @@
* Copyright (C) 2016 Ferran Marcet <fmarcet@2byte.es>
* Copyright (C) 2018 Nicolas ZABOURI <info@inovea-conseil.com>
* Copyright (C) 2018 Frédéric France <frederic.france@netlogic.fr>
* Copyright (C) 2020 Lenin Rivas <lenin@leninrivas.com>
*
* 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
@ -175,6 +176,10 @@ class Expedition extends CommonObject
*/
const STATUS_CLOSED = 2;
/**
* Canceled status
*/
const STATUS_CANCELED = -1;
/**
@ -1166,6 +1171,226 @@ class Expedition extends CommonObject
}
}
/**
* Cancel shipment.
*
* @param int $notrigger Disable triggers
* @param bool $also_update_stock true if the stock should be increased back (false by default)
* @return int >0 if OK, 0 if deletion done but failed to delete files, <0 if KO
*/
public function cancel($notrigger = 0, $also_update_stock = false)
{
global $conf, $langs, $user;
require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
require_once DOL_DOCUMENT_ROOT.'/expedition/class/expeditionbatch.class.php';
$error=0;
$this->error='';
$this->db->begin();
// Add a protection to refuse deleting if shipment has at least one delivery
$this->fetchObjectLinked($this->id, 'shipping', 0, 'delivery'); // Get deliveries linked to this shipment
if (count($this->linkedObjectsIds) > 0)
{
$this->error='ErrorThereIsSomeDeliveries';
$error++;
}
if (! $error)
{
if (! $notrigger)
{
// Call trigger
$result=$this->call_trigger('SHIPPING_CANCEL', $user);
if ($result < 0) { $error++; }
// End call triggers
}
}
// Stock control
if (! $error && $conf->stock->enabled &&
(($conf->global->STOCK_CALCULATE_ON_SHIPMENT && $this->statut > self::STATUS_DRAFT) ||
($conf->global->STOCK_CALCULATE_ON_SHIPMENT_CLOSE && $this->statut == self::STATUS_CLOSED && $also_update_stock)))
{
require_once DOL_DOCUMENT_ROOT."/product/stock/class/mouvementstock.class.php";
$langs->load("agenda");
// Loop on each product line to add a stock movement and delete features
$sql = "SELECT cd.fk_product, cd.subprice, ed.qty, ed.fk_entrepot, ed.rowid as expeditiondet_id";
$sql .= " FROM ".MAIN_DB_PREFIX."commandedet as cd,";
$sql .= " ".MAIN_DB_PREFIX."expeditiondet as ed";
$sql .= " WHERE ed.fk_expedition = ".$this->id;
$sql .= " AND cd.rowid = ed.fk_origin_line";
dol_syslog(get_class($this)."::delete select details", LOG_DEBUG);
$resql = $this->db->query($sql);
if ($resql)
{
$cpt = $this->db->num_rows($resql);
for ($i = 0; $i < $cpt; $i++)
{
dol_syslog(get_class($this)."::delete movement index ".$i);
$obj = $this->db->fetch_object($resql);
$mouvS = new MouvementStock($this->db);
// we do not log origin because it will be deleted
$mouvS->origin = null;
// get lot/serial
$lotArray = null;
if ($conf->productbatch->enabled)
{
$lotArray = ExpeditionLineBatch::fetchAll($this->db, $obj->expeditiondet_id);
if (!is_array($lotArray))
{
$error++; $this->errors[] = "Error ".$this->db->lasterror();
}
}
if (empty($lotArray)) {
// no lot/serial
// We increment stock of product (and sub-products)
// We use warehouse selected for each line
$result = $mouvS->reception($user, $obj->fk_product, $obj->fk_entrepot, $obj->qty, 0, $langs->trans("ShipmentCanceledInDolibarr", $this->ref)); // Price is set to 0, because we don't want to see WAP changed
if ($result < 0)
{
$error++; $this->errors = $this->errors + $mouvS->errors;
break;
}
}
else
{
// We increment stock of batches
// We use warehouse selected for each line
foreach ($lotArray as $lot)
{
$result = $mouvS->reception($user, $obj->fk_product, $obj->fk_entrepot, $lot->qty, 0, $langs->trans("ShipmentCanceledInDolibarr", $this->ref), $lot->eatby, $lot->sellby, $lot->batch); // Price is set to 0, because we don't want to see WAP changed
if ($result < 0)
{
$error++; $this->errors = $this->errors + $mouvS->errors;
break;
}
}
if ($error) break; // break for loop incase of error
}
}
}
else
{
$error++; $this->errors[] = "Error ".$this->db->lasterror();
}
}
// delete batch expedition line
if (!$error && $conf->productbatch->enabled)
{
if (ExpeditionLineBatch::deletefromexp($this->db, $this->id) < 0)
{
$error++; $this->errors[] = "Error ".$this->db->lasterror();
}
}
if (!$error)
{
$sql = "DELETE FROM ".MAIN_DB_PREFIX."expeditiondet";
$sql .= " WHERE fk_expedition = ".$this->id;
if ($this->db->query($sql))
{
// Delete linked object
$res = $this->deleteObjectLinked();
if ($res < 0) $error++;
// No delete expedition
if (!$error)
{
$sql = "SELECT rowid FROM ".MAIN_DB_PREFIX."expedition";
$sql .= " WHERE rowid = ".$this->id;
if ($this->db->query($sql))
{
if (!empty($this->origin) && $this->origin_id > 0)
{
$this->fetch_origin();
$origin = $this->origin;
if ($this->$origin->statut == Commande::STATUS_SHIPMENTONPROCESS) // If order source of shipment is "shipment in progress"
{
// Check if there is no more shipment. If not, we can move back status of order to "validated" instead of "shipment in progress"
$this->$origin->loadExpeditions();
//var_dump($this->$origin->expeditions);exit;
if (count($this->$origin->expeditions) <= 0)
{
$this->$origin->setStatut(Commande::STATUS_VALIDATED);
}
}
}
if (!$error)
{
$this->db->commit();
// We delete PDFs
$ref = dol_sanitizeFileName($this->ref);
if (!empty($conf->expedition->dir_output))
{
$dir = $conf->expedition->dir_output.'/sending/'.$ref;
$file = $dir.'/'.$ref.'.pdf';
if (file_exists($file))
{
if (!dol_delete_file($file))
{
return 0;
}
}
if (file_exists($dir))
{
if (!dol_delete_dir_recursive($dir))
{
$this->error = $langs->trans("ErrorCanNotDeleteDir", $dir);
return 0;
}
}
}
return 1;
}
else
{
$this->db->rollback();
return -1;
}
}
else
{
$this->error = $this->db->lasterror()." - sql=$sql";
$this->db->rollback();
return -3;
}
}
else
{
$this->error = $this->db->lasterror()." - sql=$sql";
$this->db->rollback();
return -2;
}//*/
}
else
{
$this->error = $this->db->lasterror()." - sql=$sql";
$this->db->rollback();
return -1;
}
}
else
{
$this->db->rollback();
return -1;
}
}
/**
* Delete shipment.
* Warning, do not delete a shipment if a delivery is linked to (with table llx_element_element)