47 const TRIGGER_PREFIX =
'';
83 public $errors = array();
88 private $validateFieldsErrors = array();
104 public $element_for_permission;
109 public $table_element;
114 public $table_element_line =
'';
119 public $ismultientitymanaged;
129 public $array_options = array();
134 public $fields = array();
139 public $array_languages =
null;
144 public $contacts_ids;
149 public $linked_objects;
154 public $linkedObjectsIds;
159 public $linkedObjects;
164 private $linkedObjectsFullLoaded = array();
179 protected $table_ref_field =
'';
184 public $restrictiononfksoc = 0;
192 public $context = array();
267 public $origin_object;
292 public $ref_previous;
334 public $country_code;
377 public $barcode_type;
383 public $barcode_type_code;
389 public $barcode_type_label;
395 public $barcode_type_coder;
401 public $mode_reglement_id;
407 public $cond_reglement_id;
412 public $demand_reason_id;
418 public $transport_mode_id;
425 public $cond_reglement;
432 public $fk_delivery_address;
438 public $shipping_method_id;
444 public $shipping_method;
450 public $fk_multicurrency;
455 public $multicurrency_code;
460 public $multicurrency_tx;
465 public $multicurrency_total_ht;
470 public $multicurrency_total_tva;
475 public $multicurrency_total_ttc;
480 public $multicurrency_total_localtax1;
485 public $multicurrency_total_localtax2;
504 public $last_main_doc;
529 public $note_private;
553 public $total_localtax1;
559 public $total_localtax2;
576 public $comments = array();
602 public $date_creation;
607 public $date_validation;
623 public $date_cloture;
635 public $user_creation;
640 public $user_creation_id;
652 public $user_validation;
657 public $user_validation_id;
662 public $user_closing_id;
668 public $user_modification;
673 public $user_modification_id;
676 public $next_prev_filter;
681 public $specimen = 0;
701 public $labelStatus = array();
706 public $labelStatusShort = array();
717 public $showphoto_on_popup;
722 public $nb = array();
737 public $extraparams = array();
742 protected $childtables = array();
749 protected $childtablesoncascade = array();
759 public $cond_reglement_supplier_id;
764 public $deposit_percent;
770 public $retained_warranty_fk_cond_reglement;
775 public $warehouse_id;
794 $sql =
"SELECT rowid, ref, ref_ext";
795 $sql .=
" FROM ".$db->prefix().$element;
796 $sql .=
" WHERE entity IN (".getEntity($element).
")";
799 $sql .=
" AND rowid = ".((int) $id);
801 $sql .=
" AND ref = '".$db->escape($ref).
"'";
802 } elseif ($ref_ext) {
803 $sql .=
" AND ref_ext = '".$db->escape($ref_ext).
"'";
805 $error =
'ErrorWrongParameters';
809 if ($ref || $ref_ext) {
810 $sql .=
" AND entity = ".((int) $conf->entity);
813 dol_syslog(get_class().
"::isExistingObject", LOG_DEBUG);
814 $resql = $db->query($sql);
816 $num = $db->num_rows($resql);
834 if (!empty($object->error)) {
835 $this->error = $object->error;
837 if (!empty($object->errors)) {
838 $this->errors = array_merge($this->errors, $object->errors);
863 global $action, $extrafields, $langs, $hookmanager;
866 $MAX_EXTRAFIELDS_TO_SHOW_IN_TOOLTIP =
getDolGlobalInt(
'MAX_EXTRAFIELDS_TO_SHOW_IN_TOOLTIP', 3);
872 if (!empty($extrafields->attributes[$this->table_element][
'label'])) {
873 $datas[
'opendivextra'] =
'<div class="centpercent wordbreak divtooltipextra">';
874 foreach ($extrafields->attributes[$this->table_element][
'label'] as $key => $val) {
875 if ($extrafields->attributes[$this->table_element][
'type'][$key] ==
'separate') {
878 if ($count >= abs($MAX_EXTRAFIELDS_TO_SHOW_IN_TOOLTIP)) {
879 $datas[
'more_extrafields'] =
'<br>...';
883 if ($enabled && isset($extrafields->attributes[$this->table_element][
'enabled'][$key])) {
884 $enabled =
dol_eval($extrafields->attributes[$this->table_element][
'enabled'][$key], 1, 1,
'2');
886 if ($enabled && isset($extrafields->attributes[$this->table_element][
'list'][$key])) {
887 $enabled =
dol_eval($extrafields->attributes[$this->table_element][
'list'][$key], 1, 1,
'2');
890 if ($perms && isset($extrafields->attributes[$this->table_element][
'perms'][$key])) {
891 $perms =
dol_eval($extrafields->attributes[$this->table_element][
'perms'][$key], 1, 1,
'2');
893 if (empty($enabled)) {
896 if (abs($enabled) != 1 && abs($enabled) != 3 && abs($enabled) != 5 && abs($enabled) != 4) {
902 if (!empty($extrafields->attributes[$this->table_element][
'langfile'][$key])) {
903 $langs->load($extrafields->attributes[$this->table_element][
'langfile'][$key]);
905 $labelextra = $langs->trans((
string) $extrafields->attributes[$this->table_element][
'label'][$key]);
906 if ($extrafields->attributes[$this->table_element][
'type'][$key] ==
'separate') {
907 $datas[$key]=
'<br><b><u>'. $labelextra .
'</u></b>';
909 $value = (empty($this->array_options[
'options_' . $key]) ?
'' : $this->array_options[
'options_' . $key]);
910 $datas[$key]=
'<br><b>'. $labelextra .
':</b> ' . $extrafields->showOutputField($key, $value,
'', $this->table_element);
914 $datas[
'closedivextra'] =
'</div>';
917 $hookmanager->initHooks(array($this->element .
'dao'));
919 'tooltipcontentarray' => &$datas,
923 $hookmanager->executeHooks(
'getTooltipContent', $parameters, $this, $action);
926 $label = implode($datas);
939 return $this->error.(is_array($this->errors) ? (($this->error !=
'' ?
', ' :
'').join(
', ', $this->errors)) :
'');
953 $parameters = array(
'objref'=>$objref);
955 $reshook = $hookmanager->executeHooks(
'getFormatedCustomerRef', $parameters, $this, $action);
957 return $hookmanager->resArray[
'objref'];
959 return $objref.(isset($hookmanager->resArray[
'objref']) ? $hookmanager->resArray[
'objref'] :
'');
972 $parameters = array(
'objref'=>$objref);
974 $reshook = $hookmanager->executeHooks(
'getFormatedSupplierRef', $parameters, $this, $action);
976 return $hookmanager->resArray[
'objref'];
978 return $objref.(isset($hookmanager->resArray[
'objref']) ? $hookmanager->resArray[
'objref'] :
'');
990 public function getFullAddress($withcountry = 0, $sep =
"\n", $withregion = 0, $extralangcode =
'')
992 if ($withcountry && $this->country_id && (empty($this->country_code) || empty($this->country))) {
993 require_once DOL_DOCUMENT_ROOT.
'/core/lib/company.lib.php';
994 $tmparray =
getCountry($this->country_id,
'all');
995 $this->country_code = $tmparray[
'code'];
996 $this->country = $tmparray[
'label'];
999 if ($withregion && $this->state_id && (empty($this->state_code) || empty($this->state) || empty($this->region) || empty($this->region_code))) {
1000 require_once DOL_DOCUMENT_ROOT.
'/core/lib/company.lib.php';
1001 $tmparray =
getState($this->state_id,
'all', 0, 1);
1002 $this->state_code = $tmparray[
'code'];
1003 $this->state = $tmparray[
'label'];
1004 $this->region_code = $tmparray[
'region_code'];
1005 $this->region = $tmparray[
'region'];
1022 global $user, $dolibarr_main_url_root;
1024 if (empty($this->last_main_doc)) {
1028 include_once DOL_DOCUMENT_ROOT.
'/ecm/class/ecmfiles.class.php';
1029 $ecmfile =
new EcmFiles($this->db);
1030 $result = $ecmfile->fetch(0,
'', $this->last_main_doc);
1032 $this->error = $ecmfile->error;
1033 $this->errors = $ecmfile->errors;
1037 if (empty($ecmfile->id)) {
1039 if ($initsharekey) {
1040 require_once DOL_DOCUMENT_ROOT.
'/core/lib/security2.lib.php';
1062 } elseif (empty($ecmfile->share)) {
1064 if ($initsharekey) {
1065 require_once DOL_DOCUMENT_ROOT.
'/core/lib/security2.lib.php';
1067 $ecmfile->update($user);
1073 $urlwithouturlroot = preg_replace(
'/'.preg_quote(DOL_URL_ROOT,
'/').
'$/i',
'', trim($dolibarr_main_url_root));
1077 $urlwithroot = $urlwithouturlroot.DOL_URL_ROOT;
1086 if (!empty($ecmfile->share)) {
1087 $paramlink .= ($paramlink ?
'&' :
'').
'hashp='.$ecmfile->share;
1089 if ($forcedownload) {
1090 $paramlink .= ($paramlink ?
'&' :
'').
'attachment=1';
1093 if ($relativelink) {
1094 $linktoreturn =
'document.php'.($paramlink ?
'?'.$paramlink :
'');
1096 $linktoreturn = $urlwithroot.
'/document.php'.($paramlink ?
'?'.$paramlink :
'');
1100 return $linktoreturn;
1114 public function add_contact($fk_socpeople, $type_contact, $source =
'external', $notrigger = 0)
1117 global $user, $langs;
1120 dol_syslog(get_class($this).
"::add_contact $fk_socpeople, $type_contact, $source, $notrigger");
1123 if ($fk_socpeople <= 0) {
1124 $langs->load(
"errors");
1125 $this->error = $langs->trans(
"ErrorWrongValueForParameterX",
"1");
1126 dol_syslog(get_class($this).
"::add_contact ".$this->error, LOG_ERR);
1129 if (!$type_contact) {
1130 $langs->load(
"errors");
1131 $this->error = $langs->trans(
"ErrorWrongValueForParameterX",
"2");
1132 dol_syslog(get_class($this).
"::add_contact ".$this->error, LOG_ERR);
1136 $id_type_contact = 0;
1137 if (is_numeric($type_contact)) {
1138 $id_type_contact = $type_contact;
1141 $sql =
"SELECT tc.rowid";
1142 $sql .=
" FROM ".$this->db->prefix().
"c_type_contact as tc";
1143 $sql .=
" WHERE tc.element='".$this->db->escape($this->element).
"'";
1144 $sql .=
" AND tc.source='".$this->db->escape($source).
"'";
1145 $sql .=
" AND tc.code='".$this->db->escape($type_contact).
"' AND tc.active=1";
1147 $resql = $this->db->query($sql);
1149 $obj = $this->db->fetch_object($resql);
1151 $id_type_contact = $obj->rowid;
1156 if ($id_type_contact == 0) {
1157 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");
1165 $already_added =
false;
1166 if (is_array($TListeContacts) && !empty($TListeContacts)) {
1167 foreach ($TListeContacts as $array_contact) {
1168 if ($array_contact[
'status'] == 4 && $array_contact[
'id'] == $fk_socpeople && $array_contact[
'fk_c_type_contact'] == $id_type_contact) {
1169 $already_added =
true;
1175 if (!$already_added) {
1179 $sql =
"INSERT INTO ".$this->db->prefix().
"element_contact";
1180 $sql .=
" (element_id, fk_socpeople, datecreate, statut, fk_c_type_contact) ";
1181 $sql .=
" VALUES (".$this->id.
", ".((int) $fk_socpeople).
" , ";
1182 $sql .=
"'".$this->db->idate($datecreate).
"'";
1183 $sql .=
", 4, ".((int) $id_type_contact);
1186 $resql = $this->db->query($sql);
1189 $result = $this->
call_trigger(strtoupper($this->element).
'_ADD_CONTACT', $user);
1191 $this->db->rollback();
1196 $this->db->commit();
1199 if ($this->db->errno() ==
'DB_ERROR_RECORD_ALREADY_EXISTS') {
1200 $this->error = $this->db->errno();
1201 $this->db->rollback();
1204 $this->error = $this->db->lasterror();
1205 $this->db->rollback();
1225 $contacts = $objFrom->liste_contact(-1, $source);
1226 foreach ($contacts as $contact) {
1227 if ($this->
add_contact($contact[
'id'], $contact[
'fk_c_type_contact'], $contact[
'source']) < 0) {
1244 public function update_contact($rowid, $statut, $type_contact_id = 0, $fk_socpeople = 0)
1248 $sql =
"UPDATE ".$this->db->prefix().
"element_contact set";
1249 $sql .=
" statut = ".$statut;
1250 if ($type_contact_id) {
1251 $sql .=
", fk_c_type_contact = ".((int) $type_contact_id);
1253 if ($fk_socpeople) {
1254 $sql .=
", fk_socpeople = ".((int) $fk_socpeople);
1256 $sql .=
" where rowid = ".((int) $rowid);
1257 $resql = $this->db->query($sql);
1261 $this->error = $this->db->lasterror();
1283 if (!$error && empty($notrigger)) {
1285 $this->context[
'contact_id'] = ((int) $rowid);
1286 $result = $this->
call_trigger(strtoupper($this->element).
'_DELETE_CONTACT', $user);
1294 dol_syslog(get_class($this).
"::delete_contact", LOG_DEBUG);
1296 $sql =
"DELETE FROM ".MAIN_DB_PREFIX.
"element_contact";
1297 $sql .=
" WHERE rowid = ".((int) $rowid);
1299 $result = $this->db->query($sql);
1302 $this->errors[] = $this->db->lasterror();
1307 $this->db->commit();
1310 $this->error = $this->db->lasterror();
1311 $this->db->rollback();
1331 if (!empty($typeContact)) {
1332 foreach ($typeContact as $key => $value) {
1333 array_push($temp, $key);
1335 $listId = implode(
",", $temp);
1340 if (empty($listId)) {
1344 $sql =
"DELETE FROM ".$this->db->prefix().
"element_contact";
1345 $sql .=
" WHERE element_id = ".((int) $this->
id);
1346 $sql .=
" AND fk_c_type_contact IN (".$this->db->sanitize($listId).
")";
1348 dol_syslog(get_class($this).
"::delete_linked_contact", LOG_DEBUG);
1349 if ($this->db->query($sql)) {
1352 $this->error = $this->db->lasterror();
1369 public function liste_contact($statusoflink = -1, $source =
'external', $list = 0, $code =
'', $status = -1, $arrayoftcids = array())
1376 $sql =
"SELECT ec.rowid, ec.statut as statuslink, ec.fk_socpeople as id, ec.fk_c_type_contact";
1377 if ($source ==
'internal') {
1378 $sql .=
", '-1' as socid, t.statut as statuscontact, t.login, t.photo";
1380 if ($source ==
'external' || $source ==
'thirdparty') {
1381 $sql .=
", t.fk_soc as socid, t.statut as statuscontact";
1383 $sql .=
", t.civility as civility, t.lastname as lastname, t.firstname, t.email";
1384 $sql .=
", tc.source, tc.element, tc.code, tc.libelle as type_label";
1385 $sql .=
" FROM ".$this->db->prefix().
"c_type_contact tc,";
1386 $sql .=
" ".$this->db->prefix().
"element_contact ec";
1387 if ($source ==
'internal') {
1388 $sql .=
" LEFT JOIN ".$this->db->prefix().
"user t on ec.fk_socpeople = t.rowid";
1390 if ($source ==
'external' || $source ==
'thirdparty') {
1391 $sql .=
" LEFT JOIN ".$this->db->prefix().
"socpeople t on ec.fk_socpeople = t.rowid";
1393 $sql .=
" WHERE ec.element_id = ".((int) $this->
id);
1394 $sql .=
" AND ec.fk_c_type_contact = tc.rowid";
1395 $sql .=
" AND tc.element = '".$this->db->escape($this->element).
"'";
1397 $sql .=
" AND tc.code = '".$this->db->escape($code).
"'";
1399 if ($source ==
'internal') {
1400 $sql .=
" AND tc.source = 'internal'";
1402 $sql .=
" AND t.statut = ".((int) $status);
1405 if ($source ==
'external' || $source ==
'thirdparty') {
1406 $sql .=
" AND tc.source = 'external'";
1408 $sql .=
" AND t.statut = ".((int) $status);
1411 $sql .=
" AND tc.active = 1";
1412 if ($statusoflink >= 0) {
1413 $sql .=
" AND ec.statut = ".((int) $statusoflink);
1415 $sql .=
" ORDER BY t.lastname ASC";
1417 dol_syslog(get_class($this).
"::liste_contact", LOG_DEBUG);
1418 $resql = $this->db->query($sql);
1420 $num = $this->db->num_rows($resql);
1423 $obj = $this->db->fetch_object($resql);
1426 $transkey =
"TypeContact_".$obj->element.
"_".$obj->source.
"_".$obj->code;
1427 $libelle_type = ($langs->trans($transkey) != $transkey ? $langs->trans($transkey) : $obj->type_label);
1429 'parentId' => $this->
id,
1430 'source' => $obj->source,
1431 'socid' => $obj->socid,
1433 'nom' => $obj->lastname,
1434 'civility' => $obj->civility,
1435 'lastname' => $obj->lastname,
1436 'firstname' => $obj->firstname,
1437 'email'=>$obj->email,
1438 'login'=> (empty($obj->login) ?
'' : $obj->login),
1439 'photo' => (empty($obj->photo) ?
'' : $obj->photo),
1440 'statuscontact' => $obj->statuscontact,
1441 'rowid' => $obj->rowid,
1442 'code' => $obj->code,
1443 'libelle' => $libelle_type,
1444 'status' => $obj->statuslink,
1445 'fk_c_type_contact' => $obj->fk_c_type_contact
1448 $tab[$i] = $obj->id;
1456 $this->error = $this->db->lasterror();
1471 $sql =
"SELECT ec.datecreate, ec.statut, ec.fk_socpeople, ec.fk_c_type_contact,";
1472 $sql .=
" tc.code, tc.libelle as type_label";
1473 $sql .=
" FROM (".$this->db->prefix().
"element_contact as ec, ".$this->db->prefix().
"c_type_contact as tc)";
1474 $sql .=
" WHERE ec.rowid =".((int) $rowid);
1475 $sql .=
" AND ec.fk_c_type_contact=tc.rowid";
1476 $sql .=
" AND tc.element = '".$this->db->escape($this->element).
"'";
1478 dol_syslog(get_class($this).
"::swapContactStatus", LOG_DEBUG);
1479 $resql = $this->db->query($sql);
1481 $obj = $this->db->fetch_object($resql);
1482 $newstatut = ($obj->statut == 4) ? 5 : 4;
1484 $this->db->free($resql);
1487 $this->error = $this->db->error();
1504 public function liste_type_contact($source =
'internal', $order =
'position', $option = 0, $activeonly = 0, $code =
'')
1509 if (empty($order)) {
1510 $order =
'position';
1512 if ($order ==
'position') {
1517 $sql =
"SELECT DISTINCT tc.rowid, tc.code, tc.libelle as type_label, tc.position";
1518 $sql .=
" FROM ".$this->db->prefix().
"c_type_contact as tc";
1519 $sql .=
" WHERE tc.element='".$this->db->escape($this->element).
"'";
1520 if ($activeonly == 1) {
1521 $sql .=
" AND tc.active=1";
1523 if (!empty($source) && $source !=
'all') {
1524 $sql .=
" AND tc.source='".$this->db->escape($source).
"'";
1526 if (!empty($code)) {
1527 $sql .=
" AND tc.code='".$this->db->escape($code).
"'";
1529 $sql .= $this->db->order($order,
'ASC');
1532 $resql = $this->db->query($sql);
1534 $num = $this->db->num_rows($resql);
1537 $obj = $this->db->fetch_object($resql);
1539 $transkey =
"TypeContact_".$this->element.
"_".$source.
"_".$obj->code;
1540 $libelle_type = ($langs->trans($transkey) != $transkey ? $langs->trans($transkey) : $obj->type_label);
1541 if (empty($option)) {
1542 $tab[$obj->rowid] = $libelle_type;
1544 $tab[$obj->code] = $libelle_type;
1550 $this->error = $this->db->lasterror();
1567 public function listeTypeContacts($source =
'internal', $option = 0, $activeonly = 0, $code =
'', $element =
'', $excludeelement =
'')
1569 global $langs, $conf;
1571 $langs->loadLangs(array(
'bills',
'contracts',
'interventions',
'orders',
'projects',
'propal',
'ticket',
'agenda'));
1575 $sql =
"SELECT DISTINCT tc.rowid, tc.code, tc.libelle as type_label, tc.position, tc.element, tc.module";
1576 $sql .=
" FROM ".$this->db->prefix().
"c_type_contact as tc";
1578 $sqlWhere = array();
1579 if (!empty($element)) {
1580 $sqlWhere[] =
" tc.element='".$this->db->escape($element).
"'";
1582 if (!empty($excludeelement)) {
1583 $sqlWhere[] =
" tc.element <> '".$this->db->escape($excludeelement).
"'";
1586 if ($activeonly == 1) {
1587 $sqlWhere[] =
" tc.active=1";
1590 if (!empty($source) && $source !=
'all') {
1591 $sqlWhere[] =
" tc.source='".$this->db->escape($source).
"'";
1594 if (!empty($code)) {
1595 $sqlWhere[] =
" tc.code='".$this->db->escape($code).
"'";
1598 if (count($sqlWhere) > 0) {
1599 $sql .=
" WHERE ".implode(
' AND ', $sqlWhere);
1602 $sql .= $this->db->order(
'tc.element, tc.position',
'ASC');
1605 $resql = $this->db->query($sql);
1607 $num = $this->db->num_rows($resql);
1609 $langs->loadLangs(array(
"propal",
"orders",
"bills",
"suppliers",
"contracts",
"supplier_proposal"));
1611 while ($obj = $this->db->fetch_object($resql)) {
1612 $modulename = $obj->module ?? $obj->element;
1613 if (strpos($obj->element,
'project') !==
false) {
1614 $modulename =
'projet';
1615 } elseif ($obj->element ==
'contrat') {
1616 $element =
'contract';
1617 } elseif ($obj->element ==
'action') {
1618 $modulename =
'agenda';
1619 } elseif (strpos($obj->element,
'supplier') !==
false && $obj->element !=
'supplier_proposal') {
1620 $modulename =
'fournisseur';
1621 } elseif (strpos($obj->element,
'supplier') !==
false && $obj->element !=
'supplier_proposal') {
1622 $modulename =
'fournisseur';
1624 if (!empty($conf->{$modulename}->enabled)) {
1625 $libelle_element = $langs->trans(
'ContactDefault_'.$obj->element);
1626 $tmpelement = $obj->element;
1627 $transkey =
"TypeContact_".$tmpelement.
"_".$source.
"_".$obj->code;
1628 $libelle_type = ($langs->trans($transkey) != $transkey ? $langs->trans($transkey) : $obj->type_label);
1629 if (empty($option)) {
1630 $tab[$obj->rowid] = $libelle_element.
' - '.$libelle_type;
1632 $tab[$obj->rowid] = $libelle_element.
' - '.$libelle_type;
1639 $this->error = $this->db->lasterror();
1662 if ($this->element ==
'shipping' && $this->origin_id != 0) {
1663 $id = $this->origin_id;
1664 $element =
'commande';
1665 } elseif ($this->element ==
'reception' && $this->origin_id != 0) {
1666 $id = $this->origin_id;
1667 $element =
'order_supplier';
1670 $element = $this->element;
1673 $sql =
"SELECT ec.fk_socpeople";
1674 $sql .=
" FROM ".$this->db->prefix().
"element_contact as ec,";
1675 if ($source ==
'internal') {
1676 $sql .=
" ".$this->db->prefix().
"user as c,";
1678 if ($source ==
'external') {
1679 $sql .=
" ".$this->db->prefix().
"socpeople as c,";
1681 $sql .=
" ".$this->db->prefix().
"c_type_contact as tc";
1682 $sql .=
" WHERE ec.element_id = ".((int) $id);
1683 $sql .=
" AND ec.fk_socpeople = c.rowid";
1684 if ($source ==
'internal') {
1685 $sql .=
" AND c.entity IN (".getEntity(
'user').
")";
1687 if ($source ==
'external') {
1688 $sql .=
" AND c.entity IN (".getEntity(
'societe').
")";
1690 $sql .=
" AND ec.fk_c_type_contact = tc.rowid";
1691 $sql .=
" AND tc.element = '".$this->db->escape($element).
"'";
1692 $sql .=
" AND tc.source = '".$this->db->escape($source).
"'";
1694 $sql .=
" AND tc.code = '".$this->db->escape($code).
"'";
1696 $sql .=
" AND tc.active = 1";
1698 $sql .=
" AND ec.statut = ".((int) $status);
1701 dol_syslog(get_class($this).
"::getIdContact", LOG_DEBUG);
1702 $resql = $this->db->query($sql);
1704 while ($obj = $this->db->fetch_object($resql)) {
1705 $result[$i] = $obj->fk_socpeople;
1709 $this->error = $this->db->error();
1726 if (empty($contactid)) {
1727 $contactid = $this->contact_id;
1730 if (empty($contactid)) {
1734 require_once DOL_DOCUMENT_ROOT.
'/contact/class/contact.class.php';
1735 $contact =
new Contact($this->db);
1736 $result = $contact->fetch($contactid);
1737 $this->contact = $contact;
1751 if (empty($this->socid) && empty($this->fk_soc) && empty($force_thirdparty_id)) {
1755 require_once DOL_DOCUMENT_ROOT.
'/societe/class/societe.class.php';
1757 $idtofetch = isset($this->socid) ? $this->socid : (isset($this->fk_soc) ? $this->fk_soc : 0);
1758 if ($force_thirdparty_id) {
1759 $idtofetch = $force_thirdparty_id;
1763 $thirdparty =
new Societe($this->db);
1764 $result = $thirdparty->fetch($idtofetch);
1766 $this->errors=array_merge($this->errors, $thirdparty->errors);
1768 $this->thirdparty = $thirdparty;
1771 if (
getDolGlobalString(
'PRODUIT_MULTIPRICES') && empty($this->thirdparty->price_level)) {
1772 $this->thirdparty->price_level = 1;
1791 if (!$this->table_ref_field) {
1795 $sql =
"SELECT rowid FROM ".$this->db->prefix().$this->table_element;
1796 $sql .=
" WHERE ".$this->table_ref_field.
" LIKE '".$this->db->escape($ref).
"'";
1799 $query = $this->db->query($sql);
1801 if (!$this->db->num_rows($query)) {
1805 $result = $this->db->fetch_object($query);
1807 if (method_exists($this,
'fetch')) {
1808 return $this->fetch($result->rowid);
1810 $this->error =
'Fetch method not implemented on '.get_class($this);
1811 dol_syslog(get_class($this).
'::fetchOneLike Error='.$this->error, LOG_ERR);
1812 array_push($this->errors, $this->error);
1830 dol_syslog(get_class($this).
'::fetch_barcode this->element='.$this->element.
' this->barcode_type='.$this->barcode_type);
1832 $idtype = $this->barcode_type;
1833 if (empty($idtype) && $idtype !=
'0') {
1834 if ($this->element ==
'product' &&
getDolGlobalString(
'PRODUIT_DEFAULT_BARCODE_TYPE')) {
1835 $idtype = $conf->global->PRODUIT_DEFAULT_BARCODE_TYPE;
1836 } elseif ($this->element ==
'societe') {
1837 $idtype = $conf->global->GENBARCODE_BARCODETYPE_THIRDPARTY;
1839 dol_syslog(
'Call fetch_barcode with barcode_type not defined and cant be guessed', LOG_WARNING);
1844 if (empty($this->barcode_type) || empty($this->barcode_type_code) || empty($this->barcode_type_label) || empty($this->barcode_type_coder)) {
1845 $sql =
"SELECT rowid, code, libelle as label, coder";
1846 $sql .=
" FROM ".$this->db->prefix().
"c_barcode_type";
1847 $sql .=
" WHERE rowid = ".((int) $idtype);
1848 dol_syslog(get_class($this).
'::fetch_barcode', LOG_DEBUG);
1849 $resql = $this->db->query($sql);
1851 $obj = $this->db->fetch_object($resql);
1852 $this->barcode_type = $obj->rowid;
1853 $this->barcode_type_code = $obj->code;
1854 $this->barcode_type_label = $obj->label;
1855 $this->barcode_type_coder = $obj->coder;
1875 return $this->fetch_projet();
1887 include_once DOL_DOCUMENT_ROOT.
'/projet/class/project.class.php';
1889 if (empty($this->fk_project) && !empty($this->fk_projet)) {
1890 $this->fk_project = $this->fk_projet;
1892 if (empty($this->fk_project)) {
1896 $project =
new Project($this->db);
1897 $result = $project->fetch($this->fk_project);
1899 $this->projet = $project;
1900 $this->project = $project;
1913 include_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
1915 if (empty($this->fk_product)) {
1919 $product =
new Product($this->db);
1920 $result = $product->fetch($this->fk_product);
1922 $this->product = $product;
1936 $user =
new User($this->db);
1937 $result = $user->fetch($userid);
1938 $this->
user = $user;
1953 if ($this->origin ==
'shipping') {
1954 $this->origin =
'expedition';
1956 if ($this->origin ==
'delivery') {
1957 $this->origin =
'livraison';
1959 if ($this->origin ==
'order_supplier' || $this->origin ==
'supplier_order') {
1960 $this->origin =
'commandeFournisseur';
1963 $origin = $this->origin;
1965 $classname = ucfirst($origin);
1966 $this->origin_object =
new $classname($this->db);
1967 $this->origin_object->fetch($this->origin_id);
1970 $this->$origin = $this->origin_object;
1988 $sql =
"SELECT rowid FROM ".$this->db->prefix().$table;
1989 $sql .=
" WHERE ".$field.
" = '".$this->db->escape($key).
"'";
1990 if (!empty($element)) {
1991 $sql .=
" AND entity IN (".getEntity($element).
")";
1993 $sql .=
" AND entity = ".((int) $conf->entity);
1996 dol_syslog(get_class($this).
'::fetchObjectFrom', LOG_DEBUG);
1997 $resql = $this->db->query($sql);
1999 $obj = $this->db->fetch_object($resql);
2002 if (method_exists($this,
'fetch')) {
2003 return $this->fetch($obj->rowid);
2005 $this->error =
'fetch() method not implemented on '.get_class($this);
2006 dol_syslog(get_class($this).
'::fetchOneLike Error='.$this->error, LOG_ERR);
2007 array_push($this->errors, $this->error);
2027 if (!empty($id) && !empty($field) && !empty($table)) {
2028 $sql =
"SELECT ".$field.
" FROM ".$this->db->prefix().$table;
2029 $sql .=
" WHERE rowid = ".((int) $id);
2031 dol_syslog(get_class($this).
'::getValueFrom', LOG_DEBUG);
2032 $resql = $this->db->query($sql);
2034 $row = $this->db->fetch_row($resql);
2057 public function setValueFrom($field, $value, $table =
'', $id =
null, $format =
'', $id_field =
'', $fuser =
null, $trigkey =
'', $fk_user_field =
'fk_user_modif')
2061 if (empty($table)) {
2062 $table = $this->table_element;
2067 if (empty($format)) {
2070 if (empty($id_field)) {
2071 $id_field =
'rowid';
2075 if ($table ==
'product' && $field ==
'note_private') {
2079 if (in_array($table, array(
'actioncomm',
'adherent',
'advtargetemailing',
'cronjob',
'establishment'))) {
2080 $fk_user_field =
'fk_user_mod';
2082 if (in_array($table, array(
'prelevement_bons'))) {
2083 $fk_user_field =
'';
2089 $sql =
"SELECT " . $field;
2090 $sql .=
" FROM " . MAIN_DB_PREFIX . $table;
2091 $sql .=
" WHERE " . $id_field .
" = " . ((int) $id);
2093 $resql = $this->db->query($sql);
2095 if ($obj = $this->db->fetch_object($resql)) {
2096 if ($format ==
'date') {
2097 $oldvalue = $this->db->jdate($obj->$field);
2099 $oldvalue = $obj->$field;
2103 $this->error = $this->db->lasterror();
2114 $sql =
"UPDATE ".$this->db->prefix().$table.
" SET ";
2116 if ($format ==
'text') {
2117 $sql .= $field.
" = '".$this->db->escape($value).
"'";
2118 } elseif ($format ==
'int') {
2119 $sql .= $field.
" = ".((int) $value);
2120 } elseif ($format ==
'date') {
2121 $sql .= $field.
" = ".($value ?
"'".$this->db->idate($value).
"'" :
"null");
2122 } elseif ($format ==
'dategmt') {
2123 $sql .= $field.
" = ".($value ?
"'".$this->db->idate($value,
'gmt').
"'" :
"null");
2126 if ($fk_user_field) {
2127 if (!empty($fuser) && is_object($fuser)) {
2128 $sql .=
", ".$fk_user_field.
" = ".((int) $fuser->id);
2129 } elseif (empty($fuser) || $fuser !=
'none') {
2130 $sql .=
", ".$fk_user_field.
" = ".((int) $user->id);
2134 $sql .=
" WHERE ".$id_field.
" = ".((int) $id);
2136 $resql = $this->db->query($sql);
2140 if (method_exists($this,
'fetch')) {
2141 $result = $this->fetch($id);
2143 $result = $this->fetchCommon($id);
2145 $this->oldcopy = clone $this;
2146 if (property_exists($this->oldcopy, $field)) {
2147 $this->oldcopy->$field = $oldvalue;
2151 $result = $this->call_trigger($trigkey, (!empty($fuser) && is_object($fuser)) ? $fuser : $user);
2159 if (property_exists($this, $field)) {
2160 $this->$field = $value;
2162 $this->db->commit();
2165 $this->db->rollback();
2169 if ($this->db->lasterrno() ==
'DB_ERROR_RECORD_ALREADY_EXISTS') {
2170 $this->error =
'DB_ERROR_RECORD_ALREADY_EXISTS';
2172 $this->error = $this->db->lasterror();
2174 $this->db->rollback();
2192 global $conf, $user;
2194 if (!$this->table_element) {
2195 dol_print_error(
'', get_class($this).
"::load_previous_next_ref was called on objet with property table_element not defined");
2198 if ($fieldid ==
'none') {
2203 if (in_array($this->table_element, array(
'facture_rec',
'facture_fourn_rec')) && $fieldid ==
'title') {
2209 if ($user->socid > 0) {
2210 $socid = $user->socid;
2215 $aliastablesociete =
's';
2216 if ($this->element ==
'societe') {
2217 $aliastablesociete =
'te';
2219 $restrictiononfksoc = empty($this->restrictiononfksoc) ? 0 : $this->restrictiononfksoc;
2220 $sql =
"SELECT MAX(te.".$fieldid.
")";
2221 $sql .=
" FROM ".(empty($nodbprefix) ? $this->db->prefix() :
'').$this->table_element.
" as te";
2222 if (isset($this->ismultientitymanaged) && !is_numeric($this->ismultientitymanaged)) {
2223 $tmparray = explode(
'@', $this->ismultientitymanaged);
2224 $sql .=
", ".$this->db->prefix().$tmparray[1].
" as ".($tmparray[1] ==
'societe' ?
's' :
'parenttable');
2225 } elseif ($restrictiononfksoc == 1 && $this->element !=
'societe' && !$user->hasRight(
'societe',
'client',
'voir') && !$socid) {
2226 $sql .=
", ".$this->db->prefix().
"societe as s";
2227 } elseif ($restrictiononfksoc == 2 && $this->element !=
'societe' && !$user->hasRight(
'societe',
'client',
'voir') && !$socid) {
2228 $sql .=
" LEFT JOIN ".$this->db->prefix().
"societe as s ON te.fk_soc = s.rowid";
2230 if ($restrictiononfksoc && !$user->hasRight(
'societe',
'client',
'voir') && !$socid) {
2231 $sql .=
" LEFT JOIN ".$this->db->prefix().
"societe_commerciaux as sc ON ".$aliastablesociete.
".rowid = sc.fk_soc";
2233 if ($fieldid ==
'rowid') {
2234 $sql .=
" WHERE te.".$fieldid.
" < ".((int) $this->
id);
2236 $sql .=
" WHERE te.".$fieldid.
" < '".$this->db->escape($this->
ref).
"'";
2238 if ($restrictiononfksoc == 1 && !$user->hasRight(
'societe',
'client',
'voir') && !$socid) {
2239 $sql .=
" AND sc.fk_user = ".((int) $user->id);
2241 if ($restrictiononfksoc == 2 && !$user->hasRight(
'societe',
'client',
'voir') && !$socid) {
2242 $sql .=
" AND (sc.fk_user = ".((int) $user->id).
' OR te.fk_soc IS NULL)';
2244 if (!empty($filter)) {
2245 if (!preg_match(
'/^\s*AND/i', $filter)) {
2250 if (isset($this->ismultientitymanaged) && !is_numeric($this->ismultientitymanaged)) {
2251 $tmparray = explode(
'@', $this->ismultientitymanaged);
2252 $sql .=
" AND te.".$tmparray[0].
" = ".($tmparray[1] ==
"societe" ?
"s" :
"parenttable").
".rowid";
2253 } elseif ($restrictiononfksoc == 1 && $this->element !=
'societe' && !$user->hasRight(
'societe',
'client',
'voir') && !$socid) {
2254 $sql .=
' AND te.fk_soc = s.rowid';
2256 if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) {
2257 if ($this->element ==
'user' &&
getDolGlobalInt(
'MULTICOMPANY_TRANSVERSE_MODE')) {
2258 if (!empty($user->admin) && empty($user->entity) && $conf->entity == 1) {
2259 $sql .=
" AND te.entity IS NOT NULL";
2261 $sql .=
" AND te.rowid IN (SELECT ug.fk_user FROM ".$this->db->prefix().
"usergroup_user as ug WHERE ug.entity IN (".
getEntity(
'usergroup').
"))";
2264 $sql .=
' AND te.entity IN ('.getEntity($this->element).
')';
2267 if (isset($this->ismultientitymanaged) && !is_numeric($this->ismultientitymanaged) && $this->element !=
'societe') {
2268 $tmparray = explode(
'@', $this->ismultientitymanaged);
2269 $sql .=
' AND parenttable.entity IN ('.getEntity($tmparray[1]).
')';
2271 if ($restrictiononfksoc == 1 && $socid && $this->element !=
'societe') {
2272 $sql .=
' AND te.fk_soc = '.((int) $socid);
2274 if ($restrictiononfksoc == 2 && $socid && $this->element !=
'societe') {
2275 $sql .=
' AND (te.fk_soc = '.((int) $socid).
' OR te.fk_soc IS NULL)';
2277 if ($restrictiononfksoc && $socid && $this->element ==
'societe') {
2278 $sql .=
' AND te.rowid = '.((int) $socid);
2282 $result = $this->db->query($sql);
2284 $this->error = $this->db->lasterror();
2287 $row = $this->db->fetch_row($result);
2288 $this->ref_previous = $row[0];
2290 $sql =
"SELECT MIN(te.".$fieldid.
")";
2291 $sql .=
" FROM ".(empty($nodbprefix) ? $this->db->prefix() :
'').$this->table_element.
" as te";
2292 if (isset($this->ismultientitymanaged) && !is_numeric($this->ismultientitymanaged)) {
2293 $tmparray = explode(
'@', $this->ismultientitymanaged);
2294 $sql .=
", ".$this->db->prefix().$tmparray[1].
" as ".($tmparray[1] ==
'societe' ?
's' :
'parenttable');
2295 } elseif ($restrictiononfksoc == 1 && $this->element !=
'societe' && !$user->hasRight(
'societe',
'client',
'voir') && !$socid) {
2296 $sql .=
", ".$this->db->prefix().
"societe as s";
2297 } elseif ($restrictiononfksoc == 2 && $this->element !=
'societe' && !$user->hasRight(
'societe',
'client',
'voir') && !$socid) {
2298 $sql .=
" LEFT JOIN ".$this->db->prefix().
"societe as s ON te.fk_soc = s.rowid";
2300 if ($restrictiononfksoc && !$user->hasRight(
'societe',
'client',
'voir') && !$socid) {
2301 $sql .=
" LEFT JOIN ".$this->db->prefix().
"societe_commerciaux as sc ON ".$aliastablesociete.
".rowid = sc.fk_soc";
2303 if ($fieldid ==
'rowid') {
2304 $sql .=
" WHERE te.".$fieldid.
" > ".((int) $this->
id);
2306 $sql .=
" WHERE te.".$fieldid.
" > '".$this->db->escape($this->
ref).
"'";
2308 if ($restrictiononfksoc == 1 && !$user->hasRight(
'societe',
'client',
'voir') && !$socid) {
2309 $sql .=
" AND sc.fk_user = ".((int) $user->id);
2311 if ($restrictiononfksoc == 2 && !$user->hasRight(
'societe',
'client',
'voir') && !$socid) {
2312 $sql .=
" AND (sc.fk_user = ".((int) $user->id).
' OR te.fk_soc IS NULL)';
2314 if (!empty($filter)) {
2315 if (!preg_match(
'/^\s*AND/i', $filter)) {
2320 if (isset($this->ismultientitymanaged) && !is_numeric($this->ismultientitymanaged)) {
2321 $tmparray = explode(
'@', $this->ismultientitymanaged);
2322 $sql .=
" AND te.".$tmparray[0].
" = ".($tmparray[1] ==
"societe" ?
"s" :
"parenttable").
".rowid";
2323 } elseif ($restrictiononfksoc == 1 && $this->element !=
'societe' && !$user->hasRight(
'societe',
'client',
'voir') && !$socid) {
2324 $sql .=
' AND te.fk_soc = s.rowid';
2326 if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) {
2327 if ($this->element ==
'user' &&
getDolGlobalInt(
'MULTICOMPANY_TRANSVERSE_MODE')) {
2328 if (!empty($user->admin) && empty($user->entity) && $conf->entity == 1) {
2329 $sql .=
" AND te.entity IS NOT NULL";
2331 $sql .=
" AND te.rowid IN (SELECT ug.fk_user FROM ".$this->db->prefix().
"usergroup_user as ug WHERE ug.entity IN (".
getEntity(
'usergroup').
"))";
2334 $sql .=
' AND te.entity IN ('.getEntity($this->element).
')';
2337 if (isset($this->ismultientitymanaged) && !is_numeric($this->ismultientitymanaged) && $this->element !=
'societe') {
2338 $tmparray = explode(
'@', $this->ismultientitymanaged);
2339 $sql .=
' AND parenttable.entity IN ('.getEntity($tmparray[1]).
')';
2341 if ($restrictiononfksoc == 1 && $socid && $this->element !=
'societe') {
2342 $sql .=
' AND te.fk_soc = '.((int) $socid);
2344 if ($restrictiononfksoc == 2 && $socid && $this->element !=
'societe') {
2345 $sql .=
' AND (te.fk_soc = '.((int) $socid).
' OR te.fk_soc IS NULL)';
2347 if ($restrictiononfksoc && $socid && $this->element ==
'societe') {
2348 $sql .=
' AND te.rowid = '.((int) $socid);
2353 $result = $this->db->query($sql);
2355 $this->error = $this->db->lasterror();
2358 $row = $this->db->fetch_row($result);
2359 $this->ref_next = $row[0];
2374 $contactAlreadySelected = array();
2375 $tab = $this->liste_contact(-1, $source);
2379 if ($source ==
'thirdparty') {
2380 $contactAlreadySelected[$i] = $tab[$i][
'socid'];
2382 $contactAlreadySelected[$i] = $tab[$i][
'id'];
2386 return $contactAlreadySelected;
2402 if (!$this->table_element) {
2403 dol_syslog(get_class($this).
"::setProject was called on objet with property table_element not defined", LOG_ERR);
2407 $sql =
"UPDATE ".$this->db->prefix().$this->table_element;
2408 if (!empty($this->fields[
'fk_project'])) {
2410 $sql .=
" SET fk_project = ".((int) $projectid);
2412 $sql .=
" SET fk_project = NULL";
2414 $sql .=
' WHERE rowid = '.((int) $this->
id);
2415 } elseif ($this->table_element ==
'actioncomm') {
2417 $sql .=
" SET fk_project = ".((int) $projectid);
2419 $sql .=
" SET fk_project = NULL";
2421 $sql .=
' WHERE id = '.((int) $this->
id);
2424 $sql .=
' SET fk_projet = '.((int) $projectid);
2426 $sql .=
' SET fk_projet = NULL';
2428 $sql .=
" WHERE rowid = ".((int) $this->
id);
2433 dol_syslog(get_class($this).
"::setProject", LOG_DEBUG);
2434 if ($this->db->query($sql)) {
2435 $this->fk_project = ((int) $projectid);
2442 if (!$error && !$notrigger) {
2444 $result = $this->call_trigger(strtoupper($this->element) .
'_MODIFY', $user);
2453 $this->db->rollback();
2456 $this->db->commit();
2474 dol_syslog(get_class($this).
'::setPaymentMethods('.$id.
')');
2476 if ($this->
statut >= 0 || $this->element ==
'societe') {
2478 $fieldname =
'fk_mode_reglement';
2479 if ($this->element ==
'societe') {
2480 $fieldname =
'mode_reglement';
2482 if (get_class($this) ==
'Fournisseur') {
2483 $fieldname =
'mode_reglement_supplier';
2485 if (get_class($this) ==
'Tva') {
2486 $fieldname =
'fk_typepayment';
2488 if (get_class($this) ==
'Salary') {
2489 $fieldname =
'fk_typepayment';
2492 $sql =
"UPDATE ".$this->db->prefix().$this->table_element;
2493 $sql .=
" SET ".$fieldname.
" = ".(($id > 0 || $id ==
'0') ? ((
int) $id) :
'NULL');
2494 $sql .=
' WHERE rowid='.((int) $this->
id);
2496 if ($this->db->query($sql)) {
2497 $this->mode_reglement_id = $id;
2499 if (get_class($this) ==
'Fournisseur') {
2500 $this->mode_reglement_supplier_id = $id;
2503 if (!$error && !$notrigger) {
2505 if (get_class($this) ==
'Commande') {
2506 $result = $this->call_trigger(
'ORDER_MODIFY', $user);
2508 $result = $this->call_trigger(strtoupper(get_class($this)).
'_MODIFY', $user);
2517 dol_syslog(get_class($this).
'::setPaymentMethods Error '.$this->db->error());
2518 $this->error = $this->db->error();
2522 dol_syslog(get_class($this).
'::setPaymentMethods, status of the object is incompatible');
2523 $this->error =
'Status of the object is incompatible '.$this->statut;
2536 dol_syslog(get_class($this).
'::setMulticurrencyCode('.$code.
')');
2537 if ($this->
statut >= 0 || $this->element ==
'societe') {
2538 $fieldname =
'multicurrency_code';
2540 $sql =
'UPDATE '.$this->db->prefix().$this->table_element;
2541 $sql .=
" SET ".$fieldname.
" = '".$this->db->escape($code).
"'";
2542 $sql .=
' WHERE rowid='.((int) $this->
id);
2544 if ($this->db->query($sql)) {
2545 $this->multicurrency_code = $code;
2549 $this->setMulticurrencyRate($rate, 2);
2554 dol_syslog(get_class($this).
'::setMulticurrencyCode Error '.$sql.
' - '.$this->db->error());
2555 $this->error = $this->db->error();
2559 dol_syslog(get_class($this).
'::setMulticurrencyCode, status of the object is incompatible');
2560 $this->error =
'Status of the object is incompatible '.$this->statut;
2572 public function setMulticurrencyRate($rate, $mode = 1)
2574 dol_syslog(get_class($this).
'::setMulticurrencyRate('.$rate.
','.$mode.
')');
2575 if ($this->
statut >= 0 || $this->element ==
'societe') {
2576 $fieldname =
'multicurrency_tx';
2578 $sql =
'UPDATE '.$this->db->prefix().$this->table_element;
2579 $sql .=
" SET ".$fieldname.
" = ".((float) $rate);
2580 $sql .=
' WHERE rowid='.((int) $this->
id);
2582 if ($this->db->query($sql)) {
2583 $this->multicurrency_tx = $rate;
2586 if (!empty($this->lines)) {
2587 foreach ($this->lines as &$line) {
2590 $line->subprice = 0;
2595 $line->multicurrency_subprice = 0;
2598 switch ($this->element) {
2606 $line->remise_percent,
2608 $line->localtax1_tx,
2609 $line->localtax2_tx,
2610 ($line->description ? $line->description : $line->desc),
2613 $line->special_code,
2614 $line->fk_parent_line,
2615 $line->skip_update_total,
2616 $line->fk_fournprice,
2619 $line->product_type,
2622 $line->array_options,
2624 $line->multicurrency_subprice
2632 ($line->description ? $line->description : $line->desc),
2635 $line->remise_percent,
2637 $line->localtax1_tx,
2638 $line->localtax2_tx,
2643 $line->product_type,
2644 $line->fk_parent_line,
2645 $line->skip_update_total,
2646 $line->fk_fournprice,
2649 $line->special_code,
2650 $line->array_options,
2652 $line->multicurrency_subprice
2660 ($line->description ? $line->description : $line->desc),
2663 $line->remise_percent,
2667 $line->localtax1_tx,
2668 $line->localtax2_tx,
2671 $line->product_type,
2672 $line->fk_parent_line,
2673 $line->skip_update_total,
2674 $line->fk_fournprice,
2677 $line->special_code,
2678 $line->array_options,
2679 $line->situation_percent,
2681 $line->multicurrency_subprice
2684 case 'supplier_proposal':
2691 $line->remise_percent,
2693 $line->localtax1_tx,
2694 $line->localtax2_tx,
2695 ($line->description ? $line->description : $line->desc),
2698 $line->special_code,
2699 $line->fk_parent_line,
2700 $line->skip_update_total,
2701 $line->fk_fournprice,
2704 $line->product_type,
2705 $line->array_options,
2707 $line->multicurrency_subprice
2710 case 'order_supplier':
2715 ($line->description ? $line->description : $line->desc),
2718 $line->remise_percent,
2720 $line->localtax1_tx,
2721 $line->localtax2_tx,
2724 $line->product_type,
2728 $line->array_options,
2730 $line->multicurrency_subprice,
2734 case 'invoice_supplier':
2739 ($line->description ? $line->description : $line->desc),
2742 $line->localtax1_tx,
2743 $line->localtax2_tx,
2748 $line->product_type,
2749 $line->remise_percent,
2753 $line->array_options,
2755 $line->multicurrency_subprice,
2760 dol_syslog(get_class($this).
'::setMulticurrencyRate no updateline defined', LOG_DEBUG);
2768 dol_syslog(get_class($this).
'::setMulticurrencyRate Error '.$sql.
' - '.$this->db->error());
2769 $this->error = $this->db->error();
2773 dol_syslog(get_class($this).
'::setMulticurrencyRate, status of the object is incompatible');
2774 $this->error =
'Status of the object is incompatible '.$this->statut;
2788 dol_syslog(get_class($this).
'::setPaymentTerms('.$id.
', '.var_export($deposit_percent,
true).
')');
2789 if ($this->
statut >= 0 || $this->element ==
'societe') {
2791 $fieldname =
'fk_cond_reglement';
2792 if ($this->element ==
'societe') {
2793 $fieldname =
'cond_reglement';
2795 if (get_class($this) ==
'Fournisseur') {
2796 $fieldname =
'cond_reglement_supplier';
2799 if (empty($deposit_percent) || $deposit_percent < 0) {
2803 if ($deposit_percent > 100) {
2804 $deposit_percent = 100;
2807 $sql =
'UPDATE '.$this->db->prefix().$this->table_element;
2808 $sql .=
" SET ".$fieldname.
" = ".(($id > 0 || $id ==
'0') ? ((
int) $id) :
'NULL');
2809 if (in_array($this->table_element, array(
'propal',
'commande',
'societe'))) {
2810 $sql .=
" , deposit_percent = " . (empty($deposit_percent) ?
'NULL' :
"'".$this->db->escape($deposit_percent).
"'");
2812 $sql .=
' WHERE rowid='.((int) $this->
id);
2814 if ($this->db->query($sql)) {
2815 $this->cond_reglement_id = $id;
2817 if (get_class($this) ==
'Fournisseur') {
2818 $this->cond_reglement_supplier_id = $id;
2820 $this->cond_reglement = $id;
2821 $this->deposit_percent = $deposit_percent;
2824 dol_syslog(get_class($this).
'::setPaymentTerms Error '.$sql.
' - '.$this->db->error());
2825 $this->error = $this->db->error();
2829 dol_syslog(get_class($this).
'::setPaymentTerms, status of the object is incompatible');
2830 $this->error =
'Status of the object is incompatible '.$this->statut;
2843 dol_syslog(get_class($this).
'::setTransportMode('.$id.
')');
2844 if ($this->
statut >= 0 || $this->element ==
'societe') {
2845 $fieldname =
'fk_transport_mode';
2846 if ($this->element ==
'societe') {
2847 $fieldname =
'transport_mode';
2849 if (get_class($this) ==
'Fournisseur') {
2850 $fieldname =
'transport_mode_supplier';
2853 $sql =
'UPDATE '.$this->db->prefix().$this->table_element;
2854 $sql .=
" SET ".$fieldname.
" = ".(($id > 0 || $id ==
'0') ? ((
int) $id) :
'NULL');
2855 $sql .=
' WHERE rowid='.((int) $this->
id);
2857 if ($this->db->query($sql)) {
2858 $this->transport_mode_id = $id;
2860 if (get_class($this) ==
'Fournisseur') {
2861 $this->transport_mode_supplier_id = $id;
2865 dol_syslog(get_class($this).
'::setTransportMode Error '.$sql.
' - '.$this->db->error());
2866 $this->error = $this->db->error();
2870 dol_syslog(get_class($this).
'::setTransportMode, status of the object is incompatible');
2871 $this->error =
'Status of the object is incompatible '.$this->statut;
2884 dol_syslog(get_class($this).
'::setRetainedWarrantyPaymentTerms('.$id.
')');
2885 if ($this->
statut >= 0 || $this->element ==
'societe') {
2886 $fieldname =
'retained_warranty_fk_cond_reglement';
2888 $sql =
'UPDATE '.$this->db->prefix().$this->table_element;
2889 $sql .=
" SET ".$fieldname.
" = ".((int) $id);
2890 $sql .=
' WHERE rowid='.((int) $this->
id);
2892 if ($this->db->query($sql)) {
2893 $this->retained_warranty_fk_cond_reglement = $id;
2896 dol_syslog(get_class($this).
'::setRetainedWarrantyPaymentTerms Error '.$sql.
' - '.$this->db->error());
2897 $this->error = $this->db->error();
2901 dol_syslog(get_class($this).
'::setRetainedWarrantyPaymentTerms, status of the object is incompatible');
2902 $this->error =
'Status of the object is incompatible '.$this->statut;
2916 $fieldname =
'fk_delivery_address';
2917 if ($this->element ==
'delivery' || $this->element ==
'shipping') {
2918 $fieldname =
'fk_address';
2921 $sql =
"UPDATE ".$this->db->prefix().$this->table_element.
" SET ".$fieldname.
" = ".((int) $id);
2922 $sql .=
" WHERE rowid = ".((int) $this->
id).
" AND fk_statut = 0";
2924 if ($this->db->query($sql)) {
2925 $this->fk_delivery_address = $id;
2928 $this->error = $this->db->error();
2929 dol_syslog(get_class($this).
'::setDeliveryAddress Error '.$this->error);
2948 if (empty($userused)) {
2954 if (!$this->table_element) {
2955 dol_syslog(get_class($this).
"::setShippingMethod was called on objet with property table_element not defined", LOG_ERR);
2961 if ($shipping_method_id < 0) {
2962 $shipping_method_id =
'NULL';
2964 dol_syslog(get_class($this).
'::setShippingMethod('.$shipping_method_id.
')');
2966 $sql =
"UPDATE ".$this->db->prefix().$this->table_element;
2967 $sql .=
" SET fk_shipping_method = ".((int) $shipping_method_id);
2968 $sql .=
" WHERE rowid=".((int) $this->
id);
2969 $resql = $this->db->query($sql);
2971 dol_syslog(get_class($this).
'::setShippingMethod Error ', LOG_DEBUG);
2972 $this->error = $this->db->lasterror();
2977 $this->context = array(
'shippingmethodupdate'=>1);
2978 $result = $this->call_trigger(strtoupper(get_class($this)).
'_MODIFY', $userused);
2986 $this->db->rollback();
2989 $this->shipping_method_id = ($shipping_method_id ==
'NULL') ?
null : $shipping_method_id;
2990 $this->db->commit();
3004 if (!$this->table_element) {
3005 dol_syslog(get_class($this).
"::setWarehouse was called on objet with property table_element not defined", LOG_ERR);
3008 if ($warehouse_id < 0) {
3009 $warehouse_id =
'NULL';
3011 dol_syslog(get_class($this).
'::setWarehouse('.$warehouse_id.
')');
3013 $sql =
"UPDATE ".$this->db->prefix().$this->table_element;
3014 $sql .=
" SET fk_warehouse = ".((int) $warehouse_id);
3015 $sql .=
" WHERE rowid=".((int) $this->
id);
3017 if ($this->db->query($sql)) {
3018 $this->warehouse_id = ($warehouse_id ==
'NULL') ?
null : $warehouse_id;
3021 dol_syslog(get_class($this).
'::setWarehouse Error ', LOG_DEBUG);
3022 $this->error = $this->db->error();
3037 if (!$this->table_element) {
3038 dol_syslog(get_class($this).
"::setDocModel was called on objet with property table_element not defined", LOG_ERR);
3042 $newmodelpdf =
dol_trunc($modelpdf, 255);
3044 $sql =
"UPDATE ".$this->db->prefix().$this->table_element;
3045 $sql .=
" SET model_pdf = '".$this->db->escape($newmodelpdf).
"'";
3046 $sql .=
" WHERE rowid = ".((int) $this->
id);
3048 dol_syslog(get_class($this).
"::setDocModel", LOG_DEBUG);
3049 $resql = $this->db->query($sql);
3051 $this->model_pdf = $modelpdf;
3072 if (empty($userused)) {
3078 if (!$this->table_element) {
3079 dol_syslog(get_class($this).
"::setBankAccount was called on objet with property table_element not defined", LOG_ERR);
3084 if ($fk_account < 0) {
3085 $fk_account =
'NULL';
3087 dol_syslog(get_class($this).
'::setBankAccount('.$fk_account.
')');
3089 $sql =
"UPDATE ".$this->db->prefix().$this->table_element;
3090 $sql .=
" SET fk_account = ".((int) $fk_account);
3091 $sql .=
" WHERE rowid=".((int) $this->
id);
3093 $resql = $this->db->query($sql);
3095 dol_syslog(get_class($this).
'::setBankAccount Error '.$sql.
' - '.$this->db->error());
3096 $this->error = $this->db->lasterror();
3101 $this->context[
'bankaccountupdate'] = 1;
3102 $triggerName = strtoupper(get_class($this)).
'_MODIFY';
3104 if ($triggerName ==
'FACTUREREC_MODIFY') {
3105 $triggerName =
'BILLREC_MODIFY';
3107 $result = $this->call_trigger($triggerName, $userused);
3115 $this->db->rollback();
3118 $this->fk_account = ($fk_account ==
'NULL') ?
null : $fk_account;
3119 $this->db->commit();
3137 public function line_order($renum =
false, $rowidorder =
'ASC', $fk_parent_line =
true)
3140 if (!$this->table_element_line) {
3141 dol_syslog(get_class($this).
"::line_order was called on objet with property table_element_line not defined", LOG_ERR);
3144 if (!$this->fk_element) {
3145 dol_syslog(get_class($this).
"::line_order was called on objet with property fk_element not defined", LOG_ERR);
3149 $fieldposition =
'rang';
3150 if (in_array($this->table_element_line, array(
'bom_bomline',
'ecm_files',
'emailcollector_emailcollectoraction',
'product_attribute_value'))) {
3151 $fieldposition =
'position';
3156 $sql =
"SELECT count(rowid) FROM ".$this->db->prefix().$this->table_element_line;
3157 $sql .=
" WHERE ".$this->fk_element.
" = ".((int) $this->
id);
3159 $sql .=
" AND " . $fieldposition .
" = 0";
3162 $sql .=
" AND " . $fieldposition .
" <> 0";
3165 dol_syslog(get_class($this).
"::line_order", LOG_DEBUG);
3166 $resql = $this->db->query($sql);
3168 $row = $this->db->fetch_row($resql);
3178 $sql =
"SELECT rowid FROM ".$this->db->prefix().$this->table_element_line;
3179 $sql .=
" WHERE ".$this->fk_element.
" = ".((int) $this->
id);
3180 if ($fk_parent_line) {
3181 $sql .=
' AND fk_parent_line IS NULL';
3183 $sql .=
" ORDER BY " . $fieldposition .
" ASC, rowid " . $rowidorder;
3185 dol_syslog(get_class($this).
"::line_order search all parent lines", LOG_DEBUG);
3186 $resql = $this->db->query($sql);
3189 $num = $this->db->num_rows($resql);
3191 $row = $this->db->fetch_row($resql);
3193 $childrens = $this->getChildrenOfLine($row[0]);
3194 if (!empty($childrens)) {
3195 foreach ($childrens as $child) {
3196 array_push($rows, $child);
3203 if (!empty($rows)) {
3204 foreach ($rows as $key => $row) {
3205 $this->updateRangOfLine($row, ($key + 1));
3224 $fieldposition =
'rang';
3225 if (in_array($this->table_element_line, array(
'bom_bomline',
'ecm_files',
'emailcollector_emailcollectoraction',
'product_attribute_value'))) {
3226 $fieldposition =
'position';
3231 $sql =
"SELECT rowid FROM ".$this->db->prefix().$this->table_element_line;
3232 $sql .=
" WHERE ".$this->fk_element.
" = ".((int) $this->
id);
3233 $sql .=
' AND fk_parent_line = '.((int) $id);
3234 $sql .=
" ORDER BY " . $fieldposition .
" ASC";
3236 dol_syslog(get_class($this).
"::getChildrenOfLine search children lines for line ".$id, LOG_DEBUG);
3237 $resql = $this->db->query($sql);
3239 if ($this->db->num_rows($resql) > 0) {
3240 while ($row = $this->db->fetch_row($resql)) {
3242 if (!empty($includealltree)) {
3243 $rows = array_merge($rows, $this->getChildrenOfLine($row[0], $includealltree));
3259 public function line_up($rowid, $fk_parent_line =
true)
3262 $this->line_order(
false,
'ASC', $fk_parent_line);
3265 $rang = $this->getRangOfLine($rowid);
3268 $this->updateLineUp($rowid, $rang);
3282 $this->line_order(
false,
'ASC', $fk_parent_line);
3285 $rang = $this->getRangOfLine($rowid);
3288 $max = $this->line_max();
3291 $this->updateLineDown($rowid, $rang, $max);
3303 global $hookmanager;
3304 $fieldposition =
'rang';
3305 if (in_array($this->table_element_line, array(
'bom_bomline',
'ecm_files',
'emailcollector_emailcollectoraction',
'product_attribute_value'))) {
3306 $fieldposition =
'position';
3309 $sql =
"UPDATE ".$this->db->prefix().$this->table_element_line.
" SET ".$fieldposition.
" = ".((int) $rang);
3310 $sql .=
' WHERE rowid = '.((int) $rowid);
3312 dol_syslog(get_class($this).
"::updateRangOfLine", LOG_DEBUG);
3313 if (!$this->db->query($sql)) {
3317 $parameters=array(
'rowid'=>$rowid,
'rang'=>$rang,
'fieldposition' => $fieldposition);
3319 $reshook = $hookmanager->executeHooks(
'afterRankOfLineUpdate', $parameters, $this, $action);
3334 $num = count($rows);
3335 for ($i = 0; $i < $num; $i++) {
3336 $this->updateRangOfLine($rows[$i], ($i + 1));
3350 $fieldposition =
'rang';
3351 if (in_array($this->table_element_line, array(
'ecm_files',
'emailcollector_emailcollectoraction',
'product_attribute_value'))) {
3352 $fieldposition =
'position';
3355 $sql =
"UPDATE ".$this->db->prefix().$this->table_element_line.
" SET ".$fieldposition.
" = ".((int) $rang);
3356 $sql .=
" WHERE ".$this->fk_element.
" = ".((int) $this->
id);
3357 $sql .=
" AND " . $fieldposition .
" = " . ((int) ($rang - 1));
3358 if ($this->db->query($sql)) {
3359 $sql =
"UPDATE ".$this->db->prefix().$this->table_element_line.
" SET ".$fieldposition.
" = ".((int) ($rang - 1));
3360 $sql .=
' WHERE rowid = '.((int) $rowid);
3361 if (!$this->db->query($sql)) {
3381 $fieldposition =
'rang';
3382 if (in_array($this->table_element_line, array(
'ecm_files',
'emailcollector_emailcollectoraction',
'product_attribute_value'))) {
3383 $fieldposition =
'position';
3386 $sql =
"UPDATE ".$this->db->prefix().$this->table_element_line.
" SET ".$fieldposition.
" = ".((int) $rang);
3387 $sql .=
" WHERE ".$this->fk_element.
" = ".((int) $this->
id);
3388 $sql .=
" AND " . $fieldposition .
" = " . ((int) ($rang + 1));
3389 if ($this->db->query($sql)) {
3390 $sql =
"UPDATE ".$this->db->prefix().$this->table_element_line.
" SET ".$fieldposition.
" = ".((int) ($rang + 1));
3391 $sql .=
' WHERE rowid = '.((int) $rowid);
3392 if (!$this->db->query($sql)) {
3409 $fieldposition =
'rang';
3410 if (in_array($this->table_element_line, array(
'ecm_files',
'emailcollector_emailcollectoraction',
'product_attribute_value'))) {
3411 $fieldposition =
'position';
3414 $sql =
"SELECT " . $fieldposition .
" FROM ".$this->db->prefix().$this->table_element_line;
3415 $sql .=
" WHERE rowid = ".((int) $rowid);
3417 dol_syslog(get_class($this).
"::getRangOfLine", LOG_DEBUG);
3418 $resql = $this->db->query($sql);
3420 $row = $this->db->fetch_row($resql);
3435 $fieldposition =
'rang';
3436 if (in_array($this->table_element_line, array(
'ecm_files',
'emailcollector_emailcollectoraction',
'product_attribute_value'))) {
3437 $fieldposition =
'position';
3440 $sql =
"SELECT rowid FROM ".$this->db->prefix().$this->table_element_line;
3441 $sql .=
" WHERE ".$this->fk_element.
" = ".((int) $this->
id);
3442 $sql .=
" AND " . $fieldposition .
" = ".((int) $rang);
3443 $resql = $this->db->query($sql);
3445 $row = $this->db->fetch_row($resql);
3462 $positionfield =
'rang';
3463 if (in_array($this->table_element, array(
'bom_bom',
'product_attribute'))) {
3464 $positionfield =
'position';
3468 if ($fk_parent_line) {
3469 $sql =
"SELECT max(".$positionfield.
") FROM ".$this->db->prefix().$this->table_element_line;
3470 $sql .=
" WHERE ".$this->fk_element.
" = ".((int) $this->
id);
3471 $sql .=
" AND fk_parent_line = ".((int) $fk_parent_line);
3473 dol_syslog(get_class($this).
"::line_max", LOG_DEBUG);
3474 $resql = $this->db->query($sql);
3476 $row = $this->db->fetch_row($resql);
3477 if (!empty($row[0])) {
3480 return $this->getRangOfLine($fk_parent_line);
3485 $sql =
"SELECT max(".$positionfield.
") FROM ".$this->db->prefix().$this->table_element_line;
3486 $sql .=
" WHERE ".$this->fk_element.
" = ".((int) $this->
id);
3488 dol_syslog(get_class($this).
"::line_max", LOG_DEBUG);
3489 $resql = $this->db->query($sql);
3491 $row = $this->db->fetch_row($resql);
3509 if (!$this->table_element) {
3510 dol_syslog(get_class($this).
"::update_ref_ext was called on objet with property table_element not defined", LOG_ERR);
3514 $sql =
"UPDATE ".$this->db->prefix().$this->table_element;
3515 $sql .=
" SET ref_ext = '".$this->db->escape($ref_ext).
"'";
3516 $sql .=
" WHERE ".(isset($this->table_rowid) ? $this->table_rowid :
'rowid').
" = ".((
int) $this->id);
3518 dol_syslog(get_class($this).
"::update_ref_ext", LOG_DEBUG);
3519 if ($this->db->query($sql)) {
3520 $this->ref_ext = $ref_ext;
3523 $this->error = $this->db->error();
3542 if (!$this->table_element) {
3543 $this->error =
'update_note was called on objet with property table_element not defined';
3544 dol_syslog(get_class($this).
"::update_note was called on objet with property table_element not defined", LOG_ERR);
3547 if (!in_array($suffix, array(
'',
'_public',
'_private'))) {
3548 $this->error =
'update_note Parameter suffix must be empty, \'_private\' or \'_public\'';
3549 dol_syslog(get_class($this).
"::update_note Parameter suffix must be empty, '_private' or '_public'", LOG_ERR);
3553 $newsuffix = $suffix;
3556 if ($this->table_element ==
'product' && $newsuffix ==
'_private') {
3559 if (in_array($this->table_element, array(
'actioncomm',
'adherent',
'advtargetemailing',
'cronjob',
'establishment'))) {
3560 $fieldusermod =
"fk_user_mod";
3561 } elseif ($this->table_element ==
'ecm_files') {
3562 $fieldusermod =
"fk_user_m";
3564 $fieldusermod =
"fk_user_modif";
3566 $sql =
"UPDATE ".$this->db->prefix().$this->table_element;
3567 $sql .=
" SET note".$newsuffix.
" = ".(!empty($note) ? (
"'".$this->db->escape($note).
"'") :
"NULL");
3568 $sql .=
", ".$fieldusermod.
" = ".((int) $user->id);
3569 $sql .=
" WHERE rowid = ".((int) $this->
id);
3571 dol_syslog(get_class($this).
"::update_note", LOG_DEBUG);
3572 if ($this->db->query($sql)) {
3573 if ($suffix ==
'_public') {
3574 $this->note_public = $note;
3575 } elseif ($suffix ==
'_private') {
3576 $this->note_private = $note;
3578 $this->note = $note;
3579 $this->note_private = $note;
3581 if (empty($notrigger)) {
3582 switch ($this->element) {
3584 $trigger_name =
'COMPANY_MODIFY';
3587 $trigger_name =
'ORDER_MODIFY';
3590 $trigger_name =
'BILL_MODIFY';
3592 case 'invoice_supplier':
3593 $trigger_name =
'BILL_SUPPLIER_MODIFY';
3596 $trigger_name =
'BILLREC_MODIFIY';
3598 case 'expensereport':
3599 $trigger_name =
'EXPENSE_REPORT_MODIFY';
3602 $trigger_name = strtoupper($this->element) .
'_MODIFY';
3604 $ret = $this->call_trigger($trigger_name, $user);
3611 $this->error = $this->db->lasterror();
3628 return $this->update_note($note,
'_public');
3642 public function update_price($exclspec = 0, $roundingadjust =
'none', $nodatabaseupdate = 0, $seller =
null)
3645 global $conf, $hookmanager, $action;
3647 $parameters = array(
'exclspec' => $exclspec,
'roundingadjust' => $roundingadjust,
'nodatabaseupdate' => $nodatabaseupdate,
'seller' => $seller);
3648 $reshook = $hookmanager->executeHooks(
'updateTotalPrice', $parameters, $this, $action);
3651 } elseif ($reshook < 0) {
3657 if ($this->element ==
'propal') {
3658 $MODULE =
"MODULE_DISALLOW_UPDATE_PRICE_PROPOSAL";
3659 } elseif ($this->element ==
'commande' || $this->element ==
'order') {
3660 $MODULE =
"MODULE_DISALLOW_UPDATE_PRICE_ORDER";
3661 } elseif ($this->element ==
'facture' || $this->element ==
'invoice') {
3662 $MODULE =
"MODULE_DISALLOW_UPDATE_PRICE_INVOICE";
3663 } elseif ($this->element ==
'facture_fourn' || $this->element ==
'supplier_invoice' || $this->element ==
'invoice_supplier' || $this->element ==
'invoice_supplier_rec') {
3664 $MODULE =
"MODULE_DISALLOW_UPDATE_PRICE_SUPPLIER_INVOICE";
3665 } elseif ($this->element ==
'order_supplier' || $this->element ==
'supplier_order') {
3666 $MODULE =
"MODULE_DISALLOW_UPDATE_PRICE_SUPPLIER_ORDER";
3667 } elseif ($this->element ==
'supplier_proposal') {
3668 $MODULE =
"MODULE_DISALLOW_UPDATE_PRICE_SUPPLIER_PROPOSAL";
3671 if (!empty($MODULE)) {
3674 foreach ($modsactivated as $mod) {
3675 if (isModEnabled($mod)) {
3682 include_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
3684 $forcedroundingmode = $roundingadjust;
3685 if ($forcedroundingmode ==
'auto' && isset($conf->global->MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND)) {
3687 } elseif ($forcedroundingmode ==
'auto') {
3688 $forcedroundingmode =
'0';
3693 $multicurrency_tx = !empty($this->multicurrency_tx) ? $this->multicurrency_tx : 1;
3696 $fieldtva =
'total_tva';
3697 $fieldlocaltax1 =
'total_localtax1';
3698 $fieldlocaltax2 =
'total_localtax2';
3699 $fieldup =
'subprice';
3700 if ($this->element ==
'facture_fourn' || $this->element ==
'invoice_supplier') {
3704 if ($this->element ==
'invoice_supplier_rec') {
3707 if ($this->element ==
'expensereport') {
3708 $fieldup =
'value_unit';
3711 $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,";
3712 $sql .=
' tva_tx as vatrate, localtax1_tx, localtax2_tx, localtax1_type, localtax2_type, info_bits, product_type';
3713 if ($this->table_element_line ==
'facturedet') {
3714 $sql .=
', situation_percent';
3716 $sql .=
', multicurrency_total_ht, multicurrency_total_tva, multicurrency_total_ttc';
3717 $sql .=
" FROM ".$this->db->prefix().$this->table_element_line;
3718 $sql .=
" WHERE ".$this->fk_element.
" = ".((int) $this->
id);
3720 $product_field =
'product_type';
3721 if ($this->table_element_line ==
'contratdet') {
3722 $product_field =
'';
3724 if ($product_field) {
3725 $sql .=
" AND ".$product_field.
" <> 9";
3728 $sql .=
' ORDER by rowid';
3730 dol_syslog(get_class($this).
"::update_price", LOG_DEBUG);
3732 $resql = $this->db->query($sql);
3734 $this->total_ht = 0;
3735 $this->total_tva = 0;
3736 $this->total_localtax1 = 0;
3737 $this->total_localtax2 = 0;
3738 $this->total_ttc = 0;
3739 $total_ht_by_vats = array();
3740 $total_tva_by_vats = array();
3741 $total_ttc_by_vats = array();
3742 $this->multicurrency_total_ht = 0;
3743 $this->multicurrency_total_tva = 0;
3744 $this->multicurrency_total_ttc = 0;
3748 $num = $this->db->num_rows($resql);
3751 $obj = $this->db->fetch_object($resql);
3754 $parameters = array(
'fk_element' => $obj->rowid);
3755 $reshook = $hookmanager->executeHooks(
'changeRoundingMode', $parameters, $this, $action);
3757 if (empty($reshook) && $forcedroundingmode ==
'0') {
3759 $localtax_array = array($obj->localtax1_type, $obj->localtax1_tx, $obj->localtax2_type, $obj->localtax2_tx);
3760 $tmpcal =
calcul_price_total($obj->qty, $obj->up, $obj->remise_percent, $obj->vatrate, $obj->localtax1_tx, $obj->localtax2_tx, 0,
'HT', $obj->info_bits, $obj->product_type, $seller, $localtax_array, (isset($obj->situation_percent) ? $obj->situation_percent : 100), $multicurrency_tx);
3762 $diff_when_using_price_ht =
price2num($tmpcal[1] - $obj->total_tva,
'MT', 1);
3763 $diff_on_current_total =
price2num($obj->total_ttc - $obj->total_ht - $obj->total_tva - $obj->total_localtax1 - $obj->total_localtax2,
'MT', 1);
3767 if ($diff_on_current_total) {
3769 $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);
3770 dol_syslog(
'We found unconsistent 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);
3771 $resqlfix = $this->db->query($sqlfix);
3775 $obj->total_tva = $tmpcal[1];
3776 $obj->total_ttc = $tmpcal[2];
3777 } elseif ($diff_when_using_price_ht && $roundingadjust ==
'0') {
3780 $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);
3781 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);
3782 $resqlfix = $this->db->query($sqlfix);
3786 $obj->total_tva = $tmpcal[1];
3787 $obj->total_ttc = $tmpcal[2];
3791 $this->total_ht += $obj->total_ht;
3792 $this->total_tva += $obj->total_tva;
3793 $this->total_localtax1 += $obj->total_localtax1;
3794 $this->total_localtax2 += $obj->total_localtax2;
3795 $this->total_ttc += $obj->total_ttc;
3796 $this->multicurrency_total_ht += $obj->multicurrency_total_ht;
3797 $this->multicurrency_total_tva += $obj->multicurrency_total_tva;
3798 $this->multicurrency_total_ttc += $obj->multicurrency_total_ttc;
3800 if (!isset($total_ht_by_vats[$obj->vatrate])) {
3801 $total_ht_by_vats[$obj->vatrate] = 0;
3803 if (!isset($total_tva_by_vats[$obj->vatrate])) {
3804 $total_tva_by_vats[$obj->vatrate] = 0;
3806 if (!isset($total_ttc_by_vats[$obj->vatrate])) {
3807 $total_ttc_by_vats[$obj->vatrate] = 0;
3809 $total_ht_by_vats[$obj->vatrate] += $obj->total_ht;
3810 $total_tva_by_vats[$obj->vatrate] += $obj->total_tva;
3811 $total_ttc_by_vats[$obj->vatrate] += $obj->total_ttc;
3813 if ($forcedroundingmode ==
'1') {
3814 $tmpvat =
price2num($total_ht_by_vats[$obj->vatrate] * $obj->vatrate / 100,
'MT', 1);
3815 $diff =
price2num($total_tva_by_vats[$obj->vatrate] - $tmpvat,
'MT', 1);
3818 if (abs($diff) > (10 * pow(10, -1 *
getDolGlobalInt(
'MAIN_MAX_DECIMALS_TOT', 0)))) {
3820 $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.';
3822 $this->error = $errmsg;
3826 $sqlfix =
"UPDATE ".$this->db->prefix().$this->table_element_line.
" SET ".$fieldtva.
" = ".
price2num($obj->total_tva - $diff).
", total_ttc = ".
price2num($obj->total_ttc - $diff).
" WHERE rowid = ".((int) $obj->rowid);
3827 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);
3829 $resqlfix = $this->db->query($sqlfix);
3835 $this->total_tva = (float)
price2num($this->total_tva - $diff,
'', 1);
3836 $this->total_ttc = (float)
price2num($this->total_ttc - $diff,
'', 1);
3837 $total_tva_by_vats[$obj->vatrate] = (float)
price2num($total_tva_by_vats[$obj->vatrate] - $diff,
'', 1);
3838 $total_ttc_by_vats[$obj->vatrate] = (float)
price2num($total_ttc_by_vats[$obj->vatrate] - $diff,
'', 1);
3846 $this->total_ttc += isset($this->revenuestamp) ? $this->revenuestamp : 0;
3847 $this->multicurrency_total_ttc += isset($this->revenuestamp) ? ($this->revenuestamp * $multicurrency_tx) : 0;
3850 if (!empty($this->situation_cycle_ref) && !empty($this->situation_counter) && $this->situation_counter > 1 && method_exists($this,
'get_prev_sits')) {
3851 include_once DOL_DOCUMENT_ROOT.
'/compta/facture/class/facture.class.php';
3853 $prev_sits = $this->get_prev_sits();
3855 foreach ($prev_sits as $sit) {
3856 $this->total_ht -= $sit->total_ht;
3857 $this->total_tva -= $sit->total_tva;
3858 $this->total_localtax1 -= $sit->total_localtax1;
3859 $this->total_localtax2 -= $sit->total_localtax2;
3860 $this->total_ttc -= $sit->total_ttc;
3861 $this->multicurrency_total_ht -= $sit->multicurrency_total_ht;
3862 $this->multicurrency_total_tva -= $sit->multicurrency_total_tva;
3863 $this->multicurrency_total_ttc -= $sit->multicurrency_total_ttc;
3869 $this->total_ht = (float)
price2num($this->total_ht);
3870 $this->total_tva = (float)
price2num($this->total_tva);
3871 $this->total_localtax1 = (float)
price2num($this->total_localtax1);
3872 $this->total_localtax2 = (float)
price2num($this->total_localtax2);
3873 $this->total_ttc = (float)
price2num($this->total_ttc);
3875 $this->db->free($resql);
3878 $fieldht =
'total_ht';
3880 $fieldlocaltax1 =
'localtax1';
3881 $fieldlocaltax2 =
'localtax2';
3882 $fieldttc =
'total_ttc';
3884 if (in_array($this->element, array(
'propal',
'commande',
'facture',
'facturerec',
'supplier_proposal',
'order_supplier',
'facture_fourn',
'invoice_supplier',
'invoice_supplier_rec',
'expensereport'))) {
3885 $fieldtva =
'total_tva';
3888 if (!$error && empty($nodatabaseupdate)) {
3889 $sql =
"UPDATE ".$this->db->prefix().$this->table_element.
' SET';
3890 $sql .=
" ".$fieldht.
" = ".((float)
price2num($this->total_ht,
'MT', 1)).
",";
3891 $sql .=
" ".$fieldtva.
" = ".((float)
price2num($this->total_tva,
'MT', 1)).
",";
3892 $sql .=
" ".$fieldlocaltax1.
" = ".((float)
price2num($this->total_localtax1,
'MT', 1)).
",";
3893 $sql .=
" ".$fieldlocaltax2.
" = ".((float)
price2num($this->total_localtax2,
'MT', 1)).
",";
3894 $sql .=
" ".$fieldttc.
" = ".((float)
price2num($this->total_ttc,
'MT', 1));
3895 $sql .=
", multicurrency_total_ht = ".((float)
price2num($this->multicurrency_total_ht,
'MT', 1));
3896 $sql .=
", multicurrency_total_tva = ".((float)
price2num($this->multicurrency_total_tva,
'MT', 1));
3897 $sql .=
", multicurrency_total_ttc = ".((float)
price2num($this->multicurrency_total_ttc,
'MT', 1));
3898 $sql .=
" WHERE rowid = ".((int) $this->
id);
3900 dol_syslog(get_class($this).
"::update_price", LOG_DEBUG);
3901 $resql = $this->db->query($sql);
3905 $this->error = $this->db->lasterror();
3906 $this->errors[] = $this->db->lasterror();
3911 $this->db->commit();
3914 $this->db->rollback();
3934 public function add_object_linked($origin =
null, $origin_id =
null, $f_user =
null, $notrigger = 0)
3937 global $user, $hookmanager, $action;
3938 $origin = (!empty($origin) ? $origin : $this->origin);
3939 $origin_id = (!empty($origin_id) ? $origin_id : $this->origin_id);
3940 $f_user = isset($f_user) ? $f_user : $user;
3943 if ($origin ==
'order') {
3944 $origin =
'commande';
3946 if ($origin ==
'invoice') {
3947 $origin =
'facture';
3949 if ($origin ==
'invoice_template') {
3950 $origin =
'facturerec';
3952 if ($origin ==
'supplierorder') {
3953 $origin =
'order_supplier';
3958 $coremodule = array(
'knowledgemanagement',
'partnership',
'workstation',
'ticket',
'recruitment',
'eventorganization',
'asset');
3960 $targettype = ((!empty($this->module) && ! in_array($this->module, $coremodule)) ? $this->module.
'_' :
'').$this->element;
3962 $parameters = array(
'targettype'=>$targettype);
3964 $reshook = $hookmanager->executeHooks(
'setLinkedObjectSourceTargetType', $parameters, $this, $action);
3966 if (!empty($hookmanager->resArray[
'targettype'])) {
3967 $targettype = $hookmanager->resArray[
'targettype'];
3974 $sql =
"INSERT INTO " . $this->db->prefix() .
"element_element (";
3975 $sql .=
"fk_source";
3976 $sql .=
", sourcetype";
3977 $sql .=
", fk_target";
3978 $sql .=
", targettype";
3979 $sql .=
") VALUES (";
3980 $sql .= ((int) $origin_id);
3981 $sql .=
", '" . $this->db->escape($origin) .
"'";
3982 $sql .=
", " . ((int) $this->
id);
3983 $sql .=
", '" . $this->db->escape($targettype) .
"'";
3986 dol_syslog(get_class($this) .
"::add_object_linked", LOG_DEBUG);
3987 if ($this->db->query($sql)) {
3990 $this->context[
'link_origin'] = $origin;
3991 $this->context[
'link_origin_id'] = $origin_id;
3992 $result = $this->call_trigger(
'OBJECT_LINK_INSERT', $f_user);
3999 $this->error = $this->db->lasterror();
4004 $this->db->commit();
4007 $this->db->rollback();
4034 public function fetchObjectLinked($sourceid =
null, $sourcetype =
'', $targetid =
null, $targettype =
'', $clause =
'OR', $alsosametype = 1, $orderby =
'sourcetype', $loadalsoobjects = 1)
4036 global $conf, $hookmanager, $action;
4041 if ($this->
id > 0 && !empty($this->linkedObjectsFullLoaded[$this->
id])) {
4045 $this->linkedObjectsIds = array();
4046 $this->linkedObjects = array();
4048 $justsource =
false;
4049 $justtarget =
false;
4050 $withtargettype =
false;
4051 $withsourcetype =
false;
4053 $parameters = array(
'sourcetype'=>$sourcetype,
'sourceid'=>$sourceid,
'targettype'=>$targettype,
'targetid'=>$targetid);
4055 $reshook = $hookmanager->executeHooks(
'setLinkedObjectSourceTargetType', $parameters, $this, $action);
4057 if (!empty($hookmanager->resArray[
'sourcetype'])) {
4058 $sourcetype = $hookmanager->resArray[
'sourcetype'];
4060 if (!empty($hookmanager->resArray[
'sourceid'])) {
4061 $sourceid = $hookmanager->resArray[
'sourceid'];
4063 if (!empty($hookmanager->resArray[
'targettype'])) {
4064 $targettype = $hookmanager->resArray[
'targettype'];
4066 if (!empty($hookmanager->resArray[
'targetid'])) {
4067 $targetid = $hookmanager->resArray[
'targetid'];
4071 if (!empty($sourceid) && !empty($sourcetype) && empty($targetid)) {
4073 if (!empty($targettype)) {
4074 $withtargettype =
true;
4077 if (!empty($targetid) && !empty($targettype) && empty($sourceid)) {
4079 if (!empty($sourcetype)) {
4080 $withsourcetype =
true;
4084 $sourceid = (!empty($sourceid) ? $sourceid : $this->id);
4085 $targetid = (!empty($targetid) ? $targetid : $this->id);
4086 $sourcetype = (!empty($sourcetype) ? $sourcetype : $this->element);
4087 $targettype = (!empty($targettype) ? $targettype : $this->element);
4096 $sql =
"SELECT rowid, fk_source, sourcetype, fk_target, targettype";
4097 $sql .=
" FROM ".$this->db->prefix().
"element_element";
4099 if ($justsource || $justtarget) {
4101 $sql .=
"fk_source = ".((int) $sourceid).
" AND sourcetype = '".$this->db->escape($sourcetype).
"'";
4102 if ($withtargettype) {
4103 $sql .=
" AND targettype = '".$this->db->escape($targettype).
"'";
4105 } elseif ($justtarget) {
4106 $sql .=
"fk_target = ".((int) $targetid).
" AND targettype = '".$this->db->escape($targettype).
"'";
4107 if ($withsourcetype) {
4108 $sql .=
" AND sourcetype = '".$this->db->escape($sourcetype).
"'";
4112 $sql .=
"(fk_source = ".((int) $sourceid).
" AND sourcetype = '".$this->db->escape($sourcetype).
"')";
4113 $sql .=
" ".$clause.
" (fk_target = ".((int) $targetid).
" AND targettype = '".$this->db->escape($targettype).
"')";
4114 if ($loadalsoobjects && $this->
id > 0 && $sourceid == $this->
id && $sourcetype == $this->element && $targetid == $this->
id && $targettype == $this->element && $clause ==
'OR') {
4115 $this->linkedObjectsFullLoaded[$this->id] =
true;
4118 $sql .=
" ORDER BY ".$orderby;
4120 dol_syslog(get_class($this).
"::fetchObjectLink", LOG_DEBUG);
4121 $resql = $this->db->query($sql);
4123 $num = $this->db->num_rows($resql);
4126 $obj = $this->db->fetch_object($resql);
4127 if ($justsource || $justtarget) {
4129 $this->linkedObjectsIds[$obj->targettype][$obj->rowid] = $obj->fk_target;
4130 } elseif ($justtarget) {
4131 $this->linkedObjectsIds[$obj->sourcetype][$obj->rowid] = $obj->fk_source;
4134 if ($obj->fk_source == $sourceid && $obj->sourcetype == $sourcetype) {
4135 $this->linkedObjectsIds[$obj->targettype][$obj->rowid] = $obj->fk_target;
4137 if ($obj->fk_target == $targetid && $obj->targettype == $targettype) {
4138 $this->linkedObjectsIds[$obj->sourcetype][$obj->rowid] = $obj->fk_source;
4144 if (!empty($this->linkedObjectsIds)) {
4145 $tmparray = $this->linkedObjectsIds;
4146 foreach ($tmparray as $objecttype => $objectids) {
4148 $module = $element = $subelement = $objecttype;
4150 if ($objecttype !=
'supplier_proposal' && $objecttype !=
'order_supplier' && $objecttype !=
'invoice_supplier'
4151 && preg_match(
'/^([^_]+)_([^_]+)/i', $objecttype, $regs)) {
4152 $module = $element = $regs[1];
4153 $subelement = $regs[2];
4156 $classpath = $element.
'/class';
4158 if ($objecttype ==
'facture') {
4159 $classpath =
'compta/facture/class';
4160 } elseif ($objecttype ==
'facturerec') {
4161 $classpath =
'compta/facture/class';
4162 $module =
'facture';
4163 } elseif ($objecttype ==
'propal') {
4164 $classpath =
'comm/propal/class';
4165 } elseif ($objecttype ==
'supplier_proposal') {
4166 $classpath =
'supplier_proposal/class';
4167 } elseif ($objecttype ==
'shipping') {
4168 $classpath =
'expedition/class';
4169 $subelement =
'expedition';
4170 $module =
'expedition';
4171 } elseif ($objecttype ==
'delivery') {
4172 $classpath =
'delivery/class';
4173 $subelement =
'delivery';
4174 $module =
'delivery_note';
4175 } elseif ($objecttype ==
'invoice_supplier' || $objecttype ==
'order_supplier') {
4176 $classpath =
'fourn/class';
4177 $module =
'fournisseur';
4178 } elseif ($objecttype ==
'fichinter') {
4179 $classpath =
'fichinter/class';
4180 $subelement =
'fichinter';
4181 $module =
'ficheinter';
4182 } elseif ($objecttype ==
'subscription') {
4183 $classpath =
'adherents/class';
4184 $module =
'adherent';
4185 } elseif ($objecttype ==
'contact') {
4186 $module =
'societe';
4187 } elseif ($objecttype ==
'action') {
4189 $subelement =
'actionComm';
4193 $classfile = strtolower($subelement);
4194 $classname = ucfirst($subelement);
4196 if ($objecttype ==
'order') {
4197 $classfile =
'commande';
4198 $classname =
'Commande';
4199 } elseif ($objecttype ==
'invoice_supplier') {
4200 $classfile =
'fournisseur.facture';
4201 $classname =
'FactureFournisseur';
4202 } elseif ($objecttype ==
'order_supplier') {
4203 $classfile =
'fournisseur.commande';
4204 $classname =
'CommandeFournisseur';
4205 } elseif ($objecttype ==
'supplier_proposal') {
4206 $classfile =
'supplier_proposal';
4207 $classname =
'SupplierProposal';
4208 } elseif ($objecttype ==
'facturerec') {
4209 $classfile =
'facture-rec';
4210 $classname =
'FactureRec';
4211 } elseif ($objecttype ==
'subscription') {
4212 $classfile =
'subscription';
4213 $classname =
'Subscription';
4214 } elseif ($objecttype ==
'project' || $objecttype ==
'projet') {
4215 $classpath =
'projet/class';
4216 $classfile =
'project';
4217 $classname =
'Project';
4218 } elseif ($objecttype ==
'conferenceorboothattendee') {
4219 $classpath =
'eventorganization/class';
4220 $classfile =
'conferenceorboothattendee';
4221 $classname =
'ConferenceOrBoothAttendee';
4222 $module =
'eventorganization';
4223 } elseif ($objecttype ==
'conferenceorbooth') {
4224 $classpath =
'eventorganization/class';
4225 $classfile =
'conferenceorbooth';
4226 $classname =
'ConferenceOrBooth';
4227 $module =
'eventorganization';
4228 } elseif ($objecttype ==
'mo') {
4229 $classpath =
'mrp/class';
4236 if (isModEnabled($module) && (($element != $this->element) || $alsosametype)) {
4237 if ($loadalsoobjects && (is_numeric($loadalsoobjects) || ($loadalsoobjects === $objecttype))) {
4240 if (class_exists($classname)) {
4241 foreach ($objectids as $i => $objectid) {
4242 $object =
new $classname($this->db);
4243 $ret = $object->fetch($objectid);
4245 $this->linkedObjects[$objecttype][$i] = $object;
4251 unset($this->linkedObjectsIds[$objecttype]);
4270 if ($this->
id > 0 && !empty($this->linkedObjectsFullLoaded[$this->
id])) {
4271 unset($this->linkedObjectsFullLoaded[$this->
id]);
4289 public function updateObjectLinked($sourceid =
null, $sourcetype =
'', $targetid =
null, $targettype =
'', $f_user =
null, $notrigger = 0)
4292 $updatesource =
false;
4293 $updatetarget =
false;
4294 $f_user = isset($f_user) ? $f_user : $user;
4296 if (!empty($sourceid) && !empty($sourcetype) && empty($targetid) && empty($targettype)) {
4297 $updatesource =
true;
4298 } elseif (empty($sourceid) && empty($sourcetype) && !empty($targetid) && !empty($targettype)) {
4299 $updatetarget =
true;
4305 $sql =
"UPDATE " . $this->db->prefix() .
"element_element SET ";
4306 if ($updatesource) {
4307 $sql .=
"fk_source = " . ((int) $sourceid);
4308 $sql .=
", sourcetype = '" . $this->db->escape($sourcetype) .
"'";
4309 $sql .=
" WHERE fk_target = " . ((int) $this->
id);
4310 $sql .=
" AND targettype = '" . $this->db->escape($this->element) .
"'";
4311 } elseif ($updatetarget) {
4312 $sql .=
"fk_target = " . ((int) $targetid);
4313 $sql .=
", targettype = '" . $this->db->escape($targettype) .
"'";
4314 $sql .=
" WHERE fk_source = " . ((int) $this->
id);
4315 $sql .=
" AND sourcetype = '" . $this->db->escape($this->element) .
"'";
4318 dol_syslog(get_class($this) .
"::updateObjectLinked", LOG_DEBUG);
4319 if ($this->db->query($sql)) {
4322 $this->context[
'link_source_id'] = $sourceid;
4323 $this->context[
'link_source_type'] = $sourcetype;
4324 $this->context[
'link_target_id'] = $targetid;
4325 $this->context[
'link_target_type'] = $targettype;
4326 $result = $this->call_trigger(
'OBJECT_LINK_MODIFY', $f_user);
4333 $this->error = $this->db->lasterror();
4338 $this->db->commit();
4341 $this->db->rollback();
4359 public function deleteObjectLinked($sourceid =
null, $sourcetype =
'', $targetid =
null, $targettype =
'', $rowid = 0, $f_user =
null, $notrigger = 0)
4362 $deletesource =
false;
4363 $deletetarget =
false;
4364 $f_user = isset($f_user) ? $f_user : $user;
4366 if (!empty($sourceid) && !empty($sourcetype) && empty($targetid) && empty($targettype)) {
4367 $deletesource =
true;
4368 } elseif (empty($sourceid) && empty($sourcetype) && !empty($targetid) && !empty($targettype)) {
4369 $deletetarget =
true;
4372 $sourceid = (!empty($sourceid) ? $sourceid : $this->id);
4373 $sourcetype = (!empty($sourcetype) ? $sourcetype : $this->element);
4374 $targetid = (!empty($targetid) ? $targetid : $this->id);
4375 $targettype = (!empty($targettype) ? $targettype : $this->element);
4381 $this->context[
'link_id'] = $rowid;
4382 $this->context[
'link_source_id'] = $sourceid;
4383 $this->context[
'link_source_type'] = $sourcetype;
4384 $this->context[
'link_target_id'] = $targetid;
4385 $this->context[
'link_target_type'] = $targettype;
4386 $result = $this->call_trigger(
'OBJECT_LINK_DELETE', $f_user);
4394 $sql =
"DELETE FROM " . $this->db->prefix() .
"element_element";
4397 $sql .=
" rowid = " . ((int) $rowid);
4399 if ($deletesource) {
4400 $sql .=
" fk_source = " . ((int) $sourceid) .
" AND sourcetype = '" . $this->db->escape($sourcetype) .
"'";
4401 $sql .=
" AND fk_target = " . ((int) $this->
id) .
" AND targettype = '" . $this->db->escape($this->element) .
"'";
4402 } elseif ($deletetarget) {
4403 $sql .=
" fk_target = " . ((int) $targetid) .
" AND targettype = '" . $this->db->escape($targettype) .
"'";
4404 $sql .=
" AND fk_source = " . ((int) $this->
id) .
" AND sourcetype = '" . $this->db->escape($this->element) .
"'";
4406 $sql .=
" (fk_source = " . ((int) $this->
id) .
" AND sourcetype = '" . $this->db->escape($this->element) .
"')";
4408 $sql .=
" (fk_target = " . ((int) $this->
id) .
" AND targettype = '" . $this->db->escape($this->element) .
"')";
4412 dol_syslog(get_class($this) .
"::deleteObjectLinked", LOG_DEBUG);
4413 if (!$this->db->query($sql)) {
4414 $this->error = $this->db->lasterror();
4415 $this->errors[] = $this->error;
4421 $this->db->commit();
4424 $this->db->rollback();
4440 if (empty($fk_object_where) || empty($field_where) || empty($table_element)) {
4443 if (!preg_match(
'/^[_a-zA-Z0-9]+$/', $field_select)) {
4444 dol_syslog(
'Invalid value $field_select for parameter '.$field_select.
' in call to getAllItemsLinkedByObjectID(). Must be a single field name.', LOG_ERR);
4449 $sql =
"SELECT ".$field_select.
" FROM ".$db->prefix().$table_element.
" WHERE ".$field_where.
" = ".((int) $fk_object_where);
4450 $resql = $db->query($sql);
4453 if (!empty($resql)) {
4454 while ($res = $db->fetch_object($resql)) {
4455 $TRes[] = $res->{$field_select};
4472 if (empty($fk_object_where) || empty($field_where) || empty($table_element)) {
4478 $sql =
"SELECT COUNT(*) as nb FROM ".$db->prefix().$table_element.
" WHERE ".$field_where.
" = ".((int) $fk_object_where);
4479 $resql = $db->query($sql);
4482 $res = $db->fetch_object($resql);
4501 if (empty($fk_object_where) || empty($field_where) || empty($table_element)) {
4507 $sql =
"DELETE FROM ".$db->prefix().$table_element.
" WHERE ".$field_where.
" = ".((int) $fk_object_where);
4508 $resql = $db->query($sql);
4510 if (empty($resql)) {
4527 public function setStatut($status, $elementId =
null, $elementType =
'', $trigkey =
'', $fieldstatus =
'fk_statut')
4529 global $user, $langs, $conf;
4531 $savElementId = $elementId;
4533 $elementId = (!empty($elementId) ? $elementId : $this->id);
4534 $elementTable = (!empty($elementType) ? $elementType : $this->table_element);
4538 if ($elementTable ==
'facture_rec') {
4539 $fieldstatus =
"suspended";
4541 if ($elementTable ==
'mailing') {
4542 $fieldstatus =
"statut";
4544 if ($elementTable ==
'cronjob') {
4545 $fieldstatus =
"status";
4547 if ($elementTable ==
'user') {
4548 $fieldstatus =
"statut";
4550 if ($elementTable ==
'expensereport') {
4551 $fieldstatus =
"fk_statut";
4553 if ($elementTable ==
'commande_fournisseur_dispatch') {
4554 $fieldstatus =
"status";
4556 if ($elementTable ==
'prelevement_bons') {
4557 $fieldstatus =
"statut";
4559 if (isset($this->fields) && is_array($this->fields) && array_key_exists(
'status', $this->fields)) {
4560 $fieldstatus =
'status';
4563 $sql =
"UPDATE ".$this->db->prefix().$elementTable;
4564 $sql .=
" SET ".$fieldstatus.
" = ".((int) $status);
4567 if ($status == 1 && in_array($elementTable, array(
'expensereport',
'inventory'))) {
4568 $sql .=
", fk_user_valid = ".((int) $user->id);
4570 if ($status == 1 && in_array($elementTable, array(
'expensereport'))) {
4571 $sql .=
", date_valid = '".$this->db->idate(
dol_now()).
"'";
4573 if ($status == 1 && in_array($elementTable, array(
'inventory'))) {
4574 $sql .=
", date_validation = '".$this->db->idate(
dol_now()).
"'";
4576 $sql .=
" WHERE rowid = ".((int) $elementId);
4577 $sql .=
" AND ".$fieldstatus.
" <> ".((int) $status);
4579 dol_syslog(get_class($this).
"::setStatut", LOG_DEBUG);
4580 $resql = $this->db->query($sql);
4584 $nb_rows_affected = $this->db->affected_rows($resql);
4586 if ($nb_rows_affected > 0) {
4587 if (empty($trigkey)) {
4589 if ($this->element ==
'supplier_proposal' && $status == 2) {
4590 $trigkey =
'SUPPLIER_PROPOSAL_SIGN';
4592 if ($this->element ==
'supplier_proposal' && $status == 3) {
4593 $trigkey =
'SUPPLIER_PROPOSAL_REFUSE';
4595 if ($this->element ==
'supplier_proposal' && $status == 4) {
4596 $trigkey =
'SUPPLIER_PROPOSAL_CLOSE';
4598 if ($this->element ==
'fichinter' && $status == 3) {
4599 $trigkey =
'FICHINTER_CLASSIFY_DONE';
4601 if ($this->element ==
'fichinter' && $status == 2) {
4602 $trigkey =
'FICHINTER_CLASSIFY_BILLED';
4604 if ($this->element ==
'fichinter' && $status == 1) {
4605 $trigkey =
'FICHINTER_CLASSIFY_UNBILLED';
4611 $result = $this->call_trigger($trigkey, $user);
4622 $this->db->commit();
4624 if (empty($savElementId)) {
4626 if ($fieldstatus ==
'tosell') {
4628 } elseif ($fieldstatus ==
'tobuy') {
4629 $this->status_buy = $status;
4638 $this->db->rollback();
4639 dol_syslog(get_class($this).
"::setStatut ".$this->error, LOG_ERR);
4643 $this->error = $this->db->lasterror();
4644 $this->db->rollback();
4661 if (empty($id) && empty($ref)) {
4671 $sql =
"SELECT rowid, canvas";
4672 $sql .=
" FROM ".$this->db->prefix().$this->table_element;
4673 $sql .=
" WHERE entity IN (".getEntity($this->element).
")";
4675 $sql .=
" AND rowid = ".((int) $id);
4678 $sql .=
" AND ref = '".$this->db->escape($ref).
"'";
4681 $resql = $this->db->query($sql);
4683 $obj = $this->db->fetch_object($resql);
4685 $this->canvas = $obj->canvas;
4705 $sql =
"SELECT special_code FROM ".$this->db->prefix().$this->table_element_line;
4706 $sql .=
" WHERE rowid = ".((int) $lineid);
4707 $resql = $this->db->query($sql);
4709 $row = $this->db->fetch_row($resql);
4710 return (!empty($row[0]) ? $row[0] : 0);
4733 if (!isset($this->childtables) || !is_array($this->childtables) || count($this->childtables) == 0) {
4734 dol_print_error(
'Called isObjectUsed on a class with property this->childtables not defined');
4738 $arraytoscan = $this->childtables;
4740 $tmparray = array_keys($this->childtables);
4741 if (is_numeric($tmparray[0])) {
4742 $arraytoscan = array_flip($this->childtables);
4747 foreach ($arraytoscan as $table => $element) {
4750 $sql =
"SELECT COUNT(*) as nb";
4751 $sql.=
" FROM ".$this->db->prefix().$table.
" as c";
4752 if (!empty($element[
'parent']) && !empty($element[
'parentkey'])) {
4753 $sql.=
", ".$this->db->prefix().$element[
'parent'].
" as p";
4755 if (!empty($element[
'fk_element'])) {
4756 $sql.=
" WHERE c.".$element[
'fk_element'].
" = ".((int) $id);
4758 $sql.=
" WHERE c.".$this->fk_element.
" = ".((int) $id);
4760 if (!empty($element[
'parent']) && !empty($element[
'parentkey'])) {
4761 $sql.=
" AND c.".$element[
'parentkey'].
" = p.rowid";
4763 if (!empty($element[
'parent']) && !empty($element[
'parenttypefield']) && !empty($element[
'parenttypevalue'])) {
4764 $sql.=
" AND c.".$element[
'parenttypefield'].
" = '".$this->db->escape($element[
'parenttypevalue']).
"'";
4766 if (!empty($entity)) {
4767 if (!empty($element[
'parent']) && !empty($element[
'parentkey'])) {
4768 $sql.=
" AND p.entity = ".((int) $entity);
4770 $sql.=
" AND c.entity = ".((int) $entity);
4774 $resql = $this->db->query($sql);
4776 $obj = $this->db->fetch_object($resql);
4778 $langs->load(
"errors");
4780 $haschild += $obj->nb;
4781 if (is_numeric($element)) {
4782 $this->errors[] = $langs->transnoentitiesnoconv(
"ErrorRecordHasAtLeastOneChildOfType", method_exists($this,
'getNomUrl') ? $this->getNomUrl() : $this->ref, $table);
4783 } elseif (is_string($element)) {
4784 $this->errors[] = $langs->transnoentitiesnoconv(
"ErrorRecordHasAtLeastOneChildOfType", method_exists($this,
'getNomUrl') ? $this->getNomUrl() : $this->ref, $langs->transnoentitiesnoconv($element));
4786 $this->errors[] = $langs->transnoentitiesnoconv(
"ErrorRecordHasAtLeastOneChildOfType", method_exists($this,
'getNomUrl') ? $this->getNomUrl() : $this->ref, $langs->transnoentitiesnoconv($element[
'name']));
4791 $this->errors[] = $this->db->lasterror();
4795 if ($haschild > 0) {
4796 $this->errors[] =
"ErrorRecordHasChildren";
4813 foreach ($this->lines as $key => $val) {
4815 if ($predefined == -1) {
4818 if ($predefined == 1 && $val->fk_product > 0) {
4821 if ($predefined == 0 && $val->fk_product <= 0) {
4824 if ($predefined == 2 && $val->fk_product > 0 && $val->product_type == 0) {
4827 if ($predefined == 3 && $val->fk_product > 0 && $val->product_type == 1) {
4834 dol_syslog(get_class($this).
'::hasProductsOrServices we found '.$nb.
' qualified lines of products/servcies');
4845 if (!empty($this->table_element_line)) {
4846 $total_discount = 0.00;
4848 $sql =
"SELECT subprice as pu_ht, qty, remise_percent, total_ht";
4849 $sql .=
" FROM ".$this->db->prefix().$this->table_element_line;
4850 $sql .=
" WHERE ".$this->fk_element.
" = ".((int) $this->
id);
4852 dol_syslog(get_class($this).
'::getTotalDiscount', LOG_DEBUG);
4853 $resql = $this->db->query($sql);
4855 $num = $this->db->num_rows($resql);
4858 $obj = $this->db->fetch_object($resql);
4860 $pu_ht = $obj->pu_ht;
4862 $total_ht = $obj->total_ht;
4864 $total_discount_line = (float)
price2num(($pu_ht * $qty) - $total_ht,
'MT');
4865 $total_discount += $total_discount_line;
4894 foreach ($this->lines as $line) {
4895 if (isset($line->qty_asked)) {
4896 if (empty($totalOrdered)) {
4899 $totalOrdered += $line->qty_asked;
4901 if (isset($line->qty_shipped)) {
4902 if (empty($totalToShip)) {
4905 $totalToShip += $line->qty_shipped;
4906 } elseif ($line->element ==
'commandefournisseurdispatch' && isset($line->qty)) {
4907 if (empty($totalToShip)) {
4910 $totalToShip += $line->qty;
4914 if ($this->element ==
'shipping') {
4916 $qty = $line->qty_shipped ? $line->qty_shipped : 0;
4918 $qty = $line->qty ? $line->qty : 0;
4921 $weight = !empty($line->weight) ? $line->weight : 0;
4922 ($weight == 0 && !empty($line->product->weight)) ? $weight = $line->product->weight : 0;
4923 $volume = !empty($line->volume) ? $line->volume : 0;
4924 ($volume == 0 && !empty($line->product->volume)) ? $volume = $line->product->volume : 0;
4926 $weight_units = !empty($line->weight_units) ? $line->weight_units : 0;
4927 ($weight_units == 0 && !empty($line->product->weight_units)) ? $weight_units = $line->product->weight_units : 0;
4928 $volume_units = !empty($line->volume_units) ? $line->volume_units : 0;
4929 ($volume_units == 0 && !empty($line->product->volume_units)) ? $volume_units = $line->product->volume_units : 0;
4933 if (!empty($weight_units)) {
4934 $weightUnit = $weight_units;
4936 if (!empty($volume_units)) {
4937 $volumeUnit = $volume_units;
4940 if (empty($totalWeight)) {
4943 if (empty($totalVolume)) {
4948 if ($weight_units < 50) {
4949 $trueWeightUnit = pow(10, $weightUnit);
4950 $totalWeight += $weight * $qty * $trueWeightUnit;
4952 if ($weight_units == 99) {
4954 $trueWeightUnit = 0.45359237;
4955 $totalWeight += $weight * $qty * $trueWeightUnit;
4956 } elseif ($weight_units == 98) {
4958 $trueWeightUnit = 0.0283495;
4959 $totalWeight += $weight * $qty * $trueWeightUnit;
4961 $totalWeight += $weight * $qty;
4964 if ($volume_units < 50) {
4966 $trueVolumeUnit = pow(10, $volumeUnit);
4968 $totalVolume += $volume * $qty * $trueVolumeUnit;
4970 $totalVolume += $volume * $qty;
4974 return array(
'weight'=>$totalWeight,
'volume'=>$totalVolume,
'ordered'=>$totalOrdered,
'toship'=>$totalToShip);
4987 $extraparams = (!empty($this->extraparams) ? json_encode($this->extraparams) :
null);
4989 $sql =
"UPDATE ".$this->db->prefix().$this->table_element;
4990 $sql .=
" SET extraparams = ".(!empty($extraparams) ?
"'".$this->db->escape($extraparams).
"'" :
"null");
4991 $sql .=
" WHERE rowid = ".((int) $this->
id);
4993 dol_syslog(get_class($this).
"::setExtraParameters", LOG_DEBUG);
4994 $resql = $this->db->query($sql);
4996 $this->error = $this->db->lasterror();
4997 $this->db->rollback();
5000 $this->db->commit();
5023 global $conf, $user, $langs, $object, $hookmanager, $extrafields, $form;
5026 if (!is_object($extrafields)) {
5027 require_once DOL_DOCUMENT_ROOT.
'/core/class/extrafields.class.php';
5030 $extrafields->fetch_name_optionals_label($this->table_element_line);
5035 $dirtpls = array_merge($conf->modules_parts[
'tpl'], array($defaulttpldir));
5036 foreach ($dirtpls as $module => $reldir) {
5037 if (!empty($module)) {
5040 $tpl = DOL_DOCUMENT_ROOT.$reldir.
'/objectline_create.tpl.php';
5043 if (empty($conf->file->strict_mode)) {
5044 $res = @include $tpl;
5046 $res = include $tpl;
5073 public function printObjectLines($action, $seller, $buyer, $selected = 0, $dateSelector = 0, $defaulttpldir =
'/core/tpl')
5075 global $conf, $hookmanager, $langs, $user, $form, $extrafields, $object;
5077 global $inputalsopricewithtax, $usemargins, $disableedit, $disablemove, $disableremove, $outputalsopricetotalwithtax;
5081 if (isModEnabled(
'margin') && !empty($this->element) && in_array($this->element, array(
'facture',
'facturerec',
'propal',
'commande'))) {
5085 $num = count($this->lines);
5088 if (!is_object($extrafields)) {
5089 require_once DOL_DOCUMENT_ROOT.
'/core/class/extrafields.class.php';
5092 $extrafields->fetch_name_optionals_label($this->table_element_line);
5094 $parameters = array(
'num'=>$num,
'dateSelector'=>$dateSelector,
'seller'=>$seller,
'buyer'=>$buyer,
'selected'=>$selected,
'table_element_line'=>$this->table_element_line);
5095 $reshook = $hookmanager->executeHooks(
'printObjectLineTitle', $parameters, $this, $action);
5096 if (empty($reshook)) {
5100 $dirtpls = array_merge($conf->modules_parts[
'tpl'], array($defaulttpldir));
5101 foreach ($dirtpls as $module => $reldir) {
5103 if (!empty($module)) {
5106 $tpl = DOL_DOCUMENT_ROOT.$reldir.
'/objectline_title.tpl.php';
5108 if (file_exists($tpl)) {
5109 if (empty($conf->file->strict_mode)) {
5110 $res = @include $tpl;
5112 $res = include $tpl;
5123 print
"<!-- begin printObjectLines() --><tbody>\n";
5124 foreach ($this->lines as $line) {
5126 $line->fetch_optionals();
5129 if (is_object($hookmanager)) {
5130 if (empty($line->fk_parent_line)) {
5131 $parameters = array(
'line'=>$line,
'num'=>$num,
'i'=>$i,
'dateSelector'=>$dateSelector,
'seller'=>$seller,
'buyer'=>$buyer,
'selected'=>$selected,
'table_element_line'=>$line->table_element,
'defaulttpldir'=>$defaulttpldir);
5132 $reshook = $hookmanager->executeHooks(
'printObjectLine', $parameters, $this, $action);
5134 $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);
5135 $reshook = $hookmanager->executeHooks(
'printObjectSubLine', $parameters, $this, $action);
5138 if (empty($reshook)) {
5139 $this->printObjectLine($action, $line,
'', $num, $i, $dateSelector, $seller, $buyer, $selected, $extrafields, $defaulttpldir);
5144 print
"</tbody><!-- end printObjectLines() -->\n";
5164 public function printObjectLine($action, $line, $var, $num, $i, $dateSelector, $seller, $buyer, $selected = 0, $extrafields =
null, $defaulttpldir =
'/core/tpl')
5166 global $conf, $langs, $user, $object, $hookmanager;
5168 global $object_rights, $disableedit, $disablemove, $disableremove;
5170 $object_rights = $this->getRights();
5177 if ($action !=
'editline' || $selected != $line->id) {
5179 if (!empty($line->fk_product) && $line->fk_product > 0) {
5180 $product_static =
new Product($this->db);
5181 $product_static->fetch($line->fk_product);
5183 $product_static->ref = $line->ref;
5184 $product_static->label = !empty($line->label) ? $line->label :
"";
5186 $text = $product_static->getNomUrl(1);
5190 if (property_exists($this,
'socid') && !is_object($this->thirdparty)) {
5191 dol_print_error(
'',
'Error: Method printObjectLine was called on an object and object->fetch_thirdparty was not done before');
5195 $prod =
new Product($this->db);
5196 $prod->fetch($line->fk_product);
5198 $outputlangs = $langs;
5200 if (empty($newlang) &&
GETPOST(
'lang_id',
'aZ09')) {
5201 $newlang =
GETPOST(
'lang_id',
'aZ09');
5203 if (
getDolGlobalString(
'PRODUIT_TEXTS_IN_THIRDPARTY_LANGUAGE') && empty($newlang) && is_object($this->thirdparty)) {
5204 $newlang = $this->thirdparty->default_lang;
5206 if (!empty($newlang)) {
5207 $outputlangs =
new Translate(
"", $conf);
5208 $outputlangs->setDefaultLang($newlang);
5211 $label = (!empty($prod->multilangs[$outputlangs->defaultlang][
"label"])) ? $prod->multilangs[$outputlangs->defaultlang][
"label"] : $line->product_label;
5213 $label = $line->product_label;
5216 $text .=
' - '.(!empty($line->label) ? $line->label : $label);
5217 $description .= (
getDolGlobalInt(
'PRODUIT_DESC_IN_FORM_ACCORDING_TO_DEVICE') ?
'' : (!empty($line->description) ?
dol_htmlentitiesbr($line->description) :
''));
5220 $line->pu_ttc =
price2num((!empty($line->subprice) ? $line->subprice : 0) * (1 + ((!empty($line->tva_tx) ? $line->tva_tx : 0) / 100)),
'MU');
5225 $dirtpls = array_merge($conf->modules_parts[
'tpl'], array($defaulttpldir));
5226 foreach ($dirtpls as $module => $reldir) {
5228 if (!empty($module)) {
5231 $tpl = DOL_DOCUMENT_ROOT.$reldir.
'/objectline_view.tpl.php';
5234 if (file_exists($tpl)) {
5235 if (empty($conf->file->strict_mode)) {
5236 $res = @include $tpl;
5238 $res = include $tpl;
5248 if ($this->
statut == 0 && $action ==
'editline' && $selected == $line->id) {
5249 $label = (!empty($line->label) ? $line->label : (($line->fk_product > 0) ? $line->product_label :
''));
5251 $line->pu_ttc =
price2num($line->subprice * (1 + ($line->tva_tx / 100)),
'MU');
5256 $dirtpls = array_merge($conf->modules_parts[
'tpl'], array($defaulttpldir));
5257 foreach ($dirtpls as $module => $reldir) {
5258 if (!empty($module)) {
5261 $tpl = DOL_DOCUMENT_ROOT.$reldir.
'/objectline_edit.tpl.php';
5264 if (empty($conf->file->strict_mode)) {
5265 $res = @include $tpl;
5267 $res = include $tpl;
5292 global $langs, $hookmanager, $conf, $form, $action;
5294 print
'<tr class="liste_titre">';
5295 print
'<td class="linecolref">'.$langs->trans(
'Ref').
'</td>';
5296 print
'<td class="linecoldescription">'.$langs->trans(
'Description').
'</td>';
5297 print
'<td class="linecolvat right">'.$langs->trans(
'VATRate').
'</td>';
5298 print
'<td class="linecoluht right">'.$langs->trans(
'PriceUHT').
'</td>';
5299 if (isModEnabled(
"multicurrency")) {
5300 print
'<td class="linecoluht_currency right">'.$langs->trans(
'PriceUHTCurrency').
'</td>';
5302 print
'<td class="linecolqty right">'.$langs->trans(
'Qty').
'</td>';
5304 print
'<td class="linecoluseunit left">'.$langs->trans(
'Unit').
'</td>';
5306 print
'<td class="linecoldiscount right">'.$langs->trans(
'ReductionShort').
'</td>';
5307 print
'<td class="linecolht right">'.$langs->trans(
'TotalHT').
'</td>';
5308 print
'<td class="center">'.$form->showCheckAddButtons(
'checkforselect', 1).
'</td>';
5312 if (!empty($this->lines)) {
5313 foreach ($this->lines as $line) {
5316 if (is_object($hookmanager)) {
5317 $parameters = array(
'line'=>$line,
'i'=>$i,
'restrictlist'=>$restrictlist,
'selectedLines'=> $selectedLines);
5318 if (!empty($line->fk_parent_line)) {
5319 $parameters[
'fk_parent_line'] = $line->fk_parent_line;
5321 $reshook = $hookmanager->executeHooks(
'printOriginObjectLine', $parameters, $this, $action);
5323 if (empty($reshook)) {
5324 $this->printOriginLine($line,
'', $restrictlist,
'/core/tpl', $selectedLines);
5345 public function printOriginLine($line, $var, $restrictlist =
'', $defaulttpldir =
'/core/tpl', $selectedLines = array())
5347 global $langs, $conf;
5350 if (!empty($line->date_start)) {
5351 $date_start = $line->date_start;
5353 $date_start = $line->date_debut_prevue;
5354 if ($line->date_debut_reel) {
5355 $date_start = $line->date_debut_reel;
5358 if (!empty($line->date_end)) {
5359 $date_end = $line->date_end;
5361 $date_end = $line->date_fin_prevue;
5362 if ($line->date_fin_reel) {
5363 $date_end = $line->date_fin_reel;
5367 $this->tpl[
'id'] = $line->id;
5369 $this->tpl[
'label'] =
'';
5370 if (!empty($line->fk_parent_line)) {
5371 $this->tpl[
'label'] .=
img_picto(
'',
'rightarrow');
5374 if (($line->info_bits & 2) == 2) {
5376 if (property_exists($this,
'socid')) {
5377 $discount->fk_soc = $this->socid;
5379 $this->tpl[
'label'] .= $discount->getNomUrl(0,
'discount');
5380 } elseif (!empty($line->fk_product)) {
5381 $productstatic =
new Product($this->db);
5382 $productstatic->id = $line->fk_product;
5383 $productstatic->ref = $line->ref;
5384 $productstatic->type = $line->fk_product_type;
5385 if (empty($productstatic->ref)) {
5386 $line->fetch_product();
5387 $productstatic = $line->product;
5390 $this->tpl[
'label'] .= $productstatic->getNomUrl(1);
5391 $this->tpl[
'label'] .=
' - '.(!empty($line->label) ? $line->label : $line->product_label);
5393 if ($line->product_type == 1 && ($date_start || $date_end)) {
5397 $this->tpl[
'label'] .= ($line->product_type == -1 ?
' ' : ($line->product_type == 1 ?
img_object($langs->trans(
''),
'service') :
img_object($langs->trans(
''),
'product')));
5398 if (!empty($line->desc)) {
5399 $this->tpl[
'label'] .= $line->desc;
5401 $this->tpl[
'label'] .= ($line->label ?
' '.$line->label :
'');
5405 if ($line->product_type == 1 && ($date_start || $date_end)) {
5410 if (!empty($line->desc)) {
5411 if ($line->desc ==
'(CREDIT_NOTE)') {
5413 $discount->fetch($line->fk_remise_except);
5414 $this->tpl[
'description'] = $langs->transnoentities(
"DiscountFromCreditNote", $discount->getNomUrl(0));
5415 } elseif ($line->desc ==
'(DEPOSIT)') {
5417 $discount->fetch($line->fk_remise_except);
5418 $this->tpl[
'description'] = $langs->transnoentities(
"DiscountFromDeposit", $discount->getNomUrl(0));
5419 } elseif ($line->desc ==
'(EXCESS RECEIVED)') {
5421 $discount->fetch($line->fk_remise_except);
5422 $this->tpl[
'description'] = $langs->transnoentities(
"DiscountFromExcessReceived", $discount->getNomUrl(0));
5423 } elseif ($line->desc ==
'(EXCESS PAID)') {
5425 $discount->fetch($line->fk_remise_except);
5426 $this->tpl[
'description'] = $langs->transnoentities(
"DiscountFromExcessPaid", $discount->getNomUrl(0));
5428 $this->tpl[
'description'] =
dol_trunc($line->desc, 60);
5431 $this->tpl[
'description'] =
' ';
5435 $this->tpl[
'vat_rate'] =
vatrate($line->tva_tx,
true);
5436 $this->tpl[
'vat_rate'] .= (($line->info_bits & 1) == 1) ?
'*' :
'';
5437 if (!empty($line->vat_src_code) && !preg_match(
'/\(/', $this->tpl[
'vat_rate'])) {
5438 $this->tpl[
'vat_rate'] .=
' ('.$line->vat_src_code.
')';
5441 $this->tpl[
'price'] =
price($line->subprice);
5442 $this->tpl[
'total_ht'] =
price($line->total_ht);
5443 $this->tpl[
'multicurrency_price'] =
price($line->multicurrency_subprice);
5444 $this->tpl[
'qty'] = (($line->info_bits & 2) != 2) ? $line->qty :
' ';
5446 $this->tpl[
'unit'] = $langs->transnoentities($line->getLabelOfUnit(
'long'));
5448 $this->tpl[
'remise_percent'] = (($line->info_bits & 2) != 2) ?
vatrate($line->remise_percent,
true) :
' ';
5451 $this->tpl[
'strike'] = 0;
5453 $this->tpl[
'strike'] = 1;
5458 $dirtpls = array_merge($conf->modules_parts[
'tpl'], array($defaulttpldir));
5459 foreach ($dirtpls as $module => $reldir) {
5460 if (!empty($module)) {
5463 $tpl = DOL_DOCUMENT_ROOT.$reldir.
'/originproductline.tpl.php';
5466 if (empty($conf->file->strict_mode)) {
5467 $res = @include $tpl;
5469 $res = include $tpl;
5494 $sql =
"INSERT INTO ".$this->db->prefix().
"element_resources (";
5495 $sql .=
"resource_id";
5496 $sql .=
", resource_type";
5497 $sql .=
", element_id";
5498 $sql .=
", element_type";
5500 $sql .=
", mandatory";
5501 $sql .=
") VALUES (";
5502 $sql .= ((int) $resource_id);
5503 $sql .=
", '".$this->db->escape($resource_type).
"'";
5504 $sql .=
", '".$this->db->escape($this->
id).
"'";
5505 $sql .=
", '".$this->db->escape($this->element).
"'";
5506 $sql .=
", '".$this->db->escape($busy).
"'";
5507 $sql .=
", '".$this->db->escape($mandatory).
"'";
5510 dol_syslog(get_class($this).
"::add_element_resource", LOG_DEBUG);
5511 if ($this->db->query($sql)) {
5512 $this->db->commit();
5515 $this->error = $this->db->lasterror();
5516 $this->db->rollback();
5537 $sql =
"DELETE FROM ".$this->db->prefix().
"element_resources";
5538 $sql .=
" WHERE rowid = ".((int) $rowid);
5540 dol_syslog(get_class($this).
"::delete_resource", LOG_DEBUG);
5542 $resql = $this->db->query($sql);
5544 $this->error = $this->db->lasterror();
5545 $this->db->rollback();
5549 $result = $this->call_trigger(strtoupper($element).
'_DELETE_RESOURCE', $user);
5551 $this->db->rollback();
5555 $this->db->commit();
5569 if (isset($this->lines) && is_array($this->lines)) {
5570 $nboflines = count($this->lines);
5571 for ($i = 0; $i < $nboflines; $i++) {
5572 if (is_object($this->lines[$i])) {
5573 $this->lines[$i] = clone $this->lines[$i];
5592 protected function commonGenerateDocument($modelspath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams =
null)
5594 global $conf, $langs, $user, $hookmanager, $action;
5596 $srctemplatepath =
'';
5598 $parameters = array(
'modelspath'=>$modelspath,
'modele'=>$modele,
'outputlangs'=>$outputlangs,
'hidedetails'=>$hidedetails,
'hidedesc'=>$hidedesc,
'hideref'=>$hideref,
'moreparams'=>$moreparams);
5599 $reshook = $hookmanager->executeHooks(
'commonGenerateDocument', $parameters, $this, $action);
5601 if (!empty($reshook)) {
5605 dol_syslog(
"commonGenerateDocument modele=".$modele.
" outputlangs->defaultlang=".(is_object($outputlangs) ? $outputlangs->defaultlang :
'null'));
5607 if (empty($modele)) {
5608 $this->error =
'BadValueForParameterModele';
5613 $err = error_reporting();
5615 @set_time_limit(120);
5616 error_reporting($err);
5619 $tmp = explode(
':', $modele, 2);
5620 $saved_model = $modele;
5621 if (!empty($tmp[1])) {
5623 $srctemplatepath = $tmp[1];
5630 $dirmodels = array(
'/');
5631 if (is_array($conf->modules_parts[
'models'])) {
5632 $dirmodels = array_merge($dirmodels, $conf->modules_parts[
'models']);
5634 foreach ($dirmodels as $reldir) {
5635 foreach (array(
'doc',
'pdf') as $prefix) {
5636 if (in_array(get_class($this), array(
'Adherent'))) {
5638 $file = $prefix.
"_".$modele.
".class.php";
5641 $file = $prefix.
"_".$modele.
".modules.php";
5648 if (file_exists($file)) {
5650 $classname = $prefix.
'_'.$modele;
5660 $this->error = $langs->trans(
"Error").
' Failed to load doc generator with modelpaths='.$modelspath.
' - modele='.$modele;
5661 $this->errors[] = $this->error;
5672 require_once $filefound;
5674 $obj =
new $classname($this->db);
5677 if ($obj->type ==
'odt' && empty($srctemplatepath)) {
5678 $varfortemplatedir = $obj->scandir;
5682 $listoffiles = array();
5685 $listofdir = explode(
',', $dirtoscan);
5686 foreach ($listofdir as $key => $tmpdir) {
5687 $tmpdir = trim($tmpdir);
5688 $tmpdir = preg_replace(
'/DOL_DATA_ROOT/', DOL_DATA_ROOT, $tmpdir);
5690 unset($listofdir[$key]);
5693 if (is_dir($tmpdir)) {
5694 $tmpfiles =
dol_dir_list($tmpdir,
'files', 0,
'\.od(s|t)$',
'',
'name', SORT_ASC, 0);
5695 if (count($tmpfiles)) {
5696 $listoffiles = array_merge($listoffiles, $tmpfiles);
5701 if (count($listoffiles)) {
5702 foreach ($listoffiles as $record) {
5703 $srctemplatepath = $record[
'fullname'];
5709 if (empty($srctemplatepath)) {
5710 $this->error =
'ErrorGenerationAskedForOdtTemplateWithSrcFileNotDefined';
5715 if ($obj->type ==
'odt' && !empty($srctemplatepath)) {
5717 dol_syslog(
"Failed to locate template file ".$srctemplatepath, LOG_WARNING);
5718 $this->error =
'ErrorGenerationAskedForOdtTemplateWithSrcFileNotFound';
5725 $sav_charset_output = empty($outputlangs->charset_output) ?
'' : $outputlangs->charset_output;
5728 $this->model_pdf = $saved_model;
5730 if (in_array(get_class($this), array(
'Adherent'))) {
5731 $resultwritefile = $obj->write_file($this, $outputlangs, $srctemplatepath,
'member', 1,
'tmp_cards', $moreparams);
5733 $resultwritefile = $obj->write_file($this, $outputlangs, $srctemplatepath, $hidedetails, $hidedesc, $hideref, $moreparams);
5737 if ($resultwritefile > 0) {
5738 $outputlangs->charset_output = $sav_charset_output;
5741 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
5745 if (!empty($obj->result[
'fullpath'])) {
5746 $destfull = $obj->result[
'fullpath'];
5749 $update_main_doc_field = 0;
5750 if (!empty($obj->update_main_doc_field)) {
5751 $update_main_doc_field = 1;
5757 $this->indexFile($destfull, $update_main_doc_field);
5760 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);
5768 $outputlangs->charset_output = $sav_charset_output;
5769 $this->error = $obj->error;
5770 $this->errors = $obj->errors;
5771 dol_syslog(
"Error generating document for ".__CLASS__.
". Error: ".$obj->error, LOG_ERR);
5785 public function indexFile($destfull, $update_main_doc_field)
5787 global $conf, $user;
5789 $upload_dir = dirname($destfull);
5790 $destfile = basename($destfull);
5791 $rel_dir = preg_replace(
'/^'.preg_quote(DOL_DATA_ROOT,
'/').
'/',
'', $upload_dir);
5793 if (!preg_match(
'/[\\/]temp[\\/]|[\\/]thumbs|\.meta$/', $rel_dir)) {
5794 $filename = basename($destfile);
5795 $rel_dir = preg_replace(
'/[\\/]$/',
'', $rel_dir);
5796 $rel_dir = preg_replace(
'/^[\\/]/',
'', $rel_dir);
5798 include_once DOL_DOCUMENT_ROOT.
'/ecm/class/ecmfiles.class.php';
5799 $ecmfile =
new EcmFiles($this->db);
5800 $result = $ecmfile->fetch(0,
'', ($rel_dir ? $rel_dir.
'/' :
'').$filename);
5803 $setsharekey =
false;
5804 if ($this->element ==
'propal' || $this->element ==
'proposal') {
5806 $setsharekey =
true;
5809 $setsharekey =
true;
5812 if ($this->element ==
'commande' &&
getDolGlobalInt(
"ORDER_ALLOW_EXTERNAL_DOWNLOAD")) {
5813 $setsharekey =
true;
5815 if ($this->element ==
'facture' &&
getDolGlobalInt(
"INVOICE_ALLOW_EXTERNAL_DOWNLOAD")) {
5816 $setsharekey =
true;
5818 if ($this->element ==
'bank_account' &&
getDolGlobalInt(
"BANK_ACCOUNT_ALLOW_EXTERNAL_DOWNLOAD")) {
5819 $setsharekey =
true;
5821 if ($this->element ==
'product' &&
getDolGlobalInt(
"PRODUCT_ALLOW_EXTERNAL_DOWNLOAD")) {
5822 $setsharekey =
true;
5824 if ($this->element ==
'contrat' &&
getDolGlobalInt(
"CONTRACT_ALLOW_EXTERNAL_DOWNLOAD")) {
5825 $setsharekey =
true;
5827 if ($this->element ==
'fichinter' &&
getDolGlobalInt(
"FICHINTER_ALLOW_EXTERNAL_DOWNLOAD")) {
5828 $setsharekey =
true;
5830 if ($this->element ==
'supplier_proposal' &&
getDolGlobalInt(
"SUPPLIER_PROPOSAL_ALLOW_EXTERNAL_DOWNLOAD")) {
5831 $setsharekey =
true;
5833 if ($this->element ==
'societe_rib' &&
getDolGlobalInt(
"SOCIETE_RIB_ALLOW_ONLINESIGN")) {
5834 $setsharekey =
true;
5838 if (empty($ecmfile->share)) {
5839 require_once DOL_DOCUMENT_ROOT.
'/core/lib/security2.lib.php';
5846 $ecmfile->fullpath_orig =
'';
5847 $ecmfile->gen_or_uploaded =
'generated';
5848 $ecmfile->description =
'';
5849 $ecmfile->keywords =
'';
5850 $result = $ecmfile->update($user);
5856 $ecmfile->entity = $conf->entity;
5857 $ecmfile->filepath = $rel_dir;
5858 $ecmfile->filename = $filename;
5860 $ecmfile->fullpath_orig =
'';
5861 $ecmfile->gen_or_uploaded =
'generated';
5862 $ecmfile->description =
'';
5863 $ecmfile->keywords =
'';
5864 $ecmfile->src_object_type = $this->table_element;
5865 $ecmfile->src_object_id = $this->id;
5867 $result = $ecmfile->create($user);
5879 if ($update_main_doc_field && !empty($this->table_element)) {
5880 $sql =
"UPDATE ".$this->db->prefix().$this->table_element.
" SET last_main_doc = '".$this->db->escape($ecmfile->filepath.
"/".$ecmfile->filename).
"'";
5881 $sql .=
" WHERE rowid = ".((int) $this->
id);
5883 $resql = $this->db->query($sql);
5888 $this->last_main_doc = $ecmfile->filepath.
'/'.$ecmfile->filename;
5907 if (file_exists($file_osencoded)) {
5908 require_once DOL_DOCUMENT_ROOT.
'/core/lib/images.lib.php';
5911 $maxwidthsmall = $tmparraysize[
'maxwidthsmall'];
5912 $maxheightsmall = $tmparraysize[
'maxheightsmall'];
5913 $maxwidthmini = $tmparraysize[
'maxwidthmini'];
5914 $maxheightmini = $tmparraysize[
'maxheightmini'];
5920 vignette($file_osencoded, $maxwidthsmall, $maxheightsmall,
'_small', $quality);
5924 vignette($file_osencoded, $maxwidthmini, $maxheightmini,
'_mini', $quality);
5963 global $conf, $_POST;
5966 if (GETPOSTISSET($fieldname)) {
5967 return GETPOST($fieldname, $type, 3);
5970 if (isset($alternatevalue)) {
5971 return $alternatevalue;
5974 $newelement = $this->element;
5975 if ($newelement ==
'facture') {
5976 $newelement =
'invoice';
5978 if ($newelement ==
'commande') {
5979 $newelement =
'order';
5981 if (empty($newelement)) {
5982 dol_syslog(
"Ask a default value using common method getDefaultCreateValueForField on an object with no property ->element defined. Return empty string.", LOG_WARNING);
5986 $keyforfieldname = strtoupper($newelement.
'_DEFAULT_'.$fieldname);
6016 global $langs, $conf;
6018 if (!empty(self::TRIGGER_PREFIX) && strpos($triggerName, self::TRIGGER_PREFIX .
'_') !== 0) {
6019 dol_print_error(
'',
'The trigger "' . $triggerName .
'" does not start with "' . self::TRIGGER_PREFIX .
'_" as required.');
6022 if (!is_object($langs)) {
6023 include_once DOL_DOCUMENT_ROOT.
'/core/class/translate.class.php';
6027 include_once DOL_DOCUMENT_ROOT.
'/core/class/interfaces.class.php';
6029 $result = $interface->run_triggers($triggerName, $this, $user, $langs, $conf);
6032 if (!empty($this->errors)) {
6033 $this->errors = array_unique(array_merge($this->errors, $interface->errors));
6035 $this->errors = $interface->errors;
6055 if (!$this->element) {
6058 if (!($this->
id > 0)) {
6061 if (is_array($this->array_languages)) {
6065 $this->array_languages = array();
6067 $element = $this->element;
6068 if ($element ==
'categorie') {
6069 $element =
'categories';
6073 $sql =
"SELECT rowid, property, lang , value";
6074 $sql .=
" FROM ".$this->db->prefix().
"object_lang";
6075 $sql .=
" WHERE type_object = '".$this->db->escape($element).
"'";
6076 $sql .=
" AND fk_object = ".((int) $this->
id);
6079 $resql = $this->db->query($sql);
6081 $numrows = $this->db->num_rows($resql);
6084 while ($i < $numrows) {
6085 $obj = $this->db->fetch_object($resql);
6086 $key = $obj->property;
6087 $value = $obj->value;
6088 $codelang = $obj->lang;
6089 $type = $this->fields[$key][
'type'];
6092 if (preg_match(
'/date/', $type)) {
6093 $this->array_languages[$key][$codelang] = $this->db->jdate($value);
6095 $this->array_languages[$key][$codelang] = $value;
6102 $this->db->free($resql);
6123 global $_POST, $langs;
6126 foreach ($_POST as $postfieldkey => $postfieldvalue) {
6127 $tmparray = explode(
'-', $postfieldkey);
6128 if ($tmparray[0] !=
'field') {
6132 $element = $tmparray[1];
6133 $key = $tmparray[2];
6134 $codelang = $tmparray[3];
6137 if (!empty($onlykey) && $key != $onlykey) {
6140 if ($element != $this->element) {
6144 $key_type = $this->fields[$key][
'type'];
6147 if (isset($this->fields[$key][
'enabled'])) {
6148 $enabled =
dol_eval($this->fields[$key][
'enabled'], 1, 1,
'1');
6155 if (empty($enabled)) {
6160 if (in_array($key_type, array(
'date'))) {
6164 } elseif (in_array($key_type, array(
'datetime'))) {
6167 $value_key =
dol_mktime(
GETPOST($postfieldkey.
"hour",
'int'),
GETPOST($postfieldkey.
"min",
'int'), 0,
GETPOST($postfieldkey.
"month",
'int'),
GETPOST($postfieldkey.
"day",
'int'),
GETPOST($postfieldkey.
"year",
'int'));
6168 } elseif (in_array($key_type, array(
'checkbox',
'chkbxlst'))) {
6169 $value_arr =
GETPOST($postfieldkey,
'array');
6170 if (!empty($value_arr)) {
6171 $value_key = implode(
',', $value_arr);
6175 } elseif (in_array($key_type, array(
'price',
'double'))) {
6176 $value_arr =
GETPOST($postfieldkey,
'alpha');
6179 $value_key =
GETPOST($postfieldkey);
6180 if (in_array($key_type, array(
'link')) && $value_key ==
'-1') {
6185 $this->array_languages[$key][$codelang] = $value_key;
6210 $savDisableCompute = $conf->disable_compute;
6211 $conf->disable_compute = 1;
6213 $ret = $this->fetch($id);
6215 $conf->disable_compute = $savDisableCompute;
6233 global $conf, $extrafields;
6235 if (empty($rowid)) {
6238 if (empty($rowid) && isset($this->
rowid)) {
6239 $rowid = $this->rowid;
6243 if (!$this->table_element) {
6247 $this->array_options = array();
6249 if (!is_array($optionsArray)) {
6251 if (!isset($extrafields) || !is_object($extrafields)) {
6252 require_once DOL_DOCUMENT_ROOT.
'/core/class/extrafields.class.php';
6257 if (empty($extrafields->attributes[$this->table_element][
'loaded'])) {
6258 $extrafields->fetch_name_optionals_label($this->table_element);
6260 $optionsArray = (!empty($extrafields->attributes[$this->table_element][
'label']) ? $extrafields->attributes[$this->table_element][
'label'] :
null);
6262 global $extrafields;
6263 dol_syslog(
"Warning: fetch_optionals was called with param optionsArray defined when you should pass null now", LOG_WARNING);
6266 $table_element = $this->table_element;
6267 if ($table_element ==
'categorie') {
6268 $table_element =
'categories';
6272 if (is_array($optionsArray) && count($optionsArray) > 0) {
6273 $sql =
"SELECT rowid";
6274 foreach ($optionsArray as $name => $label) {
6275 if (empty($extrafields->attributes[$this->table_element][
'type'][$name]) || $extrafields->attributes[$this->table_element][
'type'][$name] !=
'separate') {
6279 $sql .=
" FROM ".$this->db->prefix().$table_element.
"_extrafields";
6280 $sql .=
" WHERE fk_object = ".((int) $rowid);
6283 $resql = $this->db->query($sql);
6285 $numrows = $this->db->num_rows($resql);
6287 $tab = $this->db->fetch_array($resql);
6289 foreach ($tab as $key => $value) {
6291 if ($key !=
'rowid' && $key !=
'tms' && $key !=
'fk_member' && !is_int($key)) {
6293 if (!empty($extrafields->attributes[$this->table_element]) && in_array($extrafields->attributes[$this->table_element][
'type'][$key], array(
'date',
'datetime'))) {
6295 $this->array_options[
"options_".$key] = $this->db->jdate($value);
6297 $this->array_options[
"options_".$key] = $value;
6302 if (!empty($extrafields->attributes[$this->table_element][
'type'][$key]) && $extrafields->attributes[$this->table_element][
'type'][$key] ==
'password') {
6303 if (!empty($value) && preg_match(
'/^dolcrypt:/', $value)) {
6304 $this->array_options[
"options_".$key] =
dolDecrypt($value);
6312 if (is_array($extrafields->attributes[$this->table_element][
'label'])) {
6313 foreach ($extrafields->attributes[$this->table_element][
'label'] as $key => $val) {
6314 if (!empty($extrafields->attributes[$this->table_element]) && !empty($extrafields->attributes[$this->table_element][
'computed'][$key])) {
6316 if (empty($conf->disable_compute)) {
6317 global $objectoffield;
6318 $objectoffield = $this;
6319 $this->array_options[
'options_' . $key] =
dol_eval($extrafields->attributes[$this->table_element][
'computed'][$key], 1, 0,
'2');
6325 $this->db->free($resql);
6333 $this->errors[]=$this->db->lasterror;
6356 $table_element = $this->table_element;
6357 if ($table_element ==
'categorie') {
6358 $table_element =
'categories';
6361 dol_syslog(get_class($this).
"::deleteExtraFields delete", LOG_DEBUG);
6363 $sql_del =
"DELETE FROM ".$this->db->prefix().$table_element.
"_extrafields WHERE fk_object = ".((int) $this->
id);
6365 $resql = $this->db->query($sql_del);
6367 $this->error = $this->db->lasterror();
6368 $this->db->rollback();
6371 $this->db->commit();
6388 global $conf, $langs, $user;
6394 if (empty($userused)) {
6400 if (!empty($this->array_options)) {
6402 $langs->load(
'admin');
6403 require_once DOL_DOCUMENT_ROOT.
'/core/class/extrafields.class.php';
6405 $target_extrafields = $extrafields->fetch_name_optionals_label($this->table_element);
6408 $new_array_options = array();
6409 foreach ($this->array_options as $key => $value) {
6410 if (in_array(substr($key, 8), array_keys($target_extrafields))) {
6411 $new_array_options[$key] = $value;
6412 } elseif (in_array($key, array_keys($target_extrafields))) {
6413 $new_array_options[
'options_'.$key] = $value;
6417 foreach ($new_array_options as $key => $value) {
6418 $attributeKey = substr($key, 8);
6419 $attributeType = $extrafields->attributes[$this->table_element][
'type'][$attributeKey];
6420 $attributeLabel = $langs->transnoentities($extrafields->attributes[$this->table_element][
'label'][$attributeKey]);
6421 $attributeParam = $extrafields->attributes[$this->table_element][
'param'][$attributeKey];
6422 $attributeRequired = $extrafields->attributes[$this->table_element][
'required'][$attributeKey];
6423 $attributeUnique = $extrafields->attributes[$this->table_element][
'unique'][$attributeKey];
6424 $attrfieldcomputed = $extrafields->attributes[$this->table_element][
'computed'][$attributeKey];
6428 if (!empty($this->context[
'createfromclone']) && $this->context[
'createfromclone'] ==
'createfromclone' && !empty($attributeUnique)) {
6429 $new_array_options[$key] =
null;
6433 if ($attributeRequired) {
6434 $v = $this->array_options[$key];
6436 $langs->load(
"errors");
6437 dol_syslog(
"Mandatory field '".$key.
"' is empty during create and set to required into definition of extrafields");
6438 $this->errors[] = $langs->trans(
'ErrorFieldRequired', $attributeLabel);
6446 if (!empty($attrfieldcomputed)) {
6448 $value =
dol_eval($attrfieldcomputed, 1, 0,
'2');
6449 dol_syslog($langs->trans(
"Extrafieldcomputed").
" on ".$attributeLabel.
"(".$value.
")", LOG_DEBUG);
6450 $new_array_options[$key] = $value;
6452 $new_array_options[$key] =
null;
6456 switch ($attributeType) {
6458 if (!is_numeric($value) && $value !=
'') {
6459 $this->errors[] = $langs->trans(
"ExtraFieldHasWrongValue", $attributeLabel);
6461 } elseif ($value ==
'') {
6462 $new_array_options[$key] =
null;
6468 if (!is_numeric($value) && $value !=
'') {
6469 dol_syslog($langs->trans(
"ExtraFieldHasWrongValue").
" for ".$attributeLabel.
"(".$value.
"is not '".$attributeType.
"')", LOG_DEBUG);
6470 $this->errors[] = $langs->trans(
"ExtraFieldHasWrongValue", $attributeLabel);
6472 } elseif ($value ==
'') {
6476 $new_array_options[$key] = $value;
6486 if ($this->array_options[$key] !=
'' && is_array($extrafields->attributes[$this->table_element][
'param'][$attributeKey][
'options'])) {
6488 $tmparrays = array_keys($extrafields->attributes[$this->table_element][
'param'][$attributeKey][
'options']);
6489 $algo = reset($tmparrays);
6494 if (is_object($this->oldcopy)) {
6496 if (isset($this->oldcopy->array_options[$key]) && $this->array_options[$key] == $this->oldcopy->array_options[$key]) {
6498 if ($algo ==
'dolcrypt') {
6499 if (!preg_match(
'/^dolcrypt:/', $this->array_options[$key])) {
6500 $new_array_options[$key] =
dolEncrypt($this->array_options[$key]);
6502 $new_array_options[$key] = $this->array_options[$key];
6505 $new_array_options[$key] = $this->array_options[$key];
6509 if ($algo ==
'dolcrypt') {
6510 if (!preg_match(
'/^dolcrypt:/', $this->array_options[$key])) {
6511 $new_array_options[$key] =
dolEncrypt($this->array_options[$key]);
6513 $new_array_options[$key] = $this->array_options[$key];
6516 $new_array_options[$key] =
dol_hash($this->array_options[$key], $algo);
6522 if ($algo ==
'dolcrypt' && !preg_match(
'/^dolcrypt:/', $this->array_options[$key])) {
6523 $new_array_options[$key] =
dolEncrypt($this->array_options[$key]);
6525 $new_array_options[$key] = $this->array_options[$key];
6530 $new_array_options[$key] = $this->array_options[$key];
6533 $new_array_options[$key] = $this->array_options[$key];
6539 if (!is_numeric($this->array_options[$key]) || $this->array_options[$key] != intval($this->array_options[$key])) {
6540 $this->array_options[$key] = strtotime($this->array_options[$key]);
6542 $new_array_options[$key] = $this->db->idate($this->array_options[$key]);
6546 if (!is_numeric($this->array_options[$key]) || $this->array_options[$key] != intval($this->array_options[$key])) {
6547 $this->array_options[$key] = strtotime($this->array_options[$key]);
6549 $new_array_options[$key] = $this->db->idate($this->array_options[$key],
'gmt');
6552 $param_list = array_keys($attributeParam[
'options']);
6555 $InfoFieldList = explode(
":", $param_list[0]);
6557 if ($InfoFieldList[0] && class_exists($InfoFieldList[0])) {
6558 if ($value ==
'-1') {
6559 $new_array_options[$key] =
'';
6561 $object =
new $InfoFieldList[0]($this->db);
6562 if (is_numeric($value)) {
6563 $res = $object->fetch($value);
6565 $res = $object->fetch(
'', $value);
6569 $new_array_options[$key] = $object->id;
6571 $this->error =
"Id/Ref '".$value.
"' for object '".$object->element.
"' not found";
6576 dol_syslog(
'Error bad setup of extrafield', LOG_WARNING);
6581 if (is_array($this->array_options[$key])) {
6582 $new_array_options[$key] = implode(
',', $this->array_options[$key]);
6584 $new_array_options[$key] = $this->array_options[$key];
6592 $table_element = $this->table_element;
6593 if ($table_element ==
'categorie') {
6594 $table_element =
'categories';
6597 dol_syslog(get_class($this).
"::insertExtraFields delete then insert", LOG_DEBUG);
6599 $sql_del =
"DELETE FROM ".$this->db->prefix().$table_element.
"_extrafields WHERE fk_object = ".((int) $this->
id);
6600 $this->db->query($sql_del);
6602 $sql =
"INSERT INTO ".$this->db->prefix().$table_element.
"_extrafields (fk_object";
6603 foreach ($new_array_options as $key => $value) {
6604 $attributeKey = substr($key, 8);
6606 if ($extrafields->attributes[$this->table_element][
'type'][$attributeKey] !=
'separate') {
6607 $sql .=
",".$attributeKey;
6611 if (!empty($extrafields->attributes[$this->table_element][
'mandatoryfieldsofotherentities']) && is_array($extrafields->attributes[$this->table_element][
'mandatoryfieldsofotherentities'])) {
6612 foreach ($extrafields->attributes[$this->table_element][
'mandatoryfieldsofotherentities'] as $tmpkey => $tmpval) {
6613 if (!isset($extrafields->attributes[$this->table_element][
'type'][$tmpkey])) {
6614 $sql .=
",".$tmpkey;
6618 $sql .=
") VALUES (".$this->id;
6620 foreach ($new_array_options as $key => $value) {
6621 $attributeKey = substr($key, 8);
6623 if ($extrafields->attributes[$this->table_element][
'type'][$attributeKey] !=
'separate') {
6624 if ($new_array_options[$key] !=
'' || $new_array_options[$key] ==
'0') {
6625 $sql .=
",'".$this->db->escape($new_array_options[$key]).
"'";
6632 if (!empty($extrafields->attributes[$this->table_element][
'mandatoryfieldsofotherentities']) && is_array($extrafields->attributes[$this->table_element][
'mandatoryfieldsofotherentities'])) {
6633 foreach ($extrafields->attributes[$this->table_element][
'mandatoryfieldsofotherentities'] as $tmpkey => $tmpval) {
6634 if (!isset($extrafields->attributes[$this->table_element][
'type'][$tmpkey])) {
6635 if (in_array($tmpval, array(
'int',
'double',
'price'))) {
6646 $resql = $this->db->query($sql);
6648 $this->error = $this->db->lasterror();
6652 if (!$error && $trigger) {
6654 $this->context = array(
'extrafieldaddupdate'=>1);
6655 $result = $this->call_trigger($trigger, $userused);
6663 $this->db->rollback();
6666 $this->db->commit();
6686 global $conf, $langs, $user;
6688 if (empty($userused)) {
6698 if (is_array($this->array_languages)) {
6699 $new_array_languages = $this->array_languages;
6701 foreach ($new_array_languages as $key => $value) {
6702 $attributeKey = $key;
6703 $attributeType = $this->fields[$attributeKey][
'type'];
6704 $attributeLabel = $this->fields[$attributeKey][
'label'];
6709 switch ($attributeType) {
6711 if (!is_numeric($value) && $value !=
'') {
6712 $this->errors[] = $langs->trans(
"ExtraLanguageHasWrongValue", $attributeLabel);
6714 } elseif ($value ==
'') {
6715 $new_array_languages[$key] =
null;
6720 if (!is_numeric($value) && $value !=
'') {
6721 dol_syslog($langs->trans(
"ExtraLanguageHasWrongValue").
" sur ".$attributeLabel.
"(".$value.
"is not '".$attributeType.
"')", LOG_DEBUG);
6722 $this->errors[] = $langs->trans(
"ExtraLanguageHasWrongValue", $attributeLabel);
6724 } elseif ($value ==
'') {
6725 $new_array_languages[$key] =
null;
6727 $new_array_languages[$key] = $value;
6741 $table_element = $this->table_element;
6742 if ($table_element ==
'categorie') {
6743 $table_element =
'categories';
6746 dol_syslog(get_class($this).
"::insertExtraLanguages delete then insert", LOG_DEBUG);
6748 foreach ($new_array_languages as $key => $langcodearray) {
6749 foreach ($langcodearray as $langcode => $value) {
6750 $sql_del =
"DELETE FROM ".$this->db->prefix().
"object_lang";
6751 $sql_del .=
" WHERE fk_object = ".((int) $this->
id).
" AND property = '".$this->db->escape($key).
"' AND type_object = '".$this->db->escape($table_element).
"'";
6752 $sql_del .=
" AND lang = '".$this->db->escape($langcode).
"'";
6753 $this->db->query($sql_del);
6755 if ($value !==
'') {
6756 $sql =
"INSERT INTO ".$this->db->prefix().
"object_lang (fk_object, property, type_object, lang, value";
6757 $sql .=
") VALUES (".$this->id.
", '".$this->db->escape($key).
"', '".$this->db->escape($table_element).
"', '".$this->db->escape($langcode).
"', '".$this->db->escape($value).
"'";
6760 $resql = $this->db->query($sql);
6762 $this->error = $this->db->lasterror();
6770 if (!$error && $trigger) {
6772 $this->context = array(
'extralanguagesaddupdate'=>1);
6773 $result = $this->call_trigger($trigger, $userused);
6781 $this->db->rollback();
6784 $this->db->commit();
6804 global $conf, $langs, $user, $hookmanager;
6810 if (empty($userused)) {
6816 if (!empty($this->array_options) && isset($this->array_options[
"options_".$key])) {
6818 $langs->load(
'admin');
6819 require_once DOL_DOCUMENT_ROOT.
'/core/class/extrafields.class.php';
6821 $extrafields->fetch_name_optionals_label($this->table_element);
6823 $value = $this->array_options[
"options_".$key];
6825 $attributeKey = $key;
6826 $attributeType = $extrafields->attributes[$this->table_element][
'type'][$key];
6827 $attributeLabel = $extrafields->attributes[$this->table_element][
'label'][$key];
6828 $attributeParam = $extrafields->attributes[$this->table_element][
'param'][$key];
6829 $attributeRequired = $extrafields->attributes[$this->table_element][
'required'][$key];
6830 $attributeUnique = $extrafields->attributes[$this->table_element][
'unique'][$attributeKey];
6831 $attrfieldcomputed = $extrafields->attributes[$this->table_element][
'computed'][$key];
6834 if ($attributeRequired) {
6835 $mandatorypb =
false;
6836 if ($attributeType ==
'link' && $this->array_options[
"options_".$key] ==
'-1') {
6837 $mandatorypb =
true;
6839 if ($this->array_options[
"options_".$key] ===
'') {
6840 $mandatorypb =
true;
6843 $langs->load(
"errors");
6844 dol_syslog(
"Mandatory field 'options_".$key.
"' is empty during update and set to required into definition of extrafields");
6845 $this->errors[] = $langs->trans(
'ErrorFieldRequired', $attributeLabel);
6851 $new_array_options = $this->array_options;
6855 if (!empty($attrfieldcomputed)) {
6857 $value =
dol_eval($attrfieldcomputed, 1, 0,
'2');
6858 dol_syslog($langs->trans(
"Extrafieldcomputed").
" sur ".$attributeLabel.
"(".$value.
")", LOG_DEBUG);
6860 $new_array_options[
"options_".$key] = $value;
6862 $this->array_options[
"options_".$key] = $new_array_options[
"options_".$key];
6864 $new_array_options[
"options_".$key] =
null;
6866 $this->array_options[
"options_".$key] = $new_array_options[
"options_".$key];
6870 switch ($attributeType) {
6872 if (!is_numeric($value) && $value !=
'') {
6873 $this->errors[] = $langs->trans(
"ExtraFieldHasWrongValue", $attributeLabel);
6875 } elseif ($value ===
'') {
6876 $new_array_options[
"options_".$key] =
null;
6878 $this->array_options[
"options_".$key] = $new_array_options[
"options_".$key];
6884 if (!is_numeric($value) && $value !=
'') {
6885 dol_syslog($langs->trans(
"ExtraFieldHasWrongValue").
" sur ".$attributeLabel.
"(".$value.
"is not '".$attributeType.
"')", LOG_DEBUG);
6886 $this->errors[] = $langs->trans(
"ExtraFieldHasWrongValue", $attributeLabel);
6888 } elseif ($value ===
'') {
6892 $new_array_options[
"options_".$key] = $value;
6894 $this->array_options[
"options_".$key] = $new_array_options[
"options_".$key];
6906 if ($this->array_options[
"options_".$key] !=
'' && is_array($extrafields->attributes[$this->table_element][
'param'][$attributeKey][
'options'])) {
6908 $tmparrays = array_keys($extrafields->attributes[$this->table_element][
'param'][$attributeKey][
'options']);
6909 $algo = reset($tmparrays);
6915 if (is_object($this->oldcopy)) {
6917 if (isset($this->oldcopy->array_options[
"options_".$key]) && $this->array_options[
"options_".$key] == $this->oldcopy->array_options[
"options_".$key]) {
6918 if ($algo ==
'dolcrypt') {
6919 if (!preg_match(
'/^dolcrypt:/', $this->array_options[
"options_".$key])) {
6920 $new_array_options[
"options_".$key] =
dolEncrypt($this->array_options[
"options_".$key]);
6922 $new_array_options[
"options_".$key] = $this->array_options[
"options_".$key];
6925 $new_array_options[
"options_".$key] = $this->array_options[
"options_".$key];
6928 if ($algo ==
'dolcrypt') {
6929 if (!preg_match(
'/^dolcrypt:/', $this->array_options[
"options_".$key])) {
6930 $new_array_options[
"options_".$key] =
dolEncrypt($this->array_options[
"options_".$key]);
6932 $new_array_options[
"options_".$key] = $this->array_options[
"options_".$key];
6935 $new_array_options[
"options_".$key] =
dol_hash($this->array_options[
"options_".$key], $algo);
6939 if ($algo ==
'dolcrypt' && !preg_match(
'/^dolcrypt:/', $this->array_options[
"options_".$key])) {
6940 $new_array_options[
"options_".$key] =
dolEncrypt($this->array_options[
"options_".$key]);
6942 $new_array_options[
"options_".$key] = $this->array_options[
"options_".$key];
6947 $new_array_options[
"options_".$key] = $this->array_options[
"options_".$key];
6950 $new_array_options[
"options_".$key] = $this->array_options[
"options_".$key];
6953 $this->array_options[
"options_".$key] = $new_array_options[
"options_".$key];
6957 if (empty($this->array_options[
"options_".$key])) {
6958 $new_array_options[
"options_".$key] =
null;
6960 $this->array_options[
"options_".$key] = $new_array_options[
"options_".$key];
6962 $new_array_options[
"options_".$key] = $this->db->idate($this->array_options[
"options_".$key]);
6966 if (empty($this->array_options[
"options_".$key])) {
6967 $new_array_options[
"options_".$key] =
null;
6969 $this->array_options[
"options_".$key] = $new_array_options[
"options_".$key];
6971 $new_array_options[
"options_".$key] = $this->db->idate($this->array_options[
"options_".$key],
'gmt');
6975 if (empty($this->array_options[
"options_".$key])) {
6976 $new_array_options[
"options_".$key] =
null;
6978 $this->array_options[
"options_".$key] = $new_array_options[
"options_".$key];
6982 if ($this->array_options[
"options_".$key] ===
'') {
6983 $new_array_options[
"options_".$key] =
null;
6985 $this->array_options[
"options_".$key] = $new_array_options[
"options_".$key];
7019 $new_array_options = array();
7020 if (is_array($this->array_options[
"options_".$key])) {
7021 $new_array_options[
"options_".$key] = implode(
',', $this->array_options[
"options_".$key]);
7023 $new_array_options[
"options_".$key] = $this->array_options[
"options_".$key];
7026 $this->array_options[
"options_".$key] = $new_array_options[
"options_".$key];
7032 $linealreadyfound = 0;
7035 $table_element = $this->table_element;
7036 if ($table_element ==
'categorie') {
7037 $table_element =
'categories';
7040 $sql =
"SELECT COUNT(rowid) as nb FROM ".$this->db->prefix().$table_element.
"_extrafields WHERE fk_object = ".((int) $this->
id);
7041 $resql = $this->db->query($sql);
7043 $tmpobj = $this->db->fetch_object($resql);
7045 $linealreadyfound = $tmpobj->nb;
7050 if ($linealreadyfound) {
7051 if ($this->array_options[
"options_".$key] ===
null) {
7052 $sql =
"UPDATE ".$this->db->prefix().$table_element.
"_extrafields SET ".$key.
" = null";
7054 $sql =
"UPDATE ".$this->db->prefix().$table_element.
"_extrafields SET ".$key.
" = '".$this->db->escape($new_array_options[
"options_".$key]).
"'";
7056 $sql .=
" WHERE fk_object = ".((int) $this->
id);
7058 $resql = $this->db->query($sql);
7061 $this->error = $this->db->lasterror();
7064 $result = $this->insertExtraFields(
'', $user);
7071 $parameters = array(
'key'=>$key);
7072 $reshook = $hookmanager->executeHooks(
'updateExtraFieldBeforeCommit', $parameters, $this, $action);
7078 if (!$error && $trigger) {
7080 $this->context = array(
'extrafieldupdate'=>1);
7081 $result = $this->call_trigger($trigger, $userused);
7089 dol_syslog(__METHOD__.$this->error, LOG_ERR);
7090 $this->db->rollback();
7093 $this->db->commit();
7113 global $conf, $langs, $user;
7115 if (empty($userused)) {
7143 public function showInputField($val, $key, $value, $moreparam =
'', $keysuffix =
'', $keyprefix =
'', $morecss = 0, $nonewbutton = 0)
7145 global $conf, $langs, $form;
7147 if (!is_object($form)) {
7148 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.form.class.php';
7149 $form =
new Form($this->db);
7152 if (!empty($this->fields)) {
7153 $val = $this->fields[$key];
7157 $fieldValidationErrorMsg =
'';
7158 $validationClass =
'';
7159 $fieldValidationErrorMsg = $this->getFieldError($key);
7160 if (!empty($fieldValidationErrorMsg)) {
7161 $validationClass =
' --error';
7163 $validationClass =
' --success';
7170 $param[
'options'] = array();
7172 $size = !empty($this->fields[$key][
'size']) ? $this->fields[$key][
'size'] : 0;
7174 if (preg_match(
'/^(integer|link):(.*):(.*):(.*):(.*)/i', $val[
'type'], $reg)) {
7175 $param[
'options'] = array($reg[2].
':'.$reg[3].
':'.$reg[4].
':'.$reg[5] =>
'N');
7177 } elseif (preg_match(
'/^(integer|link):(.*):(.*):(.*)/i', $val[
'type'], $reg)) {
7178 $param[
'options'] = array($reg[2].
':'.$reg[3].
':'.$reg[4] =>
'N');
7180 } elseif (preg_match(
'/^(integer|link):(.*):(.*)/i', $val[
'type'], $reg)) {
7181 $param[
'options'] = array($reg[2].
':'.$reg[3] =>
'N');
7183 } elseif (preg_match(
'/^(sellist):(.*):(.*):(.*):(.*)/i', $val[
'type'], $reg)) {
7184 $param[
'options'] = array($reg[2].
':'.$reg[3].
':'.$reg[4].
':'.$reg[5] =>
'N');
7186 } elseif (preg_match(
'/^(sellist):(.*):(.*):(.*)/i', $val[
'type'], $reg)) {
7187 $param[
'options'] = array($reg[2].
':'.$reg[3].
':'.$reg[4] =>
'N');
7189 } elseif (preg_match(
'/^(sellist):(.*):(.*)/i', $val[
'type'], $reg)) {
7190 $param[
'options'] = array($reg[2].
':'.$reg[3] =>
'N');
7192 } elseif (preg_match(
'/^chkbxlst:(.*)/i', $val[
'type'], $reg)) {
7193 $param[
'options'] = array($reg[1] =>
'N');
7195 } elseif (preg_match(
'/varchar\((\d+)\)/', $val[
'type'], $reg)) {
7196 $param[
'options'] = array();
7199 } elseif (preg_match(
'/varchar/', $val[
'type'])) {
7200 $param[
'options'] = array();
7203 $param[
'options'] = array();
7204 $type = $this->fields[$key][
'type'];
7209 if (!empty($this->fields[$key][
'arrayofkeyval']) && is_array($this->fields[$key][
'arrayofkeyval'])) {
7210 $param[
'options'] = $this->fields[$key][
'arrayofkeyval'];
7211 $type = (($this->fields[$key][
'type']==
'checkbox') ? $this->fields[$key][
'type'] :
'select');
7214 $label = $this->fields[$key][
'label'];
7216 $default = (!empty($this->fields[$key][
'default']) ? $this->fields[$key][
'default'] :
'');
7217 $computed = (!empty($this->fields[$key][
'computed']) ? $this->fields[$key][
'computed'] :
'');
7218 $unique = (!empty($this->fields[$key][
'unique']) ? $this->fields[$key][
'unique'] : 0);
7219 $required = (!empty($this->fields[$key][
'required']) ? $this->fields[$key][
'required'] : 0);
7220 $autofocusoncreate = (!empty($this->fields[$key][
'autofocusoncreate']) ? $this->fields[$key][
'autofocusoncreate'] : 0);
7222 $langfile = (!empty($this->fields[$key][
'langfile']) ? $this->fields[$key][
'langfile'] :
'');
7223 $list = (!empty($this->fields[$key][
'list']) ? $this->fields[$key][
'list'] : 0);
7224 $hidden = (in_array(abs($this->fields[$key][
'visible']), array(0, 2)) ? 1 : 0);
7226 $objectid = $this->id;
7229 if (!preg_match(
'/^search_/', $keyprefix)) {
7230 return '<span class="opacitymedium">'.$langs->trans(
"AutomaticallyCalculated").
'</span>';
7237 if (empty($morecss) && !empty($val[
'css'])) {
7238 $morecss = $val[
'css'];
7239 } elseif (empty($morecss)) {
7240 if ($type ==
'date') {
7241 $morecss =
'minwidth100imp';
7242 } elseif ($type ==
'datetime' || $type ==
'link') {
7243 $morecss =
'minwidth200imp';
7244 } elseif (in_array($type, array(
'int',
'integer',
'price')) || preg_match(
'/^double(\([0-9],[0-9]\)){0,1}/', $type)) {
7245 $morecss =
'maxwidth75';
7246 } elseif ($type ==
'url') {
7247 $morecss =
'minwidth400';
7248 } elseif ($type ==
'boolean') {
7251 if (round($size) < 12) {
7252 $morecss =
'minwidth100';
7253 } elseif (round($size) <= 48) {
7254 $morecss =
'minwidth200';
7256 $morecss =
'minwidth400';
7262 if (!empty($validationClass)) {
7263 $morecss.= $validationClass;
7266 if (in_array($type, array(
'date'))) {
7267 $tmp = explode(
',', $size);
7272 if (!$required && $value ==
'') {
7277 $out = $form->selectDate($value, $keyprefix.$key.$keysuffix, $showtime, $showtime, $required,
'', 1, (($keyprefix !=
'search_' && $keyprefix !=
'search_options_') ? 1 : 0), 0, 1);
7278 } elseif (in_array($type, array(
'datetime'))) {
7279 $tmp = explode(
',', $size);
7284 if (!$required && $value ==
'') {
7289 $out = $form->selectDate($value, $keyprefix.$key.$keysuffix, $showtime, $showtime, $required,
'', 1, (($keyprefix !=
'search_' && $keyprefix !=
'search_options_') ? 1 : 0), 0, 1,
'',
'',
'', 1,
'',
'',
'tzuserrel');
7290 } elseif (in_array($type, array(
'duration'))) {
7291 $out = $form->select_duration($keyprefix.$key.$keysuffix, $value, 0,
'text', 0, 1);
7292 } elseif (in_array($type, array(
'int',
'integer'))) {
7293 $tmp = explode(
',', $size);
7295 $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' :
'').
'>';
7296 } elseif (in_array($type, array(
'real'))) {
7297 $out =
'<input type="text" class="flat '.$morecss.
'" name="'.$keyprefix.$key.$keysuffix.
'" id="'.$keyprefix.$key.$keysuffix.
'" value="'.
dol_escape_htmltag($value).
'"'.($moreparam ? $moreparam :
'').($autofocusoncreate ?
' autofocus' :
'').
'>';
7298 } elseif (preg_match(
'/varchar/', $type)) {
7299 $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' :
'').
'>';
7300 } elseif (in_array($type, array(
'email',
'mail',
'phone',
'url',
'ip'))) {
7301 $out =
'<input type="text" class="flat '.$morecss.
'" name="'.$keyprefix.$key.$keysuffix.
'" id="'.$keyprefix.$key.$keysuffix.
'" value="'.
dol_escape_htmltag($value).
'" '.($moreparam ? $moreparam :
'').($autofocusoncreate ?
' autofocus' :
'').
'>';
7302 } elseif (preg_match(
'/^text/', $type)) {
7303 if (!preg_match(
'/search_/', $keyprefix)) {
7304 require_once DOL_DOCUMENT_ROOT.
'/core/class/doleditor.class.php';
7305 $doleditor =
new DolEditor($keyprefix.$key.$keysuffix, $value,
'', 200,
'dolibarr_notes',
'In',
false,
false,
false, ROWS_5,
'90%');
7306 $out = $doleditor->Create(1);
7308 $out =
'<input type="text" class="flat '.$morecss.
' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.
'" id="'.$keyprefix.$key.$keysuffix.
'" value="'.
dol_escape_htmltag($value).
'" '.($moreparam ? $moreparam :
'').
'>';
7310 } elseif (preg_match(
'/^html/', $type)) {
7311 if (!preg_match(
'/search_/', $keyprefix)) {
7312 require_once DOL_DOCUMENT_ROOT.
'/core/class/doleditor.class.php';
7313 $doleditor =
new DolEditor($keyprefix.$key.$keysuffix, $value,
'', 200,
'dolibarr_notes',
'In',
false,
false, isModEnabled(
'fckeditor') && $conf->global->FCKEDITOR_ENABLE_SOCIETE, ROWS_5,
'90%');
7314 $out = $doleditor->Create(1,
'',
true,
'',
'', $moreparam, $morecss);
7316 $out =
'<input type="text" class="flat '.$morecss.
' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.
'" id="'.$keyprefix.$key.$keysuffix.
'" value="'.
dol_escape_htmltag($value).
'" '.($moreparam ? $moreparam :
'').
'>';
7318 } elseif ($type ==
'boolean') {
7320 if (!empty($value)) {
7321 $checked =
' checked value="1" ';
7323 $checked =
' value="1" ';
7325 $out =
'<input type="checkbox" class="flat '.$morecss.
' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.
'" id="'.$keyprefix.$key.$keysuffix.
'" '.$checked.
' '.($moreparam ? $moreparam :
'').
'>';
7326 } elseif ($type ==
'price') {
7327 if (!empty($value)) {
7328 $value =
price($value);
7330 $out =
'<input type="text" class="flat '.$morecss.
' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.
'" id="'.$keyprefix.$key.$keysuffix.
'" value="'.$value.
'" '.($moreparam ? $moreparam :
'').
'> '.$langs->getCurrencySymbol($conf->currency);
7331 } elseif (preg_match(
'/^double(\([0-9],[0-9]\)){0,1}/', $type)) {
7332 if (!empty($value)) {
7333 $value =
price($value);
7335 $out =
'<input type="text" class="flat '.$morecss.
' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.
'" id="'.$keyprefix.$key.$keysuffix.
'" value="'.$value.
'" '.($moreparam ? $moreparam :
'').
'> ';
7336 } elseif ($type ==
'select') {
7338 if (!empty($conf->use_javascript_ajax) && !
getDolGlobalString(
'MAIN_EXTRAFIELDS_DISABLE_SELECT2')) {
7339 include_once DOL_DOCUMENT_ROOT.
'/core/lib/ajax.lib.php';
7340 $out .=
ajax_combobox($keyprefix.$key.$keysuffix, array(), 0);
7343 $out .=
'<select class="flat '.$morecss.
' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.
'" id="'.$keyprefix.$key.$keysuffix.
'" '.($moreparam ? $moreparam :
'').
'>';
7344 if ((!isset($this->fields[$key][
'default'])) || ($this->fields[$key][
'notnull'] != 1)) {
7345 $out .=
'<option value="0"> </option>';
7347 foreach ($param[
'options'] as $keyb => $valb) {
7348 if ((
string) $keyb ==
'') {
7351 if (strpos($valb,
"|") !==
false) {
7352 list($valb, $parent) = explode(
'|', $valb);
7354 $out .=
'<option value="'.$keyb.
'"';
7355 $out .= (((string) $value == (
string) $keyb) ?
' selected' :
'');
7356 if (!empty($parent)) {
7359 $out .= (!empty($parent) ?
' parent="'.$parent.
'"' :
'');
7360 $out .=
'>'.$langs->trans($valb).
'</option>';
7362 $out .=
'</select>';
7363 } elseif ($type ==
'sellist') {
7365 if (!empty($conf->use_javascript_ajax) && !
getDolGlobalString(
'MAIN_EXTRAFIELDS_DISABLE_SELECT2')) {
7366 include_once DOL_DOCUMENT_ROOT.
'/core/lib/ajax.lib.php';
7367 $out .=
ajax_combobox($keyprefix.$key.$keysuffix, array(), 0);
7370 $out .=
'<select class="flat '.$morecss.
' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.
'" id="'.$keyprefix.$key.$keysuffix.
'" '.($moreparam ? $moreparam :
'').
'>';
7371 if (is_array($param[
'options'])) {
7372 $param_list = array_keys($param[
'options']);
7373 $InfoFieldList = explode(
":", $param_list[0], 5);
7374 if (! empty($InfoFieldList[4])) {
7376 $parenthesisopen = 0;
7377 while (substr($InfoFieldList[4], $pos, 1) !==
'' && ($parenthesisopen || $pos == 0 || substr($InfoFieldList[4], $pos, 1) !=
':')) {
7378 if (substr($InfoFieldList[4], $pos, 1) ==
'(') {
7381 if (substr($InfoFieldList[4], $pos, 1) ==
')') {
7386 $tmpbefore = substr($InfoFieldList[4], 0, $pos);
7387 $tmpafter = substr($InfoFieldList[4], $pos+1);
7389 $InfoFieldList[4] = $tmpbefore;
7390 if ($tmpafter !==
'') {
7391 $InfoFieldList = array_merge($InfoFieldList, explode(
':', $tmpafter));
7406 $keyList = (empty($InfoFieldList[2]) ?
'rowid' : $InfoFieldList[2].
' as rowid');
7408 if (count($InfoFieldList) > 4 && !empty($InfoFieldList[4])) {
7409 if (strpos($InfoFieldList[4],
'extra.') !==
false) {
7410 $keyList =
'main.'.$InfoFieldList[2].
' as rowid';
7412 $keyList = $InfoFieldList[2].
' as rowid';
7415 if (count($InfoFieldList) > 3 && !empty($InfoFieldList[3])) {
7416 list($parentName, $parentField) = explode(
'|', $InfoFieldList[3]);
7417 $keyList .=
', '.$parentField;
7420 $filter_categorie =
false;
7421 if (count($InfoFieldList) > 5) {
7422 if ($InfoFieldList[0] ==
'categorie') {
7423 $filter_categorie =
true;
7427 if ($filter_categorie ===
false) {
7428 $fields_label = explode(
'|', $InfoFieldList[1]);
7429 if (is_array($fields_label)) {
7431 $keyList .= implode(
', ', $fields_label);
7435 $sql =
"SELECT " . $keyList;
7436 $sql .=
" FROM " . $this->db->prefix() . $InfoFieldList[0];
7437 if (!empty($InfoFieldList[4])) {
7439 if (strpos($InfoFieldList[4],
'$SEL$') !==
false) {
7440 $InfoFieldList[4] = str_replace(
'$SEL$',
'SELECT', $InfoFieldList[4]);
7444 if (strpos($InfoFieldList[4],
'$ID$') !==
false && !empty($objectid)) {
7445 $InfoFieldList[4] = str_replace(
'$ID$', $objectid, $InfoFieldList[4]);
7447 $InfoFieldList[4] = str_replace(
'$ID$',
'0', $InfoFieldList[4]);
7452 if (strpos($InfoFieldList[4],
'extra') !==
false) {
7453 $sql .=
" as main, " . $this->db->prefix() . $InfoFieldList[0] .
"_extrafields as extra";
7454 $sqlwhere .=
" WHERE extra.fk_object=main." . $InfoFieldList[2];
7460 $sqlwhere .=
' WHERE 1=1';
7463 if (in_array($InfoFieldList[0], array(
'tablewithentity'))) {
7464 $sqlwhere .=
" AND entity = " . ((int) $conf->entity);
7470 if (isset($InfoFieldList[7]) && preg_match(
'/^[a-z0-9_\-,]+$/i', $InfoFieldList[7])) {
7471 $sql .=
" ORDER BY ".$this->db->escape($InfoFieldList[7]);
7473 $sql .=
" ORDER BY ".$this->db->sanitize(implode(
', ', $fields_label));
7476 dol_syslog(get_class($this) .
'::showInputField type=sellist', LOG_DEBUG);
7477 $resql = $this->db->query($sql);
7479 $out .=
'<option value="0"> </option>';
7480 $num = $this->db->num_rows($resql);
7484 $obj = $this->db->fetch_object($resql);
7488 $fields_label = explode(
'|', $InfoFieldList[1]);
7489 if (count($fields_label) > 1) {
7491 foreach ($fields_label as $field_toshow) {
7492 $labeltoshow .= $obj->$field_toshow .
' ';
7495 $labeltoshow = $obj->{$InfoFieldList[1]};
7497 $labeltoshow =
dol_trunc($labeltoshow, 45);
7499 if ($value == $obj->rowid) {
7500 foreach ($fields_label as $field_toshow) {
7501 $translabel = $langs->trans($obj->$field_toshow);
7502 if ($translabel != $obj->$field_toshow) {
7503 $labeltoshow =
dol_trunc($translabel) .
' ';
7505 $labeltoshow =
dol_trunc($obj->$field_toshow) .
' ';
7508 $out .=
'<option value="' . $obj->rowid .
'" selected>' . $labeltoshow .
'</option>';
7511 $translabel = $langs->trans($obj->{$InfoFieldList[1]});
7512 if ($translabel != $obj->{$InfoFieldList[1]}) {
7513 $labeltoshow =
dol_trunc($translabel, 18);
7515 $labeltoshow =
dol_trunc($obj->{$InfoFieldList[1]});
7518 if (empty($labeltoshow)) {
7519 $labeltoshow =
'(not defined)';
7521 if ($value == $obj->rowid) {
7522 $out .=
'<option value="' . $obj->rowid .
'" selected>' . $labeltoshow .
'</option>';
7525 if (!empty($InfoFieldList[3]) && $parentField) {
7526 $parent = $parentName .
':' . $obj->{$parentField};
7530 $out .=
'<option value="' . $obj->rowid .
'"';
7531 $out .= ($value == $obj->rowid ?
' selected' :
'');
7532 $out .= (!empty($parent) ?
' parent="' . $parent .
'"' :
'');
7533 $out .=
'>' . $labeltoshow .
'</option>';
7538 $this->db->free($resql);
7540 print
'Error in request ' . $sql .
' ' . $this->db->lasterror() .
'. Check setup of extra parameters.<br>';
7543 require_once DOL_DOCUMENT_ROOT.
'/categories/class/categorie.class.php';
7544 $data = $form->select_all_categories(Categorie::$MAP_ID_TO_CODE[$InfoFieldList[5]],
'',
'parent', 64, $InfoFieldList[6], 1, 1);
7545 $out .=
'<option value="0"> </option>';
7546 foreach ($data as $data_key => $data_value) {
7547 $out .=
'<option value="' . $data_key .
'"';
7548 $out .= ($value == $data_key ?
' selected' :
'');
7549 $out .=
'>' . $data_value .
'</option>';
7553 $out .=
'</select>';
7554 } elseif ($type ==
'checkbox') {
7555 $value_arr = explode(
',', $value);
7556 $out = $form->multiselectarray($keyprefix.$key.$keysuffix, (empty($param[
'options']) ?
null : $param[
'options']), $value_arr,
'', 0, $morecss, 0,
'100%');
7557 } elseif ($type ==
'radio') {
7559 foreach ($param[
'options'] as $keyopt => $valopt) {
7560 $out .=
'<input class="flat '.$morecss.
'" type="radio" name="'.$keyprefix.$key.$keysuffix.
'" id="'.$keyprefix.$key.$keysuffix.
'" '.($moreparam ? $moreparam :
'');
7561 $out .=
' value="'.$keyopt.
'"';
7562 $out .=
' id="'.$keyprefix.$key.$keysuffix.
'_'.$keyopt.
'"';
7563 $out .= ($value == $keyopt ?
'checked' :
'');
7564 $out .=
'/><label for="'.$keyprefix.$key.$keysuffix.
'_'.$keyopt.
'">'.$valopt.
'</label><br>';
7566 } elseif ($type ==
'chkbxlst') {
7567 if (is_array($value)) {
7568 $value_arr = $value;
7570 $value_arr = explode(
',', $value);
7573 if (is_array($param[
'options'])) {
7574 $param_list = array_keys($param[
'options']);
7575 $InfoFieldList = explode(
":", $param_list[0]);
7585 $keyList = (empty($InfoFieldList[2]) ?
'rowid' : $InfoFieldList[2].
' as rowid');
7587 if (count($InfoFieldList) > 3 && !empty($InfoFieldList[3])) {
7588 list($parentName, $parentField) = explode(
'|', $InfoFieldList[3]);
7589 $keyList .=
', '.$parentField;
7591 if (count($InfoFieldList) > 4 && !empty($InfoFieldList[4])) {
7592 if (strpos($InfoFieldList[4],
'extra.') !==
false) {
7593 $keyList =
'main.'.$InfoFieldList[2].
' as rowid';
7595 $keyList = $InfoFieldList[2].
' as rowid';
7599 $filter_categorie =
false;
7600 if (count($InfoFieldList) > 5) {
7601 if ($InfoFieldList[0] ==
'categorie') {
7602 $filter_categorie =
true;
7606 if ($filter_categorie ===
false) {
7607 $fields_label = explode(
'|', $InfoFieldList[1]);
7608 if (is_array($fields_label)) {
7610 $keyList .= implode(
', ', $fields_label);
7614 $sql =
"SELECT " . $keyList;
7615 $sql .=
' FROM ' . $this->db->prefix() . $InfoFieldList[0];
7616 if (!empty($InfoFieldList[4])) {
7618 if (strpos($InfoFieldList[4],
'$SEL$') !==
false) {
7619 $InfoFieldList[4] = str_replace(
'$SEL$',
'SELECT', $InfoFieldList[4]);
7623 if (strpos($InfoFieldList[4],
'$ID$') !==
false && !empty($objectid)) {
7624 $InfoFieldList[4] = str_replace(
'$ID$', $objectid, $InfoFieldList[4]);
7626 $InfoFieldList[4] = str_replace(
'$ID$',
'0', $InfoFieldList[4]);
7630 if (strpos($InfoFieldList[4],
'extra') !==
false) {
7631 $sql .=
' as main, ' . $this->db->prefix() . $InfoFieldList[0] .
'_extrafields as extra';
7632 $sqlwhere .=
" WHERE extra.fk_object=main." . $InfoFieldList[2] .
" AND " . $InfoFieldList[4];
7634 $sqlwhere .=
" WHERE " . $InfoFieldList[4];
7637 $sqlwhere .=
' WHERE 1=1';
7640 if (in_array($InfoFieldList[0], array(
'tablewithentity'))) {
7641 $sqlwhere .=
" AND entity = " . ((int) $conf->entity);
7647 dol_syslog(get_class($this) .
'::showInputField type=chkbxlst', LOG_DEBUG);
7648 $resql = $this->db->query($sql);
7650 $num = $this->db->num_rows($resql);
7657 $obj = $this->db->fetch_object($resql);
7661 $fields_label = explode(
'|', $InfoFieldList[1]);
7662 if (count($fields_label) > 1) {
7664 foreach ($fields_label as $field_toshow) {
7665 $labeltoshow .= $obj->$field_toshow .
' ';
7668 $labeltoshow = $obj->{$InfoFieldList[1]};
7670 $labeltoshow =
dol_trunc($labeltoshow, 45);
7672 if (is_array($value_arr) && in_array($obj->rowid, $value_arr)) {
7673 foreach ($fields_label as $field_toshow) {
7674 $translabel = $langs->trans($obj->$field_toshow);
7675 if ($translabel != $obj->$field_toshow) {
7676 $labeltoshow =
dol_trunc($translabel, 18) .
' ';
7678 $labeltoshow =
dol_trunc($obj->$field_toshow, 18) .
' ';
7682 $data[$obj->rowid] = $labeltoshow;
7685 $translabel = $langs->trans($obj->{$InfoFieldList[1]});
7686 if ($translabel != $obj->{$InfoFieldList[1]}) {
7687 $labeltoshow =
dol_trunc($translabel, 18);
7689 $labeltoshow =
dol_trunc($obj->{$InfoFieldList[1]}, 18);
7692 if (empty($labeltoshow)) {
7693 $labeltoshow =
'(not defined)';
7696 if (is_array($value_arr) && in_array($obj->rowid, $value_arr)) {
7697 $data[$obj->rowid] = $labeltoshow;
7700 if (!empty($InfoFieldList[3]) && $parentField) {
7701 $parent = $parentName .
':' . $obj->{$parentField};
7705 $data[$obj->rowid] = $labeltoshow;
7710 $this->db->free($resql);
7712 $out = $form->multiselectarray($keyprefix . $key . $keysuffix, $data, $value_arr,
'', 0, $morecss, 0,
'100%');
7714 print
'Error in request ' . $sql .
' ' . $this->db->lasterror() .
'. Check setup of extra parameters.<br>';
7717 require_once DOL_DOCUMENT_ROOT.
'/categories/class/categorie.class.php';
7718 $data = $form->select_all_categories(Categorie::$MAP_ID_TO_CODE[$InfoFieldList[5]],
'',
'parent', 64, $InfoFieldList[6], 1, 1);
7719 $out = $form->multiselectarray($keyprefix . $key . $keysuffix, $data, $value_arr,
'', 0, $morecss, 0,
'100%');
7722 } elseif ($type ==
'link') {
7725 $param_list = array_keys($param[
'options']);
7726 $param_list_array = explode(
':', $param_list[0], 4);
7728 $showempty = (($required && $default !=
'') ? 0 : 1);
7730 if (!preg_match(
'/search_/', $keyprefix)) {
7731 if (!empty($param_list_array[2])) {
7732 if (!empty($this->fields[$key][
'picto'])) {
7733 $morecss .=
' widthcentpercentminusxx';
7735 $morecss .=
' widthcentpercentminusx';
7738 if (!empty($this->fields[$key][
'picto'])) {
7739 $morecss .=
' widthcentpercentminusx';
7743 $objectfield = $this->element.($this->module ?
'@'.$this->module :
'').
':'.$key.$keysuffix;
7744 $out = $form->selectForForms($param_list_array[0], $keyprefix.$key.$keysuffix, $value, $showempty,
'',
'', $morecss, $moreparam, 0, (empty($val[
'disabled']) ? 0 : 1),
'', $objectfield);
7746 if (!empty($param_list_array[2])) {
7747 if ((!GETPOSTISSET(
'backtopage') || strpos(
GETPOST(
'backtopage'), $_SERVER[
'PHP_SELF']) === 0)
7748 && empty($val[
'disabled']) && empty($nonewbutton)) {
7749 list($class, $classfile) = explode(
':', $param_list[0]);
7750 if (file_exists(
dol_buildpath(dirname(dirname($classfile)).
'/card.php'))) {
7751 $url_path =
dol_buildpath(dirname(dirname($classfile)).
'/card.php', 1);
7753 $url_path =
dol_buildpath(dirname(dirname($classfile)).
'/'.strtolower($class).
'_card.php', 1);
7755 $paramforthenewlink =
'';
7756 $paramforthenewlink .= (GETPOSTISSET(
'action') ?
'&action='.GETPOST(
'action',
'aZ09') :
'');
7757 $paramforthenewlink .= (GETPOSTISSET(
'id') ?
'&id='.GETPOST(
'id',
'int') :
'');
7758 $paramforthenewlink .= (GETPOSTISSET(
'origin') ?
'&origin='.GETPOST(
'origin',
'aZ09') :
'');
7759 $paramforthenewlink .= (GETPOSTISSET(
'originid') ?
'&originid='.GETPOST(
'originid',
'int') :
'');
7760 $paramforthenewlink .=
'&fk_'.strtolower($class).
'=--IDFORBACKTOPAGE--';
7762 $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>';
7765 } elseif ($type ==
'password') {
7767 if ($keyprefix.$key.$keysuffix ==
'pass_crypted') {
7768 $out =
'<input type="'.($keyprefix ==
'search_' ?
'text' :
'password').
'" class="flat '.$morecss.
'" name="pass" id="pass" value="" '.($moreparam ? $moreparam :
'').
'>';
7769 $out .=
'<input type="hidden" name="pass_crypted" id="pass_crypted" value="'.$value.
'" '.($moreparam ? $moreparam :
'').
'>';
7771 $out =
'<input type="'.($keyprefix ==
'search_' ?
'text' :
'password').
'" class="flat '.$morecss.
'" name="'.$keyprefix.$key.$keysuffix.
'" id="'.$keyprefix.$key.$keysuffix.
'" value="'.$value.
'" '.($moreparam ? $moreparam :
'').
'>';
7773 } elseif ($type ==
'array') {
7775 $newval[
'type'] =
'varchar(256)';
7778 if (!empty($value)) {
7779 foreach ($value as $option) {
7780 $out .=
'<span><a class="'.dol_escape_htmltag($keyprefix.$key.$keysuffix).
'_del" href="javascript:;"><span class="fa fa-minus-circle valignmiddle"></span></a> ';
7781 $out .= $this->showInputField($newval, $keyprefix.$key.$keysuffix.
'[]', $option, $moreparam,
'',
'', $morecss).
'<br></span>';
7784 $out .=
'<a id="'.dol_escape_htmltag($keyprefix.$key.$keysuffix).
'_add" href="javascript:;"><span class="fa fa-plus-circle valignmiddle"></span></a>';
7786 $newInput =
'<span><a class="'.dol_escape_htmltag($keyprefix.$key.$keysuffix).
'_del" href="javascript:;"><span class="fa fa-minus-circle valignmiddle"></span></a> ';
7787 $newInput .= $this->showInputField($newval, $keyprefix.$key.$keysuffix.
'[]',
'', $moreparam,
'',
'', $morecss).
'<br></span>';
7789 if (!empty($conf->use_javascript_ajax)) {
7791 <script nonce="'.getNonce().
'">
7792 $(document).ready(function() {
7793 $("a#'.
dol_escape_js($keyprefix.$key.$keysuffix).
'_add").click(function() {
7797 $(document).on("click", "a.'.
dol_escape_js($keyprefix.$key.$keysuffix).
'_del", function() {
7798 $(this).parent().remove();
7804 if (!empty($hidden)) {
7805 $out =
'<input type="hidden" value="'.$value.
'" name="'.$keyprefix.$key.$keysuffix.
'" id="'.$keyprefix.$key.$keysuffix.
'"/>';
7808 if ($isDependList == 1) {
7809 $out .= $this->getJSListDependancies(
'_common');
7817 if (!empty($fieldValidationErrorMsg) && function_exists(
'getFieldErrorIcon')) {
7818 $out .=
' '.getFieldErrorIcon($fieldValidationErrorMsg);
7837 public function showOutputField($val, $key, $value, $moreparam =
'', $keysuffix =
'', $keyprefix =
'', $morecss =
'')
7839 global $conf, $langs, $form;
7841 if (!is_object($form)) {
7842 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.form.class.php';
7843 $form =
new Form($this->db);
7846 $label = empty($val[
'label']) ?
'' : $val[
'label'];
7847 $type = empty($val[
'type']) ?
'' : $val[
'type'];
7848 $size = empty($val[
'css']) ?
'' : $val[
'css'];
7852 if (preg_match(
'/varchar\((\d+)\)/', $type, $reg)) {
7855 } elseif (preg_match(
'/varchar/', $type)) {
7858 if (!empty($val[
'arrayofkeyval']) && is_array($val[
'arrayofkeyval'])) {
7859 $type = (($this->fields[$key][
'type']==
'checkbox') ? $this->fields[$key][
'type'] :
'select');
7861 if (preg_match(
'/^integer:(.*):(.*)/i', $val[
'type'], $reg)) {
7865 $default = empty($val[
'default']) ?
'' : $val[
'default'];
7866 $computed = empty($val[
'computed']) ?
'' : $val[
'computed'];
7867 $unique = empty($val[
'unique']) ?
'' : $val[
'unique'];
7868 $required = empty($val[
'required']) ?
'' : $val[
'required'];
7870 $param[
'options'] = array();
7872 if (!empty($val[
'arrayofkeyval']) && is_array($val[
'arrayofkeyval'])) {
7873 $param[
'options'] = $val[
'arrayofkeyval'];
7875 if (preg_match(
'/^integer:([^:]*):([^:]*)/i', $val[
'type'], $reg)) {
7877 $stringforoptions = $reg[1].
':'.$reg[2];
7879 if ($reg[1] ==
'User') {
7880 $stringforoptions .=
':#getnomurlparam1=-1';
7882 $param[
'options'] = array($stringforoptions => $stringforoptions);
7883 } elseif (preg_match(
'/^sellist:(.*):(.*):(.*):(.*)/i', $val[
'type'], $reg)) {
7884 $param[
'options'] = array($reg[1].
':'.$reg[2].
':'.$reg[3].
':'.$reg[4] =>
'N');
7886 } elseif (preg_match(
'/^sellist:(.*):(.*):(.*)/i', $val[
'type'], $reg)) {
7887 $param[
'options'] = array($reg[1].
':'.$reg[2].
':'.$reg[3] =>
'N');
7889 } elseif (preg_match(
'/^sellist:(.*):(.*)/i', $val[
'type'], $reg)) {
7890 $param[
'options'] = array($reg[1].
':'.$reg[2] =>
'N');
7892 } elseif (preg_match(
'/^chkbxlst:(.*)/i', $val[
'type'], $reg)) {
7893 $param[
'options'] = array($reg[1] =>
'N');
7897 $langfile = empty($val[
'langfile']) ?
'' : $val[
'langfile'];
7898 $list = (empty($val[
'list']) ?
'' : $val[
'list']);
7899 $help = (empty($val[
'help']) ?
'' : $val[
'help']);
7900 $hidden = (($val[
'visible'] == 0) ? 1 : 0);
7910 $value =
dol_eval($computed, 1, 0,
'2');
7913 if (empty($morecss)) {
7914 if ($type ==
'date') {
7915 $morecss =
'minwidth100imp';
7916 } elseif ($type ==
'datetime' || $type ==
'timestamp') {
7917 $morecss =
'minwidth200imp';
7918 } elseif (in_array($type, array(
'int',
'double',
'price'))) {
7919 $morecss =
'maxwidth75';
7920 } elseif ($type ==
'url') {
7921 $morecss =
'minwidth400';
7922 } elseif ($type ==
'boolean') {
7925 if (is_numeric($size) && round($size) < 12) {
7926 $morecss =
'minwidth100';
7927 } elseif (is_numeric($size) && round($size) <= 48) {
7928 $morecss =
'minwidth200';
7930 $morecss =
'minwidth400';
7936 if (in_array($key, array(
'rowid',
'ref')) && method_exists($this,
'getNomUrl')) {
7937 if ($key !=
'rowid' || empty($this->fields[
'ref'])) {
7938 $value = $this->getNomUrl(1,
'', 0,
'', 1);
7940 } elseif ($key ==
'status' && method_exists($this,
'getLibStatut')) {
7941 $value = $this->getLibStatut(3);
7942 } elseif ($type ==
'date') {
7943 if (!empty($value)) {
7948 } elseif ($type ==
'datetime' || $type ==
'timestamp') {
7949 if (!empty($value)) {
7954 } elseif ($type ==
'duration') {
7955 include_once DOL_DOCUMENT_ROOT.
'/core/lib/date.lib.php';
7956 if (!is_null($value) && $value !==
'') {
7959 } elseif ($type ==
'double' || $type ==
'real') {
7960 if (!is_null($value) && $value !==
'') {
7961 $value =
price($value);
7963 } elseif ($type ==
'boolean') {
7965 if (!empty($value)) {
7966 $checked =
' checked ';
7968 $value =
'<input type="checkbox" '.$checked.
' '.($moreparam ? $moreparam :
'').
' readonly disabled>';
7969 } elseif ($type ==
'mail' || $type ==
'email') {
7971 } elseif ($type ==
'url') {
7973 } elseif ($type ==
'phone') {
7975 } elseif ($type ==
'ip') {
7977 } elseif ($type ==
'price') {
7978 if (!is_null($value) && $value !==
'') {
7979 $value =
price($value, 0, $langs, 0, 0, -1, $conf->currency);
7981 } elseif ($type ==
'select') {
7982 $value = isset($param[
'options'][$value]) ? $param[
'options'][$value] :
'';
7983 if (strpos($value,
"|") !==
false) {
7984 $value = $langs->trans(explode(
'|', $value)[0]);
7986 } elseif ($type ==
'sellist') {
7987 $param_list = array_keys($param[
'options']);
7988 $InfoFieldList = explode(
":", $param_list[0]);
7990 $selectkey =
"rowid";
7993 if (count($InfoFieldList) > 4 && !empty($InfoFieldList[4])) {
7994 $selectkey = $InfoFieldList[2];
7995 $keyList = $InfoFieldList[2].
' as rowid';
7998 $fields_label = explode(
'|', $InfoFieldList[1]);
7999 if (is_array($fields_label)) {
8001 $keyList .= implode(
', ', $fields_label);
8004 $filter_categorie =
false;
8005 if (count($InfoFieldList) > 5) {
8006 if ($InfoFieldList[0] ==
'categorie') {
8007 $filter_categorie =
true;
8011 $sql =
"SELECT ".$keyList;
8012 $sql .=
' FROM '.$this->db->prefix().$InfoFieldList[0];
8013 if (strpos($InfoFieldList[4],
'extra') !==
false) {
8016 if ($selectkey ==
'rowid' && empty($value)) {
8017 $sql .=
" WHERE ".$selectkey.
" = 0";
8018 } elseif ($selectkey ==
'rowid') {
8019 $sql .=
" WHERE ".$selectkey.
" = ".((int) $value);
8021 $sql .=
" WHERE ".$selectkey.
" = '".$this->db->escape($value).
"'";
8026 dol_syslog(get_class($this).
':showOutputField:$type=sellist', LOG_DEBUG);
8027 $resql = $this->db->query($sql);
8029 if ($filter_categorie ===
false) {
8031 $numrows = $this->db->num_rows($resql);
8033 $obj = $this->db->fetch_object($resql);
8036 $fields_label = explode(
'|', $InfoFieldList[1]);
8038 if (is_array($fields_label) && count($fields_label) > 1) {
8039 foreach ($fields_label as $field_toshow) {
8041 if (!empty($obj->$field_toshow)) {
8042 $translabel = $langs->trans($obj->$field_toshow);
8044 if ($translabel != $field_toshow) {
8045 $value .=
dol_trunc($translabel, 18) .
' ';
8047 $value .= $obj->$field_toshow .
' ';
8052 if (!empty($obj->{$InfoFieldList[1]})) {
8053 $translabel = $langs->trans($obj->{$InfoFieldList[1]});
8055 if ($translabel != $obj->{$InfoFieldList[1]}) {
8058 $value = $obj->{$InfoFieldList[1]};
8063 require_once DOL_DOCUMENT_ROOT .
'/categories/class/categorie.class.php';
8066 $obj = $this->db->fetch_object($resql);
8068 $c->fetch($obj->rowid);
8069 $ways = $c->print_all_ways();
8070 foreach ($ways as $way) {
8071 $toprint[] =
'<li class="select2-search-choice-dolibarr noborderoncategories"' . ($c->color ?
' style="background: #' . $c->color .
';"' :
' style="background: #aaa"') .
'>' .
img_object(
'',
'category') .
' ' . $way .
'</li>';
8073 $value =
'<div class="select2-container-multi-dolibarr" style="width: 90%;"><ul class="select2-choices-dolibarr">'.implode(
' ', $toprint).
'</ul></div>';
8076 dol_syslog(get_class($this).
'::showOutputField error '.$this->db->lasterror(), LOG_WARNING);
8078 } elseif ($type ==
'radio') {
8079 $value = $param[
'options'][$value];
8080 } elseif ($type ==
'checkbox') {
8081 $value_arr = explode(
',', $value);
8083 if (is_array($value_arr) && count($value_arr) > 0) {
8085 foreach ($value_arr as $keyval => $valueval) {
8086 if (!empty($valueval)) {
8087 $toprint[] =
'<li class="select2-search-choice-dolibarr noborderoncategories" style="background: #bbb">' . $param[
'options'][$valueval] .
'</li>';
8090 if (!empty($toprint)) {
8091 $value =
'<div class="select2-container-multi-dolibarr" style="width: 90%;"><ul class="select2-choices-dolibarr">' . implode(
' ', $toprint) .
'</ul></div>';
8094 } elseif ($type ==
'chkbxlst') {
8095 $value_arr = explode(
',', $value);
8097 $param_list = array_keys($param[
'options']);
8098 $InfoFieldList = explode(
":", $param_list[0]);
8100 $selectkey =
"rowid";
8103 if (count($InfoFieldList) >= 3) {
8104 $selectkey = $InfoFieldList[2];
8105 $keyList = $InfoFieldList[2].
' as rowid';
8108 $fields_label = explode(
'|', $InfoFieldList[1]);
8109 if (is_array($fields_label)) {
8111 $keyList .= implode(
', ', $fields_label);
8114 $filter_categorie =
false;
8115 if (count($InfoFieldList) > 5) {
8116 if ($InfoFieldList[0] ==
'categorie') {
8117 $filter_categorie =
true;
8121 $sql =
"SELECT ".$keyList;
8122 $sql .=
' FROM '.$this->db->prefix().$InfoFieldList[0];
8123 if (strpos($InfoFieldList[4],
'extra') !==
false) {
8129 dol_syslog(get_class($this).
':showOutputField:$type=chkbxlst', LOG_DEBUG);
8130 $resql = $this->db->query($sql);
8132 if ($filter_categorie ===
false) {
8135 while ($obj = $this->db->fetch_object($resql)) {
8137 $fields_label = explode(
'|', $InfoFieldList[1]);
8138 if (is_array($value_arr) && in_array($obj->rowid, $value_arr)) {
8139 if (is_array($fields_label) && count($fields_label) > 1) {
8140 foreach ($fields_label as $field_toshow) {
8142 if (!empty($obj->$field_toshow)) {
8143 $translabel = $langs->trans($obj->$field_toshow);
8145 if ($translabel != $field_toshow) {
8146 $toprint[] =
'<li class="select2-search-choice-dolibarr noborderoncategories" style="background: #bbb">' .
dol_trunc($translabel, 18) .
'</li>';
8148 $toprint[] =
'<li class="select2-search-choice-dolibarr noborderoncategories" style="background: #bbb">' . $obj->$field_toshow .
'</li>';
8153 if (!empty($obj->{$InfoFieldList[1]})) {
8154 $translabel = $langs->trans($obj->{$InfoFieldList[1]});
8156 if ($translabel != $obj->{$InfoFieldList[1]}) {
8157 $toprint[] =
'<li class="select2-search-choice-dolibarr noborderoncategories" style="background: #bbb">' .
dol_trunc($translabel, 18) .
'</li>';
8159 $toprint[] =
'<li class="select2-search-choice-dolibarr noborderoncategories" style="background: #bbb">' . $obj->{$InfoFieldList[1]} .
'</li>';
8165 require_once DOL_DOCUMENT_ROOT .
'/categories/class/categorie.class.php';
8168 while ($obj = $this->db->fetch_object($resql)) {
8169 if (is_array($value_arr) && in_array($obj->rowid, $value_arr)) {
8171 $c->fetch($obj->rowid);
8172 $ways = $c->print_all_ways();
8173 foreach ($ways as $way) {
8174 $toprint[] =
'<li class="select2-search-choice-dolibarr noborderoncategories"' . ($c->color ?
' style="background: #' . $c->color .
';"' :
' style="background: #aaa"') .
'>' .
img_object(
'',
'category') .
' ' . $way .
'</li>';
8179 $value =
'<div class="select2-container-multi-dolibarr" style="width: 90%;"><ul class="select2-choices-dolibarr">'.implode(
' ', $toprint).
'</ul></div>';
8181 dol_syslog(get_class($this).
'::showOutputField error '.$this->db->lasterror(), LOG_WARNING);
8183 } elseif ($type ==
'link') {
8188 $param_list = array_keys($param[
'options']);
8192 $InfoFieldList = explode(
":", $param_list[0]);
8194 $classname = $InfoFieldList[0];
8195 $classpath = $InfoFieldList[1];
8198 $getnomurlparam = 3;
8199 $getnomurlparam2 =
'';
8201 if (preg_match(
'/#getnomurlparam1=([^#]*)/', $param_list[0], $regtmp)) {
8202 $getnomurlparam = $regtmp[1];
8204 if (preg_match(
'/#getnomurlparam2=([^#]*)/', $param_list[0], $regtmp)) {
8205 $getnomurlparam2 = $regtmp[1];
8208 if (!empty($classpath)) {
8211 if ($classname && !class_exists($classname)) {
8215 if ($element_prop) {
8216 $classname = $element_prop[
'classname'];
8221 if ($classname && class_exists($classname)) {
8222 $object =
new $classname($this->db);
8223 if ($object->element ===
'product') {
8224 $result = $object->fetch($value,
'',
'',
'', 0, 1, 1);
8226 $result = $object->fetch($value);
8229 if ($object->element ===
'product') {
8230 $get_name_url_param_arr = array($getnomurlparam, $getnomurlparam2, 0, -1, 0,
'', 0);
8231 if (isset($val[
'get_name_url_params'])) {
8232 $get_name_url_params = explode(
':', $val[
'get_name_url_params']);
8233 if (!empty($get_name_url_params)) {
8234 $param_num_max = count($get_name_url_param_arr) - 1;
8235 foreach ($get_name_url_params as $param_num => $param_value) {
8236 if ($param_num > $param_num_max) {
8239 $get_name_url_param_arr[$param_num] = $param_value;
8247 $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]);
8249 $value = $object->getNomUrl($getnomurlparam, $getnomurlparam2);
8256 dol_syslog(
'Error bad setup of extrafield', LOG_WARNING);
8257 return 'Error bad setup of extrafield';
8262 } elseif ($type ==
'password') {
8263 $value = preg_replace(
'/./i',
'*', $value);
8264 } elseif ($type ==
'array') {
8265 $value = implode(
'<br>', $value);
8285 unset($this->validateFieldsErrors[$fieldKey]);
8299 $msg = $langs->trans(
"UnknowError");
8302 $this->error = $this->validateFieldsErrors[$fieldKey] = $msg;
8313 if (!empty($this->validateFieldsErrors[$fieldKey])) {
8314 return $this->validateFieldsErrors[$fieldKey];
8331 if (!class_exists(
'Validate')) {
8332 require_once DOL_DOCUMENT_ROOT .
'/core/class/validate.class.php';
8335 $this->clearFieldError($fieldKey);
8337 if (!isset($fields[$fieldKey])) {
8338 $this->setFieldError($fieldKey, $langs->trans(
'FieldNotFoundInObject'));
8342 $val = $fields[$fieldKey];
8345 $param[
'options'] = array();
8346 $type = $val[
'type'];
8349 if (isset($val[
'notnull']) && $val[
'notnull'] === 1) {
8363 if (preg_match(
'/varchar\((\d+)\)/', $type, $reg)) {
8366 } elseif (preg_match(
'/varchar/', $type)) {
8370 if (!empty($val[
'arrayofkeyval']) && is_array($val[
'arrayofkeyval'])) {
8374 if (!empty($val[
'type']) && preg_match(
'/^integer:(.*):(.*)/i', $val[
'type'], $reg)) {
8378 if (!empty($val[
'arrayofkeyval']) && is_array($val[
'arrayofkeyval'])) {
8379 $param[
'options'] = $val[
'arrayofkeyval'];
8382 if (preg_match(
'/^integer:(.*):(.*)/i', $val[
'type'], $reg)) {
8384 $param[
'options'] = array($reg[1].
':'.$reg[2]=>$reg[1].
':'.$reg[2]);
8385 } elseif (preg_match(
'/^sellist:(.*):(.*):(.*):(.*)/i', $val[
'type'], $reg)) {
8386 $param[
'options'] = array($reg[1].
':'.$reg[2].
':'.$reg[3].
':'.$reg[4] =>
'N');
8388 } elseif (preg_match(
'/^sellist:(.*):(.*):(.*)/i', $val[
'type'], $reg)) {
8389 $param[
'options'] = array($reg[1].
':'.$reg[2].
':'.$reg[3] =>
'N');
8391 } elseif (preg_match(
'/^sellist:(.*):(.*)/i', $val[
'type'], $reg)) {
8392 $param[
'options'] = array($reg[1].
':'.$reg[2] =>
'N');
8401 $validate =
new Validate($this->db, $langs);
8411 if ($required && !$validate->isNotEmptyString($fieldValue)) {
8412 $this->setFieldError($fieldKey, $validate->error);
8414 } elseif (!$required && !$validate->isNotEmptyString($fieldValue)) {
8420 if (!empty($maxSize) && !$validate->isMaxLength($fieldValue, $maxSize)) {
8421 $this->setFieldError($fieldKey, $validate->error);
8426 if (!empty($minSize) && !$validate->isMinLength($fieldValue, $minSize)) {
8427 $this->setFieldError($fieldKey, $validate->error);
8435 if (in_array($type, array(
'date',
'datetime',
'timestamp'))) {
8436 if (!$validate->isTimestamp($fieldValue)) {
8437 $this->setFieldError($fieldKey, $validate->error);
8442 } elseif ($type ==
'duration') {
8443 if (!$validate->isDuration($fieldValue)) {
8444 $this->setFieldError($fieldKey, $validate->error);
8449 } elseif (in_array($type, array(
'double',
'real',
'price'))) {
8451 if (!$validate->isNumeric($fieldValue)) {
8452 $this->setFieldError($fieldKey, $validate->error);
8457 } elseif ($type ==
'boolean') {
8458 if (!$validate->isBool($fieldValue)) {
8459 $this->setFieldError($fieldKey, $validate->error);
8464 } elseif ($type ==
'mail') {
8465 if (!$validate->isEmail($fieldValue)) {
8466 $this->setFieldError($fieldKey, $validate->error);
8469 } elseif ($type ==
'url') {
8470 if (!$validate->isUrl($fieldValue)) {
8471 $this->setFieldError($fieldKey, $validate->error);
8476 } elseif ($type ==
'phone') {
8477 if (!$validate->isPhone($fieldValue)) {
8478 $this->setFieldError($fieldKey, $validate->error);
8483 } elseif ($type ==
'select' || $type ==
'radio') {
8484 if (!isset($param[
'options'][$fieldValue])) {
8485 $this->error = $langs->trans(
'RequireValidValue');
8490 } elseif ($type ==
'sellist' || $type ==
'chkbxlst') {
8491 $param_list = array_keys($param[
'options']);
8492 $InfoFieldList = explode(
":", $param_list[0]);
8493 $value_arr = explode(
',', $fieldValue);
8494 $value_arr = array_map(array($this->db,
'escape'), $value_arr);
8496 $selectkey =
"rowid";
8497 if (count($InfoFieldList) > 4 && !empty($InfoFieldList[4])) {
8498 $selectkey = $InfoFieldList[2];
8501 if (!$validate->isInDb($value_arr, $InfoFieldList[0], $selectkey)) {
8502 $this->setFieldError($fieldKey, $validate->error);
8507 } elseif ($type ==
'link') {
8508 $param_list = array_keys($param[
'options']);
8509 $InfoFieldList = explode(
":", $param_list[0]);
8510 $classname = $InfoFieldList[0];
8511 $classpath = $InfoFieldList[1];
8512 if (!$validate->isFetchable($fieldValue, $classname, $classpath)) {
8513 $lastIsFetchableError = $validate->error;
8516 if ($validate->isFetchableElement($fieldValue, $classname)) {
8520 $this->setFieldError($fieldKey, $lastIsFetchableError);
8544 public function showOptionals($extrafields, $mode =
'view', $params =
null, $keysuffix =
'', $keyprefix =
'', $onetrtd =
'', $display_type =
'card')
8546 global $db, $conf, $langs, $action, $form, $hookmanager;
8548 if (!is_object($form)) {
8549 $form =
new Form($db);
8551 if (!is_object($extrafields)) {
8552 dol_syslog(
'Bad parameter extrafields for showOptionals', LOG_ERR);
8553 return 'Bad parameter extrafields for showOptionals';
8555 if (!is_array($extrafields->attributes[$this->table_element])) {
8556 dol_syslog(
"extrafields->attributes was not loaded with extrafields->fetch_name_optionals_label(table_element);", LOG_WARNING);
8561 $parameters = array(
'mode'=>$mode,
'params'=>$params,
'keysuffix'=>$keysuffix,
'keyprefix'=>$keyprefix,
'display_type'=>$display_type);
8562 $reshook = $hookmanager->executeHooks(
'showOptionals', $parameters, $this, $action);
8564 if (empty($reshook)) {
8565 if (is_array($extrafields->attributes[$this->table_element]) && key_exists(
'label', $extrafields->attributes[$this->table_element]) && is_array($extrafields->attributes[$this->table_element][
'label']) && count($extrafields->attributes[$this->table_element][
'label']) > 0) {
8567 $out .=
'<!-- commonobject:showOptionals --> ';
8570 $nbofextrafieldsshown = 0;
8573 $lastseparatorkeyfound =
'';
8574 $extrafields_collapse_num =
'';
8575 $extrafields_collapse_num_old =
'';
8578 foreach ($extrafields->attributes[$this->table_element][
'label'] as $key => $label) {
8582 if (is_array($params) && array_key_exists(
'onlykey', $params) && $key != $params[
'onlykey']) {
8588 if ($enabled && isset($extrafields->attributes[$this->table_element][
'enabled'][$key])) {
8589 $enabled =
dol_eval($extrafields->attributes[$this->table_element][
'enabled'][$key], 1, 1,
'2');
8591 if (empty($enabled)) {
8596 if ($visibility && isset($extrafields->attributes[$this->table_element][
'list'][$key])) {
8597 $visibility =
dol_eval($extrafields->attributes[$this->table_element][
'list'][$key], 1, 1,
'2');
8601 if ($perms && isset($extrafields->attributes[$this->table_element][
'perms'][$key])) {
8602 $perms =
dol_eval($extrafields->attributes[$this->table_element][
'perms'][$key], 1, 1,
'2');
8605 if (($mode ==
'create') && abs($visibility) != 1 && abs($visibility) != 3) {
8607 } elseif (($mode ==
'edit') && abs($visibility) != 1 && abs($visibility) != 3 && abs($visibility) != 4) {
8609 $ef_name =
'options_' . $key;
8610 $ef_value = $this->array_options[$ef_name];
8611 $out .=
'<input type="hidden" name="' . $ef_name .
'" id="' . $ef_name .
'" value="' . $ef_value .
'" />' .
"\n";
8613 } elseif ($mode ==
'view' && empty($visibility)) {
8616 if (empty($perms)) {
8621 if (!empty($extrafields->attributes[$this->table_element][
'langfile'][$key])) {
8622 $langs->load($extrafields->attributes[$this->table_element][
'langfile'][$key]);
8626 if (is_array($params) && count($params) > 0 && $display_type==
'card') {
8627 if (array_key_exists(
'cols', $params)) {
8628 $colspan = $params[
'cols'];
8629 } elseif (array_key_exists(
'colspan', $params)) {
8631 if (preg_match(
'/colspan="(\d+)"/', $params[
'colspan'], $reg)) {
8634 $colspan = $params[
'colspan'];
8638 $colspan = intval($colspan);
8642 $value = ((!empty($this->array_options) && array_key_exists(
"options_".$key.$keysuffix, $this->array_options)) ? $this->array_options[
"options_".$key.$keysuffix] :
null);
8648 $check =
'alphanohtml';
8649 if (in_array($extrafields->attributes[$this->table_element][
'type'][$key], array(
'html',
'text'))) {
8650 $check =
'restricthtml';
8652 $getposttemp =
GETPOST($keyprefix.
'options_'.$key.$keysuffix, $check, 3);
8654 if (is_array($getposttemp) || $getposttemp !=
'' || GETPOSTISSET($keyprefix.
'options_'.$key.$keysuffix)) {
8655 if (is_array($getposttemp)) {
8657 $value = implode(
",", $getposttemp);
8659 $value = $getposttemp;
8661 } elseif (in_array($extrafields->attributes[$this->table_element][
'type'][$key], array(
'int'))) {
8662 $value =( !empty($this->array_options[
"options_".$key]) || (isset($this->array_options[
"options_".$key]) && $this->array_options[
"options_".$key] ===
'0')) ? $this->array_options[
"options_".$key] :
'';
8664 $value = (!empty($this->array_options[
"options_".$key]) ? $this->array_options[
"options_".$key] :
'');
8670 $nbofextrafieldsshown++;
8673 if ($extrafields->attributes[$this->table_element][
'type'][$key] ==
'separate') {
8674 $extrafields_collapse_num = $key;
8692 $out .= $extrafields->showSeparator($key, $this, ($colspan ? $colspan + 1 : 2), $display_type, $mode);
8694 $lastseparatorkeyfound = $key;
8696 $collapse_group = $extrafields_collapse_num.(!empty($this->
id) ?
'_'.$this->id :
'');
8698 $class = (!empty($extrafields->attributes[$this->table_element][
'hidden'][$key]) ?
'hideobject ' :
'');
8700 if (is_array($params) && count($params) > 0) {
8701 if (array_key_exists(
'class', $params)) {
8702 $class .= $params[
'class'].
' ';
8704 if (array_key_exists(
'style', $params)) {
8705 $csstyle = $params[
'style'];
8710 $domData =
' data-element="extrafield"';
8711 $domData .=
' data-targetelement="'.$this->element.
'"';
8712 $domData .=
' data-targetid="'.$this->id.
'"';
8714 $html_id = (empty($this->
id) ?
'' :
'extrarow-'.$this->element.
'_'.$key.
'_'.$this->id);
8715 if ($display_type==
'card') {
8720 if ($action ==
'selectlines') {
8726 if (in_array($extrafields->attributes[$this->table_element][
'type'][$key], array(
'date'))) {
8727 $datenotinstring =
null;
8728 if (array_key_exists(
'options_'.$key, $this->array_options)) {
8729 $datenotinstring = $this->array_options[
'options_'.$key];
8730 if (!is_numeric($this->array_options[
'options_'.$key])) {
8731 $datenotinstring = $this->db->jdate($datenotinstring);
8734 $datekey = $keyprefix.
'options_'.$key.$keysuffix;
8735 $value = (GETPOSTISSET($datekey) && $this->
id ==
GETPOST(
'elrowid',
'int')) ?
dol_mktime(12, 0, 0,
GETPOST($datekey.
'month',
'int', 3),
GETPOST($datekey.
'day',
'int', 3),
GETPOST($datekey.
'year',
'int', 3)) : $datenotinstring;
8737 if (in_array($extrafields->attributes[$this->table_element][
'type'][$key], array(
'datetime'))) {
8738 $datenotinstring =
null;
8739 if (array_key_exists(
'options_'.$key, $this->array_options)) {
8740 $datenotinstring = $this->array_options[
'options_'.$key];
8741 if (!is_numeric($this->array_options[
'options_'.$key])) {
8742 $datenotinstring = $this->db->jdate($datenotinstring);
8745 $timekey = $keyprefix.
'options_'.$key.$keysuffix;
8746 $value = (GETPOSTISSET($timekey)) ?
dol_mktime(
GETPOST($timekey.
'hour',
'int', 3),
GETPOST($timekey.
'min',
'int', 3),
GETPOST($timekey.
'sec',
'int', 3),
GETPOST($timekey.
'month',
'int', 3),
GETPOST($timekey.
'day',
'int', 3),
GETPOST($timekey.
'year',
'int', 3),
'tzuserrel') : $datenotinstring;
8749 if (in_array($extrafields->attributes[$this->table_element][
'type'][$key], array(
'price',
'double'))) {
8750 if (GETPOSTISSET($keyprefix.
'options_'.$key.$keysuffix) || $value) {
8752 } elseif (isset($this->array_options[
'options_'.$key])) {
8753 $value = $this->array_options[
'options_'.$key];
8758 if (in_array($extrafields->attributes[$this->table_element][
'type'][$key], array(
'html',
'text',
'varchar',
'select',
'radio',
'int',
'boolean'))) {
8759 if ($action ==
'create' || $mode ==
'create') {
8760 $value = (GETPOSTISSET($keyprefix.
'options_'.$key.$keysuffix) || $value) ? $value : $extrafields->attributes[$this->table_element][
'default'][$key];
8764 $labeltoshow = $langs->trans($label);
8765 $helptoshow = $langs->trans($extrafields->attributes[$this->table_element][
'help'][$key]);
8767 if ($display_type ==
'card') {
8768 $out .=
'<tr '.($html_id ?
'id="'.$html_id.
'" ' :
'').$csstyle.
' class="field_options_'.$key.
' '.$class.$this->element.
'_extras_'.$key.
' trextrafields_collapse'.$collapse_group.
'" '.$domData.
' >';
8769 if (
getDolGlobalString(
'MAIN_VIEW_LINE_NUMBER') && ($action ==
'view' || $action ==
'valid' || $action ==
'editline' || $action ==
'confirm_valid' || $action ==
'confirm_cancel')) {
8770 $out .=
'<td></td>';
8772 $out .=
'<td class="'.(empty($params[
'tdclass']) ?
'titlefieldcreate' : $params[
'tdclass']).
' wordbreak';
8773 } elseif ($display_type ==
'line') {
8774 $out .=
'<div '.($html_id ?
'id="'.$html_id.
'" ' :
'').$csstyle.
' class="fieldline_options_'.$key.
' '.$class.$this->element.
'_extras_'.$key.
' trextrafields_collapse'.$collapse_group.
'" '.$domData.
' >';
8775 $out .=
'<div style="display: inline-block; padding-right:4px" class="wordbreak';
8780 $tpl_context = isset($params[
"tpl_context"]) ? $params[
"tpl_context"] :
"none";
8781 if ($tpl_context !=
"public") {
8782 if ($mode !=
'view' && !empty($extrafields->attributes[$this->table_element][
'required'][$key])) {
8783 $out .=
' fieldrequired';
8787 if ($tpl_context ==
"public") {
8788 if (!empty($extrafields->attributes[$this->table_element][
'help'][$key])) {
8789 $out .= $form->textwithpicto($labeltoshow, $helptoshow);
8791 $out .= $labeltoshow;
8793 if ($mode !=
'view' && !empty($extrafields->attributes[$this->table_element][
'required'][$key])) {
8794 $out .=
' <span style="color: red">*</span>';
8797 if (!empty($extrafields->attributes[$this->table_element][
'help'][$key])) {
8798 $out .= $form->textwithpicto($labeltoshow, $helptoshow);
8800 $out .= $labeltoshow;
8804 $out .= ($display_type ==
'card' ?
'</td>' :
'</div>');
8806 $html_id = !empty($this->
id) ? $this->element.
'_extras_'.$key.
'_'.$this->id :
'';
8807 if ($display_type ==
'card') {
8809 $out .=
'<td '.($html_id ?
'id="'.$html_id.
'" ' :
'').
' class="valuefieldcreate '.$this->element.
'_extras_'.$key.
'" '.($colspan ?
' colspan="'.$colspan.
'"' :
'').
'>';
8810 } elseif ($display_type ==
'line') {
8811 $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].
'">';
8816 $out .= $extrafields->showOutputField($key, $value,
'', $this->table_element);
8819 $out .= $extrafields->showInputField($key, $value,
'', $keysuffix,
'', 0, $this->
id, $this->table_element);
8822 $out .= $extrafields->showInputField($key, $value,
'', $keysuffix,
'', 0, $this->
id, $this->table_element);
8826 $out .= ($display_type==
'card' ?
'</td>' :
'</div>');
8829 $out .= ($display_type==
'card' ?
'</tr>' :
'</div>');
8831 $out .= ($display_type==
'card' ?
'</tr>' :
'</div>');
8839 if (!empty($conf->use_javascript_ajax)) {
8840 $out .= $this->getJSListDependancies();
8843 $out .=
'<!-- commonobject:showOptionals end --> '.
"\n";
8845 if (empty($nbofextrafieldsshown)) {
8851 $out .= $hookmanager->resPrint;
8863 <script nonce="'.getNonce().
'">
8864 jQuery(document).ready(function() {
8865 function showOptions'.$type.
'(child_list, parent_list, orig_select)
8867 var val = $("select[name=\""+parent_list+"\"]").val();
8868 var parentVal = parent_list + ":" + val;
8869 if(typeof val == "string"){
8871 var options = orig_select.find("option[parent=\""+parentVal+"\"]").clone();
8872 $("select[name=\""+child_list+"\"] option[parent]").remove();
8873 $("select[name=\""+child_list+"\"]").append(options);
8875 var options = orig_select.find("option[parent]").clone();
8876 $("select[name=\""+child_list+"\"] option[parent]").remove();
8877 $("select[name=\""+child_list+"\"]").append(options);
8879 } else if(val > 0) {
8880 var options = orig_select.find("option[parent=\""+parentVal+"\"]").clone();
8881 $("select[name=\""+child_list+"\"] option[parent]").remove();
8882 $("select[name=\""+child_list+"\"]").append(options);
8884 var options = orig_select.find("option[parent]").clone();
8885 $("select[name=\""+child_list+"\"] option[parent]").remove();
8886 $("select[name=\""+child_list+"\"]").append(options);
8889 function setListDependencies'.$type.
'() {
8890 jQuery("select option[parent]").parent().each(function() {
8891 var orig_select = {};
8892 var child_list = $(this).attr("name");
8893 orig_select[child_list] = $(this).clone();
8894 var parent = $(this).find("option[parent]:first").attr("parent");
8895 var infos = parent.split(":");
8896 var parent_list = infos[0];
8898 //Hide daughters lists
8899 if ($("#"+child_list).val() == 0 && $("#"+parent_list).val() == 0){
8900 $("#"+child_list).hide();
8902 } else if ($("#"+parent_list).val() != 0){
8903 $("#"+parent_list).show();
8905 //Show the child list if the parent list value is selected
8906 $("select[name=\""+parent_list+"\"]").click(function() {
8907 if ($(this).val() != 0){
8908 $("#"+child_list).show()
8912 //When we change parent list
8913 $("select[name=\""+parent_list+"\"]").change(function() {
8914 showOptions'.$type.
'(child_list, parent_list, orig_select[child_list]);
8915 //Select the value 0 on child list after a change on the parent list
8916 $("#"+child_list).val(0).trigger("change");
8917 //Hide child lists if the parent value is set to 0
8918 if ($(this).val() == 0){
8919 $("#"+child_list).hide();
8925 setListDependencies'.$type.
'();
8940 $module = empty($this->module) ?
'' : $this->module;
8941 $element = $this->element;
8943 if ($element ==
'facturerec') {
8944 $element =
'facture';
8945 } elseif ($element ==
'invoice_supplier_rec') {
8946 return !$user->hasRight(
'fournisseur',
'facture') ? null : $user->hasRight(
'fournisseur',
'facture');
8947 } elseif ($module && $user->hasRight($module, $element)) {
8949 return $user->hasRight($module, $element);
8952 return $user->rights->$element;
8969 foreach ($tables as $table) {
8970 $sql =
'UPDATE '.$dbs->prefix().$table.
' SET fk_soc = '.((int) $dest_id).
' WHERE fk_soc = '.((int) $origin_id);
8972 if (!$dbs->
query($sql)) {
8973 if ($ignoreerrors) {
8998 foreach ($tables as $table) {
8999 $sql =
'UPDATE '.MAIN_DB_PREFIX.$table.
' SET fk_product = '.((int) $dest_id).
' WHERE fk_product = '.((int) $origin_id);
9001 if (!$dbs->
query($sql)) {
9002 if ($ignoreerrors) {
9025 public function defineBuyPrice($unitPrice = 0.0, $discountPercent = 0.0, $fk_product = 0)
9031 if (($unitPrice > 0) && (isset($conf->global->ForceBuyingPriceIfNull) &&
getDolGlobalInt(
'ForceBuyingPriceIfNull') > 0)) {
9033 $buyPrice = $unitPrice * (1 - $discountPercent / 100);
9036 if (!empty($fk_product) && $fk_product > 0) {
9038 require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
9039 $product =
new Product($this->db);
9040 $result = $product->fetch($fk_product);
9042 $this->errors[] =
'ErrorProductIdDoesNotExists';
9045 if ($product->cost_price > 0) {
9046 $buyPrice = $product->cost_price;
9047 } elseif ($product->pmp > 0) {
9048 $buyPrice = $product->pmp;
9051 require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
9052 $product =
new Product($this->db);
9053 $result = $product->fetch($fk_product);
9055 $this->errors[] =
'ErrorProductIdDoesNotExists';
9058 if ($product->pmp > 0) {
9059 $buyPrice = $product->pmp;
9063 if (empty($buyPrice) && isset($conf->global->MARGIN_TYPE) && in_array($conf->global->MARGIN_TYPE, array(
'1',
'pmp',
'costprice'))) {
9064 require_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.product.class.php';
9066 if (($result = $productFournisseur->find_min_price_product_fournisseur($fk_product)) > 0) {
9067 $buyPrice = $productFournisseur->fourn_unitprice;
9068 } elseif ($result < 0) {
9069 $this->errors[] = $productFournisseur->error;
9098 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')
9101 global $conf, $user, $langs;
9103 include_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
9104 include_once DOL_DOCUMENT_ROOT.
'/core/lib/images.lib.php';
9106 $sortfield =
'position_name';
9112 $dir .=
get_exdir(0, 0, 0, 0, $this, $modulepart);
9113 $pdir .=
get_exdir(0, 0, 0, 0, $this, $modulepart);
9116 if ($modulepart ==
'product') {
9118 $dir = $sdir.
'/'.
get_exdir($this->
id, 2, 0, 0, $this, $modulepart).$this->id.
"/photos/";
9119 $pdir =
'/'.get_exdir($this->
id, 2, 0, 0, $this, $modulepart).$this->id.
"/photos/";
9126 $relativedir = preg_replace(
'/^'.preg_quote(DOL_DATA_ROOT,
'/').
'/',
'', $dir);
9127 $relativedir = preg_replace(
'/^[\\/]/',
'', $relativedir);
9128 $relativedir = preg_replace(
'/[\\/]$/',
'', $relativedir);
9131 $dirthumb = $dir.
'thumbs/';
9132 $pdirthumb = $pdir.
'thumbs/';
9134 $return =
'<!-- Photo -->'.
"\n";
9137 $filearray =
dol_dir_list($dir,
"files", 0,
'',
'(\.meta|_preview.*\.png)$', $sortfield, (strtolower($sortorder) ==
'desc' ? SORT_DESC : SORT_ASC), 1);
9147 if (count($filearray)) {
9148 if ($sortfield && $sortorder) {
9152 foreach ($filearray as $key => $val) {
9154 $file = $val[
'name'];
9160 $viewfilename = $file;
9162 if ($size == 1 || $size ==
'small') {
9169 $photo_vignette = basename($file);
9176 if ($nbphoto == 1) {
9177 $return .=
'<table class="valigntop center centpercent" style="border: 0; padding: 2px; border-spacing: 2px; border-collapse: separate;">';
9180 if ($nbphoto % $nbbyrow == 1) {
9181 $return .=
'<tr class="center valignmiddle" style="border: 1px">';
9183 $return .=
'<td style="width: '.ceil(100 / $nbbyrow).
'%" class="photo">'.
"\n";
9184 } elseif ($nbbyrow < 0) {
9185 $return .=
'<div class="inline-block">'.
"\n";
9188 $relativefile = preg_replace(
'/^\//',
'', $pdir.$photo);
9189 if (empty($nolink)) {
9192 $return .=
'<a href="'.$urladvanced.
'">';
9194 $return .=
'<a href="'.DOL_URL_ROOT.
'/viewimage.php?modulepart='.$modulepart.
'&entity='.$this->entity.
'&file='.urlencode($pdir.$photo).
'" class="aphoto" target="_blank" rel="noopener noreferrer">';
9200 $alt = $langs->transnoentitiesnoconv(
'File').
': '.$relativefile;
9201 $alt .=
' - '.$langs->transnoentitiesnoconv(
'Size').
': '.$imgarray[
'width'].
'x'.$imgarray[
'height'];
9202 if ($overwritetitle) {
9203 if (is_numeric($overwritetitle)) {
9206 $alt = $overwritetitle;
9210 if ($usesharelink) {
9211 if ($val[
'share']) {
9212 if (empty($maxHeight) || ($photo_vignette && $imgarray[
'height'] > $maxHeight)) {
9213 $return .=
'<!-- Show original file (thumb not yet available with shared links) -->';
9214 $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).
'">';
9216 $return .=
'<!-- Show original file -->';
9217 $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).
'">';
9220 $return .=
'<!-- Show nophoto file (because file is not shared) -->';
9221 $return .=
'<img class="photo photowithmargin'.($addphotorefcss ?
' '.$addphotorefcss :
'').
'" height="'.$maxHeight.
'" src="'.DOL_URL_ROOT.
'/public/theme/common/nophoto.png" title="'.
dol_escape_htmltag($alt).
'">';
9224 if (empty($maxHeight) || ($photo_vignette && $imgarray[
'height'] > $maxHeight)) {
9225 $return .=
'<!-- Show thumb -->';
9226 $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).
'">';
9228 $return .=
'<!-- Show original file -->';
9229 $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).
'">';
9233 if (empty($nolink)) {
9237 if ($showfilename) {
9238 $return .=
'<br>'.$viewfilename;
9243 if ($photo_vignette && (
image_format_supported($photo) > 0) && ((isset($this->imgWidth) && $this->imgWidth > $maxWidth) || (isset($this->imgHeight) && $this->imgHeight > $maxHeight))) {
9244 $return .=
'<a href="'.$_SERVER[
"PHP_SELF"].
'?id='.$this->
id.
'&action=addthumb&token='.newToken().
'&file='.urlencode($pdir.$viewfilename).
'">'.
img_picto($langs->trans(
'GenerateThumb'),
'refresh').
' </a>';
9247 if ($modulepart ==
'product' && ($user->hasRight(
'produit',
'creer') || $user->hasRight(
'service',
'creer'))) {
9249 $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> ';
9252 $return .=
'<a href="'.$_SERVER[
"PHP_SELF"].
'?id='.$this->
id.
'&action=delete&token='.newToken().
'&file='.urlencode($pdir.$viewfilename).
'">';
9260 if (($nbphoto % $nbbyrow) == 0) {
9263 } elseif ($nbbyrow < 0) {
9264 $return .=
'</div>'.
"\n";
9269 $return .=
'<img class="photo photowithmargin" src="'.DOL_URL_ROOT.
'/viewimage.php?modulepart='.$modulepart.
'&entity='.$this->entity.
'&file='.urlencode($pdir.$photo).
'">';
9271 if ($showfilename) {
9272 $return .=
'<br>'.$viewfilename;
9276 if ($modulepart ==
'product' && ($user->hasRight(
'produit',
'creer') || $user->hasRight(
'service',
'creer'))) {
9278 $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> ';
9281 $return .=
'<a href="'.$_SERVER[
"PHP_SELF"].
'?id='.$this->
id.
'&action=delete&token='.newToken().
'&file='.urlencode($pdir.$viewfilename).
'">';
9288 if ($nbmax && $nbphoto >= $nbmax) {
9294 if ($size == 1 || $size ==
'small') {
9297 while ($nbphoto % $nbbyrow) {
9298 $return .=
'<td style="width: '.ceil(100 / $nbbyrow).
'%"> </td>';
9303 $return .=
'</table>';
9309 $this->nbphoto = $nbphoto;
9323 if (is_array($info)) {
9324 if (isset($info[
'type']) && $info[
'type'] ==
'array') {
9341 if (isset($info[
'type']) && ($info[
'type'] ==
'date' || $info[
'type'] ==
'datetime' || $info[
'type'] ==
'timestamp')) {
9355 if (is_array($info)) {
9356 if (isset($info[
'type']) && ($info[
'type'] ==
'duration')) {
9374 if (is_array($info)) {
9375 if (isset($info[
'type']) && (preg_match(
'/(^int|int$)/i', $info[
'type']))) {
9393 if (is_array($info)) {
9394 if (isset($info[
'type']) && (preg_match(
'/^(double|real|price)/i', $info[
'type']))) {
9411 if (is_array($info)) {
9412 if (isset($info[
'type']) && $info[
'type'] ==
'text') {
9429 if (is_array($info)) {
9430 if (isset($info[
'notnull']) && $info[
'notnull'] !=
'1') {
9447 if (is_array($info)) {
9448 if (isset($info[
'notnull']) && $info[
'notnull'] ==
'-1') {
9465 if (is_array($info)) {
9466 if (isset($info[
'index']) && $info[
'index'] ==
true) {
9488 $queryarray = array();
9489 foreach ($this->fields as $field => $info) {
9491 if ($this->isDate($info)) {
9492 if (empty($this->{$field})) {
9493 $queryarray[$field] =
null;
9495 $queryarray[$field] = $this->db->idate($this->{$field});
9497 } elseif ($this->isDuration($info)) {
9499 if ((isset($this->{$field}) && $this->{$field} !=
'') || !empty($info[
'notnull'])) {
9500 if (!isset($this->{$field})) {
9501 if (!empty($info[
'default'])) {
9502 $queryarray[$field] = $info[
'default'];
9504 $queryarray[$field] = 0;
9507 $queryarray[$field] = (int) $this->{$field};
9510 $queryarray[$field] =
null;
9512 } elseif ($this->isInt($info) || $this->isFloat($info)) {
9513 if ($field ==
'entity' && is_null($this->{$field})) {
9514 $queryarray[$field] = ((int) $conf->entity);
9517 if ((isset($this->{$field}) && ((
string) $this->{$field}) !=
'') || !empty($info[
'notnull'])) {
9518 if (!isset($this->{$field})) {
9519 $queryarray[$field] = 0;
9520 } elseif ($this->isInt($info)) {
9521 $queryarray[$field] = (int) $this->{$field};
9522 } elseif ($this->isFloat($info)) {
9523 $queryarray[$field] = (float) $this->{$field};
9526 $queryarray[$field] =
null;
9532 $queryarray[$field] = $this->{$field};
9535 if ($info[
'type'] ==
'timestamp' && empty($queryarray[$field])) {
9536 unset($queryarray[$field]);
9538 if (!empty($info[
'notnull']) && $info[
'notnull'] == -1 && empty($queryarray[$field])) {
9539 $queryarray[$field] =
null;
9556 foreach ($this->fields as $field => $info) {
9557 if ($this->isDate($info)) {
9558 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') {
9561 $this->$field = $db->jdate($obj->$field);
9563 } elseif ($this->isInt($info)) {
9564 if ($field ==
'rowid') {
9565 $this->
id = (int) $obj->$field;
9567 if ($this->isForcedToNullIfZero($info)) {
9568 if (empty($obj->$field)) {
9569 $this->$field =
null;
9571 $this->$field = (float) $obj->$field;
9574 if (isset($obj->$field) && (!is_null($obj->$field) || (isset($info[
'notnull']) && $info[
'notnull'] == 1))) {
9575 $this->$field = (int) $obj->$field;
9577 $this->$field =
null;
9581 } elseif ($this->isFloat($info)) {
9582 if ($this->isForcedToNullIfZero($info)) {
9583 if (empty($obj->$field)) {
9584 $this->$field =
null;
9586 $this->$field = (float) $obj->$field;
9589 if (isset($obj->$field) && (!is_null($obj->$field) || (isset($info[
'notnull']) && $info[
'notnull'] == 1))) {
9590 $this->$field = (float) $obj->$field;
9592 $this->$field =
null;
9596 $this->$field = isset($obj->$field) ? $obj->$field :
null;
9601 if (!isset($this->fields[
'ref']) && isset($this->
id)) {
9602 $this->
ref = $this->id;
9612 foreach ($this->fields as $field => $arr) {
9613 $this->$field =
null;
9626 $keys = array_keys($this->fields);
9627 if (!empty($alias)) {
9628 $keys_with_alias = array();
9629 foreach ($keys as $fieldname) {
9630 if (!empty($excludefields)) {
9631 if (in_array($fieldname, $excludefields)) {
9635 $keys_with_alias[] = $alias .
'.' . $fieldname;
9637 return implode(
',', $keys_with_alias);
9639 return implode(
',', $keys);
9650 protected function quote($value, $fieldsentry)
9652 if (is_null($value)) {
9654 } elseif (preg_match(
'/^(int|double|real|price)/i', $fieldsentry[
'type'])) {
9656 } elseif (preg_match(
'/int$/i', $fieldsentry[
'type'])) {
9657 return (
int) $value;
9658 } elseif ($fieldsentry[
'type'] ==
'boolean') {
9665 return "'".$this->db->escape($value).
"'";
9681 dol_syslog(get_class($this).
"::createCommon create", LOG_DEBUG);
9687 $fieldvalues = $this->setSaveQuery();
9689 if (array_key_exists(
'date_creation', $fieldvalues) && empty($fieldvalues[
'date_creation'])) {
9690 $fieldvalues[
'date_creation'] = $this->db->idate($now);
9692 if (array_key_exists(
'fk_user_creat', $fieldvalues) && !($fieldvalues[
'fk_user_creat'] > 0)) {
9693 $fieldvalues[
'fk_user_creat'] = $user->id;
9695 if (array_key_exists(
'pass_crypted', $fieldvalues) && property_exists($this,
'pass')) {
9696 $fieldvalues[
'pass_crypted'] =
dol_hash($this->pass);
9698 unset($fieldvalues[
'rowid']);
9699 if (array_key_exists(
'ref', $fieldvalues)) {
9705 foreach ($fieldvalues as $k => $v) {
9707 $value = $this->fields[$k];
9708 $values[$k] = $this->quote($v, $value);
9712 foreach ($keys as $key) {
9714 if (preg_match(
'/^integer:/i', $this->fields[$key][
'type']) && $values[$key] ==
'-1') {
9717 if (!empty($this->fields[$key][
'foreignkey']) && $values[$key] ==
'-1') {
9721 if (isset($this->fields[$key][
'notnull']) && $this->fields[$key][
'notnull'] == 1 && (!isset($values[$key]) || $values[$key] ===
'NULL') && is_null($this->fields[$key][
'default'])) {
9723 $langs->load(
"errors");
9724 dol_syslog(
"Mandatory field '".$key.
"' is empty and required into ->fields definition of class");
9725 $this->errors[] = $langs->trans(
"ErrorFieldRequired", $this->fields[$key][
'label']);
9729 if (isset($this->fields[$key][
'notnull']) && $this->fields[$key][
'notnull'] == 1 && (!isset($values[$key]) || $values[$key] ===
'NULL') && !is_null($this->fields[$key][
'default'])) {
9730 $values[$key] = $this->quote($this->fields[$key][
'default'], $this->fields[$key]);
9734 if (preg_match(
'/^integer:/i', $this->fields[$key][
'type']) && empty($values[$key])) {
9735 if (isset($this->fields[$key][
'default'])) {
9736 $values[$key] = ((int) $this->fields[$key][
'default']);
9738 $values[$key] =
'null';
9741 if (!empty($this->fields[$key][
'foreignkey']) && empty($values[$key])) {
9742 $values[$key] =
'null';
9753 $sql =
"INSERT INTO ".$this->db->prefix().$this->table_element;
9754 $sql .=
" (".implode(
", ", $keys).
')';
9755 $sql .=
" VALUES (".implode(
", ", $values).
")";
9757 $res = $this->db->query($sql);
9760 if ($this->db->lasterrno() ==
'DB_ERROR_RECORD_ALREADY_EXISTS') {
9761 $this->errors[] =
"ErrorRefAlreadyExists";
9763 $this->errors[] = $this->db->lasterror();
9769 $this->
id = $this->db->last_insert_id($this->db->prefix().$this->table_element);
9774 if (key_exists(
'ref', $this->fields) && key_exists(
'notnull', $this->fields[
'ref']) && $this->fields[
'ref'][
'notnull'] > 0 && key_exists(
'default', $this->fields[
'ref']) && $this->fields[
'ref'][
'default'] ==
'(PROV)') {
9775 $sql =
"UPDATE ".$this->db->prefix().$this->table_element.
" SET ref = '(PROV".((int) $this->
id).
")' WHERE (ref = '(PROV)' OR ref = '') AND rowid = ".((int) $this->
id);
9776 $resqlupdate = $this->db->query($sql);
9778 if ($resqlupdate ===
false) {
9780 $this->errors[] = $this->db->lasterror();
9782 $this->
ref =
'(PROV'.$this->id.
')';
9789 $result = $this->insertExtraFields();
9796 if (!empty($this->table_element_line) && !empty($this->fk_element)) {
9797 foreach ($this->lines as $line) {
9798 $keyforparent = $this->fk_element;
9799 $line->$keyforparent = $this->id;
9803 if (!is_object($line)) {
9804 $line = (object) $line;
9808 if (method_exists($line,
'insert')) {
9809 $result = $line->insert($user, 1);
9810 } elseif (method_exists($line,
'create')) {
9811 $result = $line->create($user, 1);
9814 $this->error = $line->error;
9815 $this->db->rollback();
9822 if (!$error && !$notrigger) {
9824 $result = $this->call_trigger(strtoupper(get_class($this)).
'_CREATE', $user);
9833 $this->db->rollback();
9836 $this->db->commit();
9851 public function fetchCommon($id, $ref =
null, $morewhere =
'', $noextrafields = 0)
9853 if (empty($id) && empty($ref) && empty($morewhere)) {
9857 $fieldlist = $this->getFieldList(
't');
9858 if (empty($fieldlist)) {
9862 $sql =
"SELECT ".$fieldlist;
9863 $sql .=
" FROM ".$this->db->prefix().$this->table_element.
' as t';
9866 $sql .=
' WHERE t.rowid = '.((int) $id);
9867 } elseif (!empty($ref)) {
9868 $sql .=
" WHERE t.ref = '".$this->db->escape($ref).
"'";
9870 $sql .=
' WHERE 1 = 1';
9872 if (empty($id) && isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) {
9873 $sql .=
' AND t.entity IN ('.getEntity($this->element).
')';
9880 $res = $this->db->query($sql);
9882 $obj = $this->db->fetch_object($res);
9884 $this->setVarsFromFetchObj($obj);
9888 if (empty($noextrafields)) {
9889 $result = $this->fetch_optionals();
9891 $this->error = $this->db->lasterror();
9892 $this->errors[] = $this->error;
9902 $this->error = $this->db->lasterror();
9903 $this->errors[] = $this->error;
9917 $objectlineclassname = get_class($this).
'Line';
9918 if (!class_exists($objectlineclassname)) {
9919 $this->error =
'Error, class '.$objectlineclassname.
' not found during call of fetchLinesCommon';
9923 $objectline =
new $objectlineclassname($this->db);
9925 $sql =
"SELECT ".$objectline->getFieldList(
'l');
9926 $sql .=
" FROM ".$this->db->prefix().$objectline->table_element.
" as l";
9927 $sql .=
" WHERE l.fk_".$this->db->escape($this->element).
" = ".((int) $this->
id);
9931 if (isset($objectline->fields[
'position'])) {
9932 $sql .= $this->db->order(
'position',
'ASC');
9935 $resql = $this->db->query($sql);
9937 $num_rows = $this->db->num_rows($resql);
9939 $this->lines = array();
9940 while ($i < $num_rows) {
9941 $obj = $this->db->fetch_object($resql);
9943 $newline =
new $objectlineclassname($this->db);
9944 $newline->setVarsFromFetchObj($obj);
9952 $this->lines[] = $newline;
9959 $this->error = $this->db->lasterror();
9960 $this->errors[] = $this->error;
9974 dol_syslog(get_class($this).
"::updateCommon update", LOG_DEBUG);
9985 $fieldvalues = $this->setSaveQuery();
9987 if (array_key_exists(
'date_modification', $fieldvalues) && empty($fieldvalues[
'date_modification'])) {
9988 $fieldvalues[
'date_modification'] = $this->db->idate($now);
9990 if (array_key_exists(
'fk_user_modif', $fieldvalues) && !($fieldvalues[
'fk_user_modif'] > 0)) {
9991 $fieldvalues[
'fk_user_modif'] = $user->id;
9993 unset($fieldvalues[
'rowid']);
9994 if (array_key_exists(
'ref', $fieldvalues)) {
10002 foreach ($fieldvalues as $k => $v) {
10004 $value = $this->fields[$k];
10005 $values[$k] = $this->quote($v, $value);
10006 $tmp[] = $k.
'='.$this->quote($v, $this->fields[$k]);
10010 foreach ($keys as $key) {
10011 if (preg_match(
'/^integer:/i', $this->fields[$key][
'type']) && $values[$key] ==
'-1') {
10012 $values[$key] =
'';
10014 if (!empty($this->fields[$key][
'foreignkey']) && $values[$key] ==
'-1') {
10015 $values[$key] =
'';
10027 $sql =
'UPDATE '.$this->db->prefix().$this->table_element.
' SET '.implode(
', ', $tmp).
' WHERE rowid='.((int) $this->
id);
10029 $this->db->begin();
10032 $res = $this->db->query($sql);
10035 $this->errors[] = $this->db->lasterror();
10041 $result = $this->insertExtraFields();
10048 if (!$error && !$notrigger) {
10050 $result = $this->call_trigger(strtoupper(get_class($this)).
'_MODIFY', $user);
10059 $this->db->rollback();
10062 $this->db->commit();
10077 dol_syslog(get_class($this).
"::deleteCommon delete", LOG_DEBUG);
10081 $this->db->begin();
10083 if ($forcechilddeletion) {
10084 foreach ($this->childtables as $table) {
10085 $sql =
"DELETE FROM ".$this->db->prefix().$table.
" WHERE ".$this->fk_element.
" = ".((int) $this->
id);
10086 $resql = $this->db->query($sql);
10088 $this->error = $this->db->lasterror();
10089 $this->errors[] = $this->error;
10090 $this->db->rollback();
10094 } elseif (!empty($this->childtables)) {
10095 $objectisused = $this->isObjectUsed($this->
id);
10096 if (!empty($objectisused)) {
10097 dol_syslog(get_class($this).
"::deleteCommon Can't delete record as it has some child", LOG_WARNING);
10098 $this->error =
'ErrorRecordHasChildren';
10099 $this->errors[] = $this->error;
10100 $this->db->rollback();
10106 if (is_array($this->childtablesoncascade) && !empty($this->childtablesoncascade)) {
10107 foreach ($this->childtablesoncascade as $table) {
10108 $deleteFromObject = explode(
':', $table);
10109 if (count($deleteFromObject) >= 2) {
10110 $className = str_replace(
'@',
'', $deleteFromObject[0]);
10111 $filePath = $deleteFromObject[1];
10112 $columnName = $deleteFromObject[2];
10113 $TMoreSQL = array();
10114 if (!empty($deleteFromObject[3])) {
10115 $TMoreSQL[
'customsql'] = $deleteFromObject[3];
10118 $childObject =
new $className($this->db);
10119 if (method_exists($childObject,
'deleteByParentField')) {
10120 $result = $childObject->deleteByParentField($this->
id, $columnName, $TMoreSQL);
10123 $this->errors[] = $childObject->error;
10128 $this->errors[] =
"You defined a cascade delete on an object $childObject but there is no method deleteByParentField for it";
10133 $this->errors[] =
'Cannot include child class file '.$filePath;
10138 $sql =
"DELETE FROM ".$this->db->prefix().$table.
" WHERE ".$this->fk_element.
" = ".((int) $this->
id);
10140 $resql = $this->db->query($sql);
10143 $this->error = $this->db->lasterror();
10144 $this->errors[] = $this->error;
10154 $result = $this->call_trigger(strtoupper(get_class($this)).
'_DELETE', $user);
10164 $res = $this->deleteEcmFiles(1);
10171 $res = $this->deleteObjectLinked();
10176 if (!$error && !empty($this->isextrafieldmanaged)) {
10177 $result = $this->deleteExtraFields();
10184 $sql =
'DELETE FROM '.$this->db->prefix().$this->table_element.
' WHERE rowid='.((int) $this->
id);
10186 $resql = $this->db->query($sql);
10189 $this->errors[] = $this->db->lasterror();
10195 $this->db->rollback();
10198 $this->db->commit();
10220 if (!empty($parentId) && !empty($parentField)) {
10221 $this->db->begin();
10223 $sql =
"SELECT rowid FROM ".$this->db->prefix().$this->table_element;
10224 $sql .=
" WHERE ".$parentField.
" = ".(int) $parentId;
10227 $sqlwhere = array();
10228 if (count($filter) > 0) {
10229 foreach ($filter as $key => $value) {
10230 if ($key ==
'customsql') {
10231 $sqlwhere[] = $value;
10232 } elseif (strpos($value,
'%') ===
false) {
10233 $sqlwhere[] = $key.
" IN (".$this->db->sanitize($this->db->escape($value)).
")";
10235 $sqlwhere[] = $key.
" LIKE '%".$this->db->escape($value).
"%'";
10239 if (count($sqlwhere) > 0) {
10240 $sql .=
" AND (".implode(
" ".$filtermode.
" ", $sqlwhere).
")";
10243 $resql = $this->db->query($sql);
10245 $this->errors[] = $this->db->lasterror();
10248 while ($obj = $this->db->fetch_object($resql)) {
10249 $result = $this->fetch($obj->rowid);
10252 $this->errors[] = $this->error;
10254 $result = $this->
delete($user);
10257 $this->errors[] = $this->error;
10265 if (empty($error)) {
10266 $this->db->commit();
10269 $this->error = implode(
', ', $this->errors);
10270 $this->db->rollback();
10271 return $error * -1;
10292 $tmpforobjectclass = get_class($this);
10293 $tmpforobjectlineclass = ucfirst($tmpforobjectclass).
'Line';
10295 $this->db->begin();
10298 $result = $this->call_trigger(
'LINE'.strtoupper($tmpforobjectclass).
'_DELETE', $user);
10304 if (empty($error)) {
10305 $sql =
"DELETE FROM ".$this->db->prefix().$this->table_element_line;
10306 $sql .=
" WHERE rowid = ".((int) $idline);
10308 $resql = $this->db->query($sql);
10310 $this->error =
"Error ".$this->db->lasterror();
10315 if (empty($error)) {
10317 $tmpobjectline =
new $tmpforobjectlineclass($this->db);
10318 if (!isset($tmpobjectline->isextrafieldmanaged) || !empty($tmpobjectline->isextrafieldmanaged)) {
10319 $tmpobjectline->id = $idline;
10320 $result = $tmpobjectline->deleteExtraFields();
10323 $this->error =
"Error ".get_class($this).
"::deleteLineCommon deleteExtraFields error -4 ".$tmpobjectline->error;
10328 if (empty($error)) {
10329 $this->db->commit();
10332 dol_syslog(get_class($this).
"::deleteLineCommon ERROR:".$this->error, LOG_ERR);
10333 $this->db->rollback();
10352 $this->db->begin();
10354 $statusfield =
'status';
10355 if (in_array($this->element, array(
'don',
'donation',
'shipping'))) {
10356 $statusfield =
'fk_statut';
10359 $sql =
"UPDATE ".$this->db->prefix().$this->table_element;
10360 $sql .=
" SET ".$statusfield.
" = ".((int) $status);
10361 $sql .=
" WHERE rowid = ".((int) $this->
id);
10363 if ($this->db->query($sql)) {
10365 $this->oldcopy = clone $this;
10368 if (!$error && !$notrigger) {
10370 $result = $this->call_trigger($triggercode, $user);
10377 $this->
status = $status;
10378 $this->db->commit();
10381 $this->db->rollback();
10385 $this->error = $this->db->error();
10386 $this->db->rollback();
10403 $this->specimen = 1;
10405 'label' =>
'This is label',
10406 'ref' =>
'ABCD1234',
10407 'description' =>
'This is a description',
10409 'note_public' =>
'Public note',
10410 'note_private' =>
'Private note',
10411 'date_creation' => (
dol_now() - 3600 * 48),
10412 'date_modification' => (
dol_now() - 3600 * 24),
10413 'fk_user_creat' => $user->id,
10414 'fk_user_modif' => $user->id,
10417 foreach ($fields as $key => $value) {
10418 if (array_key_exists($key, $this->fields)) {
10419 $this->{$key} = $value;
10424 if (property_exists($this,
'fields')) {
10425 foreach ($this->fields as $key => $value) {
10427 if (array_key_exists($key, $fields)) {
10431 if (!empty($value[
'default'])) {
10432 $this->$key = $value[
'default'];
10449 require_once DOL_DOCUMENT_ROOT.
'/core/class/comment.class.php';
10451 $comment =
new Comment($this->db);
10452 $result = $comment->fetchAllFor($this->element, $this->
id);
10454 $this->errors = array_merge($this->errors, $comment->errors);
10457 $this->comments = $comment->comments;
10459 return count($this->comments);
10469 return count($this->comments);
10480 if (!is_array($parameters)) {
10483 foreach ($parameters as $parameter) {
10484 if (isset($this->$parameter)) {
10485 $this->$parameter = trim($this->$parameter);
10504 require_once DOL_DOCUMENT_ROOT.
'/categories/class/categorie.class.php';
10508 $existing = $c->containing($this->
id, $type_categ,
'id');
10528 if (!is_array($categories)) {
10529 $categories = array($categories);
10532 dol_syslog(get_class($this).
"::setCategoriesCommon Oject Id:".$this->
id.
' type_categ:'.$type_categ.
' nb tag add:'.count($categories), LOG_DEBUG);
10534 require_once DOL_DOCUMENT_ROOT.
'/categories/class/categorie.class.php';
10536 if (empty($type_categ)) {
10537 dol_syslog(__METHOD__.
': Type '.$type_categ.
'is an unknown category type. Done nothing.', LOG_ERR);
10543 $existing = $c->containing($this->
id, $type_categ,
'id');
10544 if ($remove_existing) {
10546 if (is_array($existing)) {
10547 $to_del = array_diff($existing, $categories);
10548 $to_add = array_diff($categories, $existing);
10551 $to_add = $categories;
10555 $to_add = array_diff($categories, $existing);
10562 foreach ($to_del as $del) {
10563 if ($c->fetch($del) > 0) {
10564 $result=$c->del_type($this, $type_categ);
10567 $this->error = $c->error;
10568 $this->errors = $c->errors;
10575 foreach ($to_add as $add) {
10576 if ($c->fetch($add) > 0) {
10577 $result = $c->add_type($this, $type_categ);
10580 $this->error = $c->error;
10581 $this->errors = $c->errors;
10589 return $error ? (-1 * $error) : $ok;
10602 $this->db->begin();
10604 if (empty($type)) {
10605 $type = $this->table_element;
10608 require_once DOL_DOCUMENT_ROOT.
'/categories/class/categorie.class.php';
10609 $categorystatic =
new Categorie($this->db);
10611 $sql =
"INSERT INTO ".$this->db->prefix().
"categorie_".(empty($categorystatic->MAP_CAT_TABLE[$type]) ? $type : $categorystatic->MAP_CAT_TABLE[$type]).
" (fk_categorie, fk_product)";
10612 $sql .=
" SELECT fk_categorie, $toId FROM ".$this->db->prefix().
"categorie_".(empty($categorystatic->MAP_CAT_TABLE[$type]) ? $type : $categorystatic->MAP_CAT_TABLE[$type]);
10613 $sql .=
" WHERE fk_product = ".((int) $fromId);
10615 if (!$this->db->query($sql)) {
10616 $this->error = $this->db->lasterror();
10617 $this->db->rollback();
10621 $this->db->commit();
10635 $this->db->begin();
10639 switch ($this->element) {
10641 $element =
'propale';
10644 $element =
'produit';
10646 case 'order_supplier':
10647 $element =
'fournisseur/commande';
10649 case 'invoice_supplier':
10652 $element =
'fournisseur/facture/'.get_exdir($this->
id, 2, 0, 1, $this,
'invoice_supplier');
10655 $element =
'expedition/sending';
10658 case 'project_task':
10659 require_once DOL_DOCUMENT_ROOT.
'/projet/class/task.class.php';
10661 $project_result = $this->fetch_projet();
10662 if ($project_result >= 0) {
10663 $element =
'projet/'.dol_sanitizeFileName($this->project->ref).
'/';
10667 $element = $this->element;
10671 $sql =
"DELETE FROM ".$this->db->prefix().
"ecm_files_extrafields WHERE fk_object IN (";
10672 $sql .=
" SELECT rowid FROM ".$this->db->prefix().
"ecm_files WHERE filename LIKE '".$this->db->escape($this->
ref).
"%'";
10673 $sql .=
" AND filepath = '".$this->db->escape($element).
"/".$this->db->escape($this->
ref).
"' AND entity = ".((int) $conf->entity);
10676 if (!$this->db->query($sql)) {
10677 $this->error = $this->db->lasterror();
10678 $this->db->rollback();
10683 $sql =
"DELETE FROM ".$this->db->prefix().
"ecm_files";
10684 $sql .=
" WHERE filename LIKE '".$this->db->escape($this->
ref).
"%'";
10685 $sql .=
" AND filepath = '".$this->db->escape($element).
"/".$this->db->escape($this->
ref).
"' AND entity = ".((int) $conf->entity);
10687 if (!$this->db->query($sql)) {
10688 $this->error = $this->db->lasterror();
10689 $this->db->rollback();
10696 $sql =
'DELETE FROM '.$this->db->prefix().
"ecm_files_extrafields";
10697 $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).
")";
10698 $resql = $this->db->query($sql);
10700 $this->error = $this->db->lasterror();
10701 $this->db->rollback();
10705 $sql =
'DELETE FROM '.$this->db->prefix().
"ecm_files";
10706 $sql .=
" WHERE src_object_type = '".$this->db->escape($this->table_element.(empty($this->module) ?
"" :
"@".$this->module)).
"' AND src_object_id = ".((int) $this->
id);
10707 $resql = $this->db->query($sql);
10709 $this->error = $this->db->lasterror();
10710 $this->db->rollback();
10715 $this->db->commit();
print $langs trans("AuditedSecurityEvents").'</strong >< span class="opacitymedium"></span >< br > status
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.
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
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.
deleteLineCommon(User $user, $idline, $notrigger=false)
Delete a line of object in database.
static deleteAllItemsLinkedByObjectID($fk_object_where, $field_where, $table_element)
Function used to remove all items linked to an object id in association table.
deleteByParentField($parentId=0, $parentField='', $filter=array(), $filtermode="AND")
Delete all child object from a parent ID.
setFieldError($fieldKey, $msg='')
set validation error message a field
validateField($fields, $fieldKey, $fieldValue)
Return validation test result for a field.
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.
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.
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.
setExtraParameters()
Set extra parameters.
setErrorsFromObject($object)
setErrorsFromObject
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 an object id/ref exists If you don't need/want to instantiate object and just need to know if o...
isObjectUsed($id=0, $entity=0)
Function to check if an object is used by others (by children).
createCommon(User $user, $notrigger=false)
Create object into database.
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.
getTotalWeightVolume()
Return into unit=0, the calculated total of weight and volume of all lines * qty Calculate by adding ...
deleteCommon(User $user, $notrigger=false, $forcechilddeletion=0)
Delete object in database.
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.
update_price($exclspec=0, $roundingadjust='none', $nodatabaseupdate=0, $seller=null)
Update total_ht, total_ttc, total_vat, total_localtax1, total_localtax2 for an object (sum of lines).
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.
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.
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.
setBankAccount($fk_account, $notrigger=false, $userused=null)
Change the bank account.
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.
setShippingMethod($shipping_method_id, $notrigger=false, $userused=null)
Change the shipping method.
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.
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.
updateCommon(User $user, $notrigger=false)
Update object into database.
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.
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.
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.
getFormatedCustomerRef($objref)
Return customer ref for screen output.
getTooltipContentArray($params)
Return array of datas 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 datas.
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=0, $outputlangs='', $entconv=1, $searchlabel='')
Return country label, code or id from an id, code or label.
getState($id, $withcode='', $dbtouse=0, $withregion=0, $outputlangs='', $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($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 informations (by default a local PHP server timestamp) Re...
vatrate($rate, $addpercent=false, $info_bits=0, $usestarfornpr=0, $html=0)
Return a string with VAT rate label formated for view output Used into pdf and HTML pages.
dol_print_ip($ip, $mode=0)
Return an IP formated to be shown on screen.
img_delete($titlealt='default', $other='class="pictodelete"', $morecss='')
Show delete logo.
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 '.
get_date_range($date_start, $date_end, $format='', $outputlangs='', $withparenthesis=1)
Format output for start and end date.
dol_print_error($db='', $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0)
Show a picto called object_picto (generic function)
dol_format_address($object, $withcountry=0, $sep="\n", $outputlangs='', $mode=0, $extralangcode='')
Return a formated address (part address/zip/town/state) according to country rules.
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_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.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs='', $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
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_print_phone($phone, $countrycode='', $cid=0, $socid=0, $addlink='', $separ=" ", $withpicto='', $titlealt='', $adddivfloat=0)
Format phone numbers according to country.
dol_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
dol_escape_js($stringtoescape, $mode=0, $noescapebackslashn=0)
Returns text escaped for inclusion into javascript code.
dol_sort_array(&$array, $index, $order='asc', $natsort=0, $case_sensitive=0, $keepindex=0)
Advanced sort array by second index function, which produces ascending (default) or descending output...
if(!function_exists( 'dol_getprefix')) dol_include_once($relpath, $classname='')
Make an include_once using default root and alternate root if it fails.
dol_eval($s, $returnvalue=0, $hideerrors=1, $onlysimplestring='1')
Replace eval function to add more security.
getImageFileNameForSize($file, $extName, $extImgTarget='')
Return the filename of file to get the thumbs.
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.
getElementProperties($element_type)
Get an array with properties of an element.
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_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.
publicphonebutton2 phonegreen basiclayout basiclayout TotalHT VATCode TotalVAT TotalLT1 TotalLT2 TotalTTC TotalHT clearboth nowraponall right right takeposterminal SELECT e rowid
publicphonebutton2 phonegreen basiclayout basiclayout TotalHT VATCode TotalVAT TotalLT1 TotalLT2 TotalTTC TotalHT clearboth nowraponall right right takeposterminal SELECT e e e e e statut
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.
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 symetric encryption.
dolDecrypt($chain, $key='')
Decode a string with a symetric encryption.
dol_hash($chain, $type='0', $nosalt=0)
Returns a hash (non reversible encryption) of a string.