commit
d8ba28185a
@ -12,6 +12,7 @@
|
|||||||
* Copyright (C) 2016-2018 Ferran Marcet <fmarcet@2byte.es>
|
* Copyright (C) 2016-2018 Ferran Marcet <fmarcet@2byte.es>
|
||||||
* Copyright (C) 2016 Yasser Carreón <yacasia@gmail.com>
|
* Copyright (C) 2016 Yasser Carreón <yacasia@gmail.com>
|
||||||
* Copyright (C) 2018 Frédéric France <frederic.france@netlogic.fr>
|
* 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
|
* 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
|
* 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)
|
elseif ($action == 'confirm_delete' && $confirm == 'yes' && $user->rights->expedition->supprimer)
|
||||||
{
|
{
|
||||||
$also_update_stock = (GETPOST('alsoUpdateStock', 'alpha') ? 1 : 0);
|
$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);
|
$formconfirm = $form->formconfirm($_SERVER['PHP_SELF'].'?id='.$object->id, $langs->trans('ValidateSending'), $text, 'confirm_valid', '', 0, 1);
|
||||||
}
|
}
|
||||||
// Confirm cancelation
|
// 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);
|
$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.'&action=cancel">'.$langs->trans("Cancel").'</a>';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete
|
||||||
if ($user->rights->expedition->supprimer)
|
if ($user->rights->expedition->supprimer)
|
||||||
{
|
{
|
||||||
print '<a class="butActionDelete" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=delete">'.$langs->trans("Delete").'</a>';
|
print '<a class="butActionDelete" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=delete">'.$langs->trans("Delete").'</a>';
|
||||||
|
|||||||
@ -12,6 +12,7 @@
|
|||||||
* Copyright (C) 2016 Ferran Marcet <fmarcet@2byte.es>
|
* Copyright (C) 2016 Ferran Marcet <fmarcet@2byte.es>
|
||||||
* Copyright (C) 2018 Nicolas ZABOURI <info@inovea-conseil.com>
|
* Copyright (C) 2018 Nicolas ZABOURI <info@inovea-conseil.com>
|
||||||
* Copyright (C) 2018 Frédéric France <frederic.france@netlogic.fr>
|
* 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
|
* 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
|
* 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;
|
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.
|
* Delete shipment.
|
||||||
* Warning, do not delete a shipment if a delivery is linked to (with table llx_element_element)
|
* Warning, do not delete a shipment if a delivery is linked to (with table llx_element_element)
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user