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 '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 ''.$langs->trans("Cancel").''."\n"; - } else { + if ($object->status == $object::STATUS_CANCELED) { print ''.$langs->trans("Re-Open").''."\n"; } }