diff --git a/htdocs/bom/bom_card.php b/htdocs/bom/bom_card.php
index 5f3ec89da61..899fcdbe0e6 100644
--- a/htdocs/bom/bom_card.php
+++ b/htdocs/bom/bom_card.php
@@ -206,6 +206,62 @@ if (empty($reshook))
setEventMessages($object->error, $object->errors, 'errors');
}
}
+
+ if ($action == 'confirm_close' && $confirm == 'yes' && $permissionedit)
+ {
+ $result = $object->cancel($user);
+ if ($result >= 0)
+ {
+ // Define output language
+ if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE))
+ {
+ $outputlangs = $langs;
+ $newlang = '';
+ if ($conf->global->MAIN_MULTILANGS && empty($newlang) && GETPOST('lang_id', 'aZ09')) $newlang = GETPOST('lang_id', 'aZ09');
+ if ($conf->global->MAIN_MULTILANGS && empty($newlang)) $newlang = $object->thirdparty->default_lang;
+ if (! empty($newlang)) {
+ $outputlangs = new Translate("", $conf);
+ $outputlangs->setDefaultLang($newlang);
+ }
+ $model=$object->modelpdf;
+ $ret = $object->fetch($id); // Reload to get new records
+
+ $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
+ }
+ }
+ else
+ {
+ setEventMessages($object->error, $object->errors, 'errors');
+ }
+ }
+
+ if ($action == 'confirm_reopen' && $confirm == 'yes' && $permissionedit)
+ {
+ $result = $object->reopen($user);
+ if ($result >= 0)
+ {
+ // Define output language
+ if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE))
+ {
+ $outputlangs = $langs;
+ $newlang = '';
+ if ($conf->global->MAIN_MULTILANGS && empty($newlang) && GETPOST('lang_id', 'aZ09')) $newlang = GETPOST('lang_id', 'aZ09');
+ if ($conf->global->MAIN_MULTILANGS && empty($newlang)) $newlang = $object->thirdparty->default_lang;
+ if (! empty($newlang)) {
+ $outputlangs = new Translate("", $conf);
+ $outputlangs->setDefaultLang($newlang);
+ }
+ $model=$object->modelpdf;
+ $ret = $object->fetch($id); // Reload to get new records
+
+ $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
+ }
+ }
+ else
+ {
+ setEventMessages($object->error, $object->errors, 'errors');
+ }
+ }
}
@@ -339,13 +395,13 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea
}
$text = $langs->trans('ConfirmValidateBom', $numref);
- if (! empty($conf->notification->enabled))
+ /*if (! empty($conf->notification->enabled))
{
require_once DOL_DOCUMENT_ROOT . '/core/class/notify.class.php';
$notify = new Notify($db);
$text .= '
';
$text .= $notify->confirmMessage('BOM_VALIDATE', $object->socid, $object);
- }
+ }*/
$formquestion=array();
if (! empty($conf->bom->enabled))
@@ -362,7 +418,67 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea
);
}
- $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"] . '?id=' . $object->id, $langs->trans('ValidateOrder'), $text, 'confirm_validate', $formquestion, 0, 1, 220);
+ $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"] . '?id=' . $object->id, $langs->trans('Validate'), $text, 'confirm_validate', $formquestion, 0, 1, 220);
+ }
+
+ // Confirmation of closing
+ if ($action == 'close')
+ {
+ $text = $langs->trans('ConfirmCloseBom', $object->ref);
+ /*if (! empty($conf->notification->enabled))
+ {
+ require_once DOL_DOCUMENT_ROOT . '/core/class/notify.class.php';
+ $notify = new Notify($db);
+ $text .= '
';
+ $text .= $notify->confirmMessage('BOM_CLOSE', $object->socid, $object);
+ }*/
+
+ $formquestion=array();
+ if (! empty($conf->bom->enabled))
+ {
+ $langs->load("mrp");
+ require_once DOL_DOCUMENT_ROOT . '/product/class/html.formproduct.class.php';
+ $formproduct = new FormProduct($db);
+ $forcecombo=0;
+ if ($conf->browser->name == 'ie') $forcecombo = 1; // There is a bug in IE10 that make combo inside popup crazy
+ $formquestion = array(
+ // 'text' => $langs->trans("ConfirmClone"),
+ // array('type' => 'checkbox', 'name' => 'clone_content', 'label' => $langs->trans("CloneMainAttributes"), 'value' => 1),
+ // array('type' => 'checkbox', 'name' => 'update_prices', 'label' => $langs->trans("PuttingPricesUpToDate"), 'value' => 1),
+ );
+ }
+
+ $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"] . '?id=' . $object->id, $langs->trans('Close'), $text, 'confirm_close', $formquestion, 0, 1, 220);
+ }
+
+ // Confirmation of reopen
+ if ($action == 'reopen')
+ {
+ $text = $langs->trans('ConfirmReopenBom', $object->ref);
+ /*if (! empty($conf->notification->enabled))
+ {
+ require_once DOL_DOCUMENT_ROOT . '/core/class/notify.class.php';
+ $notify = new Notify($db);
+ $text .= '
';
+ $text .= $notify->confirmMessage('BOM_CLOSE', $object->socid, $object);
+ }*/
+
+ $formquestion=array();
+ if (! empty($conf->bom->enabled))
+ {
+ $langs->load("mrp");
+ require_once DOL_DOCUMENT_ROOT . '/product/class/html.formproduct.class.php';
+ $formproduct = new FormProduct($db);
+ $forcecombo=0;
+ if ($conf->browser->name == 'ie') $forcecombo = 1; // There is a bug in IE10 that make combo inside popup crazy
+ $formquestion = array(
+ // 'text' => $langs->trans("ConfirmClone"),
+ // array('type' => 'checkbox', 'name' => 'clone_content', 'label' => $langs->trans("CloneMainAttributes"), 'value' => 1),
+ // array('type' => 'checkbox', 'name' => 'update_prices', 'label' => $langs->trans("PuttingPricesUpToDate"), 'value' => 1),
+ );
+ }
+
+ $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"] . '?id=' . $object->id, $langs->trans('ReOpen'), $text, 'confirm_reopen', $formquestion, 0, 1, 220);
}
// Clone confirmation
@@ -546,20 +662,35 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea
print ''.$langs->trans('Modify').''."\n";
}
+ // Validate
if ($user->rights->bom->write && $object->status == BOM::STATUS_DRAFT)
{
- print '
';
+ if (is_array($object->lines) && count($object->lines) > 0)
+ {
+ print '' . $langs->trans("Validate") . '';
+ }
+ else
+ {
+ print '' . $langs->trans("Validate") . '';
+ }
}
+ // Close / Cancel
if ($user->rights->bom->write && $object->status == BOM::STATUS_VALIDATED)
{
- print '';
+ print '' . $langs->trans("Disable") . '';
+ }
+
+ // Re-open
+ if ($user->rights->bom->write && $object->status == BOM::STATUS_CANCELED)
+ {
+ print '' . $langs->trans("ReOpen") . '';
}
// Clone
if ($user->rights->bom->write)
{
- print '';
+ print '' . $langs->trans("ToClone") . '';
}
/*
diff --git a/htdocs/bom/class/bom.class.php b/htdocs/bom/class/bom.class.php
index c8855c9cc03..3968c6d2813 100644
--- a/htdocs/bom/class/bom.class.php
+++ b/htdocs/bom/class/bom.class.php
@@ -640,62 +640,75 @@ class BOM extends CommonObject
* Set draft status
*
* @param User $user Object user that modify
+ * @param int $notrigger 1=Does not execute triggers, 0=Execute triggers
* @return int <0 if KO, >0 if OK
*/
- public function setDraft($user)
+ public function setDraft($user, $notrigger = 0)
{
- global $conf, $langs;
+ // Protection
+ if ($this->status <= self::STATUS_DRAFT)
+ {
+ return 0;
+ }
- $error=0;
+ /*if (! ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && ! empty($user->rights->bom->write))
+ || (! empty($conf->global->MAIN_USE_ADVANCED_PERMS) && ! empty($user->rights->bom->bom_advance->validate))))
+ {
+ $this->error='Permission denied';
+ return -1;
+ }*/
- // Protection
- if ($this->status <= self::STATUS_DRAFT)
- {
- return 0;
- }
+ return $this->setStatusCommon($user, self::STATUS_DRAFT, $notrigger, 'BOM_UNVALIDATE');
+ }
- /*if (! ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && ! empty($user->rights->bom->write))
- || (! empty($conf->global->MAIN_USE_ADVANCED_PERMS) && ! empty($user->rights->bom->bom_advance->validate))))
- {
- $this->error='Permission denied';
- return -1;
- }*/
+ /**
+ * Set cancel status
+ *
+ * @param User $user Object user that modify
+ * @param int $notrigger 1=Does not execute triggers, 0=Execute triggers
+ * @return int <0 if KO, 0=Nothing done, >0 if OK
+ */
+ public function cancel($user, $notrigger = 0)
+ {
+ // Protection
+ if ($this->status != self::STATUS_VALIDATED)
+ {
+ return 0;
+ }
- $this->db->begin();
+ /*if (! ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && ! empty($user->rights->bom->write))
+ || (! empty($conf->global->MAIN_USE_ADVANCED_PERMS) && ! empty($user->rights->bom->bom_advance->validate))))
+ {
+ $this->error='Permission denied';
+ return -1;
+ }*/
- $sql = "UPDATE ".MAIN_DB_PREFIX."bom";
- $sql.= " SET status = ".self::STATUS_DRAFT;
- $sql.= " WHERE rowid = ".$this->id;
+ return $this->setStatusCommon($user, self::STATUS_CANCELED, 'BOM_CLOSE');
+ }
- dol_syslog(get_class($this)."::setDraft", LOG_DEBUG);
- if ($this->db->query($sql))
- {
- if (! $error)
- {
- $this->oldcopy= clone $this;
- }
+ /**
+ * Set cancel status
+ *
+ * @param User $user Object user that modify
+ * @param int $notrigger 1=Does not execute triggers, 0=Execute triggers
+ * @return int <0 if KO, 0=Nothing done, >0 if OK
+ */
+ public function reopen($user, $notrigger = 0)
+ {
+ // Protection
+ if ($this->status != self::STATUS_CANCELED)
+ {
+ return 0;
+ }
- if (!$error) {
- // Call trigger
- $result=$this->call_trigger('BOM_UNVALIDATE', $user);
- if ($result < 0) $error++;
- }
+ /*if (! ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && ! empty($user->rights->bom->write))
+ || (! empty($conf->global->MAIN_USE_ADVANCED_PERMS) && ! empty($user->rights->bom->bom_advance->validate))))
+ {
+ $this->error='Permission denied';
+ return -1;
+ }*/
- if (!$error) {
- $this->status=self::STATUS_DRAFT;
- $this->db->commit();
- return 1;
- } else {
- $this->db->rollback();
- return -1;
- }
- }
- else
- {
- $this->error=$this->db->error();
- $this->db->rollback();
- return -1;
- }
+ return $this->setStatusCommon($user, self::STATUS_VALIDATED, 'BOM_REOPEN');
}
/**
diff --git a/htdocs/commande/class/commande.class.php b/htdocs/commande/class/commande.class.php
index 16d9dcdc3d8..66a15857a04 100644
--- a/htdocs/commande/class/commande.class.php
+++ b/htdocs/commande/class/commande.class.php
@@ -647,7 +647,7 @@ class Commande extends CommonOrder
$now=dol_now();
- $sql = 'UPDATE '.MAIN_DB_PREFIX.'commande';
+ $sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element;
$sql.= ' SET fk_statut = '.self::STATUS_CLOSED.',';
$sql.= ' fk_user_cloture = '.$user->id.',';
$sql.= " date_cloture = '".$this->db->idate($now)."'";
diff --git a/htdocs/core/class/commonobject.class.php b/htdocs/core/class/commonobject.class.php
index 484bb5fa4d4..d17d49e326e 100644
--- a/htdocs/core/class/commonobject.class.php
+++ b/htdocs/core/class/commonobject.class.php
@@ -7399,7 +7399,7 @@ abstract class CommonObject
if (array_key_exists('fk_user_creat', $fieldvalues) && ! ($fieldvalues['fk_user_creat'] > 0)) $fieldvalues['fk_user_creat']=$user->id;
unset($fieldvalues['rowid']); // The field 'rowid' is reserved field name for autoincrement field so we don't need it into insert.
if (array_key_exists('ref', $fieldvalues)) $fieldvalues['ref']=dol_string_nospecial($fieldvalues['ref']); // If field is a ref,we sanitize data
-
+
$keys=array();
$values = array();
foreach ($fieldvalues as $k => $v) {
@@ -7857,6 +7857,57 @@ abstract class CommonObject
}
}
+
+ /**
+ * Set draft status
+ *
+ * @param User $user Object user that modify
+ * @param int $status New status to set (often a constant like self::STATUS_XXX)
+ * @param int $notrigger 1=Does not execute triggers, 0=Execute triggers
+ * @param string $triggercode Trigger code to use
+ * @return int <0 if KO, >0 if OK
+ */
+ public function setStatusCommon($user, $status, $notrigger = 0, $triggercode = '')
+ {
+ $error=0;
+
+ $this->db->begin();
+
+ $sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element;
+ $sql.= " SET status = ".$status;
+ $sql.= " WHERE rowid = ".$this->id;
+
+ if ($this->db->query($sql))
+ {
+ if (! $error)
+ {
+ $this->oldcopy= clone $this;
+ }
+
+ if (! $error && ! $notrigger) {
+ // Call trigger
+ $result=$this->call_trigger($triggercode, $user);
+ if ($result < 0) $error++;
+ }
+
+ if (!$error) {
+ $this->status = $status;
+ $this->db->commit();
+ return 1;
+ } else {
+ $this->db->rollback();
+ return -1;
+ }
+ }
+ else
+ {
+ $this->error=$this->db->error();
+ $this->db->rollback();
+ return -1;
+ }
+ }
+
+
/**
* Initialise object with example values
* Id must be 0 if object instance is a specimen
diff --git a/htdocs/langs/en_US/mrp.lang b/htdocs/langs/en_US/mrp.lang
index 9d8e85f889d..601fe792cd6 100644
--- a/htdocs/langs/en_US/mrp.lang
+++ b/htdocs/langs/en_US/mrp.lang
@@ -27,4 +27,7 @@ DateStartPlannedMo=Date start planned
DateEndPlannedMo=Date end planned
KeepEmptyForAsap=Empty means 'As Soon As Possible'
EstimatedDuration=Estimated duration
-EstimatedDurationDesc=Estimated duration to manufacture this product using this BOM
\ No newline at end of file
+EstimatedDurationDesc=Estimated duration to manufacture this product using this BOM
+ConfirmValidateBom=Are you sure you want to validate this BOM (you will be able to use it to build new Manufacturing Orders)
+ConfirmCloseBom=Are you sure you want to cancel this BOM (you won't be able to use it to build new Manufacturing Orders anymore) ?
+ConfirmReopenBom=Are you sure you want to re-open this BOM (you will be able to use it to build new Manufacturing Orders)
\ No newline at end of file