42require_once DOL_DOCUMENT_ROOT.
'/core/class/doldeprecationhandler.class.php';
51 use DolDeprecationHandler;
53 const TRIGGER_PREFIX =
'';
89 public $errors = array();
94 private $validateFieldsErrors = array();
112 public $element_for_permission;
117 public $table_element;
122 public $table_element_line =
'';
128 public $ismultientitymanaged;
138 public $array_options = array();
144 public $fields = array();
150 public $array_languages =
null;
155 public $contacts_ids;
160 public $linked_objects;
165 public $linkedObjectsIds;
170 public $linkedObjects;
175 private $linkedObjectsFullLoaded = array();
190 protected $table_ref_field =
'';
195 public $restrictiononfksoc = 0;
204 public $context = array();
316 private $commandeFournisseur;
332 public $ref_previous;
378 public $country_code;
396 public $fk_departement;
427 public $barcode_type;
433 public $barcode_type_code;
439 public $barcode_type_label;
445 public $barcode_type_coder;
451 public $mode_reglement_id;
457 public $cond_reglement_id;
462 public $demand_reason_id;
468 public $transport_mode_id;
477 private $cond_reglement;
481 protected $depr_cond_reglement;
488 public $fk_delivery_address;
494 public $shipping_method_id;
500 public $shipping_method;
506 public $fk_multicurrency;
512 public $multicurrency_code;
518 public $multicurrency_tx;
523 public $multicurrency_total_ht;
528 public $multicurrency_total_tva;
533 public $multicurrency_total_ttc;
538 public $multicurrency_total_localtax1;
543 public $multicurrency_total_localtax2;
555 public $last_main_doc;
580 public $note_private;
605 public $total_localtax1;
611 public $total_localtax2;
628 public $actiontypecode;
634 public $comments = array();
660 public $date_creation;
665 public $date_validation;
670 public $date_modification;
684 private $date_update;
689 public $date_cloture;
701 public $user_creation;
706 public $user_creation_id;
718 public $user_validation;
723 public $user_validation_id;
728 public $user_closing_id;
734 public $user_modification;
739 public $user_modification_id;
745 public $fk_user_creat;
751 public $fk_user_modif;
757 public $next_prev_filter;
762 public $specimen = 0;
774 private $alreadypaid;
784 public $labelStatus = array();
789 public $labelStatusShort = array();
800 public $showphoto_on_popup;
805 public $nb = array();
820 public $extraparams = array();
825 protected $childtables = array();
832 protected $childtablesoncascade = array();
842 public $cond_reglement_supplier_id;
849 public $deposit_percent;
855 public $retained_warranty_fk_cond_reglement;
860 public $warehouse_id;
865 public $isextrafieldmanaged = 0;
878 'alreadypaid' =>
'totalpaid',
879 'cond_reglement' =>
'depr_cond_reglement',
881 'commandeFournisseur' =>
'origin_object',
882 'expedition' =>
'origin_object',
883 'fk_project' =>
'fk_project',
884 'livraison' =>
'origin_object',
885 'projet' =>
'project',
886 'statut' =>
'status',
905 $sql =
"SELECT rowid, ref, ref_ext";
906 $sql .=
" FROM ".$db->prefix().$element;
907 $sql .=
" WHERE entity IN (".getEntity($element).
")";
910 $sql .=
" AND rowid = ".((int) $id);
912 $sql .=
" AND ref = '".$db->escape($ref).
"'";
913 } elseif ($ref_ext) {
914 $sql .=
" AND ref_ext = '".$db->escape($ref_ext).
"'";
916 $error =
'ErrorWrongParameters';
917 dol_syslog(get_class().
"::isExistingObject ".$error, LOG_ERR);
920 if ($ref || $ref_ext) {
921 $sql .=
" AND entity = ".((int) $conf->entity);
924 dol_syslog(get_class().
"::isExistingObject", LOG_DEBUG);
925 $resql = $db->query($sql);
927 $num = $db->num_rows($resql);
944 return (empty($this->
id));
959 $this->errors = array_merge($this->errors,
$object->errors);
984 global $action, $extrafields, $langs, $hookmanager;
987 $MAX_EXTRAFIELDS_TO_SHOW_IN_TOOLTIP =
getDolGlobalInt(
'MAX_EXTRAFIELDS_TO_SHOW_IN_TOOLTIP', 3);
993 if (!empty($extrafields->attributes[$this->table_element][
'label'])) {
994 $data[
'opendivextra'] =
'<div class="centpercent wordbreak divtooltipextra">';
995 foreach ($extrafields->attributes[$this->table_element][
'label'] as $key => $val) {
996 if ($extrafields->attributes[$this->table_element][
'type'][$key] ==
'separate') {
999 if ($count >= abs($MAX_EXTRAFIELDS_TO_SHOW_IN_TOOLTIP)) {
1000 $data[
'more_extrafields'] =
'<br>...';
1004 if ($enabled && isset($extrafields->attributes[$this->table_element][
'enabled'][$key])) {
1005 $enabled = (int)
dol_eval($extrafields->attributes[$this->table_element][
'enabled'][$key], 1, 1,
'2');
1007 if ($enabled && isset($extrafields->attributes[$this->table_element][
'list'][$key])) {
1008 $enabled = (int)
dol_eval($extrafields->attributes[$this->table_element][
'list'][$key], 1, 1,
'2');
1011 if ($perms && isset($extrafields->attributes[$this->table_element][
'perms'][$key])) {
1012 $perms = (int)
dol_eval($extrafields->attributes[$this->table_element][
'perms'][$key], 1, 1,
'2');
1014 if (empty($enabled)) {
1017 if (abs($enabled) != 1 && abs($enabled) != 3 && abs($enabled) != 5 && abs($enabled) != 4) {
1020 if (empty($perms)) {
1023 if (!empty($extrafields->attributes[$this->table_element][
'langfile'][$key])) {
1024 $langs->load($extrafields->attributes[$this->table_element][
'langfile'][$key]);
1026 $labelextra = $langs->trans((
string) $extrafields->attributes[$this->table_element][
'label'][$key]);
1027 if ($extrafields->attributes[$this->table_element][
'type'][$key] ==
'separate') {
1028 $data[$key] =
'<br><b><u>'. $labelextra .
'</u></b>';
1030 $value = (empty($this->array_options[
'options_' . $key]) ?
'' : $this->array_options[
'options_' . $key]);
1031 $data[$key] =
'<br><b>'. $labelextra .
':</b> ' . $extrafields->showOutputField($key, $value,
'', $this->table_element);
1035 $data[
'closedivextra'] =
'</div>';
1038 $hookmanager->initHooks(array($this->element .
'dao'));
1039 $parameters = array(
1040 'tooltipcontentarray' => &$data,
1041 'params' => $params,
1044 $hookmanager->executeHooks(
'getTooltipContent', $parameters, $this, $action);
1047 $label = implode($data);
1060 return $this->error.(is_array($this->errors) ? (($this->error !=
'' ?
', ' :
'').implode(
', ', $this->errors)) :
'');
1072 global $hookmanager;
1074 $parameters = array(
'objref' => $objref);
1076 $reshook = $hookmanager->executeHooks(
'getFormatedCustomerRef', $parameters, $this, $action);
1078 return $hookmanager->resArray[
'objref'];
1080 return $objref.(isset($hookmanager->resArray[
'objref']) ? $hookmanager->resArray[
'objref'] :
'');
1091 global $hookmanager;
1093 $parameters = array(
'objref' => $objref);
1095 $reshook = $hookmanager->executeHooks(
'getFormatedSupplierRef', $parameters, $this, $action);
1097 return $hookmanager->resArray[
'objref'];
1099 return $objref.(isset($hookmanager->resArray[
'objref']) ? $hookmanager->resArray[
'objref'] :
'');
1111 public function getFullAddress($withcountry = 0, $sep =
"\n", $withregion = 0, $extralangcode =
'')
1113 if ($withcountry && $this->country_id && (empty($this->country_code) || empty($this->country))) {
1114 require_once DOL_DOCUMENT_ROOT.
'/core/lib/company.lib.php';
1115 $tmparray =
getCountry($this->country_id,
'all');
1116 $this->country_code = $tmparray[
'code'];
1117 $this->country = $tmparray[
'label'];
1120 if ($withregion && $this->state_id && (empty($this->state_code) || empty($this->state) || empty($this->region) || empty($this->region_code))) {
1121 require_once DOL_DOCUMENT_ROOT.
'/core/lib/company.lib.php';
1122 $tmparray =
getState($this->state_id,
'all',
null, 1);
1123 $this->state_code = $tmparray[
'code'];
1124 $this->state = $tmparray[
'label'];
1125 $this->region_code = $tmparray[
'region_code'];
1126 $this->region = $tmparray[
'region'];
1143 global $user, $dolibarr_main_url_root;
1145 if (empty($this->last_main_doc)) {
1149 include_once DOL_DOCUMENT_ROOT.
'/ecm/class/ecmfiles.class.php';
1150 $ecmfile =
new EcmFiles($this->db);
1151 $result = $ecmfile->fetch(0,
'', $this->last_main_doc);
1153 $this->error = $ecmfile->error;
1154 $this->errors = $ecmfile->errors;
1158 if (empty($ecmfile->id)) {
1160 if ($initsharekey) {
1161 require_once DOL_DOCUMENT_ROOT.
'/core/lib/security2.lib.php';
1183 } elseif (empty($ecmfile->share)) {
1185 if ($initsharekey) {
1186 require_once DOL_DOCUMENT_ROOT.
'/core/lib/security2.lib.php';
1188 $ecmfile->update($user);
1194 $urlwithouturlroot = preg_replace(
'/'.preg_quote(DOL_URL_ROOT,
'/').
'$/i',
'', trim($dolibarr_main_url_root));
1198 $urlwithroot = $urlwithouturlroot.DOL_URL_ROOT;
1207 if (!empty($ecmfile->share)) {
1208 $paramlink .= ($paramlink ?
'&' :
'').
'hashp='.$ecmfile->share;
1210 if ($forcedownload) {
1211 $paramlink .= ($paramlink ?
'&' :
'').
'attachment=1';
1214 if ($relativelink) {
1215 $linktoreturn =
'document.php'.($paramlink ?
'?'.$paramlink :
'');
1217 $linktoreturn = $urlwithroot.
'/document.php'.($paramlink ?
'?'.$paramlink :
'');
1221 return $linktoreturn;
1235 public function add_contact($fk_socpeople, $type_contact, $source =
'external', $notrigger = 0)
1238 global $user, $langs;
1241 dol_syslog(get_class($this).
"::add_contact $fk_socpeople, $type_contact, $source, $notrigger");
1244 if ($fk_socpeople <= 0) {
1245 $langs->load(
"errors");
1246 $this->error = $langs->trans(
"ErrorWrongValueForParameterX",
"1");
1247 dol_syslog(get_class($this).
"::add_contact ".$this->error, LOG_ERR);
1250 if (!$type_contact) {
1251 $langs->load(
"errors");
1252 $this->error = $langs->trans(
"ErrorWrongValueForParameterX",
"2");
1253 dol_syslog(get_class($this).
"::add_contact ".$this->error, LOG_ERR);
1257 $id_type_contact = 0;
1258 if (is_numeric($type_contact)) {
1259 $id_type_contact = $type_contact;
1262 $sql =
"SELECT tc.rowid";
1263 $sql .=
" FROM ".$this->db->prefix().
"c_type_contact as tc";
1264 $sql .=
" WHERE tc.element='".$this->db->escape($this->element).
"'";
1265 $sql .=
" AND tc.source='".$this->db->escape($source).
"'";
1266 $sql .=
" AND tc.code='".$this->db->escape($type_contact).
"' AND tc.active=1";
1268 $resql = $this->db->query($sql);
1270 $obj = $this->db->fetch_object($resql);
1272 $id_type_contact = $obj->rowid;
1277 if ($id_type_contact == 0) {
1278 dol_syslog(
"CODE_NOT_VALID_FOR_THIS_ELEMENT: Code type of contact '".$type_contact.
"' does not exists or is not active for element ".$this->element.
", we can ignore it");
1286 $already_added =
false;
1287 if (is_array($TListeContacts) && !empty($TListeContacts)) {
1288 foreach ($TListeContacts as $array_contact) {
1289 if ($array_contact[
'status'] == 4 && $array_contact[
'id'] == $fk_socpeople && $array_contact[
'fk_c_type_contact'] == $id_type_contact) {
1290 $already_added =
true;
1296 if (!$already_added) {
1300 $sql =
"INSERT INTO ".$this->db->prefix().
"element_contact";
1301 $sql .=
" (element_id, fk_socpeople, datecreate, statut, fk_c_type_contact) ";
1302 $sql .=
" VALUES (".$this->id.
", ".((int) $fk_socpeople).
" , ";
1303 $sql .=
"'".$this->db->idate($datecreate).
"'";
1304 $sql .=
", 4, ".((int) $id_type_contact);
1307 $resql = $this->db->query($sql);
1310 $result = $this->
call_trigger(strtoupper($this->element).
'_ADD_CONTACT', $user);
1312 $this->db->rollback();
1317 $this->db->commit();
1320 if ($this->db->errno() ==
'DB_ERROR_RECORD_ALREADY_EXISTS') {
1321 $this->error = $this->db->errno();
1322 $this->db->rollback();
1325 $this->error = $this->db->lasterror();
1326 $this->db->rollback();
1346 $contacts = $objFrom->liste_contact(-1, $source);
1347 foreach ($contacts as $contact) {
1348 if ($this->
add_contact($contact[
'id'], $contact[
'fk_c_type_contact'], $contact[
'source']) < 0) {
1365 public function update_contact($rowid, $statut, $type_contact_id = 0, $fk_socpeople = 0)
1369 $sql =
"UPDATE ".$this->db->prefix().
"element_contact set";
1370 $sql .=
" statut = ".$statut;
1371 if ($type_contact_id) {
1372 $sql .=
", fk_c_type_contact = ".((int) $type_contact_id);
1374 if ($fk_socpeople) {
1375 $sql .=
", fk_socpeople = ".((int) $fk_socpeople);
1377 $sql .=
" where rowid = ".((int) $rowid);
1378 $resql = $this->db->query($sql);
1382 $this->error = $this->db->lasterror();
1404 if (!$error && empty($notrigger)) {
1406 $this->context[
'contact_id'] = ((int) $rowid);
1407 $result = $this->
call_trigger(strtoupper($this->element).
'_DELETE_CONTACT', $user);
1415 dol_syslog(get_class($this).
"::delete_contact", LOG_DEBUG);
1417 $sql =
"DELETE FROM ".MAIN_DB_PREFIX.
"element_contact";
1418 $sql .=
" WHERE rowid = ".((int) $rowid);
1420 $result = $this->db->query($sql);
1423 $this->errors[] = $this->db->lasterror();
1428 $this->db->commit();
1431 $this->error = $this->db->lasterror();
1432 $this->db->rollback();
1452 if (!empty($typeContact)) {
1453 foreach ($typeContact as $key => $value) {
1454 array_push($temp, $key);
1456 $listId = implode(
",", $temp);
1461 if (empty($listId)) {
1465 $sql =
"DELETE FROM ".$this->db->prefix().
"element_contact";
1466 $sql .=
" WHERE element_id = ".((int) $this->
id);
1467 $sql .=
" AND fk_c_type_contact IN (".$this->db->sanitize($listId).
")";
1469 dol_syslog(get_class($this).
"::delete_linked_contact", LOG_DEBUG);
1470 if ($this->db->query($sql)) {
1473 $this->error = $this->db->lasterror();
1490 public function liste_contact($statusoflink = -1, $source =
'external', $list = 0, $code =
'', $status = -1, $arrayoftcids = array())
1497 $sql =
"SELECT ec.rowid, ec.statut as statuslink, ec.fk_socpeople as id, ec.fk_c_type_contact";
1498 if ($source ==
'internal') {
1499 $sql .=
", '-1' as socid, t.statut as statuscontact, t.login, t.photo, t.gender";
1501 if ($source ==
'external' || $source ==
'thirdparty') {
1502 $sql .=
", t.fk_soc as socid, t.statut as statuscontact";
1504 $sql .=
", t.civility as civility, t.lastname as lastname, t.firstname, t.email";
1505 $sql .=
", tc.source, tc.element, tc.code, tc.libelle as type_label";
1506 $sql .=
" FROM ".$this->db->prefix().
"c_type_contact tc,";
1507 $sql .=
" ".$this->db->prefix().
"element_contact ec";
1508 if ($source ==
'internal') {
1509 $sql .=
" LEFT JOIN ".$this->db->prefix().
"user t on ec.fk_socpeople = t.rowid";
1511 if ($source ==
'external' || $source ==
'thirdparty') {
1512 $sql .=
" LEFT JOIN ".$this->db->prefix().
"socpeople t on ec.fk_socpeople = t.rowid";
1514 $sql .=
" WHERE ec.element_id = ".((int) $this->
id);
1515 $sql .=
" AND ec.fk_c_type_contact = tc.rowid";
1516 $sql .=
" AND tc.element = '".$this->db->escape($this->element).
"'";
1518 $sql .=
" AND tc.code = '".$this->db->escape($code).
"'";
1520 if ($source ==
'internal') {
1521 $sql .=
" AND tc.source = 'internal'";
1523 $sql .=
" AND t.statut = ".((int) $status);
1526 if ($source ==
'external' || $source ==
'thirdparty') {
1527 $sql .=
" AND tc.source = 'external'";
1529 $sql .=
" AND t.statut = ".((int) $status);
1532 $sql .=
" AND tc.active = 1";
1533 if ($statusoflink >= 0) {
1534 $sql .=
" AND ec.statut = ".((int) $statusoflink);
1536 $sql .=
" ORDER BY t.lastname ASC";
1538 dol_syslog(get_class($this).
"::liste_contact", LOG_DEBUG);
1539 $resql = $this->db->query($sql);
1541 $num = $this->db->num_rows($resql);
1544 $obj = $this->db->fetch_object($resql);
1547 $transkey =
"TypeContact_".$obj->element.
"_".$obj->source.
"_".$obj->code;
1548 $libelle_type = ($langs->trans($transkey) != $transkey ? $langs->trans($transkey) : $obj->type_label);
1550 'parentId' => $this->
id,
1551 'source' => $obj->source,
1552 'socid' => $obj->socid,
1554 'nom' => $obj->lastname,
1555 'civility' => $obj->civility,
1556 'lastname' => $obj->lastname,
1557 'firstname' => $obj->firstname,
1558 'email' => $obj->email,
1559 'login' => (empty($obj->login) ?
'' : $obj->login),
1560 'photo' => (empty($obj->photo) ?
'' : $obj->photo),
1561 'gender' => (empty($obj->gender) ?
'' : $obj->gender),
1562 'statuscontact' => $obj->statuscontact,
1563 'rowid' => $obj->rowid,
1564 'code' => $obj->code,
1565 'libelle' => $libelle_type,
1566 'status' => $obj->statuslink,
1567 'fk_c_type_contact' => $obj->fk_c_type_contact
1570 $tab[$i] = $obj->id;
1578 $this->error = $this->db->lasterror();
1593 $sql =
"SELECT ec.datecreate, ec.statut, ec.fk_socpeople, ec.fk_c_type_contact,";
1594 $sql .=
" tc.code, tc.libelle as type_label";
1595 $sql .=
" FROM (".$this->db->prefix().
"element_contact as ec, ".$this->db->prefix().
"c_type_contact as tc)";
1596 $sql .=
" WHERE ec.rowid =".((int) $rowid);
1597 $sql .=
" AND ec.fk_c_type_contact = tc.rowid";
1598 $sql .=
" AND tc.element = '".$this->db->escape($this->element).
"'";
1600 dol_syslog(get_class($this).
"::swapContactStatus", LOG_DEBUG);
1601 $resql = $this->db->query($sql);
1603 $obj = $this->db->fetch_object($resql);
1604 $newstatut = ($obj->statut == 4) ? 5 : 4;
1606 $this->db->free($resql);
1609 $this->error = $this->db->error();
1626 public function liste_type_contact($source =
'internal', $order =
'position', $option = 0, $activeonly = 0, $code =
'')
1631 if (empty($order)) {
1632 $order =
'position';
1634 if ($order ==
'position') {
1639 $sql =
"SELECT DISTINCT tc.rowid, tc.code, tc.libelle as type_label, tc.position";
1640 $sql .=
" FROM ".$this->db->prefix().
"c_type_contact as tc";
1641 $sql .=
" WHERE tc.element='".$this->db->escape($this->element).
"'";
1642 if ($activeonly == 1) {
1643 $sql .=
" AND tc.active=1";
1645 if (!empty($source) && $source !=
'all') {
1646 $sql .=
" AND tc.source='".$this->db->escape($source).
"'";
1648 if (!empty($code)) {
1649 $sql .=
" AND tc.code='".$this->db->escape($code).
"'";
1651 $sql .= $this->db->order($order,
'ASC');
1654 $resql = $this->db->query($sql);
1656 $num = $this->db->num_rows($resql);
1659 $obj = $this->db->fetch_object($resql);
1661 $transkey =
"TypeContact_".$this->element.
"_".$source.
"_".$obj->code;
1662 $libelle_type = ($langs->trans($transkey) != $transkey ? $langs->trans($transkey) : $obj->type_label);
1663 if (empty($option)) {
1664 $tab[$obj->rowid] = $libelle_type;
1666 $tab[$obj->code] = $libelle_type;
1672 $this->error = $this->db->lasterror();
1689 public function listeTypeContacts($source =
'internal', $option = 0, $activeonly = 0, $code =
'', $element =
'', $excludeelement =
'')
1691 global $langs, $conf;
1693 $langs->loadLangs(array(
'bills',
'contracts',
'interventions',
'orders',
'projects',
'propal',
'ticket',
'agenda'));
1697 $sql =
"SELECT DISTINCT tc.rowid, tc.code, tc.libelle as type_label, tc.position, tc.element";
1698 $sql .=
" FROM ".$this->db->prefix().
"c_type_contact as tc";
1700 $sqlWhere = array();
1701 if (!empty($element)) {
1702 $sqlWhere[] =
" tc.element='".$this->db->escape($element).
"'";
1704 if (!empty($excludeelement)) {
1705 $sqlWhere[] =
" tc.element <> '".$this->db->escape($excludeelement).
"'";
1708 if ($activeonly == 1) {
1709 $sqlWhere[] =
" tc.active=1";
1712 if (!empty($source) && $source !=
'all') {
1713 $sqlWhere[] =
" tc.source='".$this->db->escape($source).
"'";
1716 if (!empty($code)) {
1717 $sqlWhere[] =
" tc.code='".$this->db->escape($code).
"'";
1720 if (count($sqlWhere) > 0) {
1721 $sql .=
" WHERE ".implode(
' AND ', $sqlWhere);
1724 $sql .= $this->db->order(
'tc.element, tc.position',
'ASC');
1727 $resql = $this->db->query($sql);
1729 $num = $this->db->num_rows($resql);
1731 $langs->loadLangs(array(
"propal",
"orders",
"bills",
"suppliers",
"contracts",
"supplier_proposal"));
1733 while ($obj = $this->db->fetch_object($resql)) {
1734 $modulename = $obj->element;
1735 if (strpos($obj->element,
'project') !==
false) {
1736 $modulename =
'projet';
1737 } elseif ($obj->element ==
'contrat') {
1738 $element =
'contract';
1739 } elseif ($obj->element ==
'action') {
1740 $modulename =
'agenda';
1741 } elseif (strpos($obj->element,
'supplier') !==
false && $obj->element !=
'supplier_proposal') {
1742 $modulename =
'fournisseur';
1744 if (!empty($conf->{$modulename}->enabled)) {
1745 $libelle_element = $langs->trans(
'ContactDefault_'.$obj->element);
1746 $tmpelement = $obj->element;
1747 $transkey =
"TypeContact_".$tmpelement.
"_".$source.
"_".$obj->code;
1748 $libelle_type = ($langs->trans($transkey) != $transkey ? $langs->trans($transkey) : $obj->type_label);
1749 $tab[$obj->rowid] = $libelle_element.
' - '.$libelle_type;
1755 $this->error = $this->db->lasterror();
1778 if ($this->element ==
'shipping' && $this->origin_id != 0) {
1779 $id = $this->origin_id;
1780 $element =
'commande';
1781 } elseif ($this->element ==
'reception' && $this->origin_id != 0) {
1782 $id = $this->origin_id;
1783 $element =
'order_supplier';
1786 $element = $this->element;
1789 $sql =
"SELECT ec.fk_socpeople";
1790 $sql .=
" FROM ".$this->db->prefix().
"element_contact as ec,";
1791 if ($source ==
'internal') {
1792 $sql .=
" ".$this->db->prefix().
"user as c,";
1794 if ($source ==
'external') {
1795 $sql .=
" ".$this->db->prefix().
"socpeople as c,";
1797 $sql .=
" ".$this->db->prefix().
"c_type_contact as tc";
1798 $sql .=
" WHERE ec.element_id = ".((int) $id);
1799 $sql .=
" AND ec.fk_socpeople = c.rowid";
1800 if ($source ==
'internal') {
1801 $sql .=
" AND c.entity IN (".getEntity(
'user').
")";
1803 if ($source ==
'external') {
1804 $sql .=
" AND c.entity IN (".getEntity(
'societe').
")";
1806 $sql .=
" AND ec.fk_c_type_contact = tc.rowid";
1807 $sql .=
" AND tc.element = '".$this->db->escape($element).
"'";
1808 $sql .=
" AND tc.source = '".$this->db->escape($source).
"'";
1810 $sql .=
" AND tc.code = '".$this->db->escape($code).
"'";
1812 $sql .=
" AND tc.active = 1";
1814 $sql .=
" AND ec.statut = ".((int) $status);
1817 dol_syslog(get_class($this).
"::getIdContact", LOG_DEBUG);
1818 $resql = $this->db->query($sql);
1820 while ($obj = $this->db->fetch_object($resql)) {
1821 $result[$i] = $obj->fk_socpeople;
1825 $this->error = $this->db->error();
1842 if (empty($contactid)) {
1843 $contactid = $this->contact_id;
1846 if (empty($contactid)) {
1850 require_once DOL_DOCUMENT_ROOT.
'/contact/class/contact.class.php';
1851 $contact =
new Contact($this->db);
1852 $result = $contact->fetch($contactid);
1853 $this->contact = $contact;
1868 if (empty($this->socid) && empty($this->fk_soc) && empty($force_thirdparty_id)) {
1872 require_once DOL_DOCUMENT_ROOT.
'/societe/class/societe.class.php';
1874 $idtofetch = isset($this->socid) ? $this->socid : (isset($this->fk_soc) ? $this->fk_soc : 0);
1875 if ($force_thirdparty_id) {
1876 $idtofetch = $force_thirdparty_id;
1880 $thirdparty =
new Societe($this->db);
1881 $result = $thirdparty->fetch($idtofetch);
1883 $this->errors = array_merge($this->errors, $thirdparty->errors);
1885 $this->thirdparty = $thirdparty;
1888 if (
getDolGlobalString(
'PRODUIT_MULTIPRICES') && empty($this->thirdparty->price_level)) {
1889 $this->thirdparty->price_level = 1;
1908 if (!$this->table_ref_field) {
1912 $sql =
"SELECT rowid FROM ".$this->db->prefix().$this->table_element;
1913 $sql .=
" WHERE ".$this->table_ref_field.
" LIKE '".$this->db->escape($ref).
"'";
1916 $query = $this->db->query($sql);
1918 if (!$this->db->num_rows($query)) {
1922 $result = $this->db->fetch_object($query);
1924 if (method_exists($this,
'fetch')) {
1925 return $this->fetch($result->rowid);
1927 $this->error =
'Fetch method not implemented on '.get_class($this);
1928 dol_syslog(get_class($this).
'::fetchOneLike Error='.$this->error, LOG_ERR);
1929 array_push($this->errors, $this->error);
1947 dol_syslog(get_class($this).
'::fetch_barcode this->element='.$this->element.
' this->barcode_type='.$this->barcode_type);
1949 $idtype = $this->barcode_type;
1950 if (empty($idtype) && $idtype !=
'0') {
1951 if ($this->element ==
'product' &&
getDolGlobalString(
'PRODUIT_DEFAULT_BARCODE_TYPE')) {
1953 } elseif ($this->element ==
'societe') {
1956 dol_syslog(
'Call fetch_barcode with barcode_type not defined and cannot be guessed', LOG_WARNING);
1961 if (empty($this->barcode_type) || empty($this->barcode_type_code) || empty($this->barcode_type_label) || empty($this->barcode_type_coder)) {
1962 $sql =
"SELECT rowid, code, libelle as label, coder";
1963 $sql .=
" FROM ".$this->db->prefix().
"c_barcode_type";
1964 $sql .=
" WHERE rowid = ".((int) $idtype);
1965 dol_syslog(get_class($this).
'::fetch_barcode', LOG_DEBUG);
1966 $resql = $this->db->query($sql);
1968 $obj = $this->db->fetch_object($resql);
1969 $this->barcode_type = $obj->rowid;
1970 $this->barcode_type_code = $obj->code;
1971 $this->barcode_type_label = $obj->label;
1972 $this->barcode_type_coder = $obj->coder;
1992 return $this->fetch_projet();
2004 include_once DOL_DOCUMENT_ROOT.
'/projet/class/project.class.php';
2006 if (empty($this->fk_project) && !empty($this->fk_projet)) {
2007 $this->fk_project = $this->fk_projet;
2009 if (empty($this->fk_project)) {
2013 $project =
new Project($this->db);
2014 $result = $project->fetch($this->fk_project);
2016 $this->projet = $project;
2017 $this->project = $project;
2030 include_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
2033 if (empty($this->fk_product)) {
2037 $product =
new Product($this->db);
2039 $result = $product->fetch($this->fk_product);
2041 $this->product = $product;
2055 $user =
new User($this->db);
2056 $result = $user->fetch($userid);
2057 $this->
user = $user;
2071 $origin = $this->origin ? $this->origin : $this->origin_type;
2074 if ($origin ==
'shipping') {
2075 $origin =
'expedition';
2077 if ($origin ==
'delivery') {
2078 $origin =
'livraison';
2080 if ($origin ==
'order_supplier' || $origin ==
'supplier_order') {
2081 $origin =
'commandeFournisseur';
2084 $classname = ucfirst($origin);
2085 $this->origin_object =
new $classname($this->db);
2087 $this->origin_object->fetch($this->origin_id);
2105 $sql =
"SELECT rowid FROM ".$this->db->prefix().$table;
2106 $sql .=
" WHERE ".$field.
" = '".$this->db->escape($key).
"'";
2107 if (!empty($element)) {
2108 $sql .=
" AND entity IN (".getEntity($element).
")";
2110 $sql .=
" AND entity = ".((int) $conf->entity);
2113 dol_syslog(get_class($this).
'::fetchObjectFrom', LOG_DEBUG);
2114 $resql = $this->db->query($sql);
2116 $obj = $this->db->fetch_object($resql);
2119 if (method_exists($this,
'fetch')) {
2120 $result = $this->fetch($obj->rowid);
2122 $this->error =
'fetch() method not implemented on '.get_class($this);
2123 dol_syslog(get_class($this).
'::fetchOneLike Error='.$this->error, LOG_ERR);
2124 array_push($this->errors, $this->error);
2144 if (!empty($id) && !empty($field) && !empty($table)) {
2145 $sql =
"SELECT ".$field.
" FROM ".$this->db->prefix().$table;
2146 $sql .=
" WHERE rowid = ".((int) $id);
2148 dol_syslog(get_class($this).
'::getValueFrom', LOG_DEBUG);
2149 $resql = $this->db->query($sql);
2151 $row = $this->db->fetch_row($resql);
2174 public function setValueFrom($field, $value, $table =
'', $id =
null, $format =
'', $id_field =
'', $fuser =
null, $trigkey =
'', $fk_user_field =
'fk_user_modif')
2178 if (empty($table)) {
2179 $table = $this->table_element;
2184 if (empty($format)) {
2187 if (empty($id_field)) {
2188 $id_field =
'rowid';
2192 if ($table ==
'product' && $field ==
'note_private') {
2196 if (in_array($table, array(
'actioncomm',
'adherent',
'advtargetemailing',
'cronjob',
'establishment'))) {
2197 $fk_user_field =
'fk_user_mod';
2199 if (in_array($table, array(
'prelevement_bons'))) {
2200 $fk_user_field =
'';
2205 $sql =
"SELECT " . $field;
2206 $sql .=
" FROM " . MAIN_DB_PREFIX . $table;
2207 $sql .=
" WHERE " . $id_field .
" = " . ((int) $id);
2209 $resql = $this->db->query($sql);
2211 if ($obj = $this->db->fetch_object($resql)) {
2212 if ($format ==
'date') {
2213 $oldvalue = $this->db->jdate($obj->$field);
2215 $oldvalue = $obj->$field;
2219 $this->error = $this->db->lasterror();
2230 $sql =
"UPDATE ".$this->db->prefix().$table.
" SET ";
2232 if ($format ==
'text') {
2233 $sql .= $field.
" = '".$this->db->escape($value).
"'";
2234 } elseif ($format ==
'int') {
2235 $sql .= $field.
" = ".((int) $value);
2236 } elseif ($format ==
'date') {
2237 $sql .= $field.
" = ".($value ?
"'".$this->db->idate($value).
"'" :
"null");
2238 } elseif ($format ==
'dategmt') {
2239 $sql .= $field.
" = ".($value ?
"'".$this->db->idate($value,
'gmt').
"'" :
"null");
2242 if ($fk_user_field) {
2243 if (!empty($fuser) && is_object($fuser)) {
2244 $sql .=
", ".$fk_user_field.
" = ".((int) $fuser->id);
2245 } elseif (empty($fuser) || $fuser !=
'none') {
2246 $sql .=
", ".$fk_user_field.
" = ".((int) $user->id);
2250 $sql .=
" WHERE ".$id_field.
" = ".((int) $id);
2252 $resql = $this->db->query($sql);
2256 if (method_exists($this,
'fetch')) {
2257 $result = $this->fetch($id);
2259 $result = $this->fetchCommon($id);
2261 $this->oldcopy = clone $this;
2262 if (property_exists($this->oldcopy, $field)) {
2263 $this->oldcopy->$field = $oldvalue;
2267 $result = $this->call_trigger($trigkey, (!empty($fuser) && is_object($fuser)) ? $fuser : $user);
2275 if (property_exists($this, $field)) {
2276 $this->$field = $value;
2278 $this->db->commit();
2281 $this->db->rollback();
2285 if ($this->db->lasterrno() ==
'DB_ERROR_RECORD_ALREADY_EXISTS') {
2286 $this->error =
'DB_ERROR_RECORD_ALREADY_EXISTS';
2288 $this->error = $this->db->lasterror();
2290 $this->db->rollback();
2309 global $conf, $user;
2311 if (!$this->table_element) {
2312 dol_print_error(
null, get_class($this).
"::load_previous_next_ref was called on object with property table_element not defined");
2315 if ($fieldid ==
'none') {
2320 if (in_array($this->table_element, array(
'facture_rec',
'facture_fourn_rec')) && $fieldid ==
'title') {
2326 if ($user->socid > 0) {
2327 $socid = $user->socid;
2332 $aliastablesociete =
's';
2333 if ($this->element ==
'societe') {
2334 $aliastablesociete =
'te';
2336 $restrictiononfksoc = empty($this->restrictiononfksoc) ? 0 : $this->restrictiononfksoc;
2337 $sql =
"SELECT MAX(te.".$fieldid.
")";
2338 $sql .=
" FROM ".(empty($nodbprefix) ? $this->db->prefix() :
'').$this->table_element.
" as te";
2339 if (isset($this->ismultientitymanaged) && !is_numeric($this->ismultientitymanaged)) {
2340 $tmparray = explode(
'@', $this->ismultientitymanaged);
2341 $sql .=
", ".$this->db->prefix().$tmparray[1].
" as ".($tmparray[1] ==
'societe' ?
's' :
'parenttable');
2342 } elseif ($restrictiononfksoc == 1 && $this->element !=
'societe' && !$user->hasRight(
'societe',
'client',
'voir') && !$socid) {
2343 $sql .=
", ".$this->db->prefix().
"societe as s";
2344 } elseif ($restrictiononfksoc == 2 && $this->element !=
'societe' && !$user->hasRight(
'societe',
'client',
'voir') && !$socid) {
2345 $sql .=
" LEFT JOIN ".$this->db->prefix().
"societe as s ON te.fk_soc = s.rowid";
2347 if ($restrictiononfksoc && !$user->hasRight(
'societe',
'client',
'voir') && !$socid) {
2348 $sql .=
" LEFT JOIN ".$this->db->prefix().
"societe_commerciaux as sc ON ".$aliastablesociete.
".rowid = sc.fk_soc";
2350 if ($fieldid ==
'rowid') {
2351 $sql .=
" WHERE te.".$fieldid.
" < ".((int) $this->
id);
2353 $sql .=
" WHERE te.".$fieldid.
" < '".$this->db->escape($this->
ref).
"'";
2355 if ($restrictiononfksoc == 1 && !$user->hasRight(
'societe',
'client',
'voir') && !$socid) {
2356 $sql .=
" AND sc.fk_user = ".((int) $user->id);
2358 if ($restrictiononfksoc == 2 && !$user->hasRight(
'societe',
'client',
'voir') && !$socid) {
2359 $sql .=
" AND (sc.fk_user = ".((int) $user->id).
' OR te.fk_soc IS NULL)';
2362 $filtermax = $filter;
2367 if ($errormessage) {
2368 if (!preg_match(
'/^\s*AND/i', $filtermax)) {
2376 if (isset($this->ismultientitymanaged) && !is_numeric($this->ismultientitymanaged)) {
2377 $tmparray = explode(
'@', $this->ismultientitymanaged);
2378 $sql .=
" AND te.".$tmparray[0].
" = ".($tmparray[1] ==
"societe" ?
"s" :
"parenttable").
".rowid";
2379 } elseif ($restrictiononfksoc == 1 && $this->element !=
'societe' && !$user->hasRight(
'societe',
'client',
'voir') && !$socid) {
2380 $sql .=
' AND te.fk_soc = s.rowid';
2382 if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) {
2383 if ($this->element ==
'user' &&
getDolGlobalInt(
'MULTICOMPANY_TRANSVERSE_MODE')) {
2384 if (!empty($user->admin) && empty($user->entity) && $conf->entity == 1) {
2385 $sql .=
" AND te.entity IS NOT NULL";
2387 $sql .=
" AND te.rowid IN (SELECT ug.fk_user FROM ".$this->db->prefix().
"usergroup_user as ug WHERE ug.entity IN (".
getEntity(
'usergroup').
"))";
2390 $sql .=
' AND te.entity IN ('.getEntity($this->element).
')';
2393 if (isset($this->ismultientitymanaged) && !is_numeric($this->ismultientitymanaged) && $this->element !=
'societe') {
2394 $tmparray = explode(
'@', $this->ismultientitymanaged);
2395 $sql .=
' AND parenttable.entity IN ('.getEntity($tmparray[1]).
')';
2397 if ($restrictiononfksoc == 1 && $socid && $this->element !=
'societe') {
2398 $sql .=
' AND te.fk_soc = '.((int) $socid);
2400 if ($restrictiononfksoc == 2 && $socid && $this->element !=
'societe') {
2401 $sql .=
' AND (te.fk_soc = '.((int) $socid).
' OR te.fk_soc IS NULL)';
2403 if ($restrictiononfksoc && $socid && $this->element ==
'societe') {
2404 $sql .=
' AND te.rowid = '.((int) $socid);
2408 $result = $this->db->query($sql);
2410 $this->error = $this->db->lasterror();
2413 $row = $this->db->fetch_row($result);
2414 $this->ref_previous = $row[0];
2416 $sql =
"SELECT MIN(te.".$fieldid.
")";
2417 $sql .=
" FROM ".(empty($nodbprefix) ? $this->db->prefix() :
'').$this->table_element.
" as te";
2418 if (isset($this->ismultientitymanaged) && !is_numeric($this->ismultientitymanaged)) {
2419 $tmparray = explode(
'@', $this->ismultientitymanaged);
2420 $sql .=
", ".$this->db->prefix().$tmparray[1].
" as ".($tmparray[1] ==
'societe' ?
's' :
'parenttable');
2421 } elseif ($restrictiononfksoc == 1 && $this->element !=
'societe' && !$user->hasRight(
'societe',
'client',
'voir') && !$socid) {
2422 $sql .=
", ".$this->db->prefix().
"societe as s";
2423 } elseif ($restrictiononfksoc == 2 && $this->element !=
'societe' && !$user->hasRight(
'societe',
'client',
'voir') && !$socid) {
2424 $sql .=
" LEFT JOIN ".$this->db->prefix().
"societe as s ON te.fk_soc = s.rowid";
2426 if ($restrictiononfksoc && !$user->hasRight(
'societe',
'client',
'voir') && !$socid) {
2427 $sql .=
" LEFT JOIN ".$this->db->prefix().
"societe_commerciaux as sc ON ".$aliastablesociete.
".rowid = sc.fk_soc";
2429 if ($fieldid ==
'rowid') {
2430 $sql .=
" WHERE te.".$fieldid.
" > ".((int) $this->
id);
2432 $sql .=
" WHERE te.".$fieldid.
" > '".$this->db->escape($this->
ref).
"'";
2434 if ($restrictiononfksoc == 1 && !$user->hasRight(
'societe',
'client',
'voir') && !$socid) {
2435 $sql .=
" AND (sc.fk_user = ".((int) $user->id);
2437 $userschilds = $user->getAllChildIds();
2438 $sql .=
" OR sc.fk_user IN (".$this->db->sanitize(implode(
',', $userschilds)).
")";
2442 if ($restrictiononfksoc == 2 && !$user->hasRight(
'societe',
'client',
'voir') && !$socid) {
2443 $sql .=
" AND (sc.fk_user = ".((int) $user->id).
' OR te.fk_soc IS NULL)';
2446 $filtermin = $filter;
2451 if ($errormessage) {
2452 if (!preg_match(
'/^\s*AND/i', $filtermin)) {
2462 if (isset($this->ismultientitymanaged) && !is_numeric($this->ismultientitymanaged)) {
2463 $tmparray = explode(
'@', $this->ismultientitymanaged);
2464 $sql .=
" AND te.".$tmparray[0].
" = ".($tmparray[1] ==
"societe" ?
"s" :
"parenttable").
".rowid";
2465 } elseif ($restrictiononfksoc == 1 && $this->element !=
'societe' && !$user->hasRight(
'societe',
'client',
'voir') && !$socid) {
2466 $sql .=
' AND te.fk_soc = s.rowid';
2468 if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) {
2469 if ($this->element ==
'user' &&
getDolGlobalInt(
'MULTICOMPANY_TRANSVERSE_MODE')) {
2470 if (!empty($user->admin) && empty($user->entity) && $conf->entity == 1) {
2471 $sql .=
" AND te.entity IS NOT NULL";
2473 $sql .=
" AND te.rowid IN (SELECT ug.fk_user FROM ".$this->db->prefix().
"usergroup_user as ug WHERE ug.entity IN (".
getEntity(
'usergroup').
"))";
2476 $sql .=
' AND te.entity IN ('.getEntity($this->element).
')';
2479 if (isset($this->ismultientitymanaged) && !is_numeric($this->ismultientitymanaged) && $this->element !=
'societe') {
2480 $tmparray = explode(
'@', $this->ismultientitymanaged);
2481 $sql .=
' AND parenttable.entity IN ('.getEntity($tmparray[1]).
')';
2483 if ($restrictiononfksoc == 1 && $socid && $this->element !=
'societe') {
2484 $sql .=
' AND te.fk_soc = '.((int) $socid);
2486 if ($restrictiononfksoc == 2 && $socid && $this->element !=
'societe') {
2487 $sql .=
' AND (te.fk_soc = '.((int) $socid).
' OR te.fk_soc IS NULL)';
2489 if ($restrictiononfksoc && $socid && $this->element ==
'societe') {
2490 $sql .=
' AND te.rowid = '.((int) $socid);
2495 $result = $this->db->query($sql);
2497 $this->error = $this->db->lasterror();
2500 $row = $this->db->fetch_row($result);
2501 $this->ref_next = $row[0];
2516 $contactAlreadySelected = array();
2517 $tab = $this->liste_contact(-1, $source);
2521 if ($source ==
'thirdparty') {
2522 $contactAlreadySelected[$i] = $tab[$i][
'socid'];
2524 $contactAlreadySelected[$i] = $tab[$i][
'id'];
2528 return $contactAlreadySelected;
2544 if (!$this->table_element) {
2545 dol_syslog(get_class($this).
"::setProject was called on object with property table_element not defined", LOG_ERR);
2549 $sql =
"UPDATE ".$this->db->prefix().$this->table_element;
2550 if (!empty($this->fields[
'fk_project'])) {
2552 $sql .=
" SET fk_project = ".((int) $projectid);
2554 $sql .=
" SET fk_project = NULL";
2556 $sql .=
' WHERE rowid = '.((int) $this->
id);
2557 } elseif ($this->table_element ==
'actioncomm') {
2559 $sql .=
" SET fk_project = ".((int) $projectid);
2561 $sql .=
" SET fk_project = NULL";
2563 $sql .=
' WHERE id = '.((int) $this->
id);
2566 $sql .=
' SET fk_projet = '.((int) $projectid);
2568 $sql .=
' SET fk_projet = NULL';
2570 $sql .=
" WHERE rowid = ".((int) $this->
id);
2575 dol_syslog(get_class($this).
"::setProject", LOG_DEBUG);
2576 if ($this->db->query($sql)) {
2577 $this->fk_project = ((int) $projectid);
2584 if (!$error && !$notrigger) {
2586 $result = $this->call_trigger(strtoupper($this->element) .
'_MODIFY', $user);
2595 $this->db->rollback();
2598 $this->db->commit();
2616 dol_syslog(get_class($this).
'::setPaymentMethods('.$id.
')');
2618 if ($this->
status >= 0 || $this->element ==
'societe') {
2620 $fieldname =
'fk_mode_reglement';
2621 if ($this->element ==
'societe') {
2622 $fieldname =
'mode_reglement';
2624 if (get_class($this) ==
'Fournisseur') {
2625 $fieldname =
'mode_reglement_supplier';
2627 if (get_class($this) ==
'Tva') {
2628 $fieldname =
'fk_typepayment';
2630 if (get_class($this) ==
'Salary') {
2631 $fieldname =
'fk_typepayment';
2634 $sql =
"UPDATE ".$this->db->prefix().$this->table_element;
2635 $sql .=
" SET ".$fieldname.
" = ".(($id > 0 || $id ==
'0') ? ((
int) $id) :
'NULL');
2636 $sql .=
' WHERE rowid='.((int) $this->
id);
2638 if ($this->db->query($sql)) {
2639 $this->mode_reglement_id = $id;
2641 if (get_class($this) ==
'Fournisseur') {
2642 $this->mode_reglement_supplier_id = $id;
2645 if (!$error && !$notrigger) {
2647 if (get_class($this) ==
'Commande') {
2648 $result = $this->call_trigger(
'ORDER_MODIFY', $user);
2650 $result = $this->call_trigger(strtoupper(get_class($this)).
'_MODIFY', $user);
2659 dol_syslog(get_class($this).
'::setPaymentMethods Error '.$this->db->error());
2660 $this->error = $this->db->error();
2664 dol_syslog(get_class($this).
'::setPaymentMethods, status of the object is incompatible');
2665 $this->error =
'Status of the object is incompatible '.$this->status;
2678 dol_syslog(get_class($this).
'::setMulticurrencyCode('.$code.
')');
2679 if ($this->
status >= 0 || $this->element ==
'societe') {
2680 $fieldname =
'multicurrency_code';
2682 $sql =
'UPDATE '.$this->db->prefix().$this->table_element;
2683 $sql .=
" SET ".$fieldname.
" = '".$this->db->escape($code).
"'";
2684 $sql .=
' WHERE rowid='.((int) $this->
id);
2686 if ($this->db->query($sql)) {
2687 $this->multicurrency_code = $code;
2691 $this->setMulticurrencyRate($rate, 2);
2696 dol_syslog(get_class($this).
'::setMulticurrencyCode Error '.$sql.
' - '.$this->db->error());
2697 $this->error = $this->db->error();
2701 dol_syslog(get_class($this).
'::setMulticurrencyCode, status of the object is incompatible');
2702 $this->error =
'Status of the object is incompatible '.$this->status;
2714 public function setMulticurrencyRate($rate, $mode = 1)
2716 dol_syslog(get_class($this).
'::setMulticurrencyRate('.$rate.
', '.$mode.
')');
2717 if ($this->
status >= 0 || $this->element ==
'societe') {
2718 $fieldname =
'multicurrency_tx';
2720 $sql =
'UPDATE '.$this->db->prefix().$this->table_element;
2721 $sql .=
" SET ".$fieldname.
" = ".((float) $rate);
2722 $sql .=
' WHERE rowid='.((int) $this->
id);
2724 if ($this->db->query($sql)) {
2725 $this->multicurrency_tx = $rate;
2728 if (!empty($this->lines)) {
2729 foreach ($this->lines as &$line) {
2732 $line->subprice = 0;
2737 $line->multicurrency_subprice = 0;
2740 switch ($this->element) {
2748 $line->remise_percent,
2750 $line->localtax1_tx,
2751 $line->localtax2_tx,
2752 ($line->description ? $line->description : $line->desc),
2755 $line->special_code,
2756 $line->fk_parent_line,
2757 $line->skip_update_total,
2758 $line->fk_fournprice,
2761 $line->product_type,
2764 $line->array_options,
2766 $line->multicurrency_subprice
2774 ($line->description ? $line->description : $line->desc),
2777 $line->remise_percent,
2779 $line->localtax1_tx,
2780 $line->localtax2_tx,
2785 $line->product_type,
2786 $line->fk_parent_line,
2787 $line->skip_update_total,
2788 $line->fk_fournprice,
2791 $line->special_code,
2792 $line->array_options,
2794 $line->multicurrency_subprice
2802 ($line->description ? $line->description : $line->desc),
2805 $line->remise_percent,
2809 $line->localtax1_tx,
2810 $line->localtax2_tx,
2813 $line->product_type,
2814 $line->fk_parent_line,
2815 $line->skip_update_total,
2816 $line->fk_fournprice,
2819 $line->special_code,
2820 $line->array_options,
2821 $line->situation_percent,
2823 $line->multicurrency_subprice
2826 case 'supplier_proposal':
2833 $line->remise_percent,
2835 $line->localtax1_tx,
2836 $line->localtax2_tx,
2837 ($line->description ? $line->description : $line->desc),
2840 $line->special_code,
2841 $line->fk_parent_line,
2842 $line->skip_update_total,
2843 $line->fk_fournprice,
2846 $line->product_type,
2847 $line->array_options,
2849 $line->multicurrency_subprice
2852 case 'order_supplier':
2857 ($line->description ? $line->description : $line->desc),
2860 $line->remise_percent,
2862 $line->localtax1_tx,
2863 $line->localtax2_tx,
2866 $line->product_type,
2870 $line->array_options,
2872 $line->multicurrency_subprice,
2876 case 'invoice_supplier':
2881 ($line->description ? $line->description : $line->desc),
2884 $line->localtax1_tx,
2885 $line->localtax2_tx,
2890 $line->product_type,
2891 $line->remise_percent,
2895 $line->array_options,
2897 $line->multicurrency_subprice,
2902 dol_syslog(get_class($this).
'::setMulticurrencyRate no updateline defined', LOG_DEBUG);
2910 dol_syslog(get_class($this).
'::setMulticurrencyRate Error '.$sql.
' - '.$this->db->error());
2911 $this->error = $this->db->error();
2915 dol_syslog(get_class($this).
'::setMulticurrencyRate, status of the object is incompatible');
2916 $this->error =
'Status of the object is incompatible '.$this->status;
2930 dol_syslog(get_class($this).
'::setPaymentTerms('.$id.
', '.var_export($deposit_percent,
true).
')');
2931 if ($this->
status >= 0 || $this->element ==
'societe') {
2933 $fieldname =
'fk_cond_reglement';
2934 if ($this->element ==
'societe') {
2935 $fieldname =
'cond_reglement';
2937 if (get_class($this) ==
'Fournisseur') {
2938 $fieldname =
'cond_reglement_supplier';
2941 if (empty($deposit_percent) || $deposit_percent < 0) {
2942 $deposit_percent = (float)
getDictionaryValue(
'c_payment_term',
'deposit_percent', $id);
2945 if ($deposit_percent > 100) {
2946 $deposit_percent = 100;
2949 $sql =
'UPDATE '.$this->db->prefix().$this->table_element;
2950 $sql .=
" SET ".$fieldname.
" = ".(($id > 0 || $id ==
'0') ? ((
int) $id) :
'NULL');
2951 if (in_array($this->table_element, array(
'propal',
'commande',
'societe'))) {
2952 $sql .=
" , deposit_percent = " . (empty($deposit_percent) ?
'NULL' :
"'".$this->db->escape($deposit_percent).
"'");
2954 $sql .=
' WHERE rowid='.((int) $this->
id);
2956 if ($this->db->query($sql)) {
2957 $this->cond_reglement_id = $id;
2959 if (get_class($this) ==
'Fournisseur') {
2960 $this->cond_reglement_supplier_id = $id;
2962 $this->cond_reglement = $id;
2963 $this->deposit_percent = $deposit_percent;
2966 dol_syslog(get_class($this).
'::setPaymentTerms Error '.$sql.
' - '.$this->db->error());
2967 $this->error = $this->db->error();
2971 dol_syslog(get_class($this).
'::setPaymentTerms, status of the object is incompatible');
2972 $this->error =
'Status of the object is incompatible '.$this->status;
2985 dol_syslog(get_class($this).
'::setTransportMode('.$id.
')');
2986 if ($this->
status >= 0 || $this->element ==
'societe') {
2987 $fieldname =
'fk_transport_mode';
2988 if ($this->element ==
'societe') {
2989 $fieldname =
'transport_mode';
2991 if (get_class($this) ==
'Fournisseur') {
2992 $fieldname =
'transport_mode_supplier';
2995 $sql =
'UPDATE '.$this->db->prefix().$this->table_element;
2996 $sql .=
" SET ".$fieldname.
" = ".(($id > 0 || $id ==
'0') ? ((
int) $id) :
'NULL');
2997 $sql .=
' WHERE rowid='.((int) $this->
id);
2999 if ($this->db->query($sql)) {
3000 $this->transport_mode_id = $id;
3002 if (get_class($this) ==
'Fournisseur') {
3003 $this->transport_mode_supplier_id = $id;
3007 dol_syslog(get_class($this).
'::setTransportMode Error '.$sql.
' - '.$this->db->error());
3008 $this->error = $this->db->error();
3012 dol_syslog(get_class($this).
'::setTransportMode, status of the object is incompatible');
3013 $this->error =
'Status of the object is incompatible '.$this->status;
3026 dol_syslog(get_class($this).
'::setRetainedWarrantyPaymentTerms('.$id.
')');
3027 if ($this->
status >= 0 || $this->element ==
'societe') {
3028 $fieldname =
'retained_warranty_fk_cond_reglement';
3030 $sql =
'UPDATE '.$this->db->prefix().$this->table_element;
3031 $sql .=
" SET ".$fieldname.
" = ".((int) $id);
3032 $sql .=
' WHERE rowid='.((int) $this->
id);
3034 if ($this->db->query($sql)) {
3035 $this->retained_warranty_fk_cond_reglement = $id;
3038 dol_syslog(get_class($this).
'::setRetainedWarrantyPaymentTerms Error '.$sql.
' - '.$this->db->error());
3039 $this->error = $this->db->error();
3043 dol_syslog(get_class($this).
'::setRetainedWarrantyPaymentTerms, status of the object is incompatible');
3044 $this->error =
'Status of the object is incompatible '.$this->status;
3058 $fieldname =
'fk_delivery_address';
3059 if ($this->element ==
'delivery' || $this->element ==
'shipping') {
3060 $fieldname =
'fk_address';
3063 $sql =
"UPDATE ".$this->db->prefix().$this->table_element.
" SET ".$fieldname.
" = ".((int) $id);
3064 $sql .=
" WHERE rowid = ".((int) $this->
id).
" AND fk_statut = 0";
3066 if ($this->db->query($sql)) {
3067 $this->fk_delivery_address = $id;
3070 $this->error = $this->db->error();
3071 dol_syslog(get_class($this).
'::setDeliveryAddress Error '.$this->error);
3089 if (empty($userused)) {
3095 if (!$this->table_element) {
3096 dol_syslog(get_class($this).
"::setShippingMethod was called on object with property table_element not defined", LOG_ERR);
3102 if ($shipping_method_id < 0) {
3103 $shipping_method_id =
'NULL';
3105 dol_syslog(get_class($this).
'::setShippingMethod('.$shipping_method_id.
')');
3107 $sql =
"UPDATE ".$this->db->prefix().$this->table_element;
3108 $sql .=
" SET fk_shipping_method = ".((int) $shipping_method_id);
3109 $sql .=
" WHERE rowid=".((int) $this->
id);
3110 $resql = $this->db->query($sql);
3112 dol_syslog(get_class($this).
'::setShippingMethod Error ', LOG_DEBUG);
3113 $this->error = $this->db->lasterror();
3118 $this->context = array(
'shippingmethodupdate' => 1);
3119 $result = $this->call_trigger(strtoupper(get_class($this)).
'_MODIFY', $userused);
3127 $this->db->rollback();
3130 $this->shipping_method_id = ($shipping_method_id ==
'NULL') ?
null : $shipping_method_id;
3131 $this->db->commit();
3145 if (!$this->table_element) {
3146 dol_syslog(get_class($this).
"::setWarehouse was called on object with property table_element not defined", LOG_ERR);
3149 if ($warehouse_id < 0) {
3150 $warehouse_id =
'NULL';
3152 dol_syslog(get_class($this).
'::setWarehouse('.$warehouse_id.
')');
3154 $sql =
"UPDATE ".$this->db->prefix().$this->table_element;
3155 $sql .=
" SET fk_warehouse = ".((int) $warehouse_id);
3156 $sql .=
" WHERE rowid=".((int) $this->
id);
3158 if ($this->db->query($sql)) {
3159 $this->warehouse_id = ($warehouse_id ==
'NULL') ?
null : $warehouse_id;
3162 dol_syslog(get_class($this).
'::setWarehouse Error ', LOG_DEBUG);
3163 $this->error = $this->db->error();
3178 if (!$this->table_element) {
3179 dol_syslog(get_class($this).
"::setDocModel was called on object with property table_element not defined", LOG_ERR);
3183 $newmodelpdf =
dol_trunc($modelpdf, 255);
3185 $sql =
"UPDATE ".$this->db->prefix().$this->table_element;
3186 $sql .=
" SET model_pdf = '".$this->db->escape($newmodelpdf).
"'";
3187 $sql .=
" WHERE rowid = ".((int) $this->
id);
3189 dol_syslog(get_class($this).
"::setDocModel", LOG_DEBUG);
3190 $resql = $this->db->query($sql);
3192 $this->model_pdf = $modelpdf;
3213 if (empty($userused)) {
3219 if (!$this->table_element) {
3220 dol_syslog(get_class($this).
"::setBankAccount was called on object with property table_element not defined", LOG_ERR);
3225 if ($fk_account < 0) {
3226 $fk_account =
'NULL';
3228 dol_syslog(get_class($this).
'::setBankAccount('.$fk_account.
')');
3230 $sql =
"UPDATE ".$this->db->prefix().$this->table_element;
3231 $sql .=
" SET fk_account = ".((int) $fk_account);
3232 $sql .=
" WHERE rowid=".((int) $this->
id);
3234 $resql = $this->db->query($sql);
3236 dol_syslog(get_class($this).
'::setBankAccount Error '.$sql.
' - '.$this->db->error());
3237 $this->error = $this->db->lasterror();
3242 $this->context[
'bankaccountupdate'] = 1;
3243 $triggerName = strtoupper(get_class($this)).
'_MODIFY';
3245 if ($triggerName ==
'FACTUREREC_MODIFY') {
3246 $triggerName =
'BILLREC_MODIFY';
3248 $result = $this->call_trigger($triggerName, $userused);
3256 $this->db->rollback();
3259 $this->fk_account = ($fk_account ==
'NULL') ?
null : $fk_account;
3260 $this->db->commit();
3278 public function line_order($renum =
false, $rowidorder =
'ASC', $fk_parent_line =
true)
3281 if (!$this->table_element_line) {
3282 dol_syslog(get_class($this).
"::line_order was called on object with property table_element_line not defined", LOG_ERR);
3285 if (!$this->fk_element) {
3286 dol_syslog(get_class($this).
"::line_order was called on object with property fk_element not defined", LOG_ERR);
3290 $fieldposition =
'rang';
3291 if (in_array($this->table_element_line, array(
'bom_bomline',
'ecm_files',
'emailcollector_emailcollectoraction',
'product_attribute_value'))) {
3292 $fieldposition =
'position';
3297 $sql =
"SELECT count(rowid) FROM ".$this->db->prefix().$this->table_element_line;
3298 $sql .=
" WHERE ".$this->fk_element.
" = ".((int) $this->
id);
3300 $sql .=
" AND " . $fieldposition .
" = 0";
3303 $sql .=
" AND " . $fieldposition .
" <> 0";
3306 dol_syslog(get_class($this).
"::line_order", LOG_DEBUG);
3307 $resql = $this->db->query($sql);
3309 $row = $this->db->fetch_row($resql);
3319 $sql =
"SELECT rowid FROM ".$this->db->prefix().$this->table_element_line;
3320 $sql .=
" WHERE ".$this->fk_element.
" = ".((int) $this->
id);
3321 if ($fk_parent_line) {
3322 $sql .=
' AND fk_parent_line IS NULL';
3324 $sql .=
" ORDER BY " . $fieldposition .
" ASC, rowid " . $rowidorder;
3326 dol_syslog(get_class($this).
"::line_order search all parent lines", LOG_DEBUG);
3327 $resql = $this->db->query($sql);
3330 $num = $this->db->num_rows($resql);
3332 $row = $this->db->fetch_row($resql);
3334 $children = $this->getChildrenOfLine($row[0]);
3335 if (!empty($children)) {
3336 foreach ($children as $child) {
3337 array_push($rows, $child);
3344 if (!empty($rows)) {
3345 foreach ($rows as $key => $row) {
3346 $this->updateRangOfLine($row, ($key + 1));
3365 $fieldposition =
'rang';
3366 if (in_array($this->table_element_line, array(
'bom_bomline',
'ecm_files',
'emailcollector_emailcollectoraction',
'product_attribute_value'))) {
3367 $fieldposition =
'position';
3372 $sql =
"SELECT rowid FROM ".$this->db->prefix().$this->table_element_line;
3373 $sql .=
" WHERE ".$this->fk_element.
" = ".((int) $this->
id);
3374 $sql .=
' AND fk_parent_line = '.((int) $id);
3375 $sql .=
" ORDER BY " . $fieldposition .
" ASC";
3377 dol_syslog(get_class($this).
"::getChildrenOfLine search children lines for line ".$id, LOG_DEBUG);
3378 $resql = $this->db->query($sql);
3380 if ($this->db->num_rows($resql) > 0) {
3381 while ($row = $this->db->fetch_row($resql)) {
3383 if ($includealltree) {
3384 $rows = array_merge($rows, $this->getChildrenOfLine($row[0], $includealltree));
3400 public function line_up($rowid, $fk_parent_line =
true)
3403 $this->line_order(
false,
'ASC', $fk_parent_line);
3406 $rang = $this->getRangOfLine($rowid);
3409 $this->updateLineUp($rowid, $rang);
3423 $this->line_order(
false,
'ASC', $fk_parent_line);
3426 $rang = $this->getRangOfLine($rowid);
3429 $max = $this->line_max();
3432 $this->updateLineDown($rowid, $rang, $max);
3444 global $hookmanager;
3445 $fieldposition =
'rang';
3446 if (in_array($this->table_element_line, array(
'bom_bomline',
'ecm_files',
'emailcollector_emailcollectoraction',
'product_attribute_value'))) {
3447 $fieldposition =
'position';
3450 $sql =
"UPDATE ".$this->db->prefix().$this->table_element_line.
" SET ".$fieldposition.
" = ".((int) $rang);
3451 $sql .=
' WHERE rowid = '.((int) $rowid);
3453 dol_syslog(get_class($this).
"::updateRangOfLine", LOG_DEBUG);
3454 if (!$this->db->query($sql)) {
3458 $parameters = array(
'rowid' => $rowid,
'rang' => $rang,
'fieldposition' => $fieldposition);
3460 $reshook = $hookmanager->executeHooks(
'afterRankOfLineUpdate', $parameters, $this, $action);
3475 $num = count($rows);
3476 for ($i = 0; $i < $num; $i++) {
3477 $this->updateRangOfLine($rows[$i], ($i + 1));
3491 $fieldposition =
'rang';
3492 if (in_array($this->table_element_line, array(
'ecm_files',
'emailcollector_emailcollectoraction',
'product_attribute_value'))) {
3493 $fieldposition =
'position';
3496 $sql =
"UPDATE ".$this->db->prefix().$this->table_element_line.
" SET ".$fieldposition.
" = ".((int) $rang);
3497 $sql .=
" WHERE ".$this->fk_element.
" = ".((int) $this->
id);
3498 $sql .=
" AND " . $fieldposition .
" = " . ((int) ($rang - 1));
3499 if ($this->db->query($sql)) {
3500 $sql =
"UPDATE ".$this->db->prefix().$this->table_element_line.
" SET ".$fieldposition.
" = ".((int) ($rang - 1));
3501 $sql .=
' WHERE rowid = '.((int) $rowid);
3502 if (!$this->db->query($sql)) {
3522 $fieldposition =
'rang';
3523 if (in_array($this->table_element_line, array(
'ecm_files',
'emailcollector_emailcollectoraction',
'product_attribute_value'))) {
3524 $fieldposition =
'position';
3527 $sql =
"UPDATE ".$this->db->prefix().$this->table_element_line.
" SET ".$fieldposition.
" = ".((int) $rang);
3528 $sql .=
" WHERE ".$this->fk_element.
" = ".((int) $this->
id);
3529 $sql .=
" AND " . $fieldposition .
" = " . ((int) ($rang + 1));
3530 if ($this->db->query($sql)) {
3531 $sql =
"UPDATE ".$this->db->prefix().$this->table_element_line.
" SET ".$fieldposition.
" = ".((int) ($rang + 1));
3532 $sql .=
' WHERE rowid = '.((int) $rowid);
3533 if (!$this->db->query($sql)) {
3550 $fieldposition =
'rang';
3551 if (in_array($this->table_element_line, array(
'ecm_files',
'emailcollector_emailcollectoraction',
'product_attribute_value'))) {
3552 $fieldposition =
'position';
3555 $sql =
"SELECT " . $fieldposition .
" FROM ".$this->db->prefix().$this->table_element_line;
3556 $sql .=
" WHERE rowid = ".((int) $rowid);
3558 dol_syslog(get_class($this).
"::getRangOfLine", LOG_DEBUG);
3559 $resql = $this->db->query($sql);
3561 $row = $this->db->fetch_row($resql);
3576 $fieldposition =
'rang';
3577 if (in_array($this->table_element_line, array(
'ecm_files',
'emailcollector_emailcollectoraction',
'product_attribute_value'))) {
3578 $fieldposition =
'position';
3581 $sql =
"SELECT rowid FROM ".$this->db->prefix().$this->table_element_line;
3582 $sql .=
" WHERE ".$this->fk_element.
" = ".((int) $this->
id);
3583 $sql .=
" AND " . $fieldposition .
" = ".((int) $rang);
3584 $resql = $this->db->query($sql);
3586 $row = $this->db->fetch_row($resql);
3603 $positionfield =
'rang';
3604 if (in_array($this->table_element, array(
'bom_bom',
'product_attribute'))) {
3605 $positionfield =
'position';
3609 if ($fk_parent_line) {
3610 $sql =
"SELECT max(".$positionfield.
") FROM ".$this->db->prefix().$this->table_element_line;
3611 $sql .=
" WHERE ".$this->fk_element.
" = ".((int) $this->
id);
3612 $sql .=
" AND fk_parent_line = ".((int) $fk_parent_line);
3614 dol_syslog(get_class($this).
"::line_max", LOG_DEBUG);
3615 $resql = $this->db->query($sql);
3617 $row = $this->db->fetch_row($resql);
3618 if (!empty($row[0])) {
3621 return $this->getRangOfLine($fk_parent_line);
3626 $sql =
"SELECT max(".$positionfield.
") FROM ".$this->db->prefix().$this->table_element_line;
3627 $sql .=
" WHERE ".$this->fk_element.
" = ".((int) $this->
id);
3629 dol_syslog(get_class($this).
"::line_max", LOG_DEBUG);
3630 $resql = $this->db->query($sql);
3632 $row = $this->db->fetch_row($resql);
3650 if (!$this->table_element) {
3651 dol_syslog(get_class($this).
"::update_ref_ext was called on object with property table_element not defined", LOG_ERR);
3655 $sql =
"UPDATE ".$this->db->prefix().$this->table_element;
3656 $sql .=
" SET ref_ext = '".$this->db->escape($ref_ext).
"'";
3657 $sql .=
" WHERE ".(isset($this->table_rowid) ? $this->table_rowid :
'rowid').
" = ".((
int) $this->id);
3659 dol_syslog(get_class($this).
"::update_ref_ext", LOG_DEBUG);
3660 if ($this->db->query($sql)) {
3661 $this->ref_ext = $ref_ext;
3664 $this->error = $this->db->error();
3683 if (!$this->table_element) {
3684 $this->error =
'update_note was called on object with property table_element not defined';
3685 dol_syslog(get_class($this).
"::update_note was called on object with property table_element not defined", LOG_ERR);
3688 if (!in_array($suffix, array(
'',
'_public',
'_private'))) {
3689 $this->error =
'update_note Parameter suffix must be empty, \'_private\' or \'_public\'';
3690 dol_syslog(get_class($this).
"::update_note Parameter suffix must be empty, '_private' or '_public'", LOG_ERR);
3694 $newsuffix = $suffix;
3697 if ($this->table_element ==
'product' && $newsuffix ==
'_private') {
3700 if (in_array($this->table_element, array(
'actioncomm',
'adherent',
'advtargetemailing',
'cronjob',
'establishment'))) {
3701 $fieldusermod =
"fk_user_mod";
3702 } elseif ($this->table_element ==
'ecm_files') {
3703 $fieldusermod =
"fk_user_m";
3705 $fieldusermod =
"fk_user_modif";
3707 $sql =
"UPDATE ".$this->db->prefix().$this->table_element;
3708 $sql .=
" SET note".$newsuffix.
" = ".(!empty($note) ? (
"'".$this->db->escape($note).
"'") :
"NULL");
3709 $sql .=
", ".$fieldusermod.
" = ".((int) $user->id);
3710 $sql .=
" WHERE rowid = ".((int) $this->
id);
3712 dol_syslog(get_class($this).
"::update_note", LOG_DEBUG);
3713 if ($this->db->query($sql)) {
3714 if ($suffix ==
'_public') {
3715 $this->note_public = $note;
3716 } elseif ($suffix ==
'_private') {
3717 $this->note_private = $note;
3719 $this->note = $note;
3720 $this->note_private = $note;
3722 if (empty($notrigger)) {
3723 switch ($this->element) {
3725 $trigger_name =
'COMPANY_MODIFY';
3728 $trigger_name =
'ORDER_MODIFY';
3731 $trigger_name =
'BILL_MODIFY';
3733 case 'invoice_supplier':
3734 $trigger_name =
'BILL_SUPPLIER_MODIFY';
3737 $trigger_name =
'BILLREC_MODIFIY';
3739 case 'expensereport':
3740 $trigger_name =
'EXPENSE_REPORT_MODIFY';
3743 $trigger_name = strtoupper($this->element) .
'_MODIFY';
3745 $ret = $this->call_trigger($trigger_name, $user);
3752 $this->error = $this->db->lasterror();
3769 return $this->update_note($note,
'_public');
3783 public function update_price($exclspec = 0, $roundingadjust =
'auto', $nodatabaseupdate = 0, $seller =
null)
3786 global $conf, $hookmanager, $action;
3788 $parameters = array(
'exclspec' => $exclspec,
'roundingadjust' => $roundingadjust,
'nodatabaseupdate' => $nodatabaseupdate,
'seller' => $seller);
3789 $reshook = $hookmanager->executeHooks(
'updateTotalPrice', $parameters, $this, $action);
3792 } elseif ($reshook < 0) {
3797 $isElementForSupplier =
false;
3798 $roundTotalConstName =
'MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND';
3800 if ($this->element ==
'propal') {
3801 $MODULE =
"MODULE_DISALLOW_UPDATE_PRICE_PROPOSAL";
3802 } elseif ($this->element ==
'commande' || $this->element ==
'order') {
3803 $MODULE =
"MODULE_DISALLOW_UPDATE_PRICE_ORDER";
3804 } elseif ($this->element ==
'facture' || $this->element ==
'invoice') {
3805 $MODULE =
"MODULE_DISALLOW_UPDATE_PRICE_INVOICE";
3806 } elseif ($this->element ==
'facture_fourn' || $this->element ==
'supplier_invoice' || $this->element ==
'invoice_supplier' || $this->element ==
'invoice_supplier_rec') {
3807 $isElementForSupplier =
true;
3808 $MODULE =
"MODULE_DISALLOW_UPDATE_PRICE_SUPPLIER_INVOICE";
3809 } elseif ($this->element ==
'order_supplier' || $this->element ==
'supplier_order') {
3810 $isElementForSupplier =
true;
3811 $MODULE =
"MODULE_DISALLOW_UPDATE_PRICE_SUPPLIER_ORDER";
3812 } elseif ($this->element ==
'supplier_proposal') {
3813 $isElementForSupplier =
true;
3814 $MODULE =
"MODULE_DISALLOW_UPDATE_PRICE_SUPPLIER_PROPOSAL";
3816 if ($isElementForSupplier) {
3817 $roundTotalConstName =
'MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND_SUPPLIER';
3820 if (!empty($MODULE)) {
3823 foreach ($modsactivated as $mod) {
3824 if (isModEnabled($mod)) {
3831 include_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
3833 $forcedroundingmode = $roundingadjust;
3834 if ($forcedroundingmode ==
'auto' && isset($conf->global->{$roundTotalConstName})) {
3836 } elseif ($forcedroundingmode ==
'auto') {
3837 $forcedroundingmode =
'0';
3842 $multicurrency_tx = !empty($this->multicurrency_tx) ? $this->multicurrency_tx : 1;
3845 $fieldtva =
'total_tva';
3846 $fieldlocaltax1 =
'total_localtax1';
3847 $fieldlocaltax2 =
'total_localtax2';
3848 $fieldup =
'subprice';
3849 $base_price_type =
'HT';
3850 if ($this->element ==
'facture_fourn' || $this->element ==
'invoice_supplier') {
3854 if ($this->element ==
'invoice_supplier_rec') {
3857 if ($this->element ==
'expensereport') {
3861 $forcedroundingmode =
'0';
3862 $fieldup =
'value_unit';
3863 $base_price_type =
'TTC';
3866 $sql =
"SELECT rowid, qty, ".$fieldup.
" as up, remise_percent, total_ht, ".$fieldtva.
" as total_tva, total_ttc, ".$fieldlocaltax1.
" as total_localtax1, ".$fieldlocaltax2.
" as total_localtax2,";
3867 $sql .=
' tva_tx as vatrate, localtax1_tx, localtax2_tx, localtax1_type, localtax2_type, info_bits, product_type';
3868 if ($this->table_element_line ==
'facturedet') {
3869 $sql .=
', situation_percent';
3871 $sql .=
', multicurrency_total_ht, multicurrency_total_tva, multicurrency_total_ttc';
3872 $sql .=
" FROM ".$this->db->prefix().$this->table_element_line;
3873 $sql .=
" WHERE ".$this->fk_element.
" = ".((int) $this->
id);
3875 $product_field =
'product_type';
3876 if ($this->table_element_line ==
'contratdet') {
3877 $product_field =
'';
3879 if ($product_field) {
3880 $sql .=
" AND ".$product_field.
" <> 9";
3883 $sql .=
' ORDER by rowid';
3885 dol_syslog(get_class($this).
"::update_price", LOG_DEBUG);
3887 $resql = $this->db->query($sql);
3889 $this->total_ht = 0;
3890 $this->total_tva = 0;
3891 $this->total_localtax1 = 0;
3892 $this->total_localtax2 = 0;
3893 $this->total_ttc = 0;
3894 $total_ht_by_vats = array();
3895 $total_tva_by_vats = array();
3896 $total_ttc_by_vats = array();
3897 $this->multicurrency_total_ht = 0;
3898 $this->multicurrency_total_tva = 0;
3899 $this->multicurrency_total_ttc = 0;
3903 $num = $this->db->num_rows($resql);
3906 $obj = $this->db->fetch_object($resql);
3909 $parameters = array(
'fk_element' => $obj->rowid);
3910 $reshook = $hookmanager->executeHooks(
'changeRoundingMode', $parameters, $this, $action);
3912 if (empty($reshook) && $forcedroundingmode ==
'0') {
3914 $localtax_array = array($obj->localtax1_type, $obj->localtax1_tx, $obj->localtax2_type, $obj->localtax2_tx);
3915 $tmpcal =
calcul_price_total($obj->qty, $obj->up, $obj->remise_percent, $obj->vatrate, $obj->localtax1_tx, $obj->localtax2_tx, 0, $base_price_type, $obj->info_bits, $obj->product_type, $seller, $localtax_array, (isset($obj->situation_percent) ? $obj->situation_percent : 100), $multicurrency_tx);
3917 $diff_when_using_price_ht =
price2num($tmpcal[1] - $obj->total_tva,
'MT', 1);
3918 $diff_on_current_total =
price2num($obj->total_ttc - $obj->total_ht - $obj->total_tva - $obj->total_localtax1 - $obj->total_localtax2,
'MT', 1);
3922 if ($diff_on_current_total) {
3924 $sqlfix =
"UPDATE ".$this->db->prefix().$this->table_element_line.
" SET ".$fieldtva.
" = ".
price2num((
float) $tmpcal[1]).
", total_ttc = ".
price2num((
float) $tmpcal[2]).
" WHERE rowid = ".((int) $obj->rowid);
3925 dol_syslog(
'We found inconsistent data into detailed line (diff_on_current_total = '.$diff_on_current_total.
') for line rowid = '.$obj->rowid.
" (ht=".$obj->total_ht.
" vat=".$obj->total_tva.
" tax1=".$obj->total_localtax1.
" tax2=".$obj->total_localtax2.
" ttc=".$obj->total_ttc.
"). We fix the total_vat and total_ttc of line by running sqlfix = ".$sqlfix, LOG_WARNING);
3926 $resqlfix = $this->db->query($sqlfix);
3930 $obj->total_tva = $tmpcal[1];
3931 $obj->total_ttc = $tmpcal[2];
3932 } elseif ($diff_when_using_price_ht) {
3935 $sqlfix =
"UPDATE ".$this->db->prefix().$this->table_element_line.
" SET ".$fieldtva.
" = ".
price2num((
float) $tmpcal[1]).
", total_ttc = ".
price2num((
float) $tmpcal[2]).
" WHERE rowid = ".((int) $obj->rowid);
3936 dol_syslog(
'We found a line with different rounding data into detailed line (diff_when_using_price_ht = '.$diff_when_using_price_ht.
' and diff_on_current_total = '.$diff_on_current_total.
') for line rowid = '.$obj->rowid.
" (total vat of line calculated=".$tmpcal[1].
", database=".$obj->total_tva.
"). We fix the total_vat and total_ttc of line by running sqlfix = ".$sqlfix);
3937 $resqlfix = $this->db->query($sqlfix);
3941 $obj->total_tva = $tmpcal[1];
3942 $obj->total_ttc = $tmpcal[2];
3946 $this->total_ht += $obj->total_ht;
3947 $this->total_tva += $obj->total_tva;
3948 $this->total_localtax1 += $obj->total_localtax1;
3949 $this->total_localtax2 += $obj->total_localtax2;
3950 $this->total_ttc += $obj->total_ttc;
3951 $this->multicurrency_total_ht += $obj->multicurrency_total_ht;
3952 $this->multicurrency_total_tva += $obj->multicurrency_total_tva;
3953 $this->multicurrency_total_ttc += $obj->multicurrency_total_ttc;
3955 if (!isset($total_ht_by_vats[$obj->vatrate])) {
3956 $total_ht_by_vats[$obj->vatrate] = 0;
3958 if (!isset($total_tva_by_vats[$obj->vatrate])) {
3959 $total_tva_by_vats[$obj->vatrate] = 0;
3961 if (!isset($total_ttc_by_vats[$obj->vatrate])) {
3962 $total_ttc_by_vats[$obj->vatrate] = 0;
3964 $total_ht_by_vats[$obj->vatrate] += $obj->total_ht;
3965 $total_tva_by_vats[$obj->vatrate] += $obj->total_tva;
3966 $total_ttc_by_vats[$obj->vatrate] += $obj->total_ttc;
3968 if ($forcedroundingmode ==
'1') {
3969 if ($base_price_type ==
'TTC') {
3970 $tmpvat =
price2num($total_ttc_by_vats[$obj->vatrate] * $obj->vatrate / (100 + $obj->vatrate),
'MT', 1);
3972 $tmpvat =
price2num($total_ht_by_vats[$obj->vatrate] * $obj->vatrate / 100,
'MT', 1);
3974 $diff =
price2num($total_tva_by_vats[$obj->vatrate] - (
float) $tmpvat,
'MT', 1);
3977 if (abs((
float) $diff) > (10 * pow(10, -1 *
getDolGlobalInt(
'MAIN_MAX_DECIMALS_TOT', 0)))) {
3979 $errmsg =
'A rounding difference was detected into TOTAL but is too high to be corrected. Some data in your lines may be corrupted. Try to edit each line manually to fix this before restarting.';
3981 $this->error = $errmsg;
3985 if ($base_price_type ==
'TTC') {
3986 $sqlfix =
"UPDATE ".$this->db->prefix().$this->table_element_line.
" SET ".$fieldtva.
" = ".
price2num($obj->total_tva - (
float) $diff).
", total_ht = ".
price2num($obj->total_ht + (
float) $diff).
" WHERE rowid = ".((int) $obj->rowid);
3987 dol_syslog(
'We found a difference of '.$diff.
' for line rowid = '.$obj->rowid.
". We fix the total_vat and total_ht of line by running sqlfix = ".$sqlfix);
3989 $sqlfix =
"UPDATE ".$this->db->prefix().$this->table_element_line.
" SET ".$fieldtva.
" = ".
price2num($obj->total_tva - (
float) $diff).
", total_ttc = ".
price2num($obj->total_ttc - (
float) $diff).
" WHERE rowid = ".((int) $obj->rowid);
3990 dol_syslog(
'We found a difference of '.$diff.
' for line rowid = '.$obj->rowid.
". We fix the total_vat and total_ttc of line by running sqlfix = ".$sqlfix);
3993 $resqlfix = $this->db->query($sqlfix);
3999 $this->total_tva = (float)
price2num($this->total_tva - (
float) $diff,
'', 1);
4000 $total_tva_by_vats[$obj->vatrate] = (float)
price2num($total_tva_by_vats[$obj->vatrate] - (
float) $diff,
'', 1);
4001 if ($base_price_type ==
'TTC') {
4002 $this->total_ht = (float)
price2num($this->total_ht + (
float) $diff,
'', 1);
4003 $total_ht_by_vats[$obj->vatrate] = (float)
price2num($total_ht_by_vats[$obj->vatrate] + (
float) $diff,
'', 1);
4005 $this->total_ttc = (float)
price2num($this->total_ttc - (
float) $diff,
'', 1);
4006 $total_ttc_by_vats[$obj->vatrate] = (float)
price2num($total_ttc_by_vats[$obj->vatrate] - (
float) $diff,
'', 1);
4015 $this->total_ttc += isset($this->revenuestamp) ? $this->revenuestamp : 0;
4016 $this->multicurrency_total_ttc += isset($this->revenuestamp) ? ($this->revenuestamp * $multicurrency_tx) : 0;
4019 if (!empty($this->situation_cycle_ref) && !empty($this->situation_counter) && $this->situation_counter > 1 && method_exists($this,
'get_prev_sits')) {
4020 include_once DOL_DOCUMENT_ROOT.
'/compta/facture/class/facture.class.php';
4023 $prev_sits = $this->get_prev_sits();
4025 foreach ($prev_sits as $sit) {
4026 $this->total_ht -= $sit->total_ht;
4027 $this->total_tva -= $sit->total_tva;
4028 $this->total_localtax1 -= $sit->total_localtax1;
4029 $this->total_localtax2 -= $sit->total_localtax2;
4030 $this->total_ttc -= $sit->total_ttc;
4031 $this->multicurrency_total_ht -= $sit->multicurrency_total_ht;
4032 $this->multicurrency_total_tva -= $sit->multicurrency_total_tva;
4033 $this->multicurrency_total_ttc -= $sit->multicurrency_total_ttc;
4040 $this->total_ht = (float)
price2num($this->total_ht);
4041 $this->total_tva = (float)
price2num($this->total_tva);
4042 $this->total_localtax1 = (float)
price2num($this->total_localtax1);
4043 $this->total_localtax2 = (float)
price2num($this->total_localtax2);
4044 $this->total_ttc = (float)
price2num($this->total_ttc);
4046 $this->db->free($resql);
4049 $fieldht =
'total_ht';
4051 $fieldlocaltax1 =
'localtax1';
4052 $fieldlocaltax2 =
'localtax2';
4053 $fieldttc =
'total_ttc';
4055 if (in_array($this->element, array(
'propal',
'commande',
'facture',
'facturerec',
'supplier_proposal',
'order_supplier',
'facture_fourn',
'invoice_supplier',
'invoice_supplier_rec',
'expensereport'))) {
4056 $fieldtva =
'total_tva';
4059 if (!$error && empty($nodatabaseupdate)) {
4060 $sql =
"UPDATE ".$this->db->prefix().$this->table_element.
' SET';
4061 $sql .=
" ".$fieldht.
" = ".((float)
price2num($this->total_ht,
'MT', 1)).
",";
4062 $sql .=
" ".$fieldtva.
" = ".((float)
price2num($this->total_tva,
'MT', 1)).
",";
4063 $sql .=
" ".$fieldlocaltax1.
" = ".((float)
price2num($this->total_localtax1,
'MT', 1)).
",";
4064 $sql .=
" ".$fieldlocaltax2.
" = ".((float)
price2num($this->total_localtax2,
'MT', 1)).
",";
4065 $sql .=
" ".$fieldttc.
" = ".((float)
price2num($this->total_ttc,
'MT', 1));
4066 $sql .=
", multicurrency_total_ht = ".((float)
price2num($this->multicurrency_total_ht,
'MT', 1));
4067 $sql .=
", multicurrency_total_tva = ".((float)
price2num($this->multicurrency_total_tva,
'MT', 1));
4068 $sql .=
", multicurrency_total_ttc = ".((float)
price2num($this->multicurrency_total_ttc,
'MT', 1));
4069 $sql .=
" WHERE rowid = ".((int) $this->
id);
4071 dol_syslog(get_class($this).
"::update_price", LOG_DEBUG);
4072 $resql = $this->db->query($sql);
4076 $this->error = $this->db->lasterror();
4077 $this->errors[] = $this->db->lasterror();
4082 $this->db->commit();
4085 $this->db->rollback();
4105 public function add_object_linked($origin =
null, $origin_id =
null, $f_user =
null, $notrigger = 0)
4108 global $user, $hookmanager, $action;
4109 $origin = (!empty($origin) ? $origin : $this->origin);
4110 $origin_id = (!empty($origin_id) ? $origin_id : $this->origin_id);
4111 $f_user = isset($f_user) ? $f_user : $user;
4114 if ($origin ==
'order') {
4115 $origin =
'commande';
4117 if ($origin ==
'invoice') {
4118 $origin =
'facture';
4120 if ($origin ==
'invoice_template') {
4121 $origin =
'facturerec';
4123 if ($origin ==
'supplierorder') {
4124 $origin =
'order_supplier';
4128 $targettype = $this->getElementType();
4130 $parameters = array(
'targettype' => $targettype);
4132 $reshook = $hookmanager->executeHooks(
'setLinkedObjectSourceTargetType', $parameters, $this, $action);
4134 if (!empty($hookmanager->resArray[
'targettype'])) {
4135 $targettype = $hookmanager->resArray[
'targettype'];
4142 $sql =
"INSERT INTO " . $this->db->prefix() .
"element_element (";
4143 $sql .=
"fk_source";
4144 $sql .=
", sourcetype";
4145 $sql .=
", fk_target";
4146 $sql .=
", targettype";
4147 $sql .=
") VALUES (";
4148 $sql .= ((int) $origin_id);
4149 $sql .=
", '" . $this->db->escape($origin) .
"'";
4150 $sql .=
", " . ((int) $this->
id);
4151 $sql .=
", '" . $this->db->escape($targettype) .
"'";
4154 dol_syslog(get_class($this) .
"::add_object_linked", LOG_DEBUG);
4155 if ($this->db->query($sql)) {
4158 $this->context[
'link_origin'] = $origin;
4159 $this->context[
'link_origin_id'] = $origin_id;
4160 $result = $this->call_trigger(
'OBJECT_LINK_INSERT', $f_user);
4167 $this->error = $this->db->lasterror();
4172 $this->db->commit();
4175 $this->db->rollback();
4189 $coreModule = array(
'knowledgemanagement',
'partnership',
'workstation',
'ticket',
'recruitment',
'eventorganization',
'asset');
4191 return ((!empty($this->module) && !in_array($this->module, $coreModule)) ? $this->module.
'_' :
'').$this->element;
4217 public function fetchObjectLinked($sourceid =
null, $sourcetype =
'', $targetid =
null, $targettype =
'', $clause =
'OR', $alsosametype = 1, $orderby =
'sourcetype', $loadalsoobjects = 1)
4219 global $conf, $hookmanager, $action;
4224 if ($this->
id > 0 && !empty($this->linkedObjectsFullLoaded[$this->
id])) {
4228 $this->linkedObjectsIds = array();
4229 $this->linkedObjects = array();
4231 $justsource =
false;
4232 $justtarget =
false;
4233 $withtargettype =
false;
4234 $withsourcetype =
false;
4236 $parameters = array(
'sourcetype' => $sourcetype,
'sourceid' => $sourceid,
'targettype' => $targettype,
'targetid' => $targetid);
4238 $reshook = $hookmanager->executeHooks(
'setLinkedObjectSourceTargetType', $parameters, $this, $action);
4240 if (!empty($hookmanager->resArray[
'sourcetype'])) {
4241 $sourcetype = $hookmanager->resArray[
'sourcetype'];
4243 if (!empty($hookmanager->resArray[
'sourceid'])) {
4244 $sourceid = $hookmanager->resArray[
'sourceid'];
4246 if (!empty($hookmanager->resArray[
'targettype'])) {
4247 $targettype = $hookmanager->resArray[
'targettype'];
4249 if (!empty($hookmanager->resArray[
'targetid'])) {
4250 $targetid = $hookmanager->resArray[
'targetid'];
4254 if (!empty($sourceid) && !empty($sourcetype) && empty($targetid)) {
4256 if (!empty($targettype)) {
4257 $withtargettype =
true;
4260 if (!empty($targetid) && !empty($targettype) && empty($sourceid)) {
4262 if (!empty($sourcetype)) {
4263 $withsourcetype =
true;
4267 $sourceid = (!empty($sourceid) ? $sourceid : $this->id);
4268 $targetid = (!empty($targetid) ? $targetid : $this->id);
4269 $sourcetype = (!empty($sourcetype) ? $sourcetype : $this->element);
4270 $targettype = (!empty($targettype) ? $targettype : $this->element);
4279 $sql =
"SELECT rowid, fk_source, sourcetype, fk_target, targettype";
4280 $sql .=
" FROM ".$this->db->prefix().
"element_element";
4282 if ($justsource || $justtarget) {
4284 $sql .=
"fk_source = ".((int) $sourceid).
" AND sourcetype = '".$this->db->escape($sourcetype).
"'";
4285 if ($withtargettype) {
4286 $sql .=
" AND targettype = '".$this->db->escape($targettype).
"'";
4288 } elseif ($justtarget) {
4289 $sql .=
"fk_target = ".((int) $targetid).
" AND targettype = '".$this->db->escape($targettype).
"'";
4290 if ($withsourcetype) {
4291 $sql .=
" AND sourcetype = '".$this->db->escape($sourcetype).
"'";
4295 $sql .=
"(fk_source = ".((int) $sourceid).
" AND sourcetype = '".$this->db->escape($sourcetype).
"')";
4296 $sql .=
" ".$clause.
" (fk_target = ".((int) $targetid).
" AND targettype = '".$this->db->escape($targettype).
"')";
4297 if ($loadalsoobjects && $this->
id > 0 && $sourceid == $this->
id && $sourcetype == $this->element && $targetid == $this->
id && $targettype == $this->element && $clause ==
'OR') {
4298 $this->linkedObjectsFullLoaded[$this->id] =
true;
4301 $sql .=
" ORDER BY ".$orderby;
4303 dol_syslog(get_class($this).
"::fetchObjectLink", LOG_DEBUG);
4304 $resql = $this->db->query($sql);
4306 $num = $this->db->num_rows($resql);
4309 $obj = $this->db->fetch_object($resql);
4310 if ($justsource || $justtarget) {
4312 $this->linkedObjectsIds[$obj->targettype][$obj->rowid] = $obj->fk_target;
4313 } elseif ($justtarget) {
4314 $this->linkedObjectsIds[$obj->sourcetype][$obj->rowid] = $obj->fk_source;
4317 if ($obj->fk_source == $sourceid && $obj->sourcetype == $sourcetype) {
4318 $this->linkedObjectsIds[$obj->targettype][$obj->rowid] = $obj->fk_target;
4320 if ($obj->fk_target == $targetid && $obj->targettype == $targettype) {
4321 $this->linkedObjectsIds[$obj->sourcetype][$obj->rowid] = $obj->fk_source;
4327 if (!empty($this->linkedObjectsIds)) {
4328 $tmparray = $this->linkedObjectsIds;
4329 foreach ($tmparray as $objecttype => $objectids) {
4331 $element = $element_properties[
'element'];
4332 $classPath = $element_properties[
'classpath'];
4333 $classFile = $element_properties[
'classfile'];
4334 $className = $element_properties[
'classname'];
4335 $module = $element_properties[
'module'];
4338 if (isModEnabled($module) && (($element != $this->element) || $alsosametype)) {
4339 if ($loadalsoobjects && (is_numeric($loadalsoobjects) || ($loadalsoobjects === $objecttype))) {
4341 if (class_exists($className)) {
4342 foreach ($objectids as $i => $objectid) {
4343 $object =
new $className($this->db);
4344 $ret =
$object->fetch($objectid);
4346 $this->linkedObjects[$objecttype][$i] =
$object;
4352 unset($this->linkedObjectsIds[$objecttype]);
4371 if ($this->
id > 0 && !empty($this->linkedObjectsFullLoaded[$this->
id])) {
4372 unset($this->linkedObjectsFullLoaded[$this->
id]);
4390 public function updateObjectLinked($sourceid =
null, $sourcetype =
'', $targetid =
null, $targettype =
'', $f_user =
null, $notrigger = 0)
4393 $updatesource =
false;
4394 $updatetarget =
false;
4395 $f_user = isset($f_user) ? $f_user : $user;
4397 if (!empty($sourceid) && !empty($sourcetype) && empty($targetid) && empty($targettype)) {
4398 $updatesource =
true;
4399 } elseif (empty($sourceid) && empty($sourcetype) && !empty($targetid) && !empty($targettype)) {
4400 $updatetarget =
true;
4406 $sql =
"UPDATE " . $this->db->prefix() .
"element_element SET ";
4407 if ($updatesource) {
4408 $sql .=
"fk_source = " . ((int) $sourceid);
4409 $sql .=
", sourcetype = '" . $this->db->escape($sourcetype) .
"'";
4410 $sql .=
" WHERE fk_target = " . ((int) $this->
id);
4411 $sql .=
" AND targettype = '" . $this->db->escape($this->element) .
"'";
4412 } elseif ($updatetarget) {
4413 $sql .=
"fk_target = " . ((int) $targetid);
4414 $sql .=
", targettype = '" . $this->db->escape($targettype) .
"'";
4415 $sql .=
" WHERE fk_source = " . ((int) $this->
id);
4416 $sql .=
" AND sourcetype = '" . $this->db->escape($this->element) .
"'";
4419 dol_syslog(get_class($this) .
"::updateObjectLinked", LOG_DEBUG);
4420 if ($this->db->query($sql)) {
4423 $this->context[
'link_source_id'] = $sourceid;
4424 $this->context[
'link_source_type'] = $sourcetype;
4425 $this->context[
'link_target_id'] = $targetid;
4426 $this->context[
'link_target_type'] = $targettype;
4427 $result = $this->call_trigger(
'OBJECT_LINK_MODIFY', $f_user);
4434 $this->error = $this->db->lasterror();
4439 $this->db->commit();
4442 $this->db->rollback();
4460 public function deleteObjectLinked($sourceid =
null, $sourcetype =
'', $targetid =
null, $targettype =
'', $rowid = 0, $f_user =
null, $notrigger = 0)
4463 $deletesource =
false;
4464 $deletetarget =
false;
4465 $f_user = isset($f_user) ? $f_user : $user;
4467 if (!empty($sourceid) && !empty($sourcetype) && empty($targetid) && empty($targettype)) {
4468 $deletesource =
true;
4469 } elseif (empty($sourceid) && empty($sourcetype) && !empty($targetid) && !empty($targettype)) {
4470 $deletetarget =
true;
4473 $sourceid = (!empty($sourceid) ? $sourceid : $this->id);
4474 $sourcetype = (!empty($sourcetype) ? $sourcetype : $this->element);
4475 $targetid = (!empty($targetid) ? $targetid : $this->id);
4476 $targettype = (!empty($targettype) ? $targettype : $this->element);
4482 $this->context[
'link_id'] = $rowid;
4483 $this->context[
'link_source_id'] = $sourceid;
4484 $this->context[
'link_source_type'] = $sourcetype;
4485 $this->context[
'link_target_id'] = $targetid;
4486 $this->context[
'link_target_type'] = $targettype;
4487 $result = $this->call_trigger(
'OBJECT_LINK_DELETE', $f_user);
4495 $sql =
"DELETE FROM " . $this->db->prefix() .
"element_element";
4498 $sql .=
" rowid = " . ((int) $rowid);
4500 if ($deletesource) {
4501 $sql .=
" fk_source = " . ((int) $sourceid) .
" AND sourcetype = '" . $this->db->escape($sourcetype) .
"'";
4502 $sql .=
" AND fk_target = " . ((int) $this->
id) .
" AND targettype = '" . $this->db->escape($this->element) .
"'";
4503 } elseif ($deletetarget) {
4504 $sql .=
" fk_target = " . ((int) $targetid) .
" AND targettype = '" . $this->db->escape($targettype) .
"'";
4505 $sql .=
" AND fk_source = " . ((int) $this->
id) .
" AND sourcetype = '" . $this->db->escape($this->element) .
"'";
4507 $sql .=
" (fk_source = " . ((int) $this->
id) .
" AND sourcetype = '" . $this->db->escape($this->element) .
"')";
4509 $sql .=
" (fk_target = " . ((int) $this->
id) .
" AND targettype = '" . $this->db->escape($this->element) .
"')";
4513 dol_syslog(get_class($this) .
"::deleteObjectLinked", LOG_DEBUG);
4514 if (!$this->db->query($sql)) {
4515 $this->error = $this->db->lasterror();
4516 $this->errors[] = $this->error;
4522 $this->db->commit();
4525 $this->db->rollback();
4541 if (empty($fk_object_where) || empty($field_where) || empty($table_element)) {
4544 if (!preg_match(
'/^[_a-zA-Z0-9]+$/', $field_select)) {
4545 dol_syslog(
'Invalid value $field_select for parameter '.$field_select.
' in call to getAllItemsLinkedByObjectID(). Must be a single field name.', LOG_ERR);
4550 $sql =
"SELECT ".$field_select.
" FROM ".$db->prefix().$table_element.
" WHERE ".$field_where.
" = ".((int) $fk_object_where);
4551 $resql = $db->query($sql);
4554 if (!empty($resql)) {
4555 while ($res = $db->fetch_object($resql)) {
4556 $TRes[] = $res->{$field_select};
4573 if (empty($fk_object_where) || empty($field_where) || empty($table_element)) {
4579 $sql =
"SELECT COUNT(*) as nb FROM ".$db->prefix().$table_element.
" WHERE ".$field_where.
" = ".((int) $fk_object_where);
4580 $resql = $db->query($sql);
4583 $res = $db->fetch_object($resql);
4602 if (empty($fk_object_where) || empty($field_where) || empty($table_element)) {
4608 $sql =
"DELETE FROM ".$db->prefix().$table_element.
" WHERE ".$field_where.
" = ".((int) $fk_object_where);
4609 $resql = $db->query($sql);
4611 if (empty($resql)) {
4628 public function setStatut($status, $elementId =
null, $elementType =
'', $trigkey =
'', $fieldstatus =
'fk_statut')
4632 $savElementId = $elementId;
4634 $elementId = (!empty($elementId) ? $elementId : $this->id);
4635 $elementTable = (!empty($elementType) ? $elementType : $this->table_element);
4639 if ($elementTable ==
'facture_rec') {
4640 $fieldstatus =
"suspended";
4642 if ($elementTable ==
'mailing') {
4643 $fieldstatus =
"statut";
4645 if ($elementTable ==
'cronjob') {
4646 $fieldstatus =
"status";
4648 if ($elementTable ==
'user') {
4649 $fieldstatus =
"statut";
4651 if ($elementTable ==
'expensereport') {
4652 $fieldstatus =
"fk_statut";
4654 if ($elementTable ==
'receptiondet_batch') {
4655 $fieldstatus =
"status";
4657 if ($elementTable ==
'prelevement_bons') {
4658 $fieldstatus =
"statut";
4660 if (isset($this->fields) && is_array($this->fields) && array_key_exists(
'status', $this->fields)) {
4661 $fieldstatus =
'status';
4664 $sql =
"UPDATE ".$this->db->prefix().$elementTable;
4665 $sql .=
" SET ".$fieldstatus.
" = ".((int) $status);
4668 if ($status == 1 && in_array($elementTable, array(
'expensereport',
'inventory'))) {
4669 $sql .=
", fk_user_valid = ".((int) $user->id);
4671 if ($status == 1 && in_array($elementTable, array(
'expensereport'))) {
4672 $sql .=
", date_valid = '".$this->db->idate(
dol_now()).
"'";
4674 if ($status == 1 && in_array($elementTable, array(
'inventory'))) {
4675 $sql .=
", date_validation = '".$this->db->idate(
dol_now()).
"'";
4677 $sql .=
" WHERE rowid = ".((int) $elementId);
4678 $sql .=
" AND ".$fieldstatus.
" <> ".((int) $status);
4680 dol_syslog(get_class($this).
"::setStatut", LOG_DEBUG);
4681 $resql = $this->db->query($sql);
4685 $nb_rows_affected = $this->db->affected_rows($resql);
4687 if ($nb_rows_affected > 0) {
4688 if (empty($trigkey)) {
4690 if ($this->element ==
'supplier_proposal' && $status == 2) {
4691 $trigkey =
'SUPPLIER_PROPOSAL_SIGN';
4693 if ($this->element ==
'supplier_proposal' && $status == 3) {
4694 $trigkey =
'SUPPLIER_PROPOSAL_REFUSE';
4696 if ($this->element ==
'supplier_proposal' && $status == 4) {
4697 $trigkey =
'SUPPLIER_PROPOSAL_CLOSE';
4699 if ($this->element ==
'fichinter' && $status == 3) {
4700 $trigkey =
'FICHINTER_CLASSIFY_DONE';
4702 if ($this->element ==
'fichinter' && $status == 2) {
4703 $trigkey =
'FICHINTER_CLASSIFY_BILLED';
4705 if ($this->element ==
'fichinter' && $status == 1) {
4706 $trigkey =
'FICHINTER_CLASSIFY_UNBILLED';
4712 $result = $this->call_trigger($trigkey, $user);
4723 $this->db->commit();
4725 if (empty($savElementId)) {
4727 if ($fieldstatus ==
'tosell') {
4729 } elseif ($fieldstatus ==
'tobuy') {
4730 $this->status_buy = $status;
4738 $this->db->rollback();
4739 dol_syslog(get_class($this).
"::setStatut ".$this->error, LOG_ERR);
4743 $this->error = $this->db->lasterror();
4744 $this->db->rollback();
4761 if (empty($id) && empty($ref)) {
4771 $sql =
"SELECT rowid, canvas";
4772 $sql .=
" FROM ".$this->db->prefix().$this->table_element;
4773 $sql .=
" WHERE entity IN (".getEntity($this->element).
")";
4775 $sql .=
" AND rowid = ".((int) $id);
4778 $sql .=
" AND ref = '".$this->db->escape($ref).
"'";
4781 $resql = $this->db->query($sql);
4783 $obj = $this->db->fetch_object($resql);
4785 $this->canvas = $obj->canvas;
4805 $sql =
"SELECT special_code FROM ".$this->db->prefix().$this->table_element_line;
4806 $sql .=
" WHERE rowid = ".((int) $lineid);
4807 $resql = $this->db->query($sql);
4809 $row = $this->db->fetch_row($resql);
4810 return (!empty($row[0]) ? $row[0] : 0);
4833 if (!isset($this->childtables) || !is_array($this->childtables) || count($this->childtables) == 0) {
4834 dol_print_error(
null,
'Called isObjectUsed on a class with property this->childtables not defined');
4838 $arraytoscan = $this->childtables;
4840 $tmparray = array_keys($this->childtables);
4841 if (is_numeric($tmparray[0])) {
4842 $arraytoscan = array_flip($this->childtables);
4847 foreach ($arraytoscan as $table => $element) {
4850 $sql =
"SELECT COUNT(*) as nb";
4851 $sql .=
" FROM ".$this->db->prefix().$table.
" as c";
4852 if (!empty($element[
'parent']) && !empty($element[
'parentkey'])) {
4853 $sql .=
", ".$this->db->prefix().$element[
'parent'].
" as p";
4855 if (!empty($element[
'fk_element'])) {
4856 $sql .=
" WHERE c.".$element[
'fk_element'].
" = ".((int) $id);
4858 $sql .=
" WHERE c.".$this->fk_element.
" = ".((int) $id);
4860 if (!empty($element[
'parent']) && !empty($element[
'parentkey'])) {
4861 $sql .=
" AND c.".$element[
'parentkey'].
" = p.rowid";
4863 if (!empty($element[
'parent']) && !empty($element[
'parenttypefield']) && !empty($element[
'parenttypevalue'])) {
4864 $sql .=
" AND c.".$element[
'parenttypefield'].
" = '".$this->db->escape($element[
'parenttypevalue']).
"'";
4866 if (!empty($entity)) {
4867 if (!empty($element[
'parent']) && !empty($element[
'parentkey'])) {
4868 $sql .=
" AND p.entity = ".((int) $entity);
4870 $sql .=
" AND c.entity = ".((int) $entity);
4874 $resql = $this->db->query($sql);
4876 $obj = $this->db->fetch_object($resql);
4878 $langs->load(
"errors");
4880 $haschild += $obj->nb;
4881 if (is_numeric($element)) {
4882 $this->errors[] = $langs->transnoentitiesnoconv(
"ErrorRecordHasAtLeastOneChildOfType", method_exists($this,
'getNomUrl') ? $this->getNomUrl() : $this->ref, $table);
4883 } elseif (is_string($element)) {
4884 $this->errors[] = $langs->transnoentitiesnoconv(
"ErrorRecordHasAtLeastOneChildOfType", method_exists($this,
'getNomUrl') ? $this->getNomUrl() : $this->ref, $langs->transnoentitiesnoconv($element));
4886 $this->errors[] = $langs->transnoentitiesnoconv(
"ErrorRecordHasAtLeastOneChildOfType", method_exists($this,
'getNomUrl') ? $this->getNomUrl() : $this->ref, $langs->transnoentitiesnoconv($element[
'name']));
4891 $this->errors[] = $this->db->lasterror();
4895 if ($haschild > 0) {
4896 $this->errors[] =
"ErrorRecordHasChildren";
4913 foreach ($this->lines as $key => $val) {
4915 if ($predefined == -1) {
4918 if ($predefined == 1 && $val->fk_product > 0) {
4921 if ($predefined == 0 && $val->fk_product <= 0) {
4924 if ($predefined == 2 && $val->fk_product > 0 && $val->product_type == 0) {
4927 if ($predefined == 3 && $val->fk_product > 0 && $val->product_type == 1) {
4934 dol_syslog(get_class($this).
'::hasProductsOrServices we found '.$nb.
' qualified lines of products/servcies');
4945 if (!empty($this->table_element_line)) {
4946 $total_discount = 0.00;
4948 $sql =
"SELECT subprice as pu_ht, qty, remise_percent, total_ht";
4949 $sql .=
" FROM ".$this->db->prefix().$this->table_element_line;
4950 $sql .=
" WHERE ".$this->fk_element.
" = ".((int) $this->
id);
4952 dol_syslog(get_class($this).
'::getTotalDiscount', LOG_DEBUG);
4953 $resql = $this->db->query($sql);
4955 $num = $this->db->num_rows($resql);
4958 $obj = $this->db->fetch_object($resql);
4960 $pu_ht = $obj->pu_ht;
4962 $total_ht = $obj->total_ht;
4964 $total_discount_line = (float)
price2num(($pu_ht * $qty) - $total_ht,
'MT');
4965 $total_discount += $total_discount_line;
4972 return (
float)
price2num($total_discount);
4994 if (empty($this->lines)) {
4998 foreach ($this->lines as $line) {
4999 if (isset($line->qty_asked)) {
5000 if (empty($totalOrdered)) {
5003 $totalOrdered += $line->qty_asked;
5005 if (isset($line->qty_shipped)) {
5006 if (empty($totalToShip)) {
5009 $totalToShip += $line->qty_shipped;
5010 } elseif ($line->element ==
'commandefournisseurdispatch' && isset($line->qty)) {
5011 if (empty($totalToShip)) {
5014 $totalToShip += $line->qty;
5018 if ($this->element ==
'shipping') {
5020 $qty = $line->qty_shipped ? $line->qty_shipped : 0;
5022 $qty = $line->qty ? $line->qty : 0;
5025 $weight = !empty($line->weight) ? $line->weight : 0;
5026 ($weight == 0 && !empty($line->product->weight)) ? $weight = $line->product->weight : 0;
5027 $volume = !empty($line->volume) ? $line->volume : 0;
5028 ($volume == 0 && !empty($line->product->volume)) ? $volume = $line->product->volume : 0;
5030 $weight_units = !empty($line->weight_units) ? $line->weight_units : 0;
5031 ($weight_units == 0 && !empty($line->product->weight_units)) ? $weight_units = $line->product->weight_units : 0;
5032 $volume_units = !empty($line->volume_units) ? $line->volume_units : 0;
5033 ($volume_units == 0 && !empty($line->product->volume_units)) ? $volume_units = $line->product->volume_units : 0;
5037 if (!empty($weight_units)) {
5038 $weightUnit = $weight_units;
5040 if (!empty($volume_units)) {
5041 $volumeUnit = $volume_units;
5044 if (empty($totalWeight)) {
5047 if (empty($totalVolume)) {
5052 if ($weight_units < 50) {
5053 $trueWeightUnit = pow(10, $weightUnit);
5054 $totalWeight += $weight * $qty * $trueWeightUnit;
5056 if ($weight_units == 99) {
5058 $trueWeightUnit = 0.45359237;
5059 $totalWeight += $weight * $qty * $trueWeightUnit;
5060 } elseif ($weight_units == 98) {
5062 $trueWeightUnit = 0.0283495;
5063 $totalWeight += $weight * $qty * $trueWeightUnit;
5065 $totalWeight += $weight * $qty;
5068 if ($volume_units < 50) {
5070 $trueVolumeUnit = pow(10, $volumeUnit);
5072 $totalVolume += $volume * $qty * $trueVolumeUnit;
5074 $totalVolume += $volume * $qty;
5078 return array(
'weight' => $totalWeight,
'volume' => $totalVolume,
'ordered' => $totalOrdered,
'toship' => $totalToShip);
5091 $extraparams = (!empty($this->extraparams) ? json_encode($this->extraparams) :
null);
5093 $sql =
"UPDATE ".$this->db->prefix().$this->table_element;
5094 $sql .=
" SET extraparams = ".(!empty($extraparams) ?
"'".$this->db->escape($extraparams).
"'" :
"null");
5095 $sql .=
" WHERE rowid = ".((int) $this->
id);
5097 dol_syslog(get_class($this).
"::setExtraParameters", LOG_DEBUG);
5098 $resql = $this->db->query($sql);
5100 $this->error = $this->db->lasterror();
5101 $this->db->rollback();
5104 $this->db->commit();
5127 global $conf, $user, $langs,
$object, $hookmanager, $extrafields, $form;
5130 if (!is_object($extrafields)) {
5131 require_once DOL_DOCUMENT_ROOT.
'/core/class/extrafields.class.php';
5134 $extrafields->fetch_name_optionals_label($this->table_element_line);
5139 $dirtpls = array_merge($conf->modules_parts[
'tpl'], array($defaulttpldir));
5140 foreach ($dirtpls as $module => $reldir) {
5141 if (!empty($module)) {
5144 $tpl = DOL_DOCUMENT_ROOT.$reldir.
'/objectline_create.tpl.php';
5147 if (empty($conf->file->strict_mode)) {
5148 $res = @include $tpl;
5150 $res = include $tpl;
5177 public function printObjectLines($action, $seller, $buyer, $selected = 0, $dateSelector = 0, $defaulttpldir =
'/core/tpl')
5179 global $conf, $hookmanager, $langs, $user, $form, $extrafields,
$object;
5181 global $inputalsopricewithtax, $usemargins, $disableedit, $disablemove, $disableremove, $outputalsopricetotalwithtax;
5185 if (isModEnabled(
'margin') && !empty($this->element) && in_array($this->element, array(
'facture',
'facturerec',
'propal',
'commande'))) {
5189 $num = count($this->lines);
5192 if (!is_object($extrafields)) {
5193 require_once DOL_DOCUMENT_ROOT.
'/core/class/extrafields.class.php';
5196 $extrafields->fetch_name_optionals_label($this->table_element_line);
5198 $parameters = array(
'num' => $num,
'dateSelector' => $dateSelector,
'seller' => $seller,
'buyer' => $buyer,
'selected' => $selected,
'table_element_line' => $this->table_element_line);
5199 $reshook = $hookmanager->executeHooks(
'printObjectLineTitle', $parameters, $this, $action);
5200 if (empty($reshook)) {
5204 $dirtpls = array_merge($conf->modules_parts[
'tpl'], array($defaulttpldir));
5205 foreach ($dirtpls as $module => $reldir) {
5207 if (!empty($module)) {
5210 $tpl = DOL_DOCUMENT_ROOT.$reldir.
'/objectline_title.tpl.php';
5212 if (file_exists($tpl)) {
5213 if (empty($conf->file->strict_mode)) {
5214 $res = @include $tpl;
5216 $res = include $tpl;
5227 print
"<!-- begin printObjectLines() --><tbody>\n";
5228 foreach ($this->lines as $line) {
5230 $line->fetch_optionals();
5233 if (is_object($hookmanager)) {
5234 if (empty($line->fk_parent_line)) {
5235 $parameters = array(
'line' => $line,
'num' => $num,
'i' => $i,
'dateSelector' => $dateSelector,
'seller' => $seller,
'buyer' => $buyer,
'selected' => $selected,
'table_element_line' => $line->table_element,
'defaulttpldir' => $defaulttpldir);
5236 $reshook = $hookmanager->executeHooks(
'printObjectLine', $parameters, $this, $action);
5238 $parameters = array(
'line' => $line,
'num' => $num,
'i' => $i,
'dateSelector' => $dateSelector,
'seller' => $seller,
'buyer' => $buyer,
'selected' => $selected,
'table_element_line' => $line->table_element,
'fk_parent_line' => $line->fk_parent_line,
'defaulttpldir' => $defaulttpldir);
5239 $reshook = $hookmanager->executeHooks(
'printObjectSubLine', $parameters, $this, $action);
5242 if (empty($reshook)) {
5243 $this->printObjectLine($action, $line,
'', $num, $i, $dateSelector, $seller, $buyer, $selected, $extrafields, $defaulttpldir);
5248 print
"</tbody><!-- end printObjectLines() -->\n";
5268 public function printObjectLine($action, $line, $var, $num, $i, $dateSelector, $seller, $buyer, $selected = 0, $extrafields =
null, $defaulttpldir =
'/core/tpl')
5270 global $conf, $langs, $user,
$object, $hookmanager;
5272 global $object_rights, $disableedit, $disablemove, $disableremove;
5274 $object_rights = $this->getRights();
5281 if ($action !=
'editline' || $selected != $line->id) {
5283 if (!empty($line->fk_product) && $line->fk_product > 0) {
5284 $product_static =
new Product($this->db);
5285 $product_static->fetch($line->fk_product);
5287 $product_static->ref = $line->ref;
5288 $product_static->label = !empty($line->label) ? $line->label :
"";
5290 $text = $product_static->getNomUrl(1);
5294 if (property_exists($this,
'socid') && !is_object($this->thirdparty)) {
5295 dol_print_error(
null,
'Error: Method printObjectLine was called on an object and object->fetch_thirdparty was not done before');
5299 $prod =
new Product($this->db);
5300 $prod->fetch($line->fk_product);
5302 $outputlangs = $langs;
5304 if (empty($newlang) &&
GETPOST(
'lang_id',
'aZ09')) {
5305 $newlang =
GETPOST(
'lang_id',
'aZ09');
5307 if (
getDolGlobalString(
'PRODUIT_TEXTS_IN_THIRDPARTY_LANGUAGE') && empty($newlang) && is_object($this->thirdparty)) {
5308 $newlang = $this->thirdparty->default_lang;
5310 if (!empty($newlang)) {
5311 $outputlangs =
new Translate(
"", $conf);
5312 $outputlangs->setDefaultLang($newlang);
5315 $label = (!empty($prod->multilangs[$outputlangs->defaultlang][
"label"])) ? $prod->multilangs[$outputlangs->defaultlang][
"label"] : $line->product_label;
5317 $label = $line->product_label;
5320 $text .=
' - '.(!empty($line->label) ? $line->label : $label);
5321 $description .= (
getDolGlobalInt(
'PRODUIT_DESC_IN_FORM_ACCORDING_TO_DEVICE') ?
'' : (!empty($line->description) ?
dol_htmlentitiesbr($line->description) :
''));
5324 $line->pu_ttc =
price2num((!empty($line->subprice) ? $line->subprice : 0) * (1 + ((!empty($line->tva_tx) ? $line->tva_tx : 0) / 100)),
'MU');
5329 $dirtpls = array_merge($conf->modules_parts[
'tpl'], array($defaulttpldir));
5330 foreach ($dirtpls as $module => $reldir) {
5332 if (!empty($module)) {
5335 $tpl = DOL_DOCUMENT_ROOT.$reldir.
'/objectline_view.tpl.php';
5338 if (file_exists($tpl)) {
5339 if (empty($conf->file->strict_mode)) {
5340 $res = @include $tpl;
5342 $res = include $tpl;
5352 if ($this->
status == 0 && $action ==
'editline' && $selected == $line->id) {
5353 $label = (!empty($line->label) ? $line->label : (($line->fk_product > 0) ? $line->product_label :
''));
5355 $line->pu_ttc =
price2num($line->subprice * (1 + ($line->tva_tx / 100)),
'MU');
5360 $dirtpls = array_merge($conf->modules_parts[
'tpl'], array($defaulttpldir));
5361 foreach ($dirtpls as $module => $reldir) {
5362 if (!empty($module)) {
5365 $tpl = DOL_DOCUMENT_ROOT.$reldir.
'/objectline_edit.tpl.php';
5368 if (empty($conf->file->strict_mode)) {
5369 $res = @include $tpl;
5371 $res = include $tpl;
5396 global $langs, $hookmanager, $form, $action;
5398 print
'<tr class="liste_titre">';
5399 print
'<td class="linecolref">'.$langs->trans(
'Ref').
'</td>';
5400 print
'<td class="linecoldescription">'.$langs->trans(
'Description').
'</td>';
5401 print
'<td class="linecolvat right">'.$langs->trans(
'VATRate').
'</td>';
5402 print
'<td class="linecoluht right">'.$langs->trans(
'PriceUHT').
'</td>';
5403 if (isModEnabled(
"multicurrency")) {
5404 print
'<td class="linecoluht_currency right">'.$langs->trans(
'PriceUHTCurrency').
'</td>';
5406 print
'<td class="linecolqty right">'.$langs->trans(
'Qty').
'</td>';
5408 print
'<td class="linecoluseunit left">'.$langs->trans(
'Unit').
'</td>';
5410 print
'<td class="linecoldiscount right">'.$langs->trans(
'ReductionShort').
'</td>';
5411 print
'<td class="linecolht right">'.$langs->trans(
'TotalHT').
'</td>';
5412 print
'<td class="center">'.$form->showCheckAddButtons(
'checkforselect', 1).
'</td>';
5416 if (!empty($this->lines)) {
5417 foreach ($this->lines as $line) {
5420 if (is_object($hookmanager)) {
5421 $parameters = array(
'line' => $line,
'i' => $i,
'restrictlist' => $restrictlist,
'selectedLines' => $selectedLines);
5422 if (!empty($line->fk_parent_line)) {
5423 $parameters[
'fk_parent_line'] = $line->fk_parent_line;
5425 $reshook = $hookmanager->executeHooks(
'printOriginObjectLine', $parameters, $this, $action);
5427 if (empty($reshook)) {
5428 $this->printOriginLine($line,
'', $restrictlist,
'/core/tpl', $selectedLines);
5449 public function printOriginLine($line, $var, $restrictlist =
'', $defaulttpldir =
'/core/tpl', $selectedLines = array())
5451 global $langs, $conf;
5454 if (!empty($line->date_start)) {
5455 $date_start = $line->date_start;
5457 $date_start = $line->date_debut_prevue;
5458 if ($line->date_debut_reel) {
5459 $date_start = $line->date_debut_reel;
5462 if (!empty($line->date_end)) {
5463 $date_end = $line->date_end;
5465 $date_end = $line->date_fin_prevue;
5466 if ($line->date_fin_reel) {
5467 $date_end = $line->date_fin_reel;
5471 $this->tpl[
'id'] = $line->id;
5473 $this->tpl[
'label'] =
'';
5474 if (!empty($line->fk_parent_line)) {
5475 $this->tpl[
'label'] .=
img_picto(
'',
'rightarrow');
5478 if (($line->info_bits & 2) == 2) {
5480 if (property_exists($this,
'socid')) {
5481 $discount->fk_soc = $this->socid;
5482 $discount->socid = $this->socid;
5484 $this->tpl[
'label'] .= $discount->getNomUrl(0,
'discount');
5485 } elseif (!empty($line->fk_product)) {
5486 $productstatic =
new Product($this->db);
5487 $productstatic->id = $line->fk_product;
5488 $productstatic->ref = $line->ref;
5489 $productstatic->type = $line->fk_product_type;
5490 if (empty($productstatic->ref)) {
5491 $line->fetch_product();
5492 $productstatic = $line->product;
5495 $this->tpl[
'label'] .= $productstatic->getNomUrl(1);
5496 $this->tpl[
'label'] .=
' - '.(!empty($line->label) ? $line->label : $line->product_label);
5498 if ($line->product_type == 1 && ($date_start || $date_end)) {
5502 $this->tpl[
'label'] .= ($line->product_type == -1 ?
' ' : ($line->product_type == 1 ?
img_object($langs->trans(
''),
'service') :
img_object($langs->trans(
''),
'product')));
5503 if (!empty($line->desc)) {
5504 $this->tpl[
'label'] .= $line->desc;
5506 $this->tpl[
'label'] .= ($line->label ?
' '.$line->label :
'');
5510 if ($line->product_type == 1 && ($date_start || $date_end)) {
5515 if (!empty($line->desc)) {
5516 if ($line->desc ==
'(CREDIT_NOTE)') {
5518 $discount->fetch($line->fk_remise_except);
5519 $this->tpl[
'description'] = $langs->transnoentities(
"DiscountFromCreditNote", $discount->getNomUrl(0));
5520 } elseif ($line->desc ==
'(DEPOSIT)') {
5522 $discount->fetch($line->fk_remise_except);
5523 $this->tpl[
'description'] = $langs->transnoentities(
"DiscountFromDeposit", $discount->getNomUrl(0));
5524 } elseif ($line->desc ==
'(EXCESS RECEIVED)') {
5526 $discount->fetch($line->fk_remise_except);
5527 $this->tpl[
'description'] = $langs->transnoentities(
"DiscountFromExcessReceived", $discount->getNomUrl(0));
5528 } elseif ($line->desc ==
'(EXCESS PAID)') {
5530 $discount->fetch($line->fk_remise_except);
5531 $this->tpl[
'description'] = $langs->transnoentities(
"DiscountFromExcessPaid", $discount->getNomUrl(0));
5533 $this->tpl[
'description'] =
dol_trunc($line->desc, 60);
5536 $this->tpl[
'description'] =
' ';
5540 $this->tpl[
'vat_rate'] =
vatrate($line->tva_tx,
true);
5541 $this->tpl[
'vat_rate'] .= (($line->info_bits & 1) == 1) ?
'*' :
'';
5542 if (!empty($line->vat_src_code) && !preg_match(
'/\(/', $this->tpl[
'vat_rate'])) {
5543 $this->tpl[
'vat_rate'] .=
' ('.$line->vat_src_code.
')';
5546 $this->tpl[
'price'] =
price($line->subprice);
5547 $this->tpl[
'total_ht'] =
price($line->total_ht);
5548 $this->tpl[
'multicurrency_price'] =
price($line->multicurrency_subprice);
5549 $this->tpl[
'qty'] = (($line->info_bits & 2) != 2) ? $line->qty :
' ';
5551 $this->tpl[
'unit'] = $langs->transnoentities($line->getLabelOfUnit(
'long'));
5553 $this->tpl[
'remise_percent'] = (($line->info_bits & 2) != 2) ?
vatrate($line->remise_percent,
true) :
' ';
5556 $this->tpl[
'strike'] = 0;
5558 $this->tpl[
'strike'] = 1;
5563 $dirtpls = array_merge($conf->modules_parts[
'tpl'], array($defaulttpldir));
5564 foreach ($dirtpls as $module => $reldir) {
5565 if (!empty($module)) {
5568 $tpl = DOL_DOCUMENT_ROOT.$reldir.
'/originproductline.tpl.php';
5571 if (empty($conf->file->strict_mode)) {
5572 $res = @include $tpl;
5574 $res = include $tpl;
5599 $sql =
"INSERT INTO ".$this->db->prefix().
"element_resources (";
5600 $sql .=
"resource_id";
5601 $sql .=
", resource_type";
5602 $sql .=
", element_id";
5603 $sql .=
", element_type";
5605 $sql .=
", mandatory";
5606 $sql .=
") VALUES (";
5607 $sql .= ((int) $resource_id);
5608 $sql .=
", '".$this->db->escape($resource_type).
"'";
5609 $sql .=
", '".$this->db->escape($this->
id).
"'";
5610 $sql .=
", '".$this->db->escape($this->element).
"'";
5611 $sql .=
", '".$this->db->escape($busy).
"'";
5612 $sql .=
", '".$this->db->escape($mandatory).
"'";
5615 dol_syslog(get_class($this).
"::add_element_resource", LOG_DEBUG);
5616 if ($this->db->query($sql)) {
5617 $this->db->commit();
5620 $this->error = $this->db->lasterror();
5621 $this->db->rollback();
5642 $sql =
"DELETE FROM ".$this->db->prefix().
"element_resources";
5643 $sql .=
" WHERE rowid = ".((int) $rowid);
5645 dol_syslog(get_class($this).
"::delete_resource", LOG_DEBUG);
5647 $resql = $this->db->query($sql);
5649 $this->error = $this->db->lasterror();
5650 $this->db->rollback();
5654 $result = $this->call_trigger(strtoupper($element).
'_DELETE_RESOURCE', $user);
5656 $this->db->rollback();
5660 $this->db->commit();
5674 if (isset($this->lines) && is_array($this->lines)) {
5675 $nboflines = count($this->lines);
5676 for ($i = 0; $i < $nboflines; $i++) {
5677 if (is_object($this->lines[$i])) {
5678 $this->lines[$i] = clone $this->lines[$i];
5697 protected function commonGenerateDocument($modelspath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams =
null)
5699 global $conf, $langs, $user, $hookmanager, $action;
5701 $srctemplatepath =
'';
5703 $parameters = array(
'modelspath' => $modelspath,
'modele' => $modele,
'outputlangs' => $outputlangs,
'hidedetails' => $hidedetails,
'hidedesc' => $hidedesc,
'hideref' => $hideref,
'moreparams' => $moreparams);
5704 $reshook = $hookmanager->executeHooks(
'commonGenerateDocument', $parameters, $this, $action);
5706 if (!empty($reshook)) {
5710 dol_syslog(
"commonGenerateDocument modele=".$modele.
" outputlangs->defaultlang=".(is_object($outputlangs) ? $outputlangs->defaultlang :
'null'));
5712 if (empty($modele)) {
5713 $this->error =
'BadValueForParameterModele';
5718 $err = error_reporting();
5720 @set_time_limit(120);
5721 error_reporting($err);
5724 $tmp = explode(
':', $modele, 2);
5725 $saved_model = $modele;
5726 if (!empty($tmp[1])) {
5728 $srctemplatepath = $tmp[1];
5735 $dirmodels = array(
'/');
5736 if (is_array($conf->modules_parts[
'models'])) {
5737 $dirmodels = array_merge($dirmodels, $conf->modules_parts[
'models']);
5739 foreach ($dirmodels as $reldir) {
5740 foreach (array(
'doc',
'pdf') as $prefix) {
5741 if (in_array(get_class($this), array(
'Adherent'))) {
5743 $file = $prefix.
"_".$modele.
".class.php";
5746 $file = $prefix.
"_".$modele.
".modules.php";
5753 if (file_exists($file)) {
5755 $classname = $prefix.
'_'.$modele;
5764 if ($filefound ===
'' || $classname ===
'') {
5765 $this->error = $langs->trans(
"Error").
' Failed to load doc generator with modelpaths='.$modelspath.
' - modele='.$modele;
5766 $this->errors[] = $this->error;
5777 require_once $filefound;
5779 $obj =
new $classname($this->db);
5782 if ($obj->type ==
'odt' && empty($srctemplatepath)) {
5783 $varfortemplatedir = $obj->scandir;
5787 $listoffiles = array();
5790 $listofdir = explode(
',', $dirtoscan);
5791 foreach ($listofdir as $key => $tmpdir) {
5792 $tmpdir = trim($tmpdir);
5793 $tmpdir = preg_replace(
'/DOL_DATA_ROOT/', DOL_DATA_ROOT, $tmpdir);
5795 unset($listofdir[$key]);
5798 if (is_dir($tmpdir)) {
5799 $tmpfiles =
dol_dir_list($tmpdir,
'files', 0,
'\.od(s|t)$',
'',
'name', SORT_ASC, 0);
5800 if (count($tmpfiles)) {
5801 $listoffiles = array_merge($listoffiles, $tmpfiles);
5806 if (count($listoffiles)) {
5807 foreach ($listoffiles as $record) {
5808 $srctemplatepath = $record[
'fullname'];
5814 if (empty($srctemplatepath)) {
5815 $this->error =
'ErrorGenerationAskedForOdtTemplateWithSrcFileNotDefined';
5820 if ($obj->type ==
'odt' && !empty($srctemplatepath)) {
5822 dol_syslog(
"Failed to locate template file ".$srctemplatepath, LOG_WARNING);
5823 $this->error =
'ErrorGenerationAskedForOdtTemplateWithSrcFileNotFound';
5830 $sav_charset_output = empty($outputlangs->charset_output) ?
'' : $outputlangs->charset_output;
5833 $this->model_pdf = $saved_model;
5835 if (in_array(get_class($this), array(
'Adherent'))) {
5836 '@phan-var-force Adherent $this';
5837 $resultwritefile = $obj->write_file($this, $outputlangs, $srctemplatepath,
'member', 1,
'tmp_cards', $moreparams);
5839 $resultwritefile = $obj->write_file($this, $outputlangs, $srctemplatepath, $hidedetails, $hidedesc, $hideref, $moreparams);
5843 if ($resultwritefile > 0) {
5844 $outputlangs->charset_output = $sav_charset_output;
5847 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
5851 if (!empty($obj->result[
'fullpath'])) {
5852 $destfull = $obj->result[
'fullpath'];
5855 $update_main_doc_field = 0;
5856 if (!empty($obj->update_main_doc_field)) {
5857 $update_main_doc_field = 1;
5863 $this->indexFile($destfull, $update_main_doc_field);
5866 dol_syslog(
'Method ->write_file was called on object '.get_class($obj).
' and return a success but the return array ->result["fullpath"] was not set.', LOG_WARNING);
5874 $outputlangs->charset_output = $sav_charset_output;
5875 $this->error = $obj->error;
5876 $this->errors = $obj->errors;
5877 dol_syslog(
"Error generating document for ".__CLASS__.
". Error: ".$obj->error, LOG_ERR);
5891 public function indexFile($destfull, $update_main_doc_field)
5893 global $conf, $user;
5895 $upload_dir = dirname($destfull);
5896 $destfile = basename($destfull);
5897 $rel_dir = preg_replace(
'/^'.preg_quote(DOL_DATA_ROOT,
'/').
'/',
'', $upload_dir);
5899 if (!preg_match(
'/[\\/]temp[\\/]|[\\/]thumbs|\.meta$/', $rel_dir)) {
5900 $filename = basename($destfile);
5901 $rel_dir = preg_replace(
'/[\\/]$/',
'', $rel_dir);
5902 $rel_dir = preg_replace(
'/^[\\/]/',
'', $rel_dir);
5904 include_once DOL_DOCUMENT_ROOT.
'/ecm/class/ecmfiles.class.php';
5905 $ecmfile =
new EcmFiles($this->db);
5906 $result = $ecmfile->fetch(0,
'', ($rel_dir ? $rel_dir.
'/' :
'').$filename);
5909 $setsharekey =
false;
5910 if ($this->element ==
'propal' || $this->element ==
'proposal') {
5912 $setsharekey =
true;
5915 $setsharekey =
true;
5918 if ($this->element ==
'commande' &&
getDolGlobalInt(
"ORDER_ALLOW_EXTERNAL_DOWNLOAD")) {
5919 $setsharekey =
true;
5921 if ($this->element ==
'facture' &&
getDolGlobalInt(
"INVOICE_ALLOW_EXTERNAL_DOWNLOAD")) {
5922 $setsharekey =
true;
5924 if ($this->element ==
'bank_account' &&
getDolGlobalInt(
"BANK_ACCOUNT_ALLOW_EXTERNAL_DOWNLOAD")) {
5925 $setsharekey =
true;
5927 if ($this->element ==
'product' &&
getDolGlobalInt(
"PRODUCT_ALLOW_EXTERNAL_DOWNLOAD")) {
5928 $setsharekey =
true;
5930 if ($this->element ==
'contrat' &&
getDolGlobalInt(
"CONTRACT_ALLOW_EXTERNAL_DOWNLOAD")) {
5931 $setsharekey =
true;
5933 if ($this->element ==
'fichinter' &&
getDolGlobalInt(
"FICHINTER_ALLOW_EXTERNAL_DOWNLOAD")) {
5934 $setsharekey =
true;
5936 if ($this->element ==
'supplier_proposal' &&
getDolGlobalInt(
"SUPPLIER_PROPOSAL_ALLOW_EXTERNAL_DOWNLOAD")) {
5937 $setsharekey =
true;
5939 if ($this->element ==
'societe_rib' &&
getDolGlobalInt(
"SOCIETE_RIB_ALLOW_ONLINESIGN")) {
5940 $setsharekey =
true;
5944 if (empty($ecmfile->share)) {
5945 require_once DOL_DOCUMENT_ROOT.
'/core/lib/security2.lib.php';
5952 $ecmfile->fullpath_orig =
'';
5953 $ecmfile->gen_or_uploaded =
'generated';
5954 $ecmfile->description =
'';
5955 $ecmfile->keywords =
'';
5956 $result = $ecmfile->update($user);
5962 $ecmfile->entity = $conf->entity;
5963 $ecmfile->filepath = $rel_dir;
5964 $ecmfile->filename = $filename;
5966 $ecmfile->fullpath_orig =
'';
5967 $ecmfile->gen_or_uploaded =
'generated';
5968 $ecmfile->description =
'';
5969 $ecmfile->keywords =
'';
5970 $ecmfile->src_object_type = $this->table_element;
5971 $ecmfile->src_object_id = $this->id;
5973 $result = $ecmfile->create($user);
5985 if ($update_main_doc_field && !empty($this->table_element)) {
5986 $sql =
"UPDATE ".$this->db->prefix().$this->table_element.
" SET last_main_doc = '".$this->db->escape($ecmfile->filepath.
"/".$ecmfile->filename).
"'";
5987 $sql .=
" WHERE rowid = ".((int) $this->
id);
5989 $resql = $this->db->query($sql);
5994 $this->last_main_doc = $ecmfile->filepath.
'/'.$ecmfile->filename;
6013 if (file_exists($file_osencoded)) {
6014 require_once DOL_DOCUMENT_ROOT.
'/core/lib/images.lib.php';
6017 $maxwidthsmall = $tmparraysize[
'maxwidthsmall'];
6018 $maxheightsmall = $tmparraysize[
'maxheightsmall'];
6019 $maxwidthmini = $tmparraysize[
'maxwidthmini'];
6020 $maxheightmini = $tmparraysize[
'maxheightmini'];
6026 vignette($file_osencoded, $maxwidthsmall, $maxheightsmall,
'_small', $quality);
6030 vignette($file_osencoded, $maxwidthmini, $maxheightmini,
'_mini', $quality);
6070 if (GETPOSTISSET($fieldname)) {
6071 return GETPOST($fieldname, $type, 3);
6074 if (isset($alternatevalue)) {
6075 return $alternatevalue;
6078 $newelement = $this->element;
6079 if ($newelement ==
'facture') {
6080 $newelement =
'invoice';
6082 if ($newelement ==
'commande') {
6083 $newelement =
'order';
6085 if (empty($newelement)) {
6086 dol_syslog(
"Ask a default value using common method getDefaultCreateValueForField on an object with no property ->element defined. Return empty string.", LOG_WARNING);
6090 $keyforfieldname = strtoupper($newelement.
'_DEFAULT_'.$fieldname);
6120 global $langs, $conf;
6122 if (!empty(self::TRIGGER_PREFIX) && strpos($triggerName, self::TRIGGER_PREFIX .
'_') !== 0) {
6123 dol_print_error(
null,
'The trigger "' . $triggerName .
'" does not start with "' . self::TRIGGER_PREFIX .
'_" as required.');
6126 if (!is_object($langs)) {
6127 include_once DOL_DOCUMENT_ROOT.
'/core/class/translate.class.php';
6131 include_once DOL_DOCUMENT_ROOT.
'/core/class/interfaces.class.php';
6133 $result = $interface->run_triggers($triggerName, $this, $user, $langs, $conf);
6136 if (!empty($this->errors)) {
6137 $this->errors = array_unique(array_merge($this->errors, $interface->errors));
6139 $this->errors = $interface->errors;
6159 if (!$this->element) {
6162 if (!($this->
id > 0)) {
6165 if (is_array($this->array_languages)) {
6169 $this->array_languages = array();
6171 $element = $this->element;
6172 if ($element ==
'categorie') {
6173 $element =
'categories';
6177 $sql =
"SELECT rowid, property, lang , value";
6178 $sql .=
" FROM ".$this->db->prefix().
"object_lang";
6179 $sql .=
" WHERE type_object = '".$this->db->escape($element).
"'";
6180 $sql .=
" AND fk_object = ".((int) $this->
id);
6183 $resql = $this->db->query($sql);
6185 $numrows = $this->db->num_rows($resql);
6188 while ($i < $numrows) {
6189 $obj = $this->db->fetch_object($resql);
6190 $key = $obj->property;
6191 $value = $obj->value;
6192 $codelang = $obj->lang;
6193 $type = $this->fields[$key][
'type'];
6196 if (preg_match(
'/date/', $type)) {
6197 $this->array_languages[$key][$codelang] = $this->db->jdate($value);
6199 $this->array_languages[$key][$codelang] = $value;
6206 $this->db->free($resql);
6228 foreach ($_POST as $postfieldkey => $postfieldvalue) {
6229 $tmparray = explode(
'-', $postfieldkey);
6230 if ($tmparray[0] !=
'field') {
6234 $element = $tmparray[1];
6235 $key = $tmparray[2];
6236 $codelang = $tmparray[3];
6239 if (!empty($onlykey) && $key != $onlykey) {
6242 if ($element != $this->element) {
6246 $key_type = $this->fields[$key][
'type'];
6249 if (isset($this->fields[$key][
'enabled'])) {
6250 $enabled = (int)
dol_eval($this->fields[$key][
'enabled'], 1, 1,
'1');
6257 if (empty($enabled)) {
6262 if (in_array($key_type, array(
'date'))) {
6266 } elseif (in_array($key_type, array(
'datetime'))) {
6270 } elseif (in_array($key_type, array(
'checkbox',
'chkbxlst'))) {
6271 $value_arr =
GETPOST($postfieldkey,
'array');
6272 if (!empty($value_arr)) {
6273 $value_key = implode(
',', $value_arr);
6277 } elseif (in_array($key_type, array(
'price',
'double'))) {
6278 $value_arr =
GETPOST($postfieldkey,
'alpha');
6281 $value_key =
GETPOST($postfieldkey);
6282 if (in_array($key_type, array(
'link')) && $value_key ==
'-1') {
6287 $this->array_languages[$key][$codelang] = $value_key;
6312 $savDisableCompute = $conf->disable_compute;
6313 $conf->disable_compute = 1;
6315 $ret = $this->fetch($id);
6317 $conf->disable_compute = $savDisableCompute;
6335 global $conf, $extrafields;
6337 if (empty($rowid)) {
6340 if (empty($rowid) && isset($this->
rowid)) {
6341 $rowid = $this->rowid;
6345 if (!$this->table_element) {
6349 $this->array_options = array();
6351 if (!is_array($optionsArray)) {
6353 if (!isset($extrafields) || !is_object($extrafields)) {
6354 require_once DOL_DOCUMENT_ROOT.
'/core/class/extrafields.class.php';
6359 if (empty($extrafields->attributes[$this->table_element][
'loaded'])) {
6360 $extrafields->fetch_name_optionals_label($this->table_element);
6362 $optionsArray = (!empty($extrafields->attributes[$this->table_element][
'label']) ? $extrafields->attributes[$this->table_element][
'label'] :
null);
6364 global $extrafields;
6365 dol_syslog(
"Warning: fetch_optionals was called with param optionsArray defined when you should pass null now", LOG_WARNING);
6368 $table_element = $this->table_element;
6369 if ($table_element ==
'categorie') {
6370 $table_element =
'categories';
6374 if (is_array($optionsArray) && count($optionsArray) > 0) {
6375 $sql =
"SELECT rowid";
6376 foreach ($optionsArray as $name => $label) {
6377 if (empty($extrafields->attributes[$this->table_element][
'type'][$name]) || (!in_array($extrafields->attributes[$this->table_element][
'type'][$name], [
'separate',
'point',
'multipts',
'linestrg',
'polygon']))) {
6381 if (empty($extrafields->attributes[$this->table_element][
'type'][$name]) || $extrafields->attributes[$this->table_element][
'type'][$name] ==
'point') {
6382 $sql .=
", ST_AsWKT(".$name.
") as ".$name;
6384 if (empty($extrafields->attributes[$this->table_element][
'type'][$name]) || $extrafields->attributes[$this->table_element][
'type'][$name] ==
'multipts') {
6385 $sql .=
", ST_AsWKT(".$name.
") as ".$name;
6387 if (empty($extrafields->attributes[$this->table_element][
'type'][$name]) || $extrafields->attributes[$this->table_element][
'type'][$name] ==
'linestrg') {
6388 $sql .=
", ST_AsWKT(".$name.
") as ".$name;
6390 if (empty($extrafields->attributes[$this->table_element][
'type'][$name]) || $extrafields->attributes[$this->table_element][
'type'][$name] ==
'polygon') {
6391 $sql .=
", ST_AsWKT(".$name.
") as ".$name;
6394 $sql .=
" FROM ".$this->db->prefix().$table_element.
"_extrafields";
6395 $sql .=
" WHERE fk_object = ".((int) $rowid);
6398 $resql = $this->db->query($sql);
6400 $numrows = $this->db->num_rows($resql);
6402 $tab = $this->db->fetch_array($resql);
6404 foreach ($tab as $key => $value) {
6406 if ($key !=
'rowid' && $key !=
'tms' && $key !=
'fk_member' && !is_int($key)) {
6408 if (!empty($extrafields->attributes[$this->table_element]) && in_array($extrafields->attributes[$this->table_element][
'type'][$key], array(
'date',
'datetime'))) {
6410 $this->array_options[
"options_".$key] = $this->db->jdate($value);
6412 $this->array_options[
"options_".$key] = $value;
6417 if (!empty($extrafields->attributes[$this->table_element][
'type'][$key]) && $extrafields->attributes[$this->table_element][
'type'][$key] ==
'password') {
6418 if (!empty($value) && preg_match(
'/^dolcrypt:/', $value)) {
6419 $this->array_options[
"options_".$key] =
dolDecrypt($value);
6428 if (is_array($extrafields->attributes[$this->table_element][
'label'])) {
6429 foreach ($extrafields->attributes[$this->table_element][
'label'] as $key => $val) {
6430 $this->array_options[
'options_' . $key] =
null;
6437 if (is_array($extrafields->attributes[$this->table_element][
'label'])) {
6438 foreach ($extrafields->attributes[$this->table_element][
'label'] as $key => $val) {
6439 if (!empty($extrafields->attributes[$this->table_element]) && !empty($extrafields->attributes[$this->table_element][
'computed'][$key])) {
6441 if (empty($conf->disable_compute)) {
6442 global $objectoffield;
6443 $objectoffield = $this;
6444 $this->array_options[
'options_' . $key] =
dol_eval($extrafields->attributes[$this->table_element][
'computed'][$key], 1, 0,
'2');
6450 $this->db->free($resql);
6458 $this->errors[] = $this->db->lasterror;
6481 $table_element = $this->table_element;
6482 if ($table_element ==
'categorie') {
6483 $table_element =
'categories';
6486 dol_syslog(get_class($this).
"::deleteExtraFields delete", LOG_DEBUG);
6488 $sql_del =
"DELETE FROM ".$this->db->prefix().$table_element.
"_extrafields WHERE fk_object = ".((int) $this->
id);
6490 $resql = $this->db->query($sql_del);
6492 $this->error = $this->db->lasterror();
6493 $this->db->rollback();
6496 $this->db->commit();
6513 global $conf, $langs, $user;
6519 if (empty($userused)) {
6525 if (!empty($this->array_options)) {
6527 $langs->load(
'admin');
6528 require_once DOL_DOCUMENT_ROOT.
'/core/class/extrafields.class.php';
6530 $target_extrafields = $extrafields->fetch_name_optionals_label($this->table_element);
6533 $new_array_options = array();
6534 foreach ($this->array_options as $key => $value) {
6535 if (in_array(substr($key, 8), array_keys($target_extrafields))) {
6536 $new_array_options[$key] = $value;
6537 } elseif (in_array($key, array_keys($target_extrafields))) {
6538 $new_array_options[
'options_'.$key] = $value;
6542 foreach ($new_array_options as $key => $value) {
6543 $attributeKey = substr($key, 8);
6544 $attributeType = $extrafields->attributes[$this->table_element][
'type'][$attributeKey];
6545 $attributeLabel = $langs->transnoentities($extrafields->attributes[$this->table_element][
'label'][$attributeKey]);
6546 $attributeParam = $extrafields->attributes[$this->table_element][
'param'][$attributeKey];
6547 $attributeRequired = $extrafields->attributes[$this->table_element][
'required'][$attributeKey];
6548 $attributeUnique = $extrafields->attributes[$this->table_element][
'unique'][$attributeKey];
6549 $attrfieldcomputed = $extrafields->attributes[$this->table_element][
'computed'][$attributeKey];
6553 if (!empty($this->context[
'createfromclone']) && $this->context[
'createfromclone'] ==
'createfromclone' && !empty($attributeUnique)) {
6554 $new_array_options[$key] =
null;
6558 if ($attributeRequired) {
6559 $v = $this->array_options[$key];
6561 $langs->load(
"errors");
6562 dol_syslog(
"Mandatory field '".$key.
"' is empty during create and set to required into definition of extrafields");
6563 $this->errors[] = $langs->trans(
'ErrorFieldRequired', $attributeLabel);
6571 if (!empty($attrfieldcomputed)) {
6573 $value =
dol_eval($attrfieldcomputed, 1, 0,
'2');
6574 dol_syslog($langs->trans(
"Extrafieldcomputed").
" on ".$attributeLabel.
"(".$value.
")", LOG_DEBUG);
6575 $new_array_options[$key] = $value;
6577 $new_array_options[$key] =
null;
6581 switch ($attributeType) {
6583 if (!is_numeric($value) && $value !=
'') {
6584 $this->errors[] = $langs->trans(
"ExtraFieldHasWrongValue", $attributeLabel);
6586 } elseif ($value ==
'') {
6587 $new_array_options[$key] =
null;
6593 if (!is_numeric($value) && $value !=
'') {
6594 dol_syslog($langs->trans(
"ExtraFieldHasWrongValue").
" for ".$attributeLabel.
"(".$value.
"is not '".$attributeType.
"')", LOG_DEBUG);
6595 $this->errors[] = $langs->trans(
"ExtraFieldHasWrongValue", $attributeLabel);
6597 } elseif ($value ==
'') {
6601 $new_array_options[$key] = $value;
6611 if ($this->array_options[$key] !=
'' && is_array($extrafields->attributes[$this->table_element][
'param'][$attributeKey][
'options'])) {
6613 $tmparrays = array_keys($extrafields->attributes[$this->table_element][
'param'][$attributeKey][
'options']);
6614 $algo = reset($tmparrays);
6619 if (is_object($this->oldcopy)) {
6621 if (isset($this->oldcopy->array_options[$key]) && $this->array_options[$key] == $this->oldcopy->array_options[$key]) {
6623 if ($algo ==
'dolcrypt') {
6624 if (!preg_match(
'/^dolcrypt:/', $this->array_options[$key])) {
6625 $new_array_options[$key] =
dolEncrypt($this->array_options[$key]);
6627 $new_array_options[$key] = $this->array_options[$key];
6630 $new_array_options[$key] = $this->array_options[$key];
6634 if ($algo ==
'dolcrypt') {
6635 if (!preg_match(
'/^dolcrypt:/', $this->array_options[$key])) {
6636 $new_array_options[$key] =
dolEncrypt($this->array_options[$key]);
6638 $new_array_options[$key] = $this->array_options[$key];
6641 $new_array_options[$key] =
dol_hash($this->array_options[$key], $algo);
6647 if ($algo ==
'dolcrypt' && !preg_match(
'/^dolcrypt:/', $this->array_options[$key])) {
6648 $new_array_options[$key] =
dolEncrypt($this->array_options[$key]);
6650 $new_array_options[$key] = $this->array_options[$key];
6655 $new_array_options[$key] = $this->array_options[$key];
6658 $new_array_options[$key] = $this->array_options[$key];
6664 if (!is_numeric($this->array_options[$key]) || $this->array_options[$key] != intval($this->array_options[$key])) {
6665 $this->array_options[$key] = strtotime($this->array_options[$key]);
6667 $new_array_options[$key] = $this->db->idate($this->array_options[$key]);
6671 if (!is_numeric($this->array_options[$key]) || $this->array_options[$key] != intval($this->array_options[$key])) {
6672 $this->array_options[$key] = strtotime($this->array_options[$key]);
6674 $new_array_options[$key] = $this->db->idate($this->array_options[$key],
'gmt');
6677 $param_list = array_keys($attributeParam[
'options']);
6680 $InfoFieldList = explode(
":", $param_list[0]);
6682 if ($InfoFieldList[0] && class_exists($InfoFieldList[0])) {
6683 if ($value ==
'-1') {
6684 $new_array_options[$key] =
'';
6686 $object =
new $InfoFieldList[0]($this->db);
6687 if (is_numeric($value)) {
6688 $res =
$object->fetch($value);
6690 $res =
$object->fetch(
'', $value);
6694 $new_array_options[$key] =
$object->id;
6696 $this->error =
"Id/Ref '".$value.
"' for object '".
$object->element.
"' not found";
6701 dol_syslog(
'Error bad setup of extrafield', LOG_WARNING);
6706 if (is_array($this->array_options[$key])) {
6707 $new_array_options[$key] = implode(
',', $this->array_options[$key]);
6709 $new_array_options[$key] = $this->array_options[$key];
6717 $table_element = $this->table_element;
6718 if ($table_element ==
'categorie') {
6719 $table_element =
'categories';
6722 dol_syslog(get_class($this).
"::insertExtraFields delete then insert", LOG_DEBUG);
6724 $sql_del =
"DELETE FROM ".$this->db->prefix().$table_element.
"_extrafields WHERE fk_object = ".((int) $this->
id);
6725 $this->db->query($sql_del);
6727 $sql =
"INSERT INTO ".$this->db->prefix().$table_element.
"_extrafields (fk_object";
6728 foreach ($new_array_options as $key => $value) {
6729 $attributeKey = substr($key, 8);
6731 if ($extrafields->attributes[$this->table_element][
'type'][$attributeKey] !=
'separate') {
6732 $sql .=
",".$attributeKey;
6736 if (!empty($extrafields->attributes[$this->table_element][
'mandatoryfieldsofotherentities']) && is_array($extrafields->attributes[$this->table_element][
'mandatoryfieldsofotherentities'])) {
6737 foreach ($extrafields->attributes[$this->table_element][
'mandatoryfieldsofotherentities'] as $tmpkey => $tmpval) {
6738 if (!isset($extrafields->attributes[$this->table_element][
'type'][$tmpkey])) {
6739 $sql .=
",".$tmpkey;
6743 $sql .=
") VALUES (".$this->id;
6745 foreach ($new_array_options as $key => $value) {
6746 $attributeKey = substr($key, 8);
6748 if (!in_array($extrafields->attributes[$this->table_element][
'type'][$attributeKey], [
'separate',
'point',
'multipts',
'linestrg',
'polygon'])) {
6749 if ($new_array_options[$key] !=
'' || $new_array_options[$key] ==
'0') {
6750 $sql .=
",'".$this->db->escape($new_array_options[$key]).
"'";
6755 if ($extrafields->attributes[$this->table_element][
'type'][$attributeKey] ==
'point') {
6756 if (!empty($new_array_options[$key])) {
6757 $sql .=
",ST_PointFromText('".$this->db->escape($new_array_options[$key]).
"')";
6762 if ($extrafields->attributes[$this->table_element][
'type'][$attributeKey] ==
'multipts') {
6763 if (!empty($new_array_options[$key])) {
6764 $sql .=
",ST_MultiPointFromText('".$this->db->escape($new_array_options[$key]).
"')";
6769 if ($extrafields->attributes[$this->table_element][
'type'][$attributeKey] ==
'linestrg') {
6770 if (!empty($new_array_options[$key])) {
6771 $sql .=
",ST_LineFromText('".$this->db->escape($new_array_options[$key]).
"')";
6776 if ($extrafields->attributes[$this->table_element][
'type'][$attributeKey] ==
'polygon') {
6777 if (!empty($new_array_options[$key])) {
6778 $sql .=
",ST_PolyFromText('".$this->db->escape($new_array_options[$key]).
"')";
6785 if (!empty($extrafields->attributes[$this->table_element][
'mandatoryfieldsofotherentities']) && is_array($extrafields->attributes[$this->table_element][
'mandatoryfieldsofotherentities'])) {
6786 foreach ($extrafields->attributes[$this->table_element][
'mandatoryfieldsofotherentities'] as $tmpkey => $tmpval) {
6787 if (!isset($extrafields->attributes[$this->table_element][
'type'][$tmpkey])) {
6788 if (in_array($tmpval, array(
'int',
'double',
'price'))) {
6799 $resql = $this->db->query($sql);
6801 $this->error = $this->db->lasterror();
6805 if (!$error && $trigger) {
6807 $this->context = array(
'extrafieldaddupdate' => 1);
6808 $result = $this->call_trigger($trigger, $userused);
6816 $this->db->rollback();
6819 $this->db->commit();
6839 global $conf, $langs, $user;
6841 if (empty($userused)) {
6851 if (is_array($this->array_languages)) {
6852 $new_array_languages = $this->array_languages;
6854 foreach ($new_array_languages as $key => $value) {
6855 $attributeKey = $key;
6856 $attributeType = $this->fields[$attributeKey][
'type'];
6857 $attributeLabel = $this->fields[$attributeKey][
'label'];
6862 switch ($attributeType) {
6864 if (is_array($value) || (!is_numeric($value) && $value !=
'')) {
6865 $this->errors[] = $langs->trans(
"ExtraLanguageHasWrongValue", $attributeLabel);
6867 } elseif ($value ==
'') {
6868 $new_array_languages[$key] =
null;
6873 if (!is_numeric($value) && $value !=
'') {
6874 dol_syslog($langs->trans(
"ExtraLanguageHasWrongValue").
" on ".$attributeLabel.
"(".$value.
"is not '".$attributeType.
"')", LOG_DEBUG);
6875 $this->errors[] = $langs->trans(
"ExtraLanguageHasWrongValue", $attributeLabel);
6877 } elseif ($value ==
'') {
6878 $new_array_languages[$key] =
null;
6880 $new_array_languages[$key] = $value;
6894 $table_element = $this->table_element;
6895 if ($table_element ==
'categorie') {
6896 $table_element =
'categories';
6899 dol_syslog(get_class($this).
"::insertExtraLanguages delete then insert", LOG_DEBUG);
6901 foreach ($new_array_languages as $key => $langcodearray) {
6902 foreach ($langcodearray as $langcode => $value) {
6903 $sql_del =
"DELETE FROM ".$this->db->prefix().
"object_lang";
6904 $sql_del .=
" WHERE fk_object = ".((int) $this->
id).
" AND property = '".$this->db->escape($key).
"' AND type_object = '".$this->db->escape($table_element).
"'";
6905 $sql_del .=
" AND lang = '".$this->db->escape($langcode).
"'";
6906 $this->db->query($sql_del);
6908 if ($value !==
'') {
6909 $sql =
"INSERT INTO ".$this->db->prefix().
"object_lang (fk_object, property, type_object, lang, value";
6910 $sql .=
") VALUES (".$this->id.
", '".$this->db->escape($key).
"', '".$this->db->escape($table_element).
"', '".$this->db->escape($langcode).
"', '".$this->db->escape($value).
"'";
6913 $resql = $this->db->query($sql);
6915 $this->error = $this->db->lasterror();
6923 if (!$error && $trigger) {
6925 $this->context = array(
'extralanguagesaddupdate' => 1);
6926 $result = $this->call_trigger($trigger, $userused);
6934 $this->db->rollback();
6937 $this->db->commit();
6957 global $conf, $langs, $user, $hookmanager;
6963 if (empty($userused)) {
6969 if (!empty($this->array_options) && isset($this->array_options[
"options_".$key])) {
6971 $langs->load(
'admin');
6972 require_once DOL_DOCUMENT_ROOT.
'/core/class/extrafields.class.php';
6974 $extrafields->fetch_name_optionals_label($this->table_element);
6976 $value = $this->array_options[
"options_".$key];
6978 $attributeKey = $key;
6979 $attributeType = $extrafields->attributes[$this->table_element][
'type'][$key];
6980 $attributeLabel = $extrafields->attributes[$this->table_element][
'label'][$key];
6981 $attributeParam = $extrafields->attributes[$this->table_element][
'param'][$key];
6982 $attributeRequired = $extrafields->attributes[$this->table_element][
'required'][$key];
6983 $attributeUnique = $extrafields->attributes[$this->table_element][
'unique'][$attributeKey];
6984 $attrfieldcomputed = $extrafields->attributes[$this->table_element][
'computed'][$key];
6987 if ($attributeRequired) {
6988 $mandatorypb =
false;
6989 if ($attributeType ==
'link' && $this->array_options[
"options_".$key] ==
'-1') {
6990 $mandatorypb =
true;
6992 if ($this->array_options[
"options_".$key] ===
'') {
6993 $mandatorypb =
true;
6996 $langs->load(
"errors");
6997 dol_syslog(
"Mandatory field 'options_".$key.
"' is empty during update and set to required into definition of extrafields");
6998 $this->errors[] = $langs->trans(
'ErrorFieldRequired', $attributeLabel);
7004 $new_array_options = $this->array_options;
7008 if (!empty($attrfieldcomputed)) {
7010 $value =
dol_eval($attrfieldcomputed, 1, 0,
'2');
7011 dol_syslog($langs->trans(
"Extrafieldcomputed").
" on ".$attributeLabel.
"(".$value.
")", LOG_DEBUG);
7013 $new_array_options[
"options_".$key] = $value;
7015 $this->array_options[
"options_".$key] = $new_array_options[
"options_".$key];
7017 $new_array_options[
"options_".$key] =
null;
7019 $this->array_options[
"options_".$key] = $new_array_options[
"options_".$key];
7023 switch ($attributeType) {
7025 if (!is_numeric($value) && $value !=
'') {
7026 $this->errors[] = $langs->trans(
"ExtraFieldHasWrongValue", $attributeLabel);
7028 } elseif ($value ===
'') {
7029 $new_array_options[
"options_".$key] =
null;
7031 $this->array_options[
"options_".$key] = $new_array_options[
"options_".$key];
7037 if (!is_numeric($value) && $value !=
'') {
7038 dol_syslog($langs->trans(
"ExtraFieldHasWrongValue").
" on ".$attributeLabel.
"(".$value.
"is not '".$attributeType.
"')", LOG_DEBUG);
7039 $this->errors[] = $langs->trans(
"ExtraFieldHasWrongValue", $attributeLabel);
7041 } elseif ($value ===
'') {
7045 $new_array_options[
"options_".$key] = $value;
7047 $this->array_options[
"options_".$key] = $new_array_options[
"options_".$key];
7059 if ($this->array_options[
"options_".$key] !=
'' && is_array($extrafields->attributes[$this->table_element][
'param'][$attributeKey][
'options'])) {
7061 $tmparrays = array_keys($extrafields->attributes[$this->table_element][
'param'][$attributeKey][
'options']);
7062 $algo = reset($tmparrays);
7068 if (is_object($this->oldcopy)) {
7070 if (isset($this->oldcopy->array_options[
"options_".$key]) && $this->array_options[
"options_".$key] == $this->oldcopy->array_options[
"options_".$key]) {
7071 if ($algo ==
'dolcrypt') {
7072 if (!preg_match(
'/^dolcrypt:/', $this->array_options[
"options_".$key])) {
7073 $new_array_options[
"options_".$key] =
dolEncrypt($this->array_options[
"options_".$key]);
7075 $new_array_options[
"options_".$key] = $this->array_options[
"options_".$key];
7078 $new_array_options[
"options_".$key] = $this->array_options[
"options_".$key];
7081 if ($algo ==
'dolcrypt') {
7082 if (!preg_match(
'/^dolcrypt:/', $this->array_options[
"options_".$key])) {
7083 $new_array_options[
"options_".$key] =
dolEncrypt($this->array_options[
"options_".$key]);
7085 $new_array_options[
"options_".$key] = $this->array_options[
"options_".$key];
7088 $new_array_options[
"options_".$key] =
dol_hash($this->array_options[
"options_".$key], $algo);
7092 if ($algo ==
'dolcrypt' && !preg_match(
'/^dolcrypt:/', $this->array_options[
"options_".$key])) {
7093 $new_array_options[
"options_".$key] =
dolEncrypt($this->array_options[
"options_".$key]);
7095 $new_array_options[
"options_".$key] = $this->array_options[
"options_".$key];
7100 $new_array_options[
"options_".$key] = $this->array_options[
"options_".$key];
7103 $new_array_options[
"options_".$key] = $this->array_options[
"options_".$key];
7106 $this->array_options[
"options_".$key] = $new_array_options[
"options_".$key];
7110 if (empty($this->array_options[
"options_".$key])) {
7111 $new_array_options[
"options_".$key] =
null;
7113 $this->array_options[
"options_".$key] = $new_array_options[
"options_".$key];
7115 $new_array_options[
"options_".$key] = $this->db->idate($this->array_options[
"options_".$key]);
7119 if (empty($this->array_options[
"options_".$key])) {
7120 $new_array_options[
"options_".$key] =
null;
7122 $this->array_options[
"options_".$key] = $new_array_options[
"options_".$key];
7124 $new_array_options[
"options_".$key] = $this->db->idate($this->array_options[
"options_".$key],
'gmt');
7128 if (empty($this->array_options[
"options_".$key])) {
7129 $new_array_options[
"options_".$key] =
null;
7131 $this->array_options[
"options_".$key] = $new_array_options[
"options_".$key];
7135 if ($this->array_options[
"options_".$key] ===
'') {
7136 $new_array_options[
"options_".$key] =
null;
7138 $this->array_options[
"options_".$key] = $new_array_options[
"options_".$key];
7172 $new_array_options = array();
7173 if (is_array($this->array_options[
"options_".$key])) {
7174 $new_array_options[
"options_".$key] = implode(
',', $this->array_options[
"options_".$key]);
7176 $new_array_options[
"options_".$key] = $this->array_options[
"options_".$key];
7179 $this->array_options[
"options_".$key] = $new_array_options[
"options_".$key];
7185 $linealreadyfound = 0;
7188 $table_element = $this->table_element;
7189 if ($table_element ==
'categorie') {
7190 $table_element =
'categories';
7193 $sql =
"SELECT COUNT(rowid) as nb FROM ".$this->db->prefix().$table_element.
"_extrafields WHERE fk_object = ".((int) $this->
id);
7194 $resql = $this->db->query($sql);
7196 $tmpobj = $this->db->fetch_object($resql);
7198 $linealreadyfound = $tmpobj->nb;
7203 if ($linealreadyfound) {
7204 if ($this->array_options[
"options_".$key] ===
null) {
7205 $sql =
"UPDATE ".$this->db->prefix().$this->table_element.
"_extrafields SET ".$key.
" = null";
7207 $sql =
"UPDATE ".$this->db->prefix().$this->table_element.
"_extrafields SET ".$key.
" = '".$this->db->escape($new_array_options[
"options_".$key]).
"'";
7209 $sql .=
" WHERE fk_object = ".((int) $this->
id);
7211 $resql = $this->db->query($sql);
7214 $this->error = $this->db->lasterror();
7217 $result = $this->insertExtraFields(
'', $user);
7224 $parameters = array(
'key' => $key);
7226 $reshook = $hookmanager->executeHooks(
'updateExtraFieldBeforeCommit', $parameters, $this, $action);
7232 if (!$error && $trigger) {
7234 $this->context = array(
'extrafieldupdate' => 1);
7235 $result = $this->call_trigger($trigger, $userused);
7243 dol_syslog(__METHOD__.$this->error, LOG_ERR);
7244 $this->db->rollback();
7247 $this->db->commit();
7263 return $this->array_options[
'options_'.$key] ??
null;
7275 $this->array_options[
'options_'.$key] = $value;
7290 global $conf, $langs, $user;
7292 if (empty($userused)) {
7321 public function showInputField($val, $key, $value, $moreparam =
'', $keysuffix =
'', $keyprefix =
'', $morecss = 0, $nonewbutton = 0)
7323 global $conf, $langs, $form;
7325 if (!is_object($form)) {
7326 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.form.class.php';
7327 $form =
new Form($this->db);
7330 if (!empty($this->fields)) {
7331 $val = $this->fields[$key];
7335 $fieldValidationErrorMsg =
'';
7336 $validationClass =
'';
7337 $fieldValidationErrorMsg = $this->getFieldError($key);
7338 if (!empty($fieldValidationErrorMsg)) {
7339 $validationClass =
' --error';
7341 $validationClass =
' --success';
7344 $valuemultiselectinput = array();
7349 $param[
'options'] = array();
7352 $size = !empty($this->fields[$key][
'size']) ? $this->fields[$key][
'size'] : 0;
7354 if (preg_match(
'/^(integer|link):(.*):(.*):(.*):(.*)/i', $val[
'type'], $reg)) {
7355 $param[
'options'] = array($reg[2].
':'.$reg[3].
':'.$reg[4].
':'.$reg[5] =>
'N');
7357 } elseif (preg_match(
'/^(integer|link):(.*):(.*):(.*)/i', $val[
'type'], $reg)) {
7358 $param[
'options'] = array($reg[2].
':'.$reg[3].
':'.$reg[4] =>
'N');
7360 } elseif (preg_match(
'/^(integer|link):(.*):(.*)/i', $val[
'type'], $reg)) {
7361 $param[
'options'] = array($reg[2].
':'.$reg[3] =>
'N');
7363 } elseif (preg_match(
'/^(sellist):(.*):(.*):(.*):(.*)/i', $val[
'type'], $reg)) {
7364 $param[
'options'] = array($reg[2].
':'.$reg[3].
':'.$reg[4].
':'.$reg[5] =>
'N');
7366 } elseif (preg_match(
'/^(sellist):(.*):(.*):(.*)/i', $val[
'type'], $reg)) {
7367 $param[
'options'] = array($reg[2].
':'.$reg[3].
':'.$reg[4] =>
'N');
7369 } elseif (preg_match(
'/^(sellist):(.*):(.*)/i', $val[
'type'], $reg)) {
7370 $param[
'options'] = array($reg[2].
':'.$reg[3] =>
'N');
7372 } elseif (preg_match(
'/^chkbxlst:(.*)/i', $val[
'type'], $reg)) {
7373 $param[
'options'] = array($reg[1] =>
'N');
7375 } elseif (preg_match(
'/varchar\((\d+)\)/', $val[
'type'], $reg)) {
7376 $param[
'options'] = array();
7379 } elseif (preg_match(
'/varchar/', $val[
'type'])) {
7380 $param[
'options'] = array();
7383 $param[
'options'] = array();
7384 $type = $this->fields[$key][
'type'];
7389 if (!empty($this->fields[$key][
'arrayofkeyval']) && is_array($this->fields[$key][
'arrayofkeyval'])) {
7390 $param[
'options'] = $this->fields[$key][
'arrayofkeyval'];
7392 if (empty($this->fields[$key][
'multiinput'])) {
7393 $type = (($this->fields[$key][
'type'] ==
'checkbox') ? $this->fields[$key][
'type'] :
'select');
7397 $label = $this->fields[$key][
'label'];
7400 $default = (!empty($this->fields[$key][
'default']) ? $this->fields[$key][
'default'] :
'');
7402 $computed = (!empty($this->fields[$key][
'computed']) ? $this->fields[$key][
'computed'] :
'');
7404 $unique = (!empty($this->fields[$key][
'unique']) ? $this->fields[$key][
'unique'] : 0);
7406 $required = (!empty($this->fields[$key][
'required']) ? $this->fields[$key][
'required'] : 0);
7408 $autofocusoncreate = (!empty($this->fields[$key][
'autofocusoncreate']) ? $this->fields[$key][
'autofocusoncreate'] : 0);
7411 $langfile = (!empty($this->fields[$key][
'langfile']) ? $this->fields[$key][
'langfile'] :
'');
7413 $list = (!empty($this->fields[$key][
'list']) ? $this->fields[$key][
'list'] : 0);
7414 $hidden = (in_array(abs($this->fields[$key][
'visible']), array(0, 2)) ? 1 : 0);
7416 $objectid = $this->id;
7419 if (!preg_match(
'/^search_/', $keyprefix)) {
7420 return '<span class="opacitymedium">'.$langs->trans(
"AutomaticallyCalculated").
'</span>';
7427 if (empty($morecss) && !empty($val[
'css'])) {
7428 $morecss = $val[
'css'];
7429 } elseif (empty($morecss)) {
7430 if ($type ==
'date') {
7431 $morecss =
'minwidth100imp';
7432 } elseif ($type ==
'datetime' || $type ==
'link') {
7433 $morecss =
'minwidth200imp';
7434 } elseif (in_array($type, array(
'int',
'integer',
'price')) || preg_match(
'/^double(\([0-9],[0-9]\)){0,1}/', (
string) $type)) {
7435 $morecss =
'maxwidth75';
7436 } elseif ($type ==
'url') {
7437 $morecss =
'minwidth400';
7438 } elseif ($type ==
'boolean') {
7441 if (is_numeric($size) && round((
float) $size) < 12) {
7442 $morecss =
'minwidth100';
7443 } elseif (is_numeric($size) && round((
float) $size) <= 48) {
7444 $morecss =
'minwidth200';
7446 $morecss =
'minwidth400';
7452 if (!empty($validationClass)) {
7453 $morecss .= $validationClass;
7456 if (in_array($type, array(
'date'))) {
7457 $tmp = explode(
',', $size);
7462 if (!$required && $value ==
'') {
7467 $out = $form->selectDate($value, $keyprefix.$key.$keysuffix, $showtime, $showtime, $required,
'', 1, (($keyprefix !=
'search_' && $keyprefix !=
'search_options_') ? 1 : 0), 0, 1);
7468 } elseif (in_array($type, array(
'datetime'))) {
7469 $tmp = explode(
',', $size);
7474 if (!$required && $value ==
'') {
7479 $out = $form->selectDate($value, $keyprefix.$key.$keysuffix, $showtime, $showtime, $required,
'', 1, (($keyprefix !=
'search_' && $keyprefix !=
'search_options_') ? 1 : 0), 0, 1,
'',
'',
'', 1,
'',
'',
'tzuserrel');
7480 } elseif (in_array($type, array(
'duration'))) {
7481 $out = $form->select_duration($keyprefix.$key.$keysuffix, $value, 0,
'text', 0, 1);
7482 } elseif (in_array($type, array(
'int',
'integer'))) {
7483 $tmp = explode(
',', $size);
7485 $out =
'<input type="text" class="flat '.$morecss.
'" name="'.$keyprefix.$key.$keysuffix.
'" id="'.$keyprefix.$key.$keysuffix.
'"'.($newsize > 0 ?
' maxlength="'.$newsize.
'"' :
'').
' value="'.
dol_escape_htmltag($value).
'"'.($moreparam ? $moreparam :
'').($autofocusoncreate ?
' autofocus' :
'').
'>';
7486 } elseif (in_array($type, array(
'real'))) {
7487 $out =
'<input type="text" class="flat '.$morecss.
'" name="'.$keyprefix.$key.$keysuffix.
'" id="'.$keyprefix.$key.$keysuffix.
'" value="'.
dol_escape_htmltag($value).
'"'.($moreparam ? $moreparam :
'').($autofocusoncreate ?
' autofocus' :
'').
'>';
7488 } elseif (preg_match(
'/varchar/', (
string) $type)) {
7489 $out =
'<input type="text" class="flat '.$morecss.
'" name="'.$keyprefix.$key.$keysuffix.
'" id="'.$keyprefix.$key.$keysuffix.
'"'.($size > 0 ?
' maxlength="'.$size.
'"' :
'').
' value="'.
dol_escape_htmltag($value).
'"'.($moreparam ? $moreparam :
'').($autofocusoncreate ?
' autofocus' :
'').
'>';
7490 } elseif (in_array($type, array(
'email',
'mail',
'phone',
'url',
'ip'))) {
7491 $out =
'<input type="text" class="flat '.$morecss.
'" name="'.$keyprefix.$key.$keysuffix.
'" id="'.$keyprefix.$key.$keysuffix.
'" value="'.
dol_escape_htmltag($value).
'" '.($moreparam ? $moreparam :
'').($autofocusoncreate ?
' autofocus' :
'').
'>';
7492 } elseif (preg_match(
'/^text/', (
string) $type)) {
7493 if (!preg_match(
'/search_/', $keyprefix)) {
7494 if (!empty($param[
'options'])) {
7497 $out .= $form->selectarray($keyprefix.$key.$keysuffix.
"_multiinput", $param[
'options'],
'', 1, 0, 0,
"flat maxwidthonphone".$morecss);
7500 function handlemultiinputdisabling(htmlname){
7501 console.log("We handle the disabling of used options for "+htmlname+"_multiinput");
7502 multiinput = $("#"+htmlname+"_multiinput");
7503 multiinput.find("option").each(function(){
7504 tmpval = $("#"+htmlname).val();
7505 tmpvalarray = tmpval.split(",");
7506 valtotest = $(this).val();
7507 if(tmpvalarray.includes(valtotest)){
7508 $(this).prop("disabled",true);
7510 if($(this).prop("disabled") == true){
7511 console.log(valtotest)
7512 $(this).prop("disabled", false);
7518 $(document).ready(function () {
7519 $("#'.$keyprefix.$key.$keysuffix.
'_multiinput").on("change",function() {
7520 console.log("We add the selected value to the text area '.$keyprefix.$key.$keysuffix.
'");
7521 tmpval = $("#'.$keyprefix.$key.$keysuffix.
'").val();
7522 tmpvalarray = tmpval.split(",");
7523 valtotest = $(this).val();
7524 if(valtotest != -1 && !tmpvalarray.includes(valtotest)){
7528 tmpval = tmpval + "," + valtotest;
7530 $("#'.$keyprefix.$key.$keysuffix.
'").val(tmpval);
7531 handlemultiinputdisabling("'.$keyprefix.$key.$keysuffix.
'");
7534 $("#'.$keyprefix.$key.$keysuffix.
'").on("change",function(){
7535 handlemultiinputdisabling($(this).attr("id"));
7537 handlemultiinputdisabling("'.$keyprefix.$key.$keysuffix.
'");
7539 $out .=
"</script>";
7541 require_once DOL_DOCUMENT_ROOT.
'/core/class/doleditor.class.php';
7542 $doleditor =
new DolEditor($keyprefix.$key.$keysuffix, $value,
'', 200,
'dolibarr_notes',
'In',
false,
false,
false, ROWS_5,
'90%');
7543 $out .= (string) $doleditor->Create(1,
'',
true,
'',
'',
'', $morecss);
7545 $out =
'<input type="text" class="flat '.$morecss.
' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.
'" id="'.$keyprefix.$key.$keysuffix.
'" value="'.
dol_escape_htmltag($value).
'" '.($moreparam ? $moreparam :
'').
'>';
7547 } elseif (preg_match(
'/^html/', (
string) $type)) {
7548 if (!preg_match(
'/search_/', $keyprefix)) {
7549 require_once DOL_DOCUMENT_ROOT.
'/core/class/doleditor.class.php';
7550 $doleditor =
new DolEditor($keyprefix.$key.$keysuffix, $value,
'', 200,
'dolibarr_notes',
'In',
false,
false, isModEnabled(
'fckeditor') &&
getDolGlobalInt(
'FCKEDITOR_ENABLE_SOCIETE'), ROWS_5,
'90%');
7551 $out = (string) $doleditor->Create(1,
'',
true,
'',
'', $moreparam, $morecss);
7553 $out =
'<input type="text" class="flat '.$morecss.
' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.
'" id="'.$keyprefix.$key.$keysuffix.
'" value="'.
dol_escape_htmltag($value).
'" '.($moreparam ? $moreparam :
'').
'>';
7555 } elseif ($type ==
'boolean') {
7557 if (!empty($value)) {
7558 $checked =
' checked value="1" ';
7560 $checked =
' value="1" ';
7562 $out =
'<input type="checkbox" class="flat '.$morecss.
' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.
'" id="'.$keyprefix.$key.$keysuffix.
'" '.$checked.
' '.($moreparam ? $moreparam :
'').
'>';
7563 } elseif ($type ==
'price') {
7564 if (!empty($value)) {
7565 $value =
price($value);
7567 $out =
'<input type="text" class="flat '.$morecss.
' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.
'" id="'.$keyprefix.$key.$keysuffix.
'" value="'.$value.
'" '.($moreparam ? $moreparam :
'').
'> '.$langs->getCurrencySymbol($conf->currency);
7568 } elseif (preg_match(
'/^double(\([0-9],[0-9]\)){0,1}/', (
string) $type)) {
7569 if (!empty($value)) {
7570 $value =
price($value);
7572 $out =
'<input type="text" class="flat '.$morecss.
' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.
'" id="'.$keyprefix.$key.$keysuffix.
'" value="'.$value.
'" '.($moreparam ? $moreparam :
'').
'> ';
7573 } elseif ($type ==
'select') {
7575 if (!empty($conf->use_javascript_ajax) && !
getDolGlobalString(
'MAIN_EXTRAFIELDS_DISABLE_SELECT2')) {
7576 include_once DOL_DOCUMENT_ROOT.
'/core/lib/ajax.lib.php';
7577 $out .=
ajax_combobox($keyprefix.$key.$keysuffix, array(), 0);
7582 foreach ($param[
'options'] as $keyb => $valb) {
7583 if ((
string) $keyb ==
'') {
7586 if (strpos($valb,
"|") !==
false) {
7587 list($valb, $parent) = explode(
'|', $valb);
7590 $tmpselect .=
'<option value="'.$keyb.
'"';
7591 $tmpselect .= (((string) $value == (
string) $keyb) ?
' selected' :
'');
7592 if (!empty($parent)) {
7595 $tmpselect .= (!empty($parent) ?
' parent="'.$parent.
'"' :
'');
7596 $tmpselect .=
'>'.$langs->trans($valb).
'</option>';
7599 $out .=
'<select class="flat '.$morecss.
' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.
'" id="'.$keyprefix.$key.$keysuffix.
'" '.($moreparam ? $moreparam :
'').
'>';
7600 if ((!isset($this->fields[$key][
'default'])) || ($this->fields[$key][
'notnull'] != 1) || $nbchoice >= 2) {
7601 $out .=
'<option value="0"> </option>';
7604 $out .=
'</select>';
7605 } elseif ($type ==
'sellist') {
7607 if (!empty($conf->use_javascript_ajax) && !
getDolGlobalString(
'MAIN_EXTRAFIELDS_DISABLE_SELECT2')) {
7608 include_once DOL_DOCUMENT_ROOT.
'/core/lib/ajax.lib.php';
7609 $out .=
ajax_combobox($keyprefix.$key.$keysuffix, array(), 0);
7612 $out .=
'<select class="flat '.$morecss.
' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.
'" id="'.$keyprefix.$key.$keysuffix.
'" '.($moreparam ? $moreparam :
'').
'>';
7613 if (is_array($param[
'options'])) {
7614 $param_list = array_keys($param[
'options']);
7615 $InfoFieldList = explode(
":", $param_list[0], 5);
7616 if (! empty($InfoFieldList[4])) {
7618 $parenthesisopen = 0;
7619 while (substr($InfoFieldList[4], $pos, 1) !==
'' && ($parenthesisopen || $pos == 0 || substr($InfoFieldList[4], $pos, 1) !=
':')) {
7620 if (substr($InfoFieldList[4], $pos, 1) ==
'(') {
7623 if (substr($InfoFieldList[4], $pos, 1) ==
')') {
7628 $tmpbefore = substr($InfoFieldList[4], 0, $pos);
7629 $tmpafter = substr($InfoFieldList[4], $pos + 1);
7631 $InfoFieldList[4] = $tmpbefore;
7632 if ($tmpafter !==
'') {
7633 $InfoFieldList = array_merge($InfoFieldList, explode(
':', $tmpafter));
7648 $keyList = (empty($InfoFieldList[2]) ?
'rowid' : $InfoFieldList[2].
' as rowid');
7650 if (count($InfoFieldList) > 4 && !empty($InfoFieldList[4])) {
7651 if (strpos($InfoFieldList[4],
'extra.') !==
false) {
7652 $keyList =
'main.'.$InfoFieldList[2].
' as rowid';
7654 $keyList = $InfoFieldList[2].
' as rowid';
7657 if (count($InfoFieldList) > 3 && !empty($InfoFieldList[3])) {
7658 list($parentName, $parentField) = explode(
'|', $InfoFieldList[3]);
7659 $keyList .=
', '.$parentField;
7662 $filter_categorie =
false;
7663 if (count($InfoFieldList) > 5) {
7664 if ($InfoFieldList[0] ==
'categorie') {
7665 $filter_categorie =
true;
7669 if (!$filter_categorie) {
7670 $fields_label = explode(
'|', $InfoFieldList[1]);
7671 if (is_array($fields_label)) {
7673 $keyList .= implode(
', ', $fields_label);
7677 $sql =
"SELECT " . $keyList;
7678 $sql .=
" FROM " . $this->db->prefix() . $InfoFieldList[0];
7679 if (!empty($InfoFieldList[4])) {
7681 if (strpos($InfoFieldList[4],
'$SEL$') !==
false) {
7682 $InfoFieldList[4] = str_replace(
'$SEL$',
'SELECT', $InfoFieldList[4]);
7686 if (strpos($InfoFieldList[4],
'$ID$') !==
false && !empty($objectid)) {
7687 $InfoFieldList[4] = str_replace(
'$ID$', (
string) $objectid, $InfoFieldList[4]);
7689 $InfoFieldList[4] = str_replace(
'$ID$',
'0', $InfoFieldList[4]);
7694 if (strpos($InfoFieldList[4],
'extra') !==
false) {
7695 $sql .=
" as main, " . $this->db->prefix() . $InfoFieldList[0] .
"_extrafields as extra";
7696 $sqlwhere .=
" WHERE extra.fk_object=main." . $InfoFieldList[2];
7702 $sqlwhere .=
' WHERE 1=1';
7705 if (in_array($InfoFieldList[0], array(
'tablewithentity'))) {
7706 $sqlwhere .=
" AND entity = " . ((int) $conf->entity);
7712 if (isset($InfoFieldList[7]) && preg_match(
'/^[a-z0-9_\-,]+$/i', $InfoFieldList[7])) {
7713 $sql .=
" ORDER BY ".$this->db->escape($InfoFieldList[7]);
7715 $sql .=
" ORDER BY ".$this->db->sanitize(implode(
', ', $fields_label));
7718 dol_syslog(get_class($this) .
'::showInputField type=sellist', LOG_DEBUG);
7719 $resql = $this->db->query($sql);
7721 $out .=
'<option value="0"> </option>';
7722 $num = $this->db->num_rows($resql);
7726 $obj = $this->db->fetch_object($resql);
7730 $fields_label = explode(
'|', $InfoFieldList[1]);
7731 if (count($fields_label) > 1) {
7733 foreach ($fields_label as $field_toshow) {
7734 $labeltoshow .= $obj->$field_toshow .
' ';
7737 $labeltoshow = $obj->{$InfoFieldList[1]};
7739 $labeltoshow =
dol_trunc($labeltoshow, 45);
7741 if ($value == $obj->rowid) {
7742 foreach ($fields_label as $field_toshow) {
7743 $translabel = $langs->trans($obj->$field_toshow);
7744 if ($translabel != $obj->$field_toshow) {
7745 $labeltoshow =
dol_trunc($translabel) .
' ';
7747 $labeltoshow =
dol_trunc($obj->$field_toshow) .
' ';
7750 $out .=
'<option value="' . $obj->rowid .
'" selected>' . $labeltoshow .
'</option>';
7753 $translabel = $langs->trans($obj->{$InfoFieldList[1]});
7754 if ($translabel != $obj->{$InfoFieldList[1]}) {
7755 $labeltoshow =
dol_trunc($translabel, 18);
7757 $labeltoshow =
dol_trunc($obj->{$InfoFieldList[1]});
7760 if (empty($labeltoshow)) {
7761 $labeltoshow =
'(not defined)';
7763 if ($value == $obj->rowid) {
7764 $out .=
'<option value="' . $obj->rowid .
'" selected>' . $labeltoshow .
'</option>';
7767 if (!empty($InfoFieldList[3]) && $parentField) {
7768 $parent = $parentName .
':' . $obj->{$parentField};
7772 $out .=
'<option value="' . $obj->rowid .
'"';
7773 $out .= ($value == $obj->rowid ?
' selected' :
'');
7774 $out .= (!empty($parent) ?
' parent="' . $parent .
'"' :
'');
7775 $out .=
'>' . $labeltoshow .
'</option>';
7780 $this->db->free($resql);
7782 print
'Error in request ' . $sql .
' ' . $this->db->lasterror() .
'. Check setup of extra parameters.<br>';
7785 require_once DOL_DOCUMENT_ROOT.
'/categories/class/categorie.class.php';
7786 $data = $form->select_all_categories(Categorie::$MAP_ID_TO_CODE[$InfoFieldList[5]],
'',
'parent', 64, $InfoFieldList[6], 1, 1);
7787 $out .=
'<option value="0"> </option>';
7788 foreach ($data as $data_key => $data_value) {
7789 $out .=
'<option value="' . $data_key .
'"';
7790 $out .= ($value == $data_key ?
' selected' :
'');
7791 $out .=
'>' . $data_value .
'</option>';
7795 $out .=
'</select>';
7796 } elseif ($type ==
'checkbox') {
7797 $value_arr = explode(
',', $value);
7798 $out = $form->multiselectarray($keyprefix.$key.$keysuffix, (empty($param[
'options']) ?
null : $param[
'options']), $value_arr, 0, 0, $morecss, 0,
'100%');
7799 } elseif ($type ==
'radio') {
7801 foreach ($param[
'options'] as $keyopt => $valopt) {
7802 $out .=
'<input class="flat '.$morecss.
'" type="radio" name="'.$keyprefix.$key.$keysuffix.
'" id="'.$keyprefix.$key.$keysuffix.
'" '.($moreparam ? $moreparam :
'');
7803 $out .=
' value="'.$keyopt.
'"';
7804 $out .=
' id="'.$keyprefix.$key.$keysuffix.
'_'.$keyopt.
'"';
7805 $out .= ($value == $keyopt ?
'checked' :
'');
7806 $out .=
'/><label for="'.$keyprefix.$key.$keysuffix.
'_'.$keyopt.
'">'.$valopt.
'</label><br>';
7808 } elseif ($type ==
'chkbxlst') {
7809 if (is_array($value)) {
7810 $value_arr = $value;
7812 $value_arr = explode(
',', $value);
7815 if (is_array($param[
'options'])) {
7816 $param_list = array_keys($param[
'options']);
7817 $InfoFieldList = explode(
":", $param_list[0]);
7827 '@phan-var-force array{0:string,1:string,2:string,3:string,3:string,5:string,6:string} $InfoFieldList';
7829 $keyList = (empty($InfoFieldList[2]) ?
'rowid' : $InfoFieldList[2].
' as rowid');
7831 if (count($InfoFieldList) > 3 && !empty($InfoFieldList[3])) {
7832 list($parentName, $parentField) = explode(
'|', $InfoFieldList[3]);
7833 $keyList .=
', '.$parentField;
7835 if (count($InfoFieldList) > 4 && !empty($InfoFieldList[4])) {
7836 if (strpos($InfoFieldList[4],
'extra.') !==
false) {
7837 $keyList =
'main.'.$InfoFieldList[2].
' as rowid';
7839 $keyList = $InfoFieldList[2].
' as rowid';
7843 $filter_categorie =
false;
7844 if (count($InfoFieldList) > 5) {
7845 if ($InfoFieldList[0] ==
'categorie') {
7846 $filter_categorie =
true;
7850 if (!$filter_categorie) {
7851 $fields_label = explode(
'|', $InfoFieldList[1]);
7852 if (is_array($fields_label)) {
7854 $keyList .= implode(
', ', $fields_label);
7858 $sql =
"SELECT " . $keyList;
7859 $sql .=
' FROM ' . $this->db->prefix() . $InfoFieldList[0];
7860 if (!empty($InfoFieldList[4])) {
7862 if (strpos($InfoFieldList[4],
'$SEL$') !==
false) {
7863 $InfoFieldList[4] = str_replace(
'$SEL$',
'SELECT', $InfoFieldList[4]);
7867 if (strpos($InfoFieldList[4],
'$ID$') !==
false && !empty($objectid)) {
7868 $InfoFieldList[4] = str_replace(
'$ID$', (
string) $objectid, $InfoFieldList[4]);
7870 $InfoFieldList[4] = str_replace(
'$ID$',
'0', $InfoFieldList[4]);
7874 if (strpos($InfoFieldList[4],
'extra') !==
false) {
7875 $sql .=
' as main, ' . $this->db->prefix() . $InfoFieldList[0] .
'_extrafields as extra';
7876 $sqlwhere .=
" WHERE extra.fk_object=main." . $InfoFieldList[2] .
" AND " . $InfoFieldList[4];
7878 $sqlwhere .=
" WHERE " . $InfoFieldList[4];
7881 $sqlwhere .=
' WHERE 1=1';
7884 if (in_array($InfoFieldList[0], array(
'tablewithentity'))) {
7885 $sqlwhere .=
" AND entity = " . ((int) $conf->entity);
7891 dol_syslog(get_class($this) .
'::showInputField type=chkbxlst', LOG_DEBUG);
7892 $resql = $this->db->query($sql);
7894 $num = $this->db->num_rows($resql);
7901 $obj = $this->db->fetch_object($resql);
7905 $fields_label = explode(
'|', $InfoFieldList[1]);
7906 if (count($fields_label) > 1) {
7908 foreach ($fields_label as $field_toshow) {
7909 $labeltoshow .= $obj->$field_toshow .
' ';
7912 $labeltoshow = $obj->{$InfoFieldList[1]};
7914 $labeltoshow =
dol_trunc($labeltoshow, 45);
7916 if (is_array($value_arr) && in_array($obj->rowid, $value_arr)) {
7917 foreach ($fields_label as $field_toshow) {
7918 $translabel = $langs->trans($obj->$field_toshow);
7919 if ($translabel != $obj->$field_toshow) {
7920 $labeltoshow =
dol_trunc($translabel, 18) .
' ';
7922 $labeltoshow =
dol_trunc($obj->$field_toshow, 18) .
' ';
7926 $data[$obj->rowid] = $labeltoshow;
7929 $translabel = $langs->trans($obj->{$InfoFieldList[1]});
7930 if ($translabel != $obj->{$InfoFieldList[1]}) {
7931 $labeltoshow =
dol_trunc($translabel, 18);
7933 $labeltoshow =
dol_trunc($obj->{$InfoFieldList[1]}, 18);
7936 if (empty($labeltoshow)) {
7937 $labeltoshow =
'(not defined)';
7940 if (is_array($value_arr) && in_array($obj->rowid, $value_arr)) {
7941 $data[$obj->rowid] = $labeltoshow;
7944 if (!empty($InfoFieldList[3]) && $parentField) {
7945 $parent = $parentName .
':' . $obj->{$parentField};
7949 $data[$obj->rowid] = $labeltoshow;
7954 $this->db->free($resql);
7956 $out = $form->multiselectarray($keyprefix . $key . $keysuffix, $data, $value_arr, 0, 0, $morecss, 0,
'100%');
7958 print
'Error in request ' . $sql .
' ' . $this->db->lasterror() .
'. Check setup of extra parameters.<br>';
7961 require_once DOL_DOCUMENT_ROOT.
'/categories/class/categorie.class.php';
7962 $data = $form->select_all_categories(Categorie::$MAP_ID_TO_CODE[$InfoFieldList[5]],
'',
'parent', 64, $InfoFieldList[6], 1, 1);
7963 $out = $form->multiselectarray($keyprefix . $key . $keysuffix, $data, $value_arr, 0, 0, $morecss, 0,
'100%');
7966 } elseif ($type ==
'link') {
7969 $param_list = array_keys($param[
'options']);
7970 $param_list_array = explode(
':', $param_list[0], 4);
7972 $showempty = (($required && $default !=
'') ? 0 : 1);
7974 if (!preg_match(
'/search_/', $keyprefix)) {
7975 if (!empty($param_list_array[2])) {
7976 if (!empty($this->fields[$key][
'picto'])) {
7977 $morecss .=
' widthcentpercentminusxx';
7979 $morecss .=
' widthcentpercentminusx';
7982 if (!empty($this->fields[$key][
'picto'])) {
7983 $morecss .=
' widthcentpercentminusx';
7987 $objectfield = $this->element.($this->module ?
'@'.$this->module :
'').
':'.$key.$keysuffix;
7988 $out = $form->selectForForms($param_list_array[0], $keyprefix.$key.$keysuffix, $value, $showempty,
'',
'', $morecss, $moreparam, 0, (empty($val[
'disabled']) ? 0 : 1),
'', $objectfield);
7990 if (!empty($param_list_array[2])) {
7991 if ((!GETPOSTISSET(
'backtopage') || strpos(
GETPOST(
'backtopage'), $_SERVER[
'PHP_SELF']) === 0)
7992 && empty($val[
'disabled']) && empty($nonewbutton)) {
7993 list($class, $classfile) = explode(
':', $param_list[0]);
7994 if (file_exists(
dol_buildpath(dirname(dirname($classfile)).
'/card.php'))) {
7995 $url_path =
dol_buildpath(dirname(dirname($classfile)).
'/card.php', 1);
7997 $url_path =
dol_buildpath(dirname(dirname($classfile)).
'/'.strtolower($class).
'_card.php', 1);
7999 $paramforthenewlink =
'';
8000 $paramforthenewlink .= (GETPOSTISSET(
'action') ?
'&action='.GETPOST(
'action',
'aZ09') :
'');
8001 $paramforthenewlink .= (GETPOSTISSET(
'id') ?
'&id='.GETPOSTINT(
'id') :
'');
8002 $paramforthenewlink .= (GETPOSTISSET(
'origin') ?
'&origin='.GETPOST(
'origin',
'aZ09') :
'');
8003 $paramforthenewlink .= (GETPOSTISSET(
'originid') ?
'&originid='.GETPOSTINT(
'originid') :
'');
8004 $paramforthenewlink .=
'&fk_'.strtolower($class).
'=--IDFORBACKTOPAGE--';
8006 $out .=
'<a class="butActionNew" title="'.$langs->trans(
"New").
'" href="'.$url_path.
'?action=create&backtopage='.urlencode($_SERVER[
'PHP_SELF'].($paramforthenewlink ?
'?'.$paramforthenewlink :
'')).
'"><span class="fa fa-plus-circle valignmiddle"></span></a>';
8009 } elseif ($type ==
'password') {
8011 if ($keyprefix.$key.$keysuffix ==
'pass_crypted') {
8012 $out =
'<input type="'.($keyprefix ==
'search_' ?
'text' :
'password').
'" class="flat '.$morecss.
'" name="pass" id="pass" value="" '.($moreparam ? $moreparam :
'').
'>';
8013 $out .=
'<input type="hidden" name="pass_crypted" id="pass_crypted" value="'.$value.
'" '.($moreparam ? $moreparam :
'').
'>';
8015 $out =
'<input type="'.($keyprefix ==
'search_' ?
'text' :
'password').
'" class="flat '.$morecss.
'" name="'.$keyprefix.$key.$keysuffix.
'" id="'.$keyprefix.$key.$keysuffix.
'" value="'.$value.
'" '.($moreparam ? $moreparam :
'').
'>';
8017 } elseif ($type ==
'array') {
8019 $newval[
'type'] =
'varchar(256)';
8022 if (!empty($value)) {
8023 foreach ($value as $option) {
8024 $out .=
'<span><a class="'.dol_escape_htmltag($keyprefix.$key.$keysuffix).
'_del" href="javascript:;"><span class="fa fa-minus-circle valignmiddle"></span></a> ';
8025 $out .= $this->showInputField($newval, $keyprefix.$key.$keysuffix.
'[]', $option, $moreparam,
'',
'', $morecss).
'<br></span>';
8028 $out .=
'<a id="'.dol_escape_htmltag($keyprefix.$key.$keysuffix).
'_add" href="javascript:;"><span class="fa fa-plus-circle valignmiddle"></span></a>';
8030 $newInput =
'<span><a class="'.dol_escape_htmltag($keyprefix.$key.$keysuffix).
'_del" href="javascript:;"><span class="fa fa-minus-circle valignmiddle"></span></a> ';
8031 $newInput .= $this->showInputField($newval, $keyprefix.$key.$keysuffix.
'[]',
'', $moreparam,
'',
'', $morecss).
'<br></span>';
8033 if (!empty($conf->use_javascript_ajax)) {
8035 <script nonce="'.getNonce().
'">
8036 $(document).ready(function() {
8037 $("a#'.
dol_escape_js($keyprefix.$key.$keysuffix).
'_add").click(function() {
8041 $(document).on("click", "a.'.
dol_escape_js($keyprefix.$key.$keysuffix).
'_del", function() {
8042 $(this).parent().remove();
8048 if (!empty($hidden)) {
8049 $out =
'<input type="hidden" value="'.$value.
'" name="'.$keyprefix.$key.$keysuffix.
'" id="'.$keyprefix.$key.$keysuffix.
'"/>';
8052 if ($isDependList == 1) {
8053 $out .= $this->getJSListDependancies(
'_common');
8061 if (!empty($fieldValidationErrorMsg) && function_exists(
'getFieldErrorIcon')) {
8062 $out .=
' '.getFieldErrorIcon($fieldValidationErrorMsg);
8081 public function showOutputField($val, $key, $value, $moreparam =
'', $keysuffix =
'', $keyprefix =
'', $morecss =
'')
8083 global $conf, $langs, $form;
8085 if (!is_object($form)) {
8086 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.form.class.php';
8087 $form =
new Form($this->db);
8091 $type = empty($val[
'type']) ?
'' : $val[
'type'];
8092 $size = empty($val[
'css']) ?
'' : $val[
'css'];
8096 if (preg_match(
'/varchar\((\d+)\)/', $type, $reg)) {
8099 } elseif (preg_match(
'/varchar/', $type)) {
8102 if (!empty($val[
'arrayofkeyval']) && is_array($val[
'arrayofkeyval'])) {
8103 if (empty($this->fields[$key][
'multiinput'])) {
8104 $type = (($this->fields[$key][
'type'] ==
'checkbox') ? $this->fields[$key][
'type'] :
'select');
8107 if (preg_match(
'/^integer:(.*):(.*)/i', $val[
'type'], $reg)) {
8111 $default = empty($val[
'default']) ?
'' : $val[
'default'];
8112 $computed = empty($val[
'computed']) ?
'' : $val[
'computed'];
8113 $unique = empty($val[
'unique']) ?
'' : $val[
'unique'];
8114 $required = empty($val[
'required']) ?
'' : $val[
'required'];
8116 $param[
'options'] = array();
8118 if (!empty($val[
'arrayofkeyval']) && is_array($val[
'arrayofkeyval'])) {
8119 $param[
'options'] = $val[
'arrayofkeyval'];
8121 if (preg_match(
'/^integer:([^:]*):([^:]*)/i', $val[
'type'], $reg)) {
8123 $stringforoptions = $reg[1].
':'.$reg[2];
8125 if ($reg[1] ==
'User') {
8126 $stringforoptions .=
':#getnomurlparam1=-1';
8128 $param[
'options'] = array($stringforoptions => $stringforoptions);
8129 } elseif (preg_match(
'/^sellist:(.*):(.*):(.*):(.*)/i', $val[
'type'], $reg)) {
8130 $param[
'options'] = array($reg[1].
':'.$reg[2].
':'.$reg[3].
':'.$reg[4] =>
'N');
8132 } elseif (preg_match(
'/^sellist:(.*):(.*):(.*)/i', $val[
'type'], $reg)) {
8133 $param[
'options'] = array($reg[1].
':'.$reg[2].
':'.$reg[3] =>
'N');
8135 } elseif (preg_match(
'/^sellist:(.*):(.*)/i', $val[
'type'], $reg)) {
8136 $param[
'options'] = array($reg[1].
':'.$reg[2] =>
'N');
8138 } elseif (preg_match(
'/^chkbxlst:(.*)/i', $val[
'type'], $reg)) {
8139 $param[
'options'] = array($reg[1] =>
'N');
8143 $langfile = empty($val[
'langfile']) ?
'' : $val[
'langfile'];
8144 $list = (empty($val[
'list']) ?
'' : $val[
'list']);
8145 $help = (empty($val[
'help']) ?
'' : $val[
'help']);
8146 $hidden = (($val[
'visible'] == 0) ? 1 : 0);
8156 $value =
dol_eval($computed, 1, 0,
'2');
8159 if (empty($morecss)) {
8160 if ($type ==
'date') {
8161 $morecss =
'minwidth100imp';
8162 } elseif ($type ==
'datetime' || $type ==
'timestamp') {
8163 $morecss =
'minwidth200imp';
8164 } elseif (in_array($type, array(
'int',
'double',
'price'))) {
8165 $morecss =
'maxwidth75';
8166 } elseif ($type ==
'url') {
8167 $morecss =
'minwidth400';
8168 } elseif ($type ==
'boolean') {
8171 if (is_numeric($size) && round((
float) $size) < 12) {
8172 $morecss =
'minwidth100';
8173 } elseif (is_numeric($size) && round((
float) $size) <= 48) {
8174 $morecss =
'minwidth200';
8176 $morecss =
'minwidth400';
8182 if (in_array($key, array(
'rowid',
'ref')) && method_exists($this,
'getNomUrl')) {
8183 if ($key !=
'rowid' || empty($this->fields[
'ref'])) {
8184 $value = $this->getNomUrl(1,
'', 0,
'', 1);
8186 } elseif ($key ==
'status' && method_exists($this,
'getLibStatut')) {
8187 $value = $this->getLibStatut(3);
8188 } elseif ($type ==
'date') {
8189 if (!empty($value)) {
8194 } elseif ($type ==
'datetime' || $type ==
'timestamp') {
8195 if (!empty($value)) {
8200 } elseif ($type ==
'duration') {
8201 include_once DOL_DOCUMENT_ROOT.
'/core/lib/date.lib.php';
8202 if (!is_null($value) && $value !==
'') {
8205 } elseif ($type ==
'double' || $type ==
'real') {
8206 if (!is_null($value) && $value !==
'') {
8207 $value =
price($value);
8209 } elseif ($type ==
'boolean') {
8211 if (!empty($value)) {
8212 $checked =
' checked ';
8215 $value =
'<input type="checkbox" '.$checked.
' '.($moreparam ? $moreparam :
'').
' readonly disabled>';
8217 $value =
yn($value ? 1 : 0);
8219 } elseif ($type ==
'mail' || $type ==
'email') {
8221 } elseif ($type ==
'url') {
8223 } elseif ($type ==
'phone') {
8225 } elseif ($type ==
'ip') {
8227 } elseif ($type ==
'price') {
8228 if (!is_null($value) && $value !==
'') {
8229 $value =
price($value, 0, $langs, 0, 0, -1, $conf->currency);
8231 } elseif ($type ==
'select') {
8232 $value = isset($param[
'options'][(
string) $value]) ? $param[
'options'][(string) $value] :
'';
8233 if (strpos($value,
"|") !==
false) {
8234 $value = $langs->trans(explode(
'|', $value)[0]);
8235 } elseif (! is_numeric($value)) {
8236 $value = $langs->trans($value);
8238 } elseif ($type ==
'sellist') {
8239 $param_list = array_keys($param[
'options']);
8240 $InfoFieldList = explode(
":", $param_list[0]);
8242 $selectkey =
"rowid";
8245 if (count($InfoFieldList) > 2 && !empty($InfoFieldList[2])) {
8246 $selectkey = $InfoFieldList[2];
8247 $keyList = $InfoFieldList[2].
' as rowid';
8250 $fields_label = explode(
'|', $InfoFieldList[1]);
8251 if (is_array($fields_label)) {
8253 $keyList .= implode(
', ', $fields_label);
8256 $filter_categorie =
false;
8257 if (count($InfoFieldList) > 5) {
8258 if ($InfoFieldList[0] ==
'categorie') {
8259 $filter_categorie =
true;
8263 $sql =
"SELECT ".$keyList;
8264 $sql .=
' FROM '.$this->db->prefix().$InfoFieldList[0];
8265 if (strpos($InfoFieldList[4],
'extra') !==
false) {
8268 if ($selectkey ==
'rowid' && empty($value)) {
8269 $sql .=
" WHERE ".$selectkey.
" = 0";
8270 } elseif ($selectkey ==
'rowid') {
8271 $sql .=
" WHERE ".$selectkey.
" = ".((int) $value);
8273 $sql .=
" WHERE ".$selectkey.
" = '".$this->db->escape($value).
"'";
8278 dol_syslog(get_class($this).
':showOutputField:$type=sellist', LOG_DEBUG);
8279 $resql = $this->db->query($sql);
8281 if (!$filter_categorie) {
8283 $numrows = $this->db->num_rows($resql);
8285 $obj = $this->db->fetch_object($resql);
8288 $fields_label = explode(
'|', $InfoFieldList[1]);
8290 if (is_array($fields_label) && count($fields_label) > 1) {
8291 foreach ($fields_label as $field_toshow) {
8293 if (!empty($obj->$field_toshow)) {
8294 $translabel = $langs->trans($obj->$field_toshow);
8296 if ($translabel != $field_toshow) {
8297 $value .=
dol_trunc($translabel, 18) .
' ';
8299 $value .= $obj->$field_toshow .
' ';
8304 if (!empty($obj->{$InfoFieldList[1]})) {
8305 $translabel = $langs->trans($obj->{$InfoFieldList[1]});
8307 if ($translabel != $obj->{$InfoFieldList[1]}) {
8310 $value = $obj->{$InfoFieldList[1]};
8315 require_once DOL_DOCUMENT_ROOT .
'/categories/class/categorie.class.php';
8318 $obj = $this->db->fetch_object($resql);
8320 $c->fetch($obj->rowid);
8321 $ways = $c->print_all_ways();
8322 foreach ($ways as $way) {
8323 $toprint[] =
'<li class="select2-search-choice-dolibarr noborderoncategories"' . ($c->color ?
' style="background: #' . $c->color .
';"' :
' style="background: #aaa"') .
'>' .
img_object(
'',
'category') .
' ' . $way .
'</li>';
8325 $value =
'<div class="select2-container-multi-dolibarr" style="width: 90%;"><ul class="select2-choices-dolibarr">'.implode(
' ', $toprint).
'</ul></div>';
8328 dol_syslog(get_class($this).
'::showOutputField error '.$this->db->lasterror(), LOG_WARNING);
8330 } elseif ($type ==
'radio') {
8331 $value = $param[
'options'][(string) $value];
8332 } elseif ($type ==
'checkbox') {
8333 $value_arr = explode(
',', (
string) $value);
8335 if (is_array($value_arr) && count($value_arr) > 0) {
8337 foreach ($value_arr as $keyval => $valueval) {
8338 if (!empty($valueval)) {
8339 $toprint[] =
'<li class="select2-search-choice-dolibarr noborderoncategories" style="background: #bbb">' . $param[
'options'][$valueval] .
'</li>';
8342 if (!empty($toprint)) {
8343 $value =
'<div class="select2-container-multi-dolibarr" style="width: 90%;"><ul class="select2-choices-dolibarr">' . implode(
' ', $toprint) .
'</ul></div>';
8346 } elseif ($type ==
'chkbxlst') {
8347 $value_arr = (isset($value) ? explode(
',', $value) : array());
8349 $param_list = array_keys($param[
'options']);
8350 $InfoFieldList = explode(
":", $param_list[0]);
8352 $selectkey =
"rowid";
8355 if (count($InfoFieldList) >= 3) {
8356 $selectkey = $InfoFieldList[2];
8357 $keyList = $InfoFieldList[2].
' as rowid';
8360 $fields_label = explode(
'|', $InfoFieldList[1]);
8361 if (is_array($fields_label)) {
8363 $keyList .= implode(
', ', $fields_label);
8366 $filter_categorie =
false;
8367 if (count($InfoFieldList) > 5) {
8368 if ($InfoFieldList[0] ==
'categorie') {
8369 $filter_categorie =
true;
8373 $sql =
"SELECT ".$keyList;
8374 $sql .=
' FROM '.$this->db->prefix().$InfoFieldList[0];
8375 if (strpos($InfoFieldList[4],
'extra') !==
false) {
8381 dol_syslog(get_class($this).
':showOutputField:$type=chkbxlst', LOG_DEBUG);
8382 $resql = $this->db->query($sql);
8384 if (!$filter_categorie) {
8387 while ($obj = $this->db->fetch_object($resql)) {
8389 $fields_label = explode(
'|', $InfoFieldList[1]);
8390 if (is_array($value_arr) && in_array($obj->rowid, $value_arr)) {
8391 if (is_array($fields_label) && count($fields_label) > 1) {
8392 foreach ($fields_label as $field_toshow) {
8394 if (!empty($obj->$field_toshow)) {
8395 $translabel = $langs->trans($obj->$field_toshow);
8397 if ($translabel != $field_toshow) {
8398 $toprint[] =
'<li class="select2-search-choice-dolibarr noborderoncategories" style="background: #bbb">' .
dol_trunc($translabel, 18) .
'</li>';
8400 $toprint[] =
'<li class="select2-search-choice-dolibarr noborderoncategories" style="background: #bbb">' . $obj->$field_toshow .
'</li>';
8405 if (!empty($obj->{$InfoFieldList[1]})) {
8406 $translabel = $langs->trans($obj->{$InfoFieldList[1]});
8408 if ($translabel != $obj->{$InfoFieldList[1]}) {
8409 $toprint[] =
'<li class="select2-search-choice-dolibarr noborderoncategories" style="background: #bbb">' .
dol_trunc($translabel, 18) .
'</li>';
8411 $toprint[] =
'<li class="select2-search-choice-dolibarr noborderoncategories" style="background: #bbb">' . $obj->{$InfoFieldList[1]} .
'</li>';
8417 require_once DOL_DOCUMENT_ROOT .
'/categories/class/categorie.class.php';
8420 while ($obj = $this->db->fetch_object($resql)) {
8421 if (is_array($value_arr) && in_array($obj->rowid, $value_arr)) {
8423 $c->fetch($obj->rowid);
8424 $ways = $c->print_all_ways();
8425 foreach ($ways as $way) {
8426 $toprint[] =
'<li class="select2-search-choice-dolibarr noborderoncategories"' . ($c->color ?
' style="background: #' . $c->color .
';"' :
' style="background: #aaa"') .
'>' .
img_object(
'',
'category') .
' ' . $way .
'</li>';
8431 $value =
'<div class="select2-container-multi-dolibarr" style="width: 90%;"><ul class="select2-choices-dolibarr">'.implode(
' ', $toprint).
'</ul></div>';
8433 dol_syslog(get_class($this).
'::showOutputField error '.$this->db->lasterror(), LOG_WARNING);
8435 } elseif ($type ==
'link') {
8440 $param_list = array_keys($param[
'options']);
8444 $InfoFieldList = explode(
":", $param_list[0]);
8446 $classname = $InfoFieldList[0];
8447 $classpath = $InfoFieldList[1];
8450 $getnomurlparam = 3;
8451 $getnomurlparam2 =
'';
8453 if (preg_match(
'/#getnomurlparam1=([^#]*)/', $param_list[0], $regtmp)) {
8454 $getnomurlparam = $regtmp[1];
8456 if (preg_match(
'/#getnomurlparam2=([^#]*)/', $param_list[0], $regtmp)) {
8457 $getnomurlparam2 = $regtmp[1];
8460 if (!empty($classpath)) {
8463 if ($classname && !class_exists($classname)) {
8467 if ($element_prop) {
8468 $classname = $element_prop[
'classname'];
8473 if ($classname && class_exists($classname)) {
8474 $object =
new $classname($this->db);
8475 if (
$object->element ===
'product') {
8476 $result =
$object->fetch($value,
'',
'',
'', 0, 1, 1);
8478 $result =
$object->fetch($value);
8481 if (
$object->element ===
'product') {
8482 $get_name_url_param_arr = array($getnomurlparam, $getnomurlparam2, 0, -1, 0,
'', 0);
8483 if (isset($val[
'get_name_url_params'])) {
8484 $get_name_url_params = explode(
':', $val[
'get_name_url_params']);
8485 if (!empty($get_name_url_params)) {
8486 $param_num_max = count($get_name_url_param_arr) - 1;
8487 foreach ($get_name_url_params as $param_num => $param_value) {
8488 if ($param_num > $param_num_max) {
8491 $get_name_url_param_arr[$param_num] = $param_value;
8499 $value =
$object->getNomUrl($get_name_url_param_arr[0], $get_name_url_param_arr[1], $get_name_url_param_arr[2], $get_name_url_param_arr[3], $get_name_url_param_arr[4], $get_name_url_param_arr[5], $get_name_url_param_arr[6]);
8501 $value =
$object->getNomUrl($getnomurlparam, $getnomurlparam2);
8508 dol_syslog(
'Error bad setup of extrafield', LOG_WARNING);
8509 return 'Error bad setup of extrafield';
8514 } elseif ($type ==
'password') {
8515 $value =
'<span class="opacitymedium">'.$langs->trans(
"Encrypted").
'</span>';
8517 } elseif ($type ==
'array') {
8518 if (is_array($value)) {
8519 $value = implode(
'<br>', $value);
8521 dol_syslog(__METHOD__.
' Expected array from dol_eval, but got '.gettype($value), LOG_ERR);
8522 return 'Error unexpected result from code evaluation';
8531 return is_null($out) ?
'' : $out;
8543 unset($this->validateFieldsErrors[$fieldKey]);
8557 $msg = $langs->trans(
"UnknownError");
8560 $this->error = $this->validateFieldsErrors[$fieldKey] = $msg;
8571 if (!empty($this->validateFieldsErrors[$fieldKey])) {
8572 return $this->validateFieldsErrors[$fieldKey];
8589 if (!class_exists(
'Validate')) {
8590 require_once DOL_DOCUMENT_ROOT .
'/core/class/validate.class.php';
8593 $this->clearFieldError($fieldKey);
8595 if (!isset($fields[$fieldKey])) {
8596 $this->setFieldError($fieldKey, $langs->trans(
'FieldNotFoundInObject'));
8600 $val = $fields[$fieldKey];
8603 $param[
'options'] = array();
8604 $type = $val[
'type'];
8607 if (isset($val[
'notnull']) && $val[
'notnull'] === 1) {
8621 if (preg_match(
'/varchar\((\d+)\)/', $type, $reg)) {
8624 } elseif (preg_match(
'/varchar/', $type)) {
8628 if (!empty($val[
'arrayofkeyval']) && is_array($val[
'arrayofkeyval'])) {
8632 if (!empty($val[
'type']) && preg_match(
'/^integer:(.*):(.*)/i', $val[
'type'], $reg)) {
8636 if (!empty($val[
'arrayofkeyval']) && is_array($val[
'arrayofkeyval'])) {
8637 $param[
'options'] = $val[
'arrayofkeyval'];
8640 if (preg_match(
'/^integer:(.*):(.*)/i', $val[
'type'], $reg)) {
8642 $param[
'options'] = array($reg[1].
':'.$reg[2] => $reg[1].
':'.$reg[2]);
8643 } elseif (preg_match(
'/^sellist:(.*):(.*):(.*):(.*)/i', $val[
'type'], $reg)) {
8644 $param[
'options'] = array($reg[1].
':'.$reg[2].
':'.$reg[3].
':'.$reg[4] =>
'N');
8646 } elseif (preg_match(
'/^sellist:(.*):(.*):(.*)/i', $val[
'type'], $reg)) {
8647 $param[
'options'] = array($reg[1].
':'.$reg[2].
':'.$reg[3] =>
'N');
8649 } elseif (preg_match(
'/^sellist:(.*):(.*)/i', $val[
'type'], $reg)) {
8650 $param[
'options'] = array($reg[1].
':'.$reg[2] =>
'N');
8659 $validate =
new Validate($this->db, $langs);
8669 if ($required && !$validate->isNotEmptyString($fieldValue)) {
8670 $this->setFieldError($fieldKey, $validate->error);
8672 } elseif (!$required && !$validate->isNotEmptyString($fieldValue)) {
8678 if (!empty($maxSize) && !$validate->isMaxLength($fieldValue, $maxSize)) {
8679 $this->setFieldError($fieldKey, $validate->error);
8684 if (!empty($minSize) && !$validate->isMinLength($fieldValue, $minSize)) {
8685 $this->setFieldError($fieldKey, $validate->error);
8693 if (in_array($type, array(
'date',
'datetime',
'timestamp'))) {
8694 if (!$validate->isTimestamp($fieldValue)) {
8695 $this->setFieldError($fieldKey, $validate->error);
8700 } elseif ($type ==
'duration') {
8701 if (!$validate->isDuration($fieldValue)) {
8702 $this->setFieldError($fieldKey, $validate->error);
8707 } elseif (in_array($type, array(
'double',
'real',
'price'))) {
8709 if (!$validate->isNumeric($fieldValue)) {
8710 $this->setFieldError($fieldKey, $validate->error);
8715 } elseif ($type ==
'boolean') {
8716 if (!$validate->isBool($fieldValue)) {
8717 $this->setFieldError($fieldKey, $validate->error);
8722 } elseif ($type ==
'mail') {
8723 if (!$validate->isEmail($fieldValue)) {
8724 $this->setFieldError($fieldKey, $validate->error);
8727 } elseif ($type ==
'url') {
8728 if (!$validate->isUrl($fieldValue)) {
8729 $this->setFieldError($fieldKey, $validate->error);
8734 } elseif ($type ==
'phone') {
8735 if (!$validate->isPhone($fieldValue)) {
8736 $this->setFieldError($fieldKey, $validate->error);
8741 } elseif ($type ==
'select' || $type ==
'radio') {
8742 if (!isset($param[
'options'][$fieldValue])) {
8743 $this->error = $langs->trans(
'RequireValidValue');
8748 } elseif ($type ==
'sellist' || $type ==
'chkbxlst') {
8749 $param_list = array_keys($param[
'options']);
8750 $InfoFieldList = explode(
":", $param_list[0]);
8751 $value_arr = explode(
',', $fieldValue);
8752 $value_arr = array_map(array($this->db,
'escape'), $value_arr);
8754 $selectkey =
"rowid";
8755 if (count($InfoFieldList) > 4 && !empty($InfoFieldList[4])) {
8756 $selectkey = $InfoFieldList[2];
8759 if (!$validate->isInDb($value_arr, $InfoFieldList[0], $selectkey)) {
8760 $this->setFieldError($fieldKey, $validate->error);
8765 } elseif ($type ==
'link') {
8766 $param_list = array_keys($param[
'options']);
8767 $InfoFieldList = explode(
":", $param_list[0]);
8768 $classname = $InfoFieldList[0];
8769 $classpath = $InfoFieldList[1];
8770 if (!$validate->isFetchable($fieldValue, $classname, $classpath)) {
8771 $lastIsFetchableError = $validate->error;
8774 if ($validate->isFetchableElement($fieldValue, $classname)) {
8778 $this->setFieldError($fieldKey, $lastIsFetchableError);
8802 public function showOptionals($extrafields, $mode =
'view', $params =
null, $keysuffix =
'', $keyprefix =
'', $onetrtd =
'', $display_type =
'card')
8804 global $db, $conf, $langs, $action, $form, $hookmanager;
8806 if (!is_object($form)) {
8807 $form =
new Form($db);
8809 if (!is_object($extrafields)) {
8810 dol_syslog(
'Bad parameter extrafields for showOptionals', LOG_ERR);
8811 return 'Bad parameter extrafields for showOptionals';
8813 if (!is_array($extrafields->attributes[$this->table_element])) {
8814 dol_syslog(
"extrafields->attributes was not loaded with extrafields->fetch_name_optionals_label(table_element);", LOG_WARNING);
8819 $parameters = array(
'mode' => $mode,
'params' => $params,
'keysuffix' => $keysuffix,
'keyprefix' => $keyprefix,
'display_type' => $display_type);
8820 $reshook = $hookmanager->executeHooks(
'showOptionals', $parameters, $this, $action);
8822 if (empty($reshook)) {
8823 if (is_array($extrafields->attributes[$this->table_element]) && array_key_exists(
'label', $extrafields->attributes[$this->table_element]) && is_array($extrafields->attributes[$this->table_element][
'label']) && count($extrafields->attributes[$this->table_element][
'label']) > 0) {
8825 $out .=
'<!-- commonobject:showOptionals --> ';
8828 $nbofextrafieldsshown = 0;
8831 $lastseparatorkeyfound =
'';
8832 $extrafields_collapse_num =
'';
8833 $extrafields_collapse_num_old =
'';
8836 foreach ($extrafields->attributes[$this->table_element][
'label'] as $key => $label) {
8840 if (is_array($params) && array_key_exists(
'onlykey', $params) && $key != $params[
'onlykey']) {
8846 if ($enabled && isset($extrafields->attributes[$this->table_element][
'enabled'][$key])) {
8847 $enabled = (int)
dol_eval($extrafields->attributes[$this->table_element][
'enabled'][$key], 1, 1,
'2');
8849 if (empty($enabled)) {
8854 if (isset($extrafields->attributes[$this->table_element][
'list'][$key])) {
8855 $visibility = (int)
dol_eval($extrafields->attributes[$this->table_element][
'list'][$key], 1, 1,
'2');
8859 if ($perms && isset($extrafields->attributes[$this->table_element][
'perms'][$key])) {
8860 $perms = (int)
dol_eval($extrafields->attributes[$this->table_element][
'perms'][$key], 1, 1,
'2');
8863 if (($mode ==
'create') && !in_array(abs($visibility), array(1, 3))) {
8865 } elseif (($mode ==
'edit') && !in_array(abs($visibility), array(1, 3, 4))) {
8867 } elseif ($mode ==
'view' && empty($visibility)) {
8870 if (empty($perms)) {
8875 if (!empty($extrafields->attributes[$this->table_element][
'langfile'][$key])) {
8876 $langs->load($extrafields->attributes[$this->table_element][
'langfile'][$key]);
8881 if (is_array($params) && count($params) > 0 && $display_type ==
'card') {
8882 if (array_key_exists(
'cols', $params)) {
8883 $colspan = $params[
'cols'];
8884 } elseif (array_key_exists(
'colspan', $params)) {
8886 if (preg_match(
'/colspan="(\d+)"/', $params[
'colspan'], $reg)) {
8889 $colspan = $params[
'colspan'];
8893 $colspan = intval($colspan);
8897 $value = ((!empty($this->array_options) && array_key_exists(
"options_".$key.$keysuffix, $this->array_options)) ? $this->array_options[
"options_".$key.$keysuffix] :
null);
8903 $check =
'alphanohtml';
8904 if (in_array($extrafields->attributes[$this->table_element][
'type'][$key], array(
'html',
'text'))) {
8905 $check =
'restricthtml';
8907 $getposttemp =
GETPOST($keyprefix.
'options_'.$key.$keysuffix, $check, 3);
8909 if (is_array($getposttemp) || $getposttemp !=
'' || GETPOSTISSET($keyprefix.
'options_'.$key.$keysuffix)) {
8910 if (is_array($getposttemp)) {
8912 $value = implode(
",", $getposttemp);
8914 $value = $getposttemp;
8916 } elseif (in_array($extrafields->attributes[$this->table_element][
'type'][$key], array(
'int'))) {
8917 $value =( !empty($this->array_options[
"options_".$key]) || $this->array_options[
"options_".$key] ===
'0' ) ? $this->array_options[
"options_".$key] :
'';
8919 $value = (!empty($this->array_options[
"options_".$key]) ? $this->array_options[
"options_".$key] :
'');
8925 $nbofextrafieldsshown++;
8928 if ($extrafields->attributes[$this->table_element][
'type'][$key] ==
'separate') {
8929 $extrafields_collapse_num = $key;
8947 $out .= $extrafields->showSeparator($key, $this, ($colspan ? $colspan + 1 : 2), $display_type, $mode);
8949 $lastseparatorkeyfound = $key;
8951 $collapse_group = $extrafields_collapse_num.(!empty($this->
id) ?
'_'.$this->id :
'');
8953 $class = (!empty($extrafields->attributes[$this->table_element][
'hidden'][$key]) ?
'hideobject ' :
'');
8955 if (is_array($params) && count($params) > 0) {
8956 if (array_key_exists(
'class', $params)) {
8957 $class .= $params[
'class'].
' ';
8959 if (array_key_exists(
'style', $params)) {
8960 $csstyle = $params[
'style'];
8965 $domData =
' data-element="extrafield"';
8966 $domData .=
' data-targetelement="'.$this->element.
'"';
8967 $domData .=
' data-targetid="'.$this->id.
'"';
8969 $html_id = (empty($this->
id) ?
'' :
'extrarow-'.$this->element.
'_'.$key.
'_'.$this->id);
8970 if ($display_type ==
'card') {
8975 if ($action ==
'selectlines') {
8981 if (in_array($extrafields->attributes[$this->table_element][
'type'][$key], array(
'date'))) {
8982 $datenotinstring =
null;
8983 if (array_key_exists(
'options_'.$key, $this->array_options)) {
8984 $datenotinstring = $this->array_options[
'options_'.$key];
8985 if (!is_numeric($this->array_options[
'options_'.$key])) {
8986 $datenotinstring = $this->db->jdate($datenotinstring);
8989 $datekey = $keyprefix.
'options_'.$key.$keysuffix;
8992 if (in_array($extrafields->attributes[$this->table_element][
'type'][$key], array(
'datetime'))) {
8993 $datenotinstring =
null;
8994 if (array_key_exists(
'options_'.$key, $this->array_options)) {
8995 $datenotinstring = $this->array_options[
'options_'.$key];
8996 if (!is_numeric($this->array_options[
'options_'.$key])) {
8997 $datenotinstring = $this->db->jdate($datenotinstring);
9000 $timekey = $keyprefix.
'options_'.$key.$keysuffix;
9001 $value = (GETPOSTISSET($timekey)) ?
dol_mktime(
GETPOSTINT($timekey.
'hour', 3),
GETPOSTINT($timekey.
'min', 3),
GETPOSTINT($timekey.
'sec', 3),
GETPOSTINT($timekey.
'month', 3),
GETPOSTINT($timekey.
'day', 3),
GETPOSTINT($timekey.
'year', 3),
'tzuserrel') : $datenotinstring;
9004 if (in_array($extrafields->attributes[$this->table_element][
'type'][$key], array(
'price',
'double'))) {
9005 if (GETPOSTISSET($keyprefix.
'options_'.$key.$keysuffix) || $value) {
9007 } elseif (isset($this->array_options[
'options_'.$key])) {
9008 $value = $this->array_options[
'options_'.$key];
9013 if (in_array($extrafields->attributes[$this->table_element][
'type'][$key], array(
'html',
'text',
'varchar',
'select',
'radio',
'int',
'boolean'))) {
9014 if ($action ==
'create' || $mode ==
'create') {
9015 $value = (GETPOSTISSET($keyprefix.
'options_'.$key.$keysuffix) || $value) ? $value : $extrafields->attributes[$this->table_element][
'default'][$key];
9019 $labeltoshow = $langs->trans($label);
9020 $helptoshow = $langs->trans($extrafields->attributes[$this->table_element][
'help'][$key]);
9021 if ($display_type ==
'card') {
9022 $out .=
'<tr '.($html_id ?
'id="'.$html_id.
'" ' :
'').$csstyle.
' class="field_options_'.$key.
' '.$class.$this->element.
'_extras_'.$key.
' trextrafields_collapse'.$collapse_group.
'" '.$domData.
' >';
9023 if (
getDolGlobalString(
'MAIN_VIEW_LINE_NUMBER') && ($action ==
'view' || $action ==
'valid' || $action ==
'editline' || $action ==
'confirm_valid' || $action ==
'confirm_cancel')) {
9024 $out .=
'<td></td>';
9026 $out .=
'<td class="'.(empty($params[
'tdclass']) ?
'titlefieldcreate' : $params[
'tdclass']).
' wordbreak';
9027 if ($extrafields->attributes[$this->table_element][
'type'][$key] ==
'text') {
9030 } elseif ($display_type ==
'line') {
9031 $out .=
'<div '.($html_id ?
'id="'.$html_id.
'" ' :
'').$csstyle.
' class="fieldline_options_'.$key.
' '.$class.$this->element.
'_extras_'.$key.
' trextrafields_collapse'.$collapse_group.
'" '.$domData.
' >';
9032 $out .=
'<div style="display: inline-block; padding-right:4px" class="wordbreak';
9037 $tpl_context = isset($params[
"tpl_context"]) ? $params[
"tpl_context"] :
"none";
9038 if ($tpl_context !=
"public") {
9039 if ($mode !=
'view' && !empty($extrafields->attributes[$this->table_element][
'required'][$key])) {
9040 $out .=
' fieldrequired';
9044 if ($tpl_context ==
"public") {
9045 if (!empty($extrafields->attributes[$this->table_element][
'help'][$key])) {
9046 $out .= $form->textwithpicto($labeltoshow, $helptoshow);
9048 $out .= $labeltoshow;
9050 if ($mode !=
'view' && !empty($extrafields->attributes[$this->table_element][
'required'][$key])) {
9051 $out .=
' <span style="color: red">*</span>';
9054 if (!empty($extrafields->attributes[$this->table_element][
'help'][$key])) {
9055 $out .= $form->textwithpicto($labeltoshow, $helptoshow);
9057 $out .= $labeltoshow;
9061 $out .= ($display_type ==
'card' ?
'</td>' :
'</div>');
9064 $html_id = !empty($this->
id) ? $this->element.
'_extras_'.$key.
'_'.$this->id :
'';
9065 if ($display_type ==
'card') {
9067 $out .=
'<td '.($html_id ?
'id="'.$html_id.
'" ' :
'').
' class="valuefieldcreate '.$this->element.
'_extras_'.$key;
9068 $out .=
'" '.($colspan ?
' colspan="'.$colspan.
'"' :
'');
9070 } elseif ($display_type ==
'line') {
9071 $out .=
'<div '.($html_id ?
'id="'.$html_id.
'" ' :
'').
' style="display: inline-block" class="valuefieldcreate '.$this->element.
'_extras_'.$key.
' extra_inline_'.$extrafields->attributes[$this->table_element][
'type'][$key].
'">';
9076 $out .= $extrafields->showOutputField($key, $value,
'', $this->table_element);
9079 $listoftypestoshowpicto = explode(
',',
getDolGlobalString(
'MAIN_TYPES_TO_SHOW_PICOT',
'email,phone,ip,password'));
9080 if (in_array($extrafields->attributes[$this->table_element][
'type'][$key], $listoftypestoshowpicto)) {
9081 $out .=
getPictoForType($extrafields->attributes[$this->table_element][
'type'][$key], ($extrafields->attributes[$this->table_element][
'type'][$key] ==
'text' ?
'tdtop' :
''));
9084 $out .= $extrafields->showInputField($key, $value,
'', $keysuffix,
'', 0, $this->
id, $this->table_element);
9087 $listoftypestoshowpicto = explode(
',',
getDolGlobalString(
'MAIN_TYPES_TO_SHOW_PICOT',
'email,phone,ip,password'));
9088 if (in_array($extrafields->attributes[$this->table_element][
'type'][$key], $listoftypestoshowpicto)) {
9089 $out .=
getPictoForType($extrafields->attributes[$this->table_element][
'type'][$key], ($extrafields->attributes[$this->table_element][
'type'][$key] ==
'text' ?
'tdtop' :
''));
9091 $out .= $extrafields->showInputField($key, $value,
'', $keysuffix,
'', 0, $this->
id, $this->table_element);
9095 $out .= ($display_type ==
'card' ?
'</td>' :
'</div>');
9096 $out .= ($display_type ==
'card' ?
'</tr>'.
"\n" :
'</div>');
9102 if (!empty($conf->use_javascript_ajax)) {
9103 $out .= $this->getJSListDependancies();
9106 $out .=
'<!-- commonobject:showOptionals end --> '.
"\n";
9108 if (empty($nbofextrafieldsshown)) {
9114 $out .= $hookmanager->resPrint;
9126 <script nonce="'.getNonce().
'">
9127 jQuery(document).ready(function() {
9128 function showOptions'.$type.
'(child_list, parent_list, orig_select)
9130 var val = $("select[name=\""+parent_list+"\"]").val();
9131 var parentVal = parent_list + ":" + val;
9132 if(typeof val == "string"){
9134 var options = orig_select.find("option[parent=\""+parentVal+"\"]").clone();
9135 $("select[name=\""+child_list+"\"] option[parent]").remove();
9136 $("select[name=\""+child_list+"\"]").append(options);
9138 var options = orig_select.find("option[parent]").clone();
9139 $("select[name=\""+child_list+"\"] option[parent]").remove();
9140 $("select[name=\""+child_list+"\"]").append(options);
9142 } else if(val > 0) {
9143 var options = orig_select.find("option[parent=\""+parentVal+"\"]").clone();
9144 $("select[name=\""+child_list+"\"] option[parent]").remove();
9145 $("select[name=\""+child_list+"\"]").append(options);
9147 var options = orig_select.find("option[parent]").clone();
9148 $("select[name=\""+child_list+"\"] option[parent]").remove();
9149 $("select[name=\""+child_list+"\"]").append(options);
9152 function setListDependencies'.$type.
'() {
9153 jQuery("select option[parent]").parent().each(function() {
9154 var orig_select = {};
9155 var child_list = $(this).attr("name");
9156 orig_select[child_list] = $(this).clone();
9157 var parent = $(this).find("option[parent]:first").attr("parent");
9158 var infos = parent.split(":");
9159 var parent_list = infos[0];
9161 //Hide daughters lists
9162 if ($("#"+child_list).val() == 0 && $("#"+parent_list).val() == 0){
9163 $("#"+child_list).hide();
9165 } else if ($("#"+parent_list).val() != 0){
9166 $("#"+parent_list).show();
9168 //Show the child list if the parent list value is selected
9169 $("select[name=\""+parent_list+"\"]").click(function() {
9170 if ($(this).val() != 0){
9171 $("#"+child_list).show()
9175 //When we change parent list
9176 $("select[name=\""+parent_list+"\"]").change(function() {
9177 showOptions'.$type.
'(child_list, parent_list, orig_select[child_list]);
9178 //Select the value 0 on child list after a change on the parent list
9179 $("#"+child_list).val(0).trigger("change");
9180 //Hide child lists if the parent value is set to 0
9181 if ($(this).val() == 0){
9182 $("#"+child_list).hide();
9188 setListDependencies'.$type.
'();
9203 $module = empty($this->module) ?
'' : $this->module;
9204 $element = $this->element;
9206 if ($element ==
'facturerec') {
9207 $element =
'facture';
9208 } elseif ($element ==
'invoice_supplier_rec') {
9209 return !$user->hasRight(
'fournisseur',
'facture') ? null : $user->hasRight(
'fournisseur',
'facture');
9210 } elseif ($module && $user->hasRight($module, $element)) {
9212 return $user->hasRight($module, $element);
9215 return $user->rights->$element;
9232 foreach ($tables as $table) {
9233 $sql =
'UPDATE '.$dbs->prefix().$table.
' SET fk_soc = '.((int) $dest_id).
' WHERE fk_soc = '.((int) $origin_id);
9235 if (!$dbs->
query($sql)) {
9236 if ($ignoreerrors) {
9261 foreach ($tables as $table) {
9262 $sql =
'UPDATE '.MAIN_DB_PREFIX.$table.
' SET fk_product = '.((int) $dest_id).
' WHERE fk_product = '.((int) $origin_id);
9264 if (!$dbs->
query($sql)) {
9265 if ($ignoreerrors) {
9288 public function defineBuyPrice($unitPrice = 0.0, $discountPercent = 0.0, $fk_product = 0)
9294 if (($unitPrice > 0) && (isset($conf->global->ForceBuyingPriceIfNull) &&
getDolGlobalInt(
'ForceBuyingPriceIfNull') > 0)) {
9296 $buyPrice = $unitPrice * (1 - $discountPercent / 100);
9299 if (!empty($fk_product) && $fk_product > 0) {
9302 require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
9303 $product =
new Product($this->db);
9304 $result = $product->fetch($fk_product);
9306 $this->errors[] =
'ErrorProductIdDoesNotExists';
9309 if ($product->cost_price > 0) {
9310 $buyPrice = $product->cost_price;
9311 } elseif ($product->pmp > 0) {
9312 $buyPrice = $product->pmp;
9315 require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
9316 $product =
new Product($this->db);
9317 $result = $product->fetch($fk_product);
9319 $this->errors[] =
'ErrorProductIdDoesNotExists';
9322 if ($product->pmp > 0) {
9323 $buyPrice = $product->pmp;
9327 if (empty($buyPrice) && isset($conf->global->MARGIN_TYPE) && in_array($conf->global->MARGIN_TYPE, array(
'1',
'pmp',
'costprice'))) {
9328 require_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.product.class.php';
9330 if (($result = $productFournisseur->find_min_price_product_fournisseur($fk_product)) > 0) {
9331 $buyPrice = $productFournisseur->fourn_unitprice;
9332 } elseif ($result < 0) {
9333 $this->errors[] = $productFournisseur->error;
9352 return array(
'dir' =>
'',
'file' =>
'',
'originalfile' =>
'',
'altfile' =>
'',
'email' =>
'',
'capture' =>
'');
9376 public function show_photos($modulepart, $sdir, $size = 0, $nbmax = 0, $nbbyrow = 5, $showfilename = 0, $showaction = 0, $maxHeight = 120, $maxWidth = 160, $nolink = 0, $overwritetitle = 0, $usesharelink = 0, $cache =
'', $addphotorefcss =
'photoref')
9379 global $user, $langs;
9381 include_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
9382 include_once DOL_DOCUMENT_ROOT.
'/core/lib/images.lib.php';
9384 $sortfield =
'position_name';
9390 $dir .=
get_exdir(0, 0, 0, 0, $this, $modulepart);
9391 $pdir .=
get_exdir(0, 0, 0, 0, $this, $modulepart);
9394 if ($modulepart ==
'product') {
9396 $dir = $sdir.
'/'.
get_exdir($this->
id, 2, 0, 0, $this, $modulepart).$this->id.
"/photos/";
9397 $pdir =
'/'.get_exdir($this->
id, 2, 0, 0, $this, $modulepart).$this->id.
"/photos/";
9400 if ($modulepart ==
'category') {
9401 $dir = $sdir.
'/'.
get_exdir($this->
id, 2, 0, 0, $this, $modulepart).$this->id.
"/photos/";
9402 $pdir =
'/'.get_exdir($this->
id, 2, 0, 0, $this, $modulepart).$this->id.
"/photos/";
9408 $relativedir = preg_replace(
'/^'.preg_quote(DOL_DATA_ROOT,
'/').
'/',
'', $dir);
9409 $relativedir = preg_replace(
'/^[\\/]/',
'', $relativedir);
9410 $relativedir = preg_replace(
'/[\\/]$/',
'', $relativedir);
9413 $dirthumb = $dir.
'thumbs/';
9414 $pdirthumb = $pdir.
'thumbs/';
9416 $return =
'<!-- Photo -->'.
"\n";
9419 $filearray =
dol_dir_list($dir,
"files", 0,
'',
'(\.meta|_preview.*\.png)$', $sortfield, (strtolower($sortorder) ==
'desc' ? SORT_DESC : SORT_ASC), 1);
9429 if (count($filearray)) {
9430 if ($sortfield && $sortorder) {
9434 foreach ($filearray as $key => $val) {
9436 $file = $val[
'name'];
9442 $viewfilename = $file;
9444 if ($size == 1 || $size ==
'small') {
9451 $photo_vignette = basename($file);
9458 if ($nbphoto == 1) {
9459 $return .=
'<table class="valigntop center centpercent" style="border: 0; padding: 2px; border-spacing: 2px; border-collapse: separate;">';
9462 if ($nbphoto % $nbbyrow == 1) {
9463 $return .=
'<tr class="center valignmiddle" style="border: 1px">';
9465 $return .=
'<td style="width: '.ceil(100 / $nbbyrow).
'%" class="photo">'.
"\n";
9466 } elseif ($nbbyrow < 0) {
9467 $return .=
'<div class="inline-block">'.
"\n";
9470 $relativefile = preg_replace(
'/^\//',
'', $pdir.$photo);
9471 if (empty($nolink)) {
9474 $return .=
'<a href="'.$urladvanced.
'">';
9476 $return .=
'<a href="'.DOL_URL_ROOT.
'/viewimage.php?modulepart='.$modulepart.
'&entity='.$this->entity.
'&file='.urlencode($pdir.$photo).
'" class="aphoto" target="_blank" rel="noopener noreferrer">';
9482 $alt = $langs->transnoentitiesnoconv(
'File').
': '.$relativefile;
9483 $alt .=
' - '.$langs->transnoentitiesnoconv(
'Size').
': '.$imgarray[
'width'].
'x'.$imgarray[
'height'];
9484 if ($overwritetitle) {
9485 if (is_numeric($overwritetitle)) {
9488 $alt = $overwritetitle;
9491 if (empty($cache) && !empty($val[
'label'])) {
9494 $cache = $val[
'label'];
9496 if ($usesharelink) {
9497 if (array_key_exists(
'share', $val) && $val[
'share']) {
9498 if (empty($maxHeight) || ($photo_vignette && $imgarray[
'height'] > $maxHeight)) {
9499 $return .=
'<!-- Show original file (thumb not yet available with shared links) -->';
9500 $return .=
'<img class="photo photowithmargin'.($addphotorefcss ?
' '.$addphotorefcss :
'').
'"'.($maxHeight ?
' height="'.$maxHeight.
'"' :
'').
' src="'.DOL_URL_ROOT.
'/viewimage.php?hashp='.urlencode($val[
'share']).($cache ?
'&cache='.urlencode($cache) :
'').
'" title="'.
dol_escape_htmltag($alt).
'">';
9502 $return .=
'<!-- Show original file -->';
9503 $return .=
'<img class="photo photowithmargin'.($addphotorefcss ?
' '.$addphotorefcss :
'').
'" height="'.$maxHeight.
'" src="'.DOL_URL_ROOT.
'/viewimage.php?hashp='.urlencode($val[
'share']).($cache ?
'&cache='.urlencode($cache) :
'').
'" title="'.
dol_escape_htmltag($alt).
'">';
9506 $return .=
'<!-- Show nophoto file (because file is not shared) -->';
9507 $return .=
'<img class="photo photowithmargin'.($addphotorefcss ?
' '.$addphotorefcss :
'').
'" height="'.$maxHeight.
'" src="'.DOL_URL_ROOT.
'/public/theme/common/nophoto.png" title="'.
dol_escape_htmltag($alt).
'">';
9510 if (empty($maxHeight) || ($photo_vignette && $imgarray[
'height'] > $maxHeight)) {
9511 $return .=
'<!-- Show thumb -->';
9512 $return .=
'<img class="photo photowithmargin'.($addphotorefcss ?
' '.$addphotorefcss :
'').
' maxwidth150onsmartphone maxwidth200"'.($maxHeight ?
' height="'.$maxHeight.
'"' :
'').
' src="'.DOL_URL_ROOT.
'/viewimage.php?modulepart='.$modulepart.
'&entity='.$this->entity.($cache ?
'&cache='.urlencode($cache) :
'').
'&file='.urlencode($pdirthumb.$photo_vignette).
'" title="'.
dol_escape_htmltag($alt).
'">';
9514 $return .=
'<!-- Show original file -->';
9515 $return .=
'<img class="photo photowithmargin'.($addphotorefcss ?
' '.$addphotorefcss :
'').
'" height="'.$maxHeight.
'" src="'.DOL_URL_ROOT.
'/viewimage.php?modulepart='.$modulepart.
'&entity='.$this->entity.($cache ?
'&cache='.urlencode($cache) :
'').
'&file='.urlencode($pdir.$photo).
'" title="'.
dol_escape_htmltag($alt).
'">';
9519 if (empty($nolink)) {
9523 if ($showfilename) {
9524 $return .=
'<br>'.$viewfilename;
9529 if ($photo_vignette && (
image_format_supported($photo) > 0) && ((isset($imgarray[
'width']) && $imgarray[
'width'] > $maxWidth) || (isset($imgarray[
'width']) && $imgarray[
'width'] > $maxHeight))) {
9530 $return .=
'<a href="'.$_SERVER[
"PHP_SELF"].
'?id='.$this->
id.
'&action=addthumb&token='.newToken().
'&file='.urlencode($pdir.$viewfilename).
'">'.
img_picto($langs->trans(
'GenerateThumb'),
'refresh').
' </a>';
9533 if ($modulepart ==
'product' && ($user->hasRight(
'produit',
'creer') || $user->hasRight(
'service',
'creer'))) {
9535 $return .=
'<a href="'.DOL_URL_ROOT.
'/core/photos_resize.php?modulepart='.urlencode(
'produit|service').
'&id='.$this->
id.
'&file='.urlencode($pdir.$viewfilename).
'" title="'.
dol_escape_htmltag($langs->trans(
"Resize")).
'">'.
img_picto($langs->trans(
"Resize"),
'resize',
'').
'</a> ';
9538 $return .=
'<a href="'.$_SERVER[
"PHP_SELF"].
'?id='.$this->
id.
'&action=delete&token='.newToken().
'&file='.urlencode($pdir.$viewfilename).
'">';
9546 if (($nbphoto % $nbbyrow) == 0) {
9549 } elseif ($nbbyrow < 0) {
9550 $return .=
'</div>'.
"\n";
9555 $return .=
'<img class="photo photowithmargin" src="'.DOL_URL_ROOT.
'/viewimage.php?modulepart='.$modulepart.
'&entity='.$this->entity.
'&file='.urlencode($pdir.$photo).
'">';
9557 if ($showfilename) {
9558 $return .=
'<br>'.$viewfilename;
9562 if ($modulepart ==
'product' && ($user->hasRight(
'produit',
'creer') || $user->hasRight(
'service',
'creer'))) {
9564 $return .=
'<a href="'.DOL_URL_ROOT.
'/core/photos_resize.php?modulepart='.urlencode(
'produit|service').
'&id='.$this->
id.
'&file='.urlencode($pdir.$viewfilename).
'" title="'.
dol_escape_htmltag($langs->trans(
"Resize")).
'">'.
img_picto($langs->trans(
"Resize"),
'resize',
'').
'</a> ';
9567 $return .=
'<a href="'.$_SERVER[
"PHP_SELF"].
'?id='.$this->
id.
'&action=delete&token='.newToken().
'&file='.urlencode($pdir.$viewfilename).
'">';
9574 if ($nbmax && $nbphoto >= $nbmax) {
9580 if ($size == 1 || $size ==
'small') {
9583 while ($nbphoto % $nbbyrow) {
9584 $return .=
'<td style="width: '.ceil(100 / $nbbyrow).
'%"> </td>';
9589 $return .=
'</table>';
9595 $this->nbphoto = $nbphoto;
9609 if (is_array($info)) {
9610 if (isset($info[
'type']) && $info[
'type'] ==
'array') {
9627 if (isset($info[
'type']) && ($info[
'type'] ==
'date' || $info[
'type'] ==
'datetime' || $info[
'type'] ==
'timestamp')) {
9641 if (is_array($info)) {
9642 if (isset($info[
'type']) && ($info[
'type'] ==
'duration')) {
9660 if (is_array($info)) {
9661 if (isset($info[
'type']) && (preg_match(
'/(^int|int$)/i', $info[
'type']))) {
9679 if (is_array($info)) {
9680 if (isset($info[
'type']) && (preg_match(
'/^(double|real|price)/i', $info[
'type']))) {
9697 if (is_array($info)) {
9698 if (isset($info[
'type']) && $info[
'type'] ==
'text') {
9715 if (is_array($info)) {
9716 if (array_key_exists(
'notnull', $info) && $info[
'notnull'] !=
'1') {
9733 if (is_array($info)) {
9734 if (array_key_exists(
'notnull', $info) && $info[
'notnull'] ==
'-1') {
9751 if (is_array($info)) {
9752 if (array_key_exists(
'index', $info) && $info[
'index'] ==
true) {
9774 $queryarray = array();
9775 foreach ($this->fields as $field => $info) {
9777 if ($this->isDate($info)) {
9778 if (empty($this->{$field})) {
9779 $queryarray[$field] =
null;
9781 $queryarray[$field] = $this->db->idate($this->{$field});
9783 } elseif ($this->isDuration($info)) {
9785 if ((isset($this->{$field}) && $this->{$field} !=
'') || !empty($info[
'notnull'])) {
9786 if (!isset($this->{$field})) {
9787 if (!empty($info[
'default'])) {
9788 $queryarray[$field] = $info[
'default'];
9790 $queryarray[$field] = 0;
9793 $queryarray[$field] = (int) $this->{$field};
9796 $queryarray[$field] =
null;
9798 } elseif ($this->isInt($info) || $this->isFloat($info)) {
9799 if ($field ==
'entity' && is_null($this->{$field})) {
9800 $queryarray[$field] = ((int) $conf->entity);
9803 if ((isset($this->{$field}) && ((
string) $this->{$field}) !=
'') || !empty($info[
'notnull'])) {
9804 if (!isset($this->{$field})) {
9805 $queryarray[$field] = 0;
9806 } elseif ($this->isInt($info)) {
9807 $queryarray[$field] = (int) $this->{$field};
9808 } elseif ($this->isFloat($info)) {
9809 $queryarray[$field] = (float) $this->{$field};
9812 $queryarray[$field] =
null;
9818 $queryarray[$field] = $this->{$field};
9821 if (array_key_exists(
'type', $info) && $info[
'type'] ==
'timestamp' && empty($queryarray[$field])) {
9822 unset($queryarray[$field]);
9824 if (!empty($info[
'notnull']) && $info[
'notnull'] == -1 && empty($queryarray[$field])) {
9825 $queryarray[$field] =
null;
9842 foreach ($this->fields as $field => $info) {
9843 if ($this->isDate($info)) {
9844 if (!isset($obj->$field) || is_null($obj->$field) || $obj->$field ===
'' || $obj->$field ===
'0000-00-00 00:00:00' || $obj->$field ===
'1000-01-01 00:00:00') {
9847 $this->$field = $db->jdate($obj->$field);
9849 } elseif ($this->isInt($info)) {
9850 if ($field ==
'rowid') {
9851 $this->
id = (int) $obj->$field;
9853 if ($this->isForcedToNullIfZero($info)) {
9854 if (empty($obj->$field)) {
9855 $this->$field =
null;
9857 $this->$field = (int) $obj->$field;
9860 if (isset($obj->$field) && (!is_null($obj->$field) || (array_key_exists(
'notnull', $info) && $info[
'notnull'] == 1))) {
9861 $this->$field = (int) $obj->$field;
9863 $this->$field =
null;
9867 } elseif ($this->isFloat($info)) {
9868 if ($this->isForcedToNullIfZero($info)) {
9869 if (empty($obj->$field)) {
9870 $this->$field =
null;
9872 $this->$field = (float) $obj->$field;
9875 if (isset($obj->$field) && (!is_null($obj->$field) || (array_key_exists(
'notnull', $info) && $info[
'notnull'] == 1))) {
9876 $this->$field = (float) $obj->$field;
9878 $this->$field =
null;
9882 $this->$field = isset($obj->$field) ? $obj->$field :
null;
9887 if (!isset($this->fields[
'ref']) && isset($this->
id)) {
9888 $this->
ref = (string) $this->
id;
9898 foreach ($this->fields as $field => $arr) {
9899 $this->$field =
null;
9912 $keys = array_keys($this->fields);
9913 if (!empty($alias)) {
9914 $keys_with_alias = array();
9915 foreach ($keys as $fieldname) {
9916 if (!empty($excludefields)) {
9917 if (in_array($fieldname, $excludefields)) {
9921 $keys_with_alias[] = $alias .
'.' . $fieldname;
9923 return implode(
',', $keys_with_alias);
9925 return implode(
',', $keys);
9936 protected function quote($value, $fieldsentry)
9938 if (is_null($value)) {
9940 } elseif (preg_match(
'/^(int|double|real|price)/i', $fieldsentry[
'type'])) {
9942 } elseif (preg_match(
'/int$/i', $fieldsentry[
'type'])) {
9943 return (
int) $value;
9944 } elseif ($fieldsentry[
'type'] ==
'boolean') {
9951 return "'".$this->db->escape($value).
"'";
9967 dol_syslog(get_class($this).
"::createCommon create", LOG_DEBUG);
9973 $fieldvalues = $this->setSaveQuery();
9977 if (array_key_exists(
'date_creation', $fieldvalues) && empty($fieldvalues[
'date_creation'])) {
9978 $fieldvalues[
'date_creation'] = $this->db->idate($now);
9980 if (array_key_exists(
'fk_user_creat', $fieldvalues) && !($fieldvalues[
'fk_user_creat'] > 0)) {
9981 $fieldvalues[
'fk_user_creat'] = $user->id;
9982 $this->fk_user_creat = $user->id;
9984 if (array_key_exists(
'user_creation_id', $fieldvalues) && !($fieldvalues[
'user_creation_id'] > 0)) {
9985 $fieldvalues[
'user_creation_id'] = $user->id;
9986 $this->user_creation_id = $user->id;
9988 if (array_key_exists(
'pass_crypted', $fieldvalues) && property_exists($this,
'pass')) {
9990 $fieldvalues[
'pass_crypted'] =
dol_hash($this->pass);
9992 if (array_key_exists(
'ref', $fieldvalues)) {
9996 unset($fieldvalues[
'rowid']);
10000 foreach ($fieldvalues as $k => $v) {
10002 $value = $this->fields[$k];
10004 $values[$k] = $this->quote($v, $value);
10008 foreach ($keys as $key) {
10009 if (!isset($this->fields[$key])) {
10012 $key_fields = $this->fields[$key];
10015 if (preg_match(
'/^integer:/i', $key_fields[
'type']) && $values[$key] ==
'-1') {
10016 $values[$key] =
'';
10018 if (!empty($key_fields[
'foreignkey']) && $values[$key] ==
'-1') {
10019 $values[$key] =
'';
10022 if (isset($key_fields[
'notnull']) && $key_fields[
'notnull'] == 1 && (!isset($values[$key]) || $values[$key] ===
'NULL') && (!isset($key_fields[
'default']) || is_null($key_fields[
'default']))) {
10024 $langs->load(
"errors");
10025 dol_syslog(
"Mandatory field '".$key.
"' is empty and required into ->fields definition of class");
10026 $this->errors[] = $langs->trans(
"ErrorFieldRequired", isset($key_fields[
'label']) ? $key_fields[
'label'] : $key);
10030 if (isset($key_fields[
'notnull']) && $key_fields[
'notnull'] == 1 && (!isset($values[$key]) || $values[$key] ===
'NULL') && !is_null($key_fields[
'default'])) {
10031 $values[$key] = $this->quote($key_fields[
'default'], $key_fields);
10035 if (isset($key_fields[
'type']) && preg_match(
'/^integer:/i', $key_fields[
'type']) && empty($values[$key])) {
10036 if (isset($key_fields[
'default'])) {
10037 $values[$key] = ((int) $key_fields[
'default']);
10039 $values[$key] =
'null';
10042 if (!empty($key_fields[
'foreignkey']) && empty($values[$key])) {
10043 $values[$key] =
'null';
10051 $this->db->begin();
10054 $sql =
"INSERT INTO ".$this->db->prefix().$this->table_element;
10055 $sql .=
" (".implode(
", ", $keys).
')';
10056 $sql .=
" VALUES (".implode(
", ", $values).
")";
10058 $res = $this->db->query($sql);
10061 if ($this->db->lasterrno() ==
'DB_ERROR_RECORD_ALREADY_EXISTS') {
10062 $this->errors[] =
"ErrorRefAlreadyExists";
10064 $this->errors[] = $this->db->lasterror();
10070 $this->
id = $this->db->last_insert_id($this->db->prefix().$this->table_element);
10076 if (array_key_exists(
'ref', $this->fields) && array_key_exists(
'notnull', $this->fields[
'ref']) && $this->fields[
'ref'][
'notnull'] > 0 && array_key_exists(
'default', $this->fields[
'ref']) && $this->fields[
'ref'][
'default'] ==
'(PROV)') {
10077 $sql =
"UPDATE ".$this->db->prefix().$this->table_element.
" SET ref = '(PROV".((int) $this->
id).
")' WHERE (ref = '(PROV)' OR ref = '') AND rowid = ".((int) $this->
id);
10078 $resqlupdate = $this->db->query($sql);
10080 if ($resqlupdate ===
false) {
10082 $this->errors[] = $this->db->lasterror();
10084 $this->
ref =
'(PROV'.$this->id.
')';
10091 $result = $this->insertExtraFields();
10098 if (!empty($this->table_element_line) && !empty($this->fk_element)) {
10099 foreach ($this->lines as $line) {
10100 $keyforparent = $this->fk_element;
10101 $line->$keyforparent = $this->id;
10105 if (!is_object($line)) {
10106 $line = (object) $line;
10110 if (method_exists($line,
'insert')) {
10111 $result = $line->insert($user, 1);
10112 } elseif (method_exists($line,
'create')) {
10113 $result = $line->create($user, 1);
10116 $this->error = $line->error;
10117 $this->db->rollback();
10124 if (!$error && !$notrigger) {
10126 $result = $this->call_trigger(strtoupper(get_class($this)).
'_CREATE', $user);
10135 $this->db->rollback();
10138 $this->db->commit();
10153 public function fetchCommon($id, $ref =
null, $morewhere =
'', $noextrafields = 0)
10155 if (empty($id) && empty($ref) && empty($morewhere)) {
10159 $fieldlist = $this->getFieldList(
't');
10160 if (empty($fieldlist)) {
10164 $sql =
"SELECT ".$fieldlist;
10165 $sql .=
" FROM ".$this->db->prefix().$this->table_element.
' as t';
10168 $sql .=
' WHERE t.rowid = '.((int) $id);
10169 } elseif (!empty($ref)) {
10170 $sql .=
" WHERE t.ref = '".$this->db->escape($ref).
"'";
10172 $sql .=
' WHERE 1 = 1';
10174 if (empty($id) && isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) {
10175 $sql .=
' AND t.entity IN ('.getEntity($this->element).
')';
10178 $sql .= $morewhere;
10180 $sql .=
' LIMIT 1';
10182 $res = $this->db->query($sql);
10184 $obj = $this->db->fetch_object($res);
10186 $this->setVarsFromFetchObj($obj);
10190 if (empty($noextrafields)) {
10191 $result = $this->fetch_optionals();
10193 $this->error = $this->db->lasterror();
10194 $this->errors[] = $this->error;
10204 $this->error = $this->db->lasterror();
10205 $this->errors[] = $this->error;
10219 $objectlineclassname = get_class($this).
'Line';
10220 if (!class_exists($objectlineclassname)) {
10221 $this->error =
'Error, class '.$objectlineclassname.
' not found during call of fetchLinesCommon';
10225 $objectline =
new $objectlineclassname($this->db);
10226 '@phan-var-force CommonObjectLine $objectline';
10228 $sql =
"SELECT ".$objectline->getFieldList(
'l');
10229 $sql .=
" FROM ".$this->db->prefix().$objectline->table_element.
" as l";
10230 $sql .=
" WHERE l.fk_".$this->db->escape($this->element).
" = ".((int) $this->
id);
10232 $sql .= $morewhere;
10234 if (isset($objectline->fields[
'position'])) {
10235 $sql .= $this->db->order(
'position',
'ASC');
10238 $resql = $this->db->query($sql);
10240 $num_rows = $this->db->num_rows($resql);
10242 while ($i < $num_rows) {
10243 $obj = $this->db->fetch_object($resql);
10245 $newline =
new $objectlineclassname($this->db);
10246 '@phan-var-force CommonObjectLine $newline';
10247 $newline->setVarsFromFetchObj($obj);
10255 $this->lines[] = $newline;
10262 $this->error = $this->db->lasterror();
10263 $this->errors[] = $this->error;
10277 dol_syslog(get_class($this).
"::updateCommon update", LOG_DEBUG);
10289 $fieldvalues = $this->setSaveQuery();
10293 if (array_key_exists(
'date_modification', $fieldvalues) && empty($fieldvalues[
'date_modification'])) {
10294 $fieldvalues[
'date_modification'] = $this->db->idate($now);
10296 if (array_key_exists(
'fk_user_modif', $fieldvalues) && !($fieldvalues[
'fk_user_modif'] > 0)) {
10297 $fieldvalues[
'fk_user_modif'] = $user->id;
10299 if (array_key_exists(
'user_modification_id', $fieldvalues) && !($fieldvalues[
'user_modification_id'] > 0)) {
10300 $fieldvalues[
'user_modification_id'] = $user->id;
10302 if (array_key_exists(
'ref', $fieldvalues)) {
10306 unset($fieldvalues[
'rowid']);
10312 foreach ($fieldvalues as $k => $v) {
10314 $value = $this->fields[$k];
10316 $values[$k] = $this->quote($v, $value);
10318 $tmp[] = $k.
'='.$this->quote($v, $this->fields[$k]);
10322 foreach ($keys as $key) {
10323 if (preg_match(
'/^integer:/i', $this->fields[$key][
'type']) && $values[$key] ==
'-1') {
10324 $values[$key] =
'';
10326 if (!empty($this->fields[$key][
'foreignkey']) && $values[$key] ==
'-1') {
10327 $values[$key] =
'';
10339 $sql =
'UPDATE '.$this->db->prefix().$this->table_element.
' SET '.implode(
', ', $tmp).
' WHERE rowid='.((int) $this->
id);
10341 $this->db->begin();
10344 $res = $this->db->query($sql);
10347 $this->errors[] = $this->db->lasterror();
10353 $result = $this->insertExtraFields();
10360 if (!$error && !$notrigger) {
10362 $result = $this->call_trigger(strtoupper(get_class($this)).
'_MODIFY', $user);
10371 $this->db->rollback();
10374 $this->db->commit();
10389 dol_syslog(get_class($this).
"::deleteCommon delete", LOG_DEBUG);
10393 $this->db->begin();
10395 if ($forcechilddeletion) {
10396 foreach ($this->childtables as $table) {
10397 $sql =
"DELETE FROM ".$this->db->prefix().$table.
" WHERE ".$this->fk_element.
" = ".((int) $this->
id);
10398 $resql = $this->db->query($sql);
10400 $this->error = $this->db->lasterror();
10401 $this->errors[] = $this->error;
10402 $this->db->rollback();
10406 } elseif (!empty($this->childtables)) {
10407 $objectisused = $this->isObjectUsed($this->
id);
10408 if (!empty($objectisused)) {
10409 dol_syslog(get_class($this).
"::deleteCommon Can't delete record as it has some child", LOG_WARNING);
10410 $this->error =
'ErrorRecordHasChildren';
10411 $this->errors[] = $this->error;
10412 $this->db->rollback();
10418 if (is_array($this->childtablesoncascade) && !empty($this->childtablesoncascade)) {
10419 foreach ($this->childtablesoncascade as $tabletodelete) {
10420 $deleteFromObject = explode(
':', $tabletodelete, 4);
10421 if (count($deleteFromObject) >= 2) {
10422 $className = str_replace(
'@',
'', $deleteFromObject[0]);
10423 $filePath = $deleteFromObject[1];
10424 $columnName = $deleteFromObject[2];
10426 if (!empty($deleteFromObject[3])) {
10427 $filter = $deleteFromObject[3];
10430 $childObject =
new $className($this->db);
10431 if (method_exists($childObject,
'deleteByParentField')) {
10432 '@phan-var-force CommonObject $childObject';
10433 $result = $childObject->deleteByParentField($this->
id, $columnName, $filter);
10436 $this->errors[] = $childObject->error;
10441 $this->errors[] =
"You defined a cascade delete on an object $className/$this->id but there is no method deleteByParentField for it";
10446 $this->errors[] =
'Cannot include child class file '.$filePath;
10451 $sql =
"DELETE FROM ".$this->db->prefix().$tabletodelete.
" WHERE ".$this->fk_element.
" = ".((int) $this->
id);
10453 $resql = $this->db->query($sql);
10456 $this->error = $this->db->lasterror();
10457 $this->errors[] = $this->error;
10467 $result = $this->call_trigger(strtoupper(get_class($this)).
'_DELETE', $user);
10477 $res = $this->deleteEcmFiles(1);
10484 $res = $this->deleteObjectLinked();
10489 if (!$error && !empty($this->isextrafieldmanaged)) {
10490 $result = $this->deleteExtraFields();
10497 $sql =
'DELETE FROM '.$this->db->prefix().$this->table_element.
' WHERE rowid='.((int) $this->
id);
10499 $resql = $this->db->query($sql);
10502 $this->errors[] = $this->db->lasterror();
10508 $this->db->rollback();
10511 $this->db->commit();
10534 if (!empty($parentId) && !empty($parentField)) {
10535 $this->db->begin();
10537 $sql =
"SELECT rowid FROM ".$this->db->prefix().$this->table_element;
10538 $sql .=
" WHERE ".$this->db->sanitize($parentField).
" = ".(int) $parentId;
10541 $errormessage =
'';
10543 if ($errormessage) {
10544 $this->errors[] = $errormessage;
10545 dol_syslog(__METHOD__.
' '.implode(
',', $this->errors), LOG_ERR);
10549 $resql = $this->db->query($sql);
10551 $this->errors[] = $this->db->lasterror();
10554 while ($obj = $this->db->fetch_object($resql)) {
10555 $result = $this->fetch($obj->rowid);
10558 $this->errors[] = $this->error;
10560 $result = $this->
delete($user);
10563 $this->errors[] = $this->error;
10571 if (empty($error)) {
10572 $this->db->commit();
10575 $this->error = implode(
', ', $this->errors);
10576 $this->db->rollback();
10577 return $error * -1;
10596 $tmpforobjectclass = get_class($this);
10597 $tmpforobjectlineclass = ucfirst($tmpforobjectclass).
'Line';
10599 $this->db->begin();
10602 $result = $this->call_trigger(
'LINE'.strtoupper($tmpforobjectclass).
'_DELETE', $user);
10608 if (empty($error)) {
10609 $sql =
"DELETE FROM ".$this->db->prefix().$this->table_element_line;
10610 $sql .=
" WHERE rowid = ".((int) $idline);
10612 $resql = $this->db->query($sql);
10614 $this->error =
"Error ".$this->db->lasterror();
10619 if (empty($error)) {
10621 $tmpobjectline =
new $tmpforobjectlineclass($this->db);
10622 '@phan-var-force CommonObjectLine $tmpobjectline';
10623 if (!isset($tmpobjectline->isextrafieldmanaged) || !empty($tmpobjectline->isextrafieldmanaged)) {
10624 $tmpobjectline->id = $idline;
10625 $result = $tmpobjectline->deleteExtraFields();
10628 $this->error =
"Error ".get_class($this).
"::deleteLineCommon deleteExtraFields error -4 ".$tmpobjectline->error;
10633 if (empty($error)) {
10634 $this->db->commit();
10637 dol_syslog(get_class($this).
"::deleteLineCommon ERROR:".$this->error, LOG_ERR);
10638 $this->db->rollback();
10657 $this->db->begin();
10659 $statusfield =
'status';
10660 if (in_array($this->element, array(
'don',
'donation',
'shipping'))) {
10661 $statusfield =
'fk_statut';
10664 $sql =
"UPDATE ".$this->db->prefix().$this->table_element;
10665 $sql .=
" SET ".$statusfield.
" = ".((int) $status);
10666 $sql .=
" WHERE rowid = ".((int) $this->
id);
10668 if ($this->db->query($sql)) {
10670 $this->oldcopy = clone $this;
10673 if (!$error && !$notrigger) {
10675 $result = $this->call_trigger($triggercode, $user);
10682 $this->
status = $status;
10683 if (property_exists($this,
'statut')) {
10684 $this->
statut = $status;
10686 $this->db->commit();
10689 $this->db->rollback();
10693 $this->error = $this->db->error();
10694 $this->db->rollback();
10712 $this->db->begin();
10714 $statusfield =
'signed_status';
10716 $sql =
"UPDATE ".$this->db->prefix().$this->table_element;
10717 $sql .=
" SET ".$statusfield.
" = ".((int) $status);
10718 $sql .=
" WHERE rowid = ".((int) $this->
id);
10720 if ($this->db->query($sql)) {
10722 $this->oldcopy = clone $this;
10725 if (!$error && !$notrigger) {
10727 $result = $this->call_trigger($triggercode, $user);
10734 $this->
status = $status;
10735 $this->db->commit();
10738 $this->db->rollback();
10742 $this->error = $this->db->error();
10743 $this->db->rollback();
10760 $this->specimen = 1;
10762 'label' =>
'This is label',
10763 'ref' =>
'ABCD1234',
10764 'description' =>
'This is a description',
10766 'note_public' =>
'Public note',
10767 'note_private' =>
'Private note',
10768 'date_creation' => (
dol_now() - 3600 * 48),
10769 'date_modification' => (
dol_now() - 3600 * 24),
10770 'fk_user_creat' => $user->id,
10771 'fk_user_modif' => $user->id,
10774 foreach ($fields as $key => $value) {
10775 if (array_key_exists($key, $this->fields)) {
10776 $this->{$key} = $value;
10781 if (property_exists($this,
'fields')) {
10782 foreach ($this->fields as $key => $value) {
10784 if (array_key_exists($key, $fields)) {
10788 if (!empty($value[
'default'])) {
10789 $this->$key = $value[
'default'];
10807 require_once DOL_DOCUMENT_ROOT.
'/core/class/comment.class.php';
10809 $comment =
new Comment($this->db);
10810 $result = $comment->fetchAllFor($this->element, $this->
id);
10812 $this->errors = array_merge($this->errors, $comment->errors);
10815 $this->comments = $comment->comments;
10817 return count($this->comments);
10827 return count($this->comments);
10838 if (!is_array($parameters)) {
10841 foreach ($parameters as $parameter) {
10842 if (isset($this->$parameter)) {
10843 $this->$parameter = trim($this->$parameter);
10862 require_once DOL_DOCUMENT_ROOT.
'/categories/class/categorie.class.php';
10866 $existing = $c->containing($this->
id, $type_categ,
'id');
10886 if (!is_array($categories)) {
10887 $categories = array($categories);
10890 dol_syslog(get_class($this).
"::setCategoriesCommon Object Id:".$this->
id.
' type_categ:'.$type_categ.
' nb tag add:'.count($categories), LOG_DEBUG);
10892 require_once DOL_DOCUMENT_ROOT.
'/categories/class/categorie.class.php';
10894 if (empty($type_categ)) {
10895 dol_syslog(__METHOD__.
': Type '.$type_categ.
'is an unknown category type. Done nothing.', LOG_ERR);
10901 $existing = $c->containing($this->
id, $type_categ,
'id');
10902 if ($remove_existing) {
10904 if (is_array($existing)) {
10905 $to_del = array_diff($existing, $categories);
10906 $to_add = array_diff($categories, $existing);
10909 $to_add = $categories;
10913 $to_add = array_diff($categories, $existing);
10920 foreach ($to_del as $del) {
10921 if ($c->fetch($del) > 0) {
10922 $result = $c->del_type($this, $type_categ);
10925 $this->error = $c->error;
10926 $this->errors = $c->errors;
10933 foreach ($to_add as $add) {
10934 if ($c->fetch($add) > 0) {
10935 $result = $c->add_type($this, $type_categ);
10938 $this->error = $c->error;
10939 $this->errors = $c->errors;
10947 return $error ? (-1 * $error) : $ok;
10960 $this->db->begin();
10962 if (empty($type)) {
10963 $type = $this->table_element;
10966 require_once DOL_DOCUMENT_ROOT.
'/categories/class/categorie.class.php';
10967 $categorystatic =
new Categorie($this->db);
10969 $sql =
"INSERT INTO ".$this->db->prefix().
"categorie_".(empty($categorystatic->MAP_CAT_TABLE[$type]) ? $type : $categorystatic->MAP_CAT_TABLE[$type]).
" (fk_categorie, fk_product)";
10970 $sql .=
" SELECT fk_categorie, $toId FROM ".$this->db->prefix().
"categorie_".(empty($categorystatic->MAP_CAT_TABLE[$type]) ? $type : $categorystatic->MAP_CAT_TABLE[$type]);
10971 $sql .=
" WHERE fk_product = ".((int) $fromId);
10973 if (!$this->db->query($sql)) {
10974 $this->error = $this->db->lasterror();
10975 $this->db->rollback();
10979 $this->db->commit();
10993 $this->db->begin();
10997 switch ($this->element) {
10999 $element =
'propale';
11002 $element =
'produit';
11004 case 'order_supplier':
11005 $element =
'fournisseur/commande';
11007 case 'invoice_supplier':
11010 $element =
'fournisseur/facture/'.get_exdir($this->
id, 2, 0, 1, $this,
'invoice_supplier');
11013 $element =
'expedition/sending';
11016 case 'project_task':
11017 require_once DOL_DOCUMENT_ROOT.
'/projet/class/task.class.php';
11019 $project_result = $this->fetch_projet();
11020 if ($project_result >= 0) {
11021 $element =
'projet/'.dol_sanitizeFileName($this->project->ref).
'/';
11025 $element = $this->element;
11027 '@phan-var-force string $element';
11030 $sql =
"DELETE FROM ".$this->db->prefix().
"ecm_files_extrafields WHERE fk_object IN (";
11031 $sql .=
" SELECT rowid FROM ".$this->db->prefix().
"ecm_files WHERE filename LIKE '".$this->db->escape($this->
ref).
"%'";
11032 $sql .=
" AND filepath = '".$this->db->escape($element).
"/".$this->db->escape($this->
ref).
"' AND entity = ".((int) $conf->entity);
11035 if (!$this->db->query($sql)) {
11036 $this->error = $this->db->lasterror();
11037 $this->db->rollback();
11042 $sql =
"DELETE FROM ".$this->db->prefix().
"ecm_files";
11043 $sql .=
" WHERE filename LIKE '".$this->db->escape($this->
ref).
"%'";
11044 $sql .=
" AND filepath = '".$this->db->escape($element).
"/".$this->db->escape($this->
ref).
"' AND entity = ".((int) $conf->entity);
11046 if (!$this->db->query($sql)) {
11047 $this->error = $this->db->lasterror();
11048 $this->db->rollback();
11055 $sql =
'DELETE FROM '.$this->db->prefix().
"ecm_files_extrafields";
11056 $sql .=
" WHERE fk_object IN (SELECT rowid FROM ".$this->db->prefix().
"ecm_files WHERE src_object_type = '".$this->db->escape($this->table_element.(empty($this->module) ?
"" :
"@".$this->module)).
"' AND src_object_id = ".((int) $this->
id).
")";
11057 $resql = $this->db->query($sql);
11059 $this->error = $this->db->lasterror();
11060 $this->db->rollback();
11064 $sql =
'DELETE FROM '.$this->db->prefix().
"ecm_files";
11065 $sql .=
" WHERE src_object_type = '".$this->db->escape($this->table_element.(empty($this->module) ?
"" :
"@".$this->module)).
"' AND src_object_id = ".((int) $this->
id);
11066 $resql = $this->db->query($sql);
11068 $this->error = $this->db->lasterror();
11069 $this->db->rollback();
11074 $this->db->commit();
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
print $langs trans("AuditedSecurityEvents").'</strong >< span class="opacitymedium"></span >< br > status
Or an array listing all the potential status of the object: array: int of the status => translated la...
ajax_combobox($htmlname, $events=array(), $minLengthToAutocomplete=0, $forcefocus=0, $widthTypeOfAutocomplete='resolve', $idforemptyvalue='-1', $morecss='')
Convert a html select field into an ajax combobox.
Class to manage categories.
Parent class of all other business classes (invoices, contracts, proposals, orders,...
fetch_optionals($rowid=null, $optionsArray=null)
Function to get extra fields of an object into $this->array_options This method is in most cases call...
getCategoriesCommon($type_categ)
Sets object to given categories.
indexFile($destfull, $update_main_doc_field)
Index a file into the ECM database.
getFormatedSupplierRef($objref)
Return supplier ref for screen output.
line_order($renum=false, $rowidorder='ASC', $fk_parent_line=true)
Save a new position (field rang) for details lines.
deleteLineCommon(User $user, $idline, $notrigger=0)
Delete a line of object in database.
isEmpty()
isEmpty We consider CommonObject isEmpty if this->id is empty
clearFieldError($fieldKey)
clear validation message result for a field
static getCountOfItemsLinkedByObjectID($fk_object_where, $field_where, $table_element)
Count items linked to an object id in association table.
deleteEcmFiles($mode=0)
Delete related files of object in database.
getLastMainDocLink($modulepart, $initsharekey=0, $relativelink=0)
Return the link of last main doc file for direct public download.
liste_type_contact($source='internal', $order='position', $option=0, $activeonly=0, $code='')
Return array with list of possible values for type of contacts.
getTooltipContent($params)
getTooltipContent
update_price($exclspec=0, $roundingadjust='auto', $nodatabaseupdate=0, $seller=null)
Update total_ht, total_ttc, total_vat, total_localtax1, total_localtax2 for an object (sum of lines).
swapContactStatus($rowid)
Update status of a contact linked to object.
getFieldError($fieldKey)
get field error message
add_object_linked($origin=null, $origin_id=null, $f_user=null, $notrigger=0)
Add an object link into llx_element_element.
updateObjectLinked($sourceid=null, $sourcetype='', $targetid=null, $targettype='', $f_user=null, $notrigger=0)
Update object linked of a current object.
defineBuyPrice($unitPrice=0.0, $discountPercent=0.0, $fk_product=0)
Get buy price to use for margin calculation.
commonGenerateDocument($modelspath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams=null)
Common function for all objects extending CommonObject for generating documents.
liste_contact($statusoflink=-1, $source='external', $list=0, $code='', $status=-1, $arrayoftcids=array())
Get array of all contacts for an object.
fetchObjectFrom($table, $field, $key, $element=null)
Load object from specific field.
fetch_thirdparty($force_thirdparty_id=0)
Load the third party of object, from id $this->socid or $this->fk_soc, into this->thirdparty.
static deleteAllItemsLinkedByObjectID($fk_object_where, $field_where, $table_element)
Function used to remove all items linked to an object id in association table.
setFieldError($fieldKey, $msg='')
set validation error message a field
validateField($fields, $fieldKey, $fieldValue)
Return validation test result for a field.
getDataToShowPhoto($modulepart, $imagesize)
Function used to get the logos or photos of an object.
setMulticurrencyCode($code)
Change the multicurrency code.
add_element_resource($resource_id, $resource_type, $busy=0, $mandatory=0)
Add resources to the current object : add entry into llx_element_resources Need $this->element & $thi...
emtpyObjectVars()
Sets all object fields to null.
fetch_projet()
Load the project with id $this->fk_project into this->project.
getIdContact($source, $code, $status=0)
Return id of contacts for a source and a contact code.
setExtraField($key, $value)
Convenience method for setting the value of an extrafield without actually updating it in the databas...
setDocModel($user, $modelpdf)
Set last model used by doc generator.
deleteObjectLinked($sourceid=null, $sourcetype='', $targetid=null, $targettype='', $rowid=0, $f_user=null, $notrigger=0)
Delete all links between an object $this.
getExtraField($key)
Convenience method for retrieving the value of an extrafield without actually fetching it from the da...
updateExtraField($key, $trigger=null, $userused=null)
Update 1 extra field value for the current object.
setPaymentTerms($id, $deposit_percent=null)
Change the payments terms.
isFloat($info)
Function test if type is float.
setBankAccount($fk_account, $notrigger=0, $userused=null)
Change the bank account.
setExtraParameters()
Set extra parameters.
setErrorsFromObject($object)
setErrorsFromObject
setShippingMethod($shipping_method_id, $notrigger=0, $userused=null)
Change the shipping method.
update_note_public($note)
Update public note (kept for backward compatibility)
getSpecialCode($lineid)
Get special code of a line.
clearObjectLinkedCache()
Clear the cache saying that all linked object were already loaded.
update_ref_ext($ref_ext)
Update external ref of element.
fetchOneLike($ref)
Looks for an object with ref matching the wildcard provided It does only work when $this->table_ref_f...
hasProductsOrServices($predefined=-1)
Function to say how many lines object contains.
static isExistingObject($element, $id, $ref='', $ref_ext='')
Check if an object id or ref exists If you don't need or want to instantiate the object and just need...
isObjectUsed($id=0, $entity=0)
Function to check if an object is used by others (by children).
updateRangOfLine($rowid, $rang)
Update position of line (rang)
getDefaultCreateValueFor($fieldname, $alternatevalue=null, $type='alphanohtml')
Return the default value to use for a field when showing the create form of object.
createCommon(User $user, $notrigger=0)
Create object in the database.
getTotalWeightVolume()
Return into unit=0, the calculated total of weight and volume of all lines * qty Calculate by adding ...
update_note($note, $suffix='', $notrigger=0)
Update note of element.
getFullAddress($withcountry=0, $sep="\n", $withregion=0, $extralangcode='')
Return full address of contact.
fetch_project()
Load the project with id $this->fk_project into this->project.
setStatut($status, $elementId=null, $elementType='', $trigkey='', $fieldstatus='fk_statut')
Set status of an object.
getFieldList($alias='', $excludefields=array())
Function to concat keys of fields.
getNbComments()
Return nb comments already posted.
setVarsFromFetchObj(&$obj)
Function to load data from a SQL pointer into properties of current object $this.
printObjectLines($action, $seller, $buyer, $selected=0, $dateSelector=0, $defaulttpldir='/core/tpl')
Return HTML table for object lines TODO Move this into an output class file (htmlline....
getChildrenOfLine($id, $includealltree=0)
Get children of line.
updateCommon(User $user, $notrigger=0)
Update object into database.
updateExtraLanguages($key, $trigger=null, $userused=null)
Update an extra language value for the current object.
deleteExtraFields()
Delete all extra fields values for the current object.
setStatusCommon($user, $status, $notrigger=0, $triggercode='')
Set to a status.
deprecatedProperties()
Provide list of deprecated properties and replacements.
addThumbs($file)
Build thumb.
setSaveQuery()
Function to return the array of data key-value from the ->fields and all the ->properties of an objec...
setValuesForExtraLanguages($onlykey='')
Fill array_options property of object by extrafields value (using for data sent by forms)
insertExtraLanguages($trigger='', $userused=null)
Add/Update all extra fields values for the current object.
setTransportMode($id)
Change the transport mode methods.
isArray($info)
Function test if type is array.
isInt($info)
Function test if type is integer.
fetchObjectLinked($sourceid=null, $sourcetype='', $targetid=null, $targettype='', $clause='OR', $alsosametype=1, $orderby='sourcetype', $loadalsoobjects=1)
Fetch array of objects linked to current object (object of enabled modules only).
delete_contact($rowid, $notrigger=0)
Delete a link to contact line.
updateLineUp($rowid, $rang)
Update position of line up (rang)
fetch_user($userid)
Load the user with id $userid into this->user.
errorsToString()
Method to output saved errors.
getListContactId($source='external')
Return list of id of contacts of object.
setWarehouse($warehouse_id)
Change the warehouse.
setDeliveryAddress($id)
Define delivery address.
getTotalDiscount()
Function that returns the total amount HT of discounts applied for all lines.
initAsSpecimenCommon()
Initialise object with example values Id must be 0 if object instance is a specimen.
printObjectLine($action, $line, $var, $num, $i, $dateSelector, $seller, $buyer, $selected=0, $extrafields=null, $defaulttpldir='/core/tpl')
Return HTML content of a detail line TODO Move this into an output class file (htmlline....
copy_linked_contact($objFrom, $source='internal')
Copy contact from one element to current.
static commonReplaceThirdparty(DoliDB $dbs, $origin_id, $dest_id, array $tables, $ignoreerrors=0)
Function used to replace a thirdparty id with another one.
getValueFrom($table, $id, $field)
Getter generic.
trimParameters($parameters)
Trim object parameters.
fetch_product()
Load the product with id $this->fk_product into this->product.
isIndex($info)
Function test if is indexed.
quote($value, $fieldsentry)
Add quote to field value if necessary.
formAddObjectLine($dateSelector, $seller, $buyer, $defaulttpldir='/core/tpl')
Show add free and predefined products/services form.
fetchComments()
Load comments linked with current task.
line_down($rowid, $fk_parent_line=true)
Update a line to have a higher rank.
setValueFrom($field, $value, $table='', $id=null, $format='', $id_field='', $fuser=null, $trigkey='', $fk_user_field='fk_user_modif')
Setter generic.
fetch_contact($contactid=null)
Load object contact with id=$this->contact_id into $this->contact.
setSignedStatusCommon($user, $status, $notrigger=0, $triggercode='')
Set to a signed status.
setRetainedWarrantyPaymentTerms($id)
Change the retained warranty payments terms.
delThumbs($file)
Delete thumbs.
show_photos($modulepart, $sdir, $size=0, $nbmax=0, $nbbyrow=5, $showfilename=0, $showaction=0, $maxHeight=120, $maxWidth=160, $nolink=0, $overwritetitle=0, $usesharelink=0, $cache='', $addphotorefcss='photoref')
Show photos of an object (nbmax maximum), into several columns.
fetchLinesCommon($morewhere='', $noextrafields=0)
Load object in memory from the database.
static commonReplaceProduct(DoliDB $dbs, $origin_id, $dest_id, array $tables, $ignoreerrors=0)
Function used to replace a product id with another one.
getRangOfLine($rowid)
Get position of line (rang)
showInputField($val, $key, $value, $moreparam='', $keysuffix='', $keyprefix='', $morecss=0, $nonewbutton=0)
Return HTML string to put an input field into a page Code very similar with showInputField of extra f...
delete_resource($rowid, $element, $notrigger=0)
Delete a link to resource line.
update_contact($rowid, $statut, $type_contact_id=0, $fk_socpeople=0)
Update a link to contact line.
getElementType()
Return an element type string formatted like element_element target_type and source_type.
load_previous_next_ref($filter, $fieldid, $nodbprefix=0)
Load properties id_previous and id_next by comparing $fieldid with $this->ref.
setCategoriesCommon($categories, $type_categ='', $remove_existing=true)
Sets object to given categories.
fetchValuesForExtraLanguages()
Function to get alternative languages of a data into $this->array_languages This method is NOT called...
fetchNoCompute($id)
Function to make a fetch but set environment to avoid to load computed values before.
line_max($fk_parent_line=0)
Get max value used for position of line (rang)
getJSListDependancies($type='_extra')
setProject($projectid, $notrigger=0)
Link element with a project.
isForcedToNullIfZero($info)
Function test if field is forced to null if zero or empty.
line_ajaxorder($rows)
Update position of line with ajax (rang)
printOriginLinesList($restrictlist='', $selectedLines=array())
Return HTML table table of source object lines TODO Move this and previous function into output html ...
fetch_origin()
Read linked origin object.
getIdOfLine($rang)
Get rowid of the line relative to its position.
insertExtraFields($trigger='', $userused=null)
Add/Update all extra fields values for the current object.
deleteByParentField($parentId=0, $parentField='', $filter='', $filtermode="AND")
Delete all child object from a parent ID.
static getAllItemsLinkedByObjectID($fk_object_where, $field_select, $field_where, $table_element)
Function used to get an array with all items linked to an object id in association table.
__clone()
Overwrite magic function to solve problem of cloning object that are kept as references.
setPaymentMethods($id)
Change the payments methods.
updateLineDown($rowid, $rang, $max)
Update position of line down (rang)
delete_linked_contact($source='', $code='')
Delete all links between an object $this and all its contacts in llx_element_contact.
fetchCommon($id, $ref=null, $morewhere='', $noextrafields=0)
Load object in memory from the database.
deleteCommon(User $user, $notrigger=0, $forcechilddeletion=0)
Delete object in database.
getFormatedCustomerRef($objref)
Return customer ref for screen output.
getTooltipContentArray($params)
Return array of data to show into a tooltip.
isText($info)
Function test if type is text.
isDate($info)
Function test if type is date.
printOriginLine($line, $var, $restrictlist='', $defaulttpldir='/core/tpl', $selectedLines=array())
Return HTML with a line of table array of source object lines TODO Move this and previous function in...
showOptionals($extrafields, $mode='view', $params=null, $keysuffix='', $keyprefix='', $onetrtd='', $display_type='card')
Function to show lines of extrafields with output data.
getCanvas($id=0, $ref='')
Load type of canvas of an object if it exists.
line_up($rowid, $fk_parent_line=true)
Update a line to have a lower rank.
isDuration($info)
Function test if type is duration.
canBeNull($info)
Function test if field can be null.
listeTypeContacts($source='internal', $option=0, $activeonly=0, $code='', $element='', $excludeelement='')
Return array with list of possible values for type of contacts.
call_trigger($triggerName, $user)
Call trigger based on this instance.
getRights()
Returns the rights used for this class.
add_contact($fk_socpeople, $type_contact, $source='external', $notrigger=0)
Add a link between element $this->element and a contact.
cloneCategories($fromId, $toId, $type='')
Copy related categories to another object.
fetch_barcode()
Load data for barcode into properties ->barcode_type* Properties ->barcode_type that is id of barcode...
Class to manage absolute discounts.
Class to manage a WYSIWYG editor.
Class to manage Dolibarr database access.
Class to manage ECM files.
const TYPE_CREDIT_NOTE
Credit note invoice.
Class to manage triggers.
static getIdAndTxFromCode($dbs, $code, $date_document='')
Get id and rate of currency from code.
Class to manage predefined suppliers products.
Class to manage products or services.
const TYPE_SERVICE
Service.
Class to manage projects.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage translations.
Class to manage Dolibarr users.
Class toolbox to validate values.
getCountry($searchkey, $withcode='', $dbtouse=null, $outputlangs=null, $entconv=1, $searchlabel='')
Return country label, code or id from an id, code or label.
getState($id, $withcode='0', $dbtouse=null, $withregion=0, $outputlangs=null, $entconv=1)
Return state translated from an id.
convertSecondToTime($iSecond, $format='all', $lengthOfDay=86400, $lengthOfWeek=7)
Return, in clear text, value of a number of seconds in days, hours and minutes.
dol_meta_create($object)
Create a meta file with document file into same directory.
dol_delete_file($file, $disableglob=0, $nophperrors=0, $nohook=0, $object=null, $allowdotdot=false, $indexdatabase=1, $nolog=0)
Remove a file or several files with a mask.
dol_is_file($pathoffile)
Return if path is a file.
dol_dir_list($utf8_path, $types="all", $recursive=0, $filter="", $excludefilter=null, $sortcriteria="name", $sortorder=SORT_ASC, $mode=0, $nohook=0, $relativename="", $donotfollowsymlinks=0, $nbsecondsold=0)
Scan a directory and return a list of files/directories.
completeFileArrayWithDatabaseInfo(&$filearray, $relativedir)
Complete $filearray with data from database.
dol_delete_preview($object)
Delete all preview files linked to object instance.
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed information (by default a local PHP server timestamp) Rep...
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0)
Show a picto called object_picto (generic function)
vatrate($rate, $addpercent=false, $info_bits=0, $usestarfornpr=0, $html=0)
Return a string with VAT rate label formatted for view output Used into pdf and HTML pages.
dol_print_phone($phone, $countrycode='', $cid=0, $socid=0, $addlink='', $separ=" ", $withpicto='', $titlealt='', $adddivfloat=0, $morecss='')
Format phone numbers according to country.
dol_print_ip($ip, $mode=0)
Return an IP formatted to be shown on screen.
img_delete($titlealt='default', $other='class="pictodelete"', $morecss='')
Show delete logo.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dol_format_address($object, $withcountry=0, $sep="\n", $outputlangs=null, $mode=0, $extralangcode='')
Return a formatted address (part address/zip/town/state) according to country rules.
yn($yesno, $case=1, $color=0)
Return yes or no in current language.
dol_osencode($str)
Return a string encoded into OS filesystem encoding.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
dol_string_nospecial($str, $newstr='_', $badcharstoreplace='', $badcharstoremove='', $keepspaces=0)
Clean a string from all punctuation characters to use it as a ref or login.
dol_eval($s, $returnvalue=1, $hideerrors=1, $onlysimplestring='1')
Replace eval function to add more security.
dol_print_url($url, $target='_blank', $max=32, $withpicto=0, $morecss='')
Show Url link.
price($amount, $form=0, $outlangs='', $trunc=1, $rounding=-1, $forcerounding=-1, $currency_code='')
Function to format a value into an amount for visual output Function used into PDF and HTML pages.
getPictoForType($key, $morecss='')
Return the picto for a data type.
forgeSQLFromUniversalSearchCriteria($filter, &$errorstr='', $noand=0, $nopar=0, $noerror=0)
forgeSQLFromUniversalSearchCriteria
dol_print_email($email, $cid=0, $socid=0, $addlink=0, $max=64, $showinvalid=1, $withpicto=0)
Show EMail link formatted for HTML output.
dol_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
getElementProperties($elementType)
Get an array with properties of an element.
dol_escape_js($stringtoescape, $mode=0, $noescapebackslashn=0)
Returns text escaped for inclusion into javascript code.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
dol_sort_array(&$array, $index, $order='asc', $natsort=0, $case_sensitive=0, $keepindex=0)
Advanced sort array by the value of a given key, which produces ascending (default) or descending out...
if(!function_exists( 'dol_getprefix')) dol_include_once($relpath, $classname='')
Make an include_once using default root and alternate root if it fails.
getImageFileNameForSize($file, $extName, $extImgTarget='')
Return the filename of file to get the thumbs.
get_date_range($date_start, $date_end, $format='', $outputlangs=null, $withparenthesis=1)
Format output for start and end date.
getAdvancedPreviewUrl($modulepart, $relativepath, $alldata=0, $param='')
Return URL we can use for advanced preview links.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0)
Set event messages in dol_events session object.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
dol_sanitizeFileName($str, $newstr='_', $unaccent=1)
Clean a string to use it as a file name.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
dol_trunc($string, $size=40, $trunc='right', $stringencoding='UTF-8', $nodot=0, $display=0)
Truncate a string to a particular length adding '…' if string larger than length.
dol_htmlentitiesbr($stringtoencode, $nl2brmode=0, $pagecodefrom='UTF-8', $removelasteolbr=1)
This function is called to encode a string into a HTML string but differs from htmlentities because a...
getDolGlobalString($key, $default='')
Return dolibarr global constant string value.
getDictionaryValue($tablename, $field, $id, $checkentity=false, $rowidfield='rowid')
Return the value of a filed into a dictionary for the record $id.
get_exdir($num, $level, $alpha, $withoutslash, $object, $modulepart='')
Return a path to have a the directory according to object where files are stored.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
getEntity($element, $shared=1, $currentobject=null)
Get list of entity id to use.
dol_sanitizePathName($str, $newstr='_', $unaccent=1)
Clean a string to use it as a path name.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
vignette($file, $maxWidth=160, $maxHeight=120, $extName='_small', $quality=50, $outdir='thumbs', $targetformat=0)
Create a thumbnail from an image file (Supported extensions are gif, jpg, png and bmp).
if(!defined( 'IMAGETYPE_WEBP')) getDefaultImageSizes()
Return default values for image sizes.
dol_getImageSize($file, $url=false)
Return size of image file on disk (Supported extensions are gif, jpg, png, bmp and webp)
image_format_supported($file, $acceptsvg=0)
Return if a filename is file name of a supported image format.
query($query, $usesavepoint=0, $type='auto', $result_mode=0)
Execute a SQL request and return the resultset.
calcul_price_total($qty, $pu, $remise_percent_ligne, $txtva, $uselocaltax1_rate, $uselocaltax2_rate, $remise_percent_global, $price_base_type, $info_bits, $type, $seller='', $localtaxes_array=[], $progress=100, $multicurrency_tx=1, $pu_devise=0, $multicurrency_code='')
Calculate totals (net, vat, ...) of a line.
$conf db user
Active Directory does not allow anonymous connections.
if(preg_match('/crypted:/i', $dolibarr_main_db_pass)||!empty($dolibarr_main_db_encrypted_pass)) $conf db type
getRandomPassword($generic=false, $replaceambiguouschars=null, $length=32)
Return a generated password using default module.
dolEncrypt($chain, $key='', $ciphering='AES-256-CTR', $forceseed='')
Encode a string with a symmetric encryption.
dolDecrypt($chain, $key='')
Decode a string with a symmetric encryption.
dol_hash($chain, $type='0', $nosalt=0)
Returns a hash (non reversible encryption) of a string.
publicphonebutton2 phonegreen basiclayout basiclayout TotalHT VATCode TotalVAT TotalLT1 TotalLT2 TotalTTC TotalHT clearboth nowraponall TAKEPOS_SHOW_SUBPRICE right right right takeposterminal SELECT e e e e e statut
publicphonebutton2 phonegreen basiclayout basiclayout TotalHT VATCode TotalVAT TotalLT1 TotalLT2 TotalTTC TotalHT clearboth nowraponall TAKEPOS_SHOW_SUBPRICE right right right takeposterminal SELECT e rowid