diff --git a/htdocs/core/class/commonobject.class.php b/htdocs/core/class/commonobject.class.php
index be4b48be401..c5d72ee1ba1 100644
--- a/htdocs/core/class/commonobject.class.php
+++ b/htdocs/core/class/commonobject.class.php
@@ -7645,6 +7645,12 @@ abstract class CommonObject
$this->errors[] = $langs->trans("ErrorFieldRequired", $this->fields[$key]['label']);
}
+ // If value is null and there is a default value for field
+ if (isset($this->fields[$key]['notnull']) && $this->fields[$key]['notnull'] == 1 && (!isset($values[$key]) || $values[$key] === 'NULL') && !is_null($this->fields[$key]['default']))
+ {
+ $values[$key] = $this->fields[$key]['default'];
+ }
+
// If field is an implicit foreign key field
if (preg_match('/^integer:/i', $this->fields[$key]['type']) && empty($values[$key])) {
if (isset($this->fields[$key]['default'])) $values[$key] = $this->fields[$key]['default'];
diff --git a/htdocs/langs/en_US/main.lang b/htdocs/langs/en_US/main.lang
index 331d81a90c8..e27af882c51 100644
--- a/htdocs/langs/en_US/main.lang
+++ b/htdocs/langs/en_US/main.lang
@@ -155,6 +155,7 @@ RemoveLink=Remove link
AddToDraft=Add to draft
Update=Update
Close=Close
+CloseAs=Set status to
CloseBox=Remove widget from your dashboard
Confirm=Confirm
ConfirmSendCardByMail=Do you really want to send the content of this card by mail to %s?
diff --git a/htdocs/langs/en_US/propal.lang b/htdocs/langs/en_US/propal.lang
index 273996ab1b1..c68574d9ae2 100644
--- a/htdocs/langs/en_US/propal.lang
+++ b/htdocs/langs/en_US/propal.lang
@@ -47,7 +47,6 @@ SendPropalByMail=Send commercial proposal by mail
DatePropal=Date of proposal
DateEndPropal=Validity ending date
ValidityDuration=Validity duration
-CloseAs=Set status to
SetAcceptedRefused=Set accepted/refused
ErrorPropalNotFound=Propal %s not found
AddToDraftProposals=Add to draft proposal
diff --git a/htdocs/recruitment/class/recruitmentjobposition.class.php b/htdocs/recruitment/class/recruitmentjobposition.class.php
index d6a8c62e000..e7fb5ba1e48 100644
--- a/htdocs/recruitment/class/recruitmentjobposition.class.php
+++ b/htdocs/recruitment/class/recruitmentjobposition.class.php
@@ -122,7 +122,7 @@ class RecruitmentJobPosition extends CommonObject
'last_main_doc' => array('type'=>'varchar(255)', 'label'=>'LastMainDoc', 'enabled'=>'1', 'position'=>900, 'notnull'=>0, 'visible'=>0,),
'import_key' => array('type'=>'varchar(14)', 'label'=>'ImportId', 'enabled'=>'1', 'position'=>1000, 'notnull'=>-1, 'visible'=>-2,),
'model_pdf' => array('type'=>'varchar(255)', 'label'=>'Model pdf', 'enabled'=>'1', 'position'=>1010, 'notnull'=>-1, 'visible'=>0,),
- 'status' => array('type'=>'smallint', 'label'=>'Status', 'enabled'=>'1', 'position'=>1000, 'notnull'=>1, 'visible'=>1, 'default'=>'0', 'index'=>1, 'arrayofkeyval'=>array('0'=>'Draft', '1'=>'Validated', '3'=>'Recruited', '9'=>'Canceled'),),
+ 'status' => array('type'=>'smallint', 'label'=>'Status', 'enabled'=>'1', 'position'=>1000, 'notnull'=>1, 'visible'=>5, 'default'=>'0', 'index'=>1, 'arrayofkeyval'=>array('0'=>'Draft', '1'=>'Validated', '3'=>'Recruited', '9'=>'Canceled'),),
);
public $rowid;
public $ref;
@@ -660,6 +660,99 @@ class RecruitmentJobPosition extends CommonObject
return $this->setStatusCommon($user, self::STATUS_CANCELED, $notrigger, 'RECRUITMENTJOBPOSITION_CLOSE');
}
+ /**
+ * Close the commercial proposal
+ *
+ * @param User $user Object user that close
+ * @param int $status Statut
+ * @param string $note Complete private note with this note
+ * @param int $notrigger 1=Does not execute triggers, 0=Execute triggers
+ * @return int <0 if KO, >0 if OK
+ */
+ public function cloture($user, $status, $note = "", $notrigger = 0)
+ {
+ global $langs, $conf;
+
+ $error = 0;
+ $now = dol_now();
+
+ $this->db->begin();
+
+ $newprivatenote = dol_concatdesc($this->note_private, $note);
+
+ $sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element;
+ $sql .= " SET status = ".$status.", note_private = '".$this->db->escape($newprivatenote)."'";
+ //$sql .= ", date_cloture='".$this->db->idate($now)."', fk_user_cloture=".$user->id;
+ $sql .= " WHERE rowid = ".$this->id;
+
+ $resql = $this->db->query($sql);
+ if ($resql)
+ {
+ $modelpdf = $this->modelpdf;
+ $triggerName = 'PROPAL_CLOSE_REFUSED';
+
+ if ($status == self::STATUS_RECRUITED)
+ {
+ $triggerName = 'RECRUITMENTJOB_CLOSE_RECRUITED';
+ $modelpdf = $this->modelpdf;
+
+ if ($result < 0)
+ {
+ $this->error = $this->db->lasterror();
+ $this->db->rollback();
+ return -2;
+ }
+ }
+
+ if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE))
+ {
+ // Define output language
+ $outputlangs = $langs;
+ if (!empty($conf->global->MAIN_MULTILANGS))
+ {
+ $outputlangs = new Translate("", $conf);
+ $newlang = (GETPOST('lang_id', 'aZ09') ? GETPOST('lang_id', 'aZ09') : $this->thirdparty->default_lang);
+ $outputlangs->setDefaultLang($newlang);
+ }
+ //$ret=$object->fetch($id); // Reload to get new records
+ $this->generateDocument($modelpdf, $outputlangs);
+ }
+
+ if (!$error)
+ {
+ $this->oldcopy = clone $this;
+ $this->status = $status;
+ $this->date_cloture = $now;
+ $this->note_private = $newprivatenote;
+ }
+
+ if (!$notrigger && empty($error))
+ {
+ // Call trigger
+ $result = $this->call_trigger($triggerName, $user);
+ if ($result < 0) { $error++; }
+ // End call triggers
+ }
+
+ if (!$error)
+ {
+ $this->db->commit();
+ return 1;
+ } else {
+ $this->status = $this->oldcopy->status;
+ $this->date_cloture = $this->oldcopy->date_cloture;
+ $this->note_private = $this->oldcopy->note_private;
+
+ $this->db->rollback();
+ return -1;
+ }
+ } else {
+ $this->error = $this->db->lasterror();
+ $this->db->rollback();
+ return -1;
+ }
+ }
+
/**
* Set back to validated status
*
diff --git a/htdocs/recruitment/recruitmentjobposition_card.php b/htdocs/recruitment/recruitmentjobposition_card.php
index bdc1fe24742..638bc9e4cef 100644
--- a/htdocs/recruitment/recruitmentjobposition_card.php
+++ b/htdocs/recruitment/recruitmentjobposition_card.php
@@ -109,6 +109,8 @@ $permissionnote = $user->rights->recruitment->recruitmentjobposition->write; //
$permissiondellink = $user->rights->recruitment->recruitmentjobposition->write; // Used by the include of actions_dellink.inc.php
$upload_dir = $conf->recruitment->multidir_output[isset($object->entity) ? $object->entity : 1];
+$usercanclose = $permissiontoadd;
+
// Security check - Protection if external user
//if ($user->socid > 0) accessforbidden();
//if ($user->socid > 0) $socid = $user->socid;
@@ -163,6 +165,32 @@ if (empty($reshook))
{
$object->setProject(GETPOST('projectid', 'int'));
}
+ if ($action == 'confirm_closeas' && $usercanclose && !GETPOST('cancel', 'alpha')) {
+ if (!(GETPOST('status', 'int') > 0)) {
+ setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("CloseAs")), null, 'errors');
+ $action = 'closeas';
+ } else {
+ // prevent browser refresh from closing proposal several times
+ if ($object->status == $object::STATUS_VALIDATED)
+ {
+ $db->begin();
+
+ $result = $object->cloture($user, GETPOST('status', 'int'), GETPOST('note_private', 'none'));
+ if ($result < 0)
+ {
+ setEventMessages($object->error, $object->errors, 'errors');
+ $error++;
+ }
+
+ if (!$error)
+ {
+ $db->commit();
+ } else {
+ $db->rollback();
+ }
+ }
+ }
+ }
// Actions to send emails
$triggersendname = 'RECRUITMENTJOBPOSITION_SENTBYMAIL';
@@ -286,22 +314,24 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea
$formquestion = array();
$formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('ToClone'), $langs->trans('ConfirmCloneAsk', $object->ref), 'confirm_clone', $formquestion, 'yes', 1);
}
-
- // Confirmation of action xxxx
- if ($action == 'xxx')
+ if ($action == 'closeas')
{
- $formquestion = array();
- /*
- $forcecombo=0;
- if ($conf->browser->name == 'ie') $forcecombo = 1; // There is a bug in IE10 that make combo inside popup crazy
+ //Form to close proposal (signed or not)
$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),
- // array('type' => 'other', 'name' => 'idwarehouse', 'label' => $langs->trans("SelectWarehouseForStockDecrease"), 'value' => $formproduct->selectWarehouses(GETPOST('idwarehouse')?GETPOST('idwarehouse'):'ifone', 'idwarehouse', '', 1, 0, 0, '', 0, $forcecombo))
+ array('type' => 'select', 'name' => 'status', 'label' => ''.$langs->trans("CloseAs").'', 'values' => array(3=>$object->LibStatut($object::STATUS_RECRUITED), 9=>$object->LibStatut($object::STATUS_CANCELED))),
+ array('type' => 'text', 'name' => 'note_private', 'label' => $langs->trans("Note"), 'value' => '') // Field to complete private note (not replace)
);
- */
- $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('XXX'), $text, 'confirm_xxx', $formquestion, 0, 1, 220);
+
+ /*if (!empty($conf->notification->enabled))
+ {
+ require_once DOL_DOCUMENT_ROOT.'/core/class/notify.class.php';
+ $notify = new Notify($db);
+ $formquestion = array_merge($formquestion, array(
+ array('type' => 'onecolumn', 'value' => $notify->confirmMessage('PROPAL_CLOSE_SIGNED', $object->socid, $object)),
+ ));
+ }*/
+
+ $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('Close'), $text, 'confirm_closeas', $formquestion, '', 1, 250);
}
// Call Hook formConfirm
@@ -482,6 +512,16 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea
}
}
+ // Close as recruited/canceled
+ if ($object->status == $object::STATUS_VALIDATED) {
+ if ($usercanclose) {
+ print 'id.'&action=closeas'.(empty($conf->global->MAIN_JUMP_TAG) ? '' : '#close').'"';
+ print '>'.$langs->trans('Close').'';
+ } else {
+ print ''.$langs->trans('Close').'';
+ }
+ }
+
// Clone
if ($permissiontoadd) {
print ''.$langs->trans("ToClone").''."\n";
@@ -497,9 +537,7 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea
}*/
if ($permissiontoadd)
{
- if ($object->status == $object::STATUS_VALIDATED) {
- print 'id.'&action=confirm_close&confirm=yes">'.$langs->trans("Cancel").''."\n";
- } else {
+ if ($object->status == $object::STATUS_CANCELED) {
print 'id.'&action=confirm_reopen&confirm=yes">'.$langs->trans("Re-Open").''."\n";
}
}