Merge branch 'develop' of git@github.com:Dolibarr/dolibarr.git into develop

This commit is contained in:
Laurent Destailleur 2022-01-10 19:29:12 +01:00
commit b91b8d35be
6 changed files with 690 additions and 8 deletions

View File

@ -215,7 +215,7 @@ class FormSetup
$out = '<table class="noborder centpercent">';
$out .= '<thead>';
$out .= '<tr class="liste_titre">';
$out .= ' <td class="titlefield">' . $this->langs->trans("Parameter") . '</td>';
$out .= ' <td>' . $this->langs->trans("Parameter") . '</td>';
$out .= ' <td>' . $this->langs->trans("Value") . '</td>';
$out .= '</tr>';
$out .= '</thead>';
@ -353,7 +353,8 @@ class FormSetup
*/
$item = new FormSetupItem($confKey);
$item->setTypeFromTypeString($params['type']);
// need to be ignored from scrutinizer setTypeFromTypeString was created as deprecated to incite developper to use object oriented usage
/** @scrutinizer ignore-deprecated */ $item->setTypeFromTypeString($params['type']);
if (!empty($params['enabled'])) {
$item->enabled = $params['enabled'];
@ -560,13 +561,16 @@ class FormSetupItem
/** @var string $helpText */
public $helpText = '';
/** @var string $value */
/** @var string $fieldValue */
public $fieldValue;
/** @var array $fieldAttr fields attribute only for compatible fields like input text */
public $fieldAttr;
/** @var bool|string set this var to override field output will override $fieldInputOverride and $fieldOutputOverride too */
public $fieldOverride = false;
/** @var bool|string set this var to override field output */
/** @var bool|string set this var to override field input */
public $fieldInputOverride = false;
/** @var bool|string set this var to override field output */
@ -583,6 +587,7 @@ class FormSetupItem
/**
* TODO each type must have setAs{type} method to help configuration
* And set var as protected when its done configuration must be done by method
* this is important for retrocompatibility of futures versions
* @var string $type 'string', 'textarea', 'category:'.Categorie::TYPE_CUSTOMER', 'emailtemplate', 'thirdparty_type'
*/
protected $type = 'string';
@ -594,13 +599,19 @@ class FormSetupItem
/**
* Constructor
*
* @param $confKey the conf key used in database
* @param string $confKey the conf key used in database
*/
public function __construct($confKey)
{
global $langs, $db, $conf;
global $langs, $db, $conf, $form;
$this->db = $db;
$this->form = new Form($this->db);
if (!empty($form) && is_object($form) && get_class($form) == 'Form') { // the form class has a cache inside so I am using it to optimize
$this->form = $form;
} else {
$this->form = new Form($this->db);
}
$this->langs = $langs;
$this->entity = $conf->entity;
@ -700,6 +711,10 @@ class FormSetupItem
return $this->fieldInputOverride;
}
$this->fieldAttr['name'] = $this->confKey;
$this->fieldAttr['id'] = 'setup-'.$this->confKey;
$this->fieldAttr['value'] = $this->fieldValue;
$out = '';
if ($this->type == 'title') {
@ -726,7 +741,9 @@ class FormSetupItem
$out.= $this->form->select_produits($selected, $this->confKey, '', 0, 0, 1, 2, '', 0, array(), 0, '1', 0, $this->cssClass, 0, '', null, 1);
}
} else {
$out.= '<input name="'.$this->confKey.'" class="flat '.(empty($this->cssClass) ? 'minwidth200' : $this->cssClass).'" value="'.$this->fieldValue.'">';
if (empty($this->fieldAttr)) { $this->fieldAttr['class'] = 'flat '.(empty($this->cssClass) ? 'minwidth200' : $this->cssClass); }
$out.= '<input '.FormSetup::generateAttributesStringFromArray($this->fieldAttr).' />';
}
return $out;

View File

@ -762,6 +762,11 @@ class EmailCollector extends CommonObject
if ($norsh || !empty($conf->global->IMAP_FORCE_NORSH)) {
$flags .= '/norsh';
}
//Used in shared mailbox from Office365
if (strpos($this->login, '/') != false) {
$partofauth = explode('/', $this->login);
$flags .= '/authuser='.$partofauth[0].'/user='.$partofauth[1];
}
$connectstringserver = '{'.$this->host.':993'.$flags.'}';
@ -2381,6 +2386,7 @@ class EmailCollector extends CommonObject
'messagetext'=>$messagetext,
'subject'=>$subject,
'header'=>$header,
'attachments'=>$attachments,
);
$res = $hookmanager->executeHooks('doCollectOneCollector', $parameters, $this, $operation['type']);

View File

@ -284,3 +284,4 @@ PROJECT_CLASSIFY_CLOSED_WHEN_ALL_TASKS_DONE_help=Note: existing projects with al
SelectLinesOfTimeSpentToInvoice=Select lines of time spent that are unbilled, then bulk action "Generate Invoice" to bill them
ProjectTasksWithoutTimeSpent=Project tasks without time spent
FormForNewLeadDesc=Thanks to fill the following form to contact us. You can also send us an email directly to <b>%s</b>.
StartDateCannotBeAfterEndDate=End date cannot be before start date

View File

@ -165,6 +165,11 @@ class Task extends CommonObject
$this->label = trim($this->label);
$this->description = trim($this->description);
if (!empty($this->date_start) && !empty($this->date_end) && $this->date_start > $this->date_end) {
$this->errors[] = $langs->trans('StartDateCannotBeAfterEndDate');
return -1;
}
// Check parameters
// Put here code to add control on parameters values
@ -384,6 +389,11 @@ class Task extends CommonObject
$this->budget_amount = trim($this->budget_amount);
}
if (!empty($this->date_start) && !empty($this->date_end) && $this->date_start > $this->date_end) {
$this->errors[] = $langs->trans('StartDateCannotBeAfterEndDate');
return -1;
}
// Check parameters
// Put here code to add control on parameters values

View File

@ -117,6 +117,7 @@ if ($action == 'update' && !GETPOST("cancel") && $user->rights->projet->creer) {
$result = $object->update($user);
if ($result < 0) {
setEventMessages($object->error, $object->errors, 'errors');
$action = 'edit';
}
}
} else {

View File

@ -0,0 +1,647 @@
<?php
/* Copyright (C) 2022 Thibault FOUCART <support@ptibogxiv.net>
*
* 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
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
use Luracast\Restler\RestException;
dol_include_once('/recruitment/class/recruitmentjobposition.class.php');
dol_include_once('/recruitment/class/recruitmentcandidature.class.php');
/**
* \file recruitment/class/api_recruitment.class.php
* \ingroup recruitment
* \brief File for API management of recruitment.
*/
/**
* API class for recruitment
*
* @access protected
* @class DolibarrApiAccess {@requires user,external}
*/
class Recruitment extends DolibarrApi
{
/**
* @var jobposition $jobposition {@type jobposition}
*/
public $jobposition;
public $candidature;
/**
* Constructor
*
* @url GET /
*
*/
public function __construct()
{
global $db, $conf;
$this->db = $db;
$this->jobposition = new RecruitmentJobPosition($this->db);
$this->candidature = new RecruitmentCandidature($this->db);
}
/**
* Get properties of a jobposition object
*
* Return an array with jobposition informations
*
* @param int $id ID of jobposition
* @return array|mixed data without useless information
*
* @url GET jobposition/{id}
*
* @throws RestException 401 Not allowed
* @throws RestException 404 Not found
*/
public function getJobPosition($id)
{
if (!DolibarrApiAccess::$user->rights->recruitment->recruitmentjobposition->read) {
throw new RestException(401);
}
$result = $this->jobposition->fetch($id);
if (!$result) {
throw new RestException(404, 'JobPosition not found');
}
if (!DolibarrApi::_checkAccessToResource('recruitment', $this->jobposition->id, 'recruitment_recruitmentjobposition')) {
throw new RestException(401, 'Access to instance id='.$this->jobposition->id.' of object not allowed for login '.DolibarrApiAccess::$user->login);
}
return $this->_cleanObjectDatas($this->jobposition);
}
/**
* Get properties of a candidature object
*
* Return an array with candidature informations
*
* @param int $id ID of candidature
* @return array|mixed data without useless information
*
* @url GET candidature/{id}
*
* @throws RestException 401 Not allowed
* @throws RestException 404 Not found
*/
public function getCandidature($id)
{
if (!DolibarrApiAccess::$user->rights->recruitment->recruitmentjobposition->read) {
throw new RestException(401);
}
$result = $this->candidature->fetch($id);
if (!$result) {
throw new RestException(404, 'Candidature not found');
}
if (!DolibarrApi::_checkAccessToResource('recruitment', $this->candidature->id, 'recruitment_recruitmentcandidature')) {
throw new RestException(401, 'Access to instance id='.$this->candidature->id.' of object not allowed for login '.DolibarrApiAccess::$user->login);
}
return $this->_cleanObjectDatas($this->candidature);
}
/**
* List jobpositions
*
* Get a list of jobpositions
*
* @param string $sortfield Sort field
* @param string $sortorder Sort order
* @param int $limit Limit for list
* @param int $page Page number
* @param string $sqlfilters Other criteria to filter answers separated by a comma. Syntax example "(t.ref:like:'SO-%') and (t.date_creation:<:'20160101')"
* @return array Array of order objects
*
* @throws RestException
*
* @url GET /jobposition/
*/
public function indexJobPosition($sortfield = "t.rowid", $sortorder = 'ASC', $limit = 100, $page = 0, $sqlfilters = '')
{
global $db, $conf;
$obj_ret = array();
$tmpobject = new RecruitmentJobPosition($this->db);
if (!DolibarrApiAccess::$user->rights->recruitment->recruitmentjobposition->read) {
throw new RestException(401);
}
$socid = DolibarrApiAccess::$user->socid ? DolibarrApiAccess::$user->socid : '';
$restrictonsocid = 0; // Set to 1 if there is a field socid in table of object
// If the internal user must only see his customers, force searching by him
$search_sale = 0;
if ($restrictonsocid && !DolibarrApiAccess::$user->rights->societe->client->voir && !$socid) {
$search_sale = DolibarrApiAccess::$user->id;
}
$sql = "SELECT t.rowid";
if ($restrictonsocid && (!DolibarrApiAccess::$user->rights->societe->client->voir && !$socid) || $search_sale > 0) {
$sql .= ", sc.fk_soc, sc.fk_user"; // We need these fields in order to filter by sale (including the case where the user can only see his prospects)
}
$sql .= " FROM ".MAIN_DB_PREFIX.$tmpobject->table_element." as t";
if ($restrictonsocid && (!DolibarrApiAccess::$user->rights->societe->client->voir && !$socid) || $search_sale > 0) {
$sql .= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc"; // We need this table joined to the select in order to filter by sale
}
$sql .= " WHERE 1 = 1";
// Example of use $mode
//if ($mode == 1) $sql.= " AND s.client IN (1, 3)";
//if ($mode == 2) $sql.= " AND s.client IN (2, 3)";
if ($tmpobject->ismultientitymanaged) {
$sql .= ' AND t.entity IN ('.getEntity($tmpobject->element).')';
}
if ($restrictonsocid && (!DolibarrApiAccess::$user->rights->societe->client->voir && !$socid) || $search_sale > 0) {
$sql .= " AND t.fk_soc = sc.fk_soc";
}
if ($restrictonsocid && $socid) {
$sql .= " AND t.fk_soc = ".((int) $socid);
}
if ($restrictonsocid && $search_sale > 0) {
$sql .= " AND t.rowid = sc.fk_soc"; // Join for the needed table to filter by sale
}
// Insert sale filter
if ($restrictonsocid && $search_sale > 0) {
$sql .= " AND sc.fk_user = ".((int) $search_sale);
}
if ($sqlfilters) {
$errormessage = '';
if (!DolibarrApi::_checkFilters($sqlfilters, $errormessage)) {
throw new RestException(503, 'Error when validating parameter sqlfilters -> '.$errormessage);
}
$regexstring = '\(([^:\'\(\)]+:[^:\'\(\)]+:[^\(\)]+)\)';
$sql .= " AND (".preg_replace_callback('/'.$regexstring.'/', 'DolibarrApi::_forge_criteria_callback', $sqlfilters).")";
}
$sql .= $this->db->order($sortfield, $sortorder);
if ($limit) {
if ($page < 0) {
$page = 0;
}
$offset = $limit * $page;
$sql .= $this->db->plimit($limit + 1, $offset);
}
$result = $this->db->query($sql);
$i = 0;
if ($result) {
$num = $this->db->num_rows($result);
while ($i < $num) {
$obj = $this->db->fetch_object($result);
$tmp_object = new RecruitmentJobPosition($this->db);
if ($tmp_object->fetch($obj->rowid)) {
$obj_ret[] = $this->_cleanObjectDatas($tmp_object);
}
$i++;
}
} else {
throw new RestException(503, 'Error when retrieving jobposition list: '.$this->db->lasterror());
}
if (!count($obj_ret)) {
throw new RestException(404, 'No jobposition found');
}
return $obj_ret;
}
/**
* List candatures
*
* Get a list of candidatures
*
* @param string $sortfield Sort field
* @param string $sortorder Sort order
* @param int $limit Limit for list
* @param int $page Page number
* @param string $sqlfilters Other criteria to filter answers separated by a comma. Syntax example "(t.ref:like:'SO-%') and (t.date_creation:<:'20160101')"
* @return array Array of order objects
*
* @throws RestException
*
* @url GET /candidature/
*/
public function indexCandidature($sortfield = "t.rowid", $sortorder = 'ASC', $limit = 100, $page = 0, $sqlfilters = '')
{
global $db, $conf;
$obj_ret = array();
$tmpobject = new RecruitmentCandidature($this->db);
if (!DolibarrApiAccess::$user->rights->recruitment->recruitmentjobposition->read) {
throw new RestException(401);
}
$socid = DolibarrApiAccess::$user->socid ? DolibarrApiAccess::$user->socid : '';
$restrictonsocid = 0; // Set to 1 if there is a field socid in table of object
// If the internal user must only see his customers, force searching by him
$search_sale = 0;
if ($restrictonsocid && !DolibarrApiAccess::$user->rights->societe->client->voir && !$socid) {
$search_sale = DolibarrApiAccess::$user->id;
}
$sql = "SELECT t.rowid";
if ($restrictonsocid && (!DolibarrApiAccess::$user->rights->societe->client->voir && !$socid) || $search_sale > 0) {
$sql .= ", sc.fk_soc, sc.fk_user"; // We need these fields in order to filter by sale (including the case where the user can only see his prospects)
}
$sql .= " FROM ".MAIN_DB_PREFIX.$tmpobject->table_element." as t";
if ($restrictonsocid && (!DolibarrApiAccess::$user->rights->societe->client->voir && !$socid) || $search_sale > 0) {
$sql .= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc"; // We need this table joined to the select in order to filter by sale
}
$sql .= " WHERE 1 = 1";
// Example of use $mode
//if ($mode == 1) $sql.= " AND s.client IN (1, 3)";
//if ($mode == 2) $sql.= " AND s.client IN (2, 3)";
if ($tmpobject->ismultientitymanaged) {
$sql .= ' AND t.entity IN ('.getEntity($tmpobject->element).')';
}
if ($restrictonsocid && (!DolibarrApiAccess::$user->rights->societe->client->voir && !$socid) || $search_sale > 0) {
$sql .= " AND t.fk_soc = sc.fk_soc";
}
if ($restrictonsocid && $socid) {
$sql .= " AND t.fk_soc = ".((int) $socid);
}
if ($restrictonsocid && $search_sale > 0) {
$sql .= " AND t.rowid = sc.fk_soc"; // Join for the needed table to filter by sale
}
// Insert sale filter
if ($restrictonsocid && $search_sale > 0) {
$sql .= " AND sc.fk_user = ".((int) $search_sale);
}
if ($sqlfilters) {
$errormessage = '';
if (!DolibarrApi::_checkFilters($sqlfilters, $errormessage)) {
throw new RestException(503, 'Error when validating parameter sqlfilters -> '.$errormessage);
}
$regexstring = '\(([^:\'\(\)]+:[^:\'\(\)]+:[^\(\)]+)\)';
$sql .= " AND (".preg_replace_callback('/'.$regexstring.'/', 'DolibarrApi::_forge_criteria_callback', $sqlfilters).")";
}
$sql .= $this->db->order($sortfield, $sortorder);
if ($limit) {
if ($page < 0) {
$page = 0;
}
$offset = $limit * $page;
$sql .= $this->db->plimit($limit + 1, $offset);
}
$result = $this->db->query($sql);
$i = 0;
if ($result) {
$num = $this->db->num_rows($result);
while ($i < $num) {
$obj = $this->db->fetch_object($result);
$tmp_object = new RecruitmentCandidature($this->db);
if ($tmp_object->fetch($obj->rowid)) {
$obj_ret[] = $this->_cleanObjectDatas($tmp_object);
}
$i++;
}
} else {
throw new RestException(503, 'Error when retrieving candidature list: '.$this->db->lasterror());
}
if (!count($obj_ret)) {
throw new RestException(404, 'No candidature found');
}
return $obj_ret;
}
/**
* Create jobposition object
*
* @param array $request_data Request datas
* @return int ID of jobposition
*
* @throws RestException
*
* @url POST jobposition/
*/
public function postJobPosition($request_data = null)
{
if (!DolibarrApiAccess::$user->rights->recruitment->recruitmentjobposition->write) {
throw new RestException(401);
}
// Check mandatory fields
$result = $this->_validate($request_data);
foreach ($request_data as $field => $value) {
$this->jobposition->$field = $this->_checkValForAPI($field, $value, $this->jobposition);
}
// Clean data
// $this->jobposition->abc = checkVal($this->jobposition->abc, 'alphanohtml');
if ($this->jobposition->create(DolibarrApiAccess::$user)<0) {
throw new RestException(500, "Error creating jobposition", array_merge(array($this->jobposition->error), $this->jobposition->errors));
}
return $this->jobposition->id;
}
/**
* Create candidature object
*
* @param array $request_data Request datas
* @return int ID of candidature
*
* @throws RestException
*
* @url POST candidature/
*/
public function postCandidature($request_data = null)
{
if (!DolibarrApiAccess::$user->rights->recruitment->recruitmentjobposition->write) {
throw new RestException(401);
}
// Check mandatory fields
$result = $this->_validate($request_data);
foreach ($request_data as $field => $value) {
$this->jobposition->$field = $this->_checkValForAPI($field, $value, $this->jobposition);
}
// Clean data
// $this->jobposition->abc = checkVal($this->jobposition->abc, 'alphanohtml');
if ($this->candidature->create(DolibarrApiAccess::$user)<0) {
throw new RestException(500, "Error creating candidature", array_merge(array($this->candidature->error), $this->candidature->errors));
}
return $this->candidature->id;
}
/**
* Update jobposition
*
* @param int $id Id of jobposition to update
* @param array $request_data Datas
* @return int
*
* @throws RestException
*
* @url PUT jobposition/{id}
*/
public function putJobPosition($id, $request_data = null)
{
if (!DolibarrApiAccess::$user->rights->recruitment->recruitmentjobposition->write) {
throw new RestException(401);
}
$result = $this->jobposition->fetch($id);
if (!$result) {
throw new RestException(404, 'jobposition not found');
}
if (!DolibarrApi::_checkAccessToResource('recruitment', $this->jobposition->id, 'recruitment_recruitmentjobposition')) {
throw new RestException(401, 'Access to instance id='.$this->jobposition->id.' of object not allowed for login '.DolibarrApiAccess::$user->login);
}
foreach ($request_data as $field => $value) {
if ($field == 'id') {
continue;
}
$this->jobposition->$field = $this->_checkValForAPI($field, $value, $this->jobposition);
}
// Clean data
// $this->jobposition->abc = checkVal($this->jobposition->abc, 'alphanohtml');
if ($this->jobposition->update(DolibarrApiAccess::$user, false) > 0) {
return $this->get($id);
} else {
throw new RestException(500, $this->jobposition->error);
}
}
/**
* Update candidature
*
* @param int $id Id of candidature to update
* @param array $request_data Datas
* @return int
*
* @throws RestException
*
* @url PUT candidature/{id}
*/
public function putCandidature($id, $request_data = null)
{
if (!DolibarrApiAccess::$user->rights->recruitment->recruitmentjobposition->write) {
throw new RestException(401);
}
$result = $this->candidature->fetch($id);
if (!$result) {
throw new RestException(404, 'candidature not found');
}
if (!DolibarrApi::_checkAccessToResource('recruitment', $this->candidature->id, 'recruitment_recruitmentcandidature')) {
throw new RestException(401, 'Access to instance id='.$this->candidature->id.' of object not allowed for login '.DolibarrApiAccess::$user->login);
}
foreach ($request_data as $field => $value) {
if ($field == 'id') {
continue;
}
$this->candidature->$field = $this->_checkValForAPI($field, $value, $this->candidature);
}
// Clean data
// $this->jobposition->abc = checkVal($this->jobposition->abc, 'alphanohtml');
if ($this->candidature->update(DolibarrApiAccess::$user, false) > 0) {
return $this->get($id);
} else {
throw new RestException(500, $this->candidature->error);
}
}
/**
* Delete jobposition
*
* @param int $id jobposition ID
* @return array
*
* @throws RestException
*
* @url DELETE jobposition/{id}
*/
public function deleteJobPosition($id)
{
if (!DolibarrApiAccess::$user->rights->recruitment->recruitmentjobposition->delete) {
throw new RestException(401);
}
$result = $this->jobposition->fetch($id);
if (!$result) {
throw new RestException(404, 'jobposition not found');
}
if (!DolibarrApi::_checkAccessToResource('recruitment', $this->jobposition->id, 'recruitment_recruitmentjobposition')) {
throw new RestException(401, 'Access to instance id='.$this->jobposition->id.' of object not allowed for login '.DolibarrApiAccess::$user->login);
}
if (!$this->jobposition->delete(DolibarrApiAccess::$user)) {
throw new RestException(500, 'Error when deleting jobposition : '.$this->jobposition->error);
}
return array(
'success' => array(
'code' => 200,
'message' => 'jobposition deleted'
)
);
}
/**
* Delete candidature
*
* @param int $id candidature ID
* @return array
*
* @throws RestException
*
* @url DELETE candidature/{id}
*/
public function deleteCandidature($id)
{
if (!DolibarrApiAccess::$user->rights->recruitment->recruitmentjobposition->delete) {
throw new RestException(401);
}
$result = $this->candidature->fetch($id);
if (!$result) {
throw new RestException(404, 'candidature not found');
}
if (!DolibarrApi::_checkAccessToResource('recruitment', $this->candidature->id, 'recruitment_recruitmentcandidature')) {
throw new RestException(401, 'Access to instance id='.$this->candidature->id.' of object not allowed for login '.DolibarrApiAccess::$user->login);
}
if (!$this->candidature->delete(DolibarrApiAccess::$user)) {
throw new RestException(500, 'Error when deleting candidature : '.$this->candidature->error);
}
return array(
'success' => array(
'code' => 200,
'message' => 'candidature deleted'
)
);
}
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.PublicUnderscore
/**
* Clean sensible object datas
*
* @param Object $object Object to clean
* @return Object Object with cleaned properties
*/
protected function _cleanObjectDatas($object)
{
// phpcs:enable
$object = parent::_cleanObjectDatas($object);
unset($object->rowid);
unset($object->canvas);
/*unset($object->name);
unset($object->lastname);
unset($object->firstname);
unset($object->civility_id);
unset($object->statut);
unset($object->state);
unset($object->state_id);
unset($object->state_code);
unset($object->region);
unset($object->region_code);
unset($object->country);
unset($object->country_id);
unset($object->country_code);
unset($object->barcode_type);
unset($object->barcode_type_code);
unset($object->barcode_type_label);
unset($object->barcode_type_coder);
unset($object->total_ht);
unset($object->total_tva);
unset($object->total_localtax1);
unset($object->total_localtax2);
unset($object->total_ttc);
unset($object->fk_account);
unset($object->comments);
unset($object->note);
unset($object->mode_reglement_id);
unset($object->cond_reglement_id);
unset($object->cond_reglement);
unset($object->shipping_method_id);
unset($object->fk_incoterms);
unset($object->label_incoterms);
unset($object->location_incoterms);
*/
// If object has lines, remove $db property
if (isset($object->lines) && is_array($object->lines) && count($object->lines) > 0) {
$nboflines = count($object->lines);
for ($i = 0; $i < $nboflines; $i++) {
$this->_cleanObjectDatas($object->lines[$i]);
unset($object->lines[$i]->lines);
unset($object->lines[$i]->note);
}
}
return $object;
}
/**
* Validate fields before create or update object
*
* @param array $data Array of data to validate
* @return array
*
* @throws RestException
*/
private function _validate($data)
{
$jobposition = array();
foreach ($this->jobposition->fields as $field => $propfield) {
if (in_array($field, array('rowid', 'entity', 'date_creation', 'tms', 'fk_user_creat')) || $propfield['notnull'] != 1) {
continue; // Not a mandatory field
}
if (!isset($data[$field])) {
throw new RestException(400, "$field field missing");
}
$jobposition[$field] = $data[$field];
}
return $jobposition;
}
}