/htdocs/core/class/commonobject.class.php
PHP | 2750 lines | 1800 code | 287 blank | 663 comment | 580 complexity | 600cdc8b234b25507da49b2a6db75b39 MD5 | raw file
Possible License(s): LGPL-3.0, LGPL-2.1, GPL-3.0, MIT
Large files files are truncated, but you can click here to view the full file
- <?php
- /* Copyright (C) 2006-2012 Laurent Destailleur <eldy@users.sourceforge.net>
- * Copyright (C) 2005-2013 Regis Houssin <regis.houssin@capnetworks.com>
- * Copyright (C) 2010-2011 Juanjo Menent <jmenent@2byte.es>
- * Copyright (C) 2012 Christophe Battarel <christophe.battarel@altairis.fr>
- * Copyright (C) 2011-2012 Philippe Grand <philippe.grand@atoo-net.com>
- * Copyright (C) 2012 Marcos García <marcosgdf@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
- /**
- * \file htdocs/core/class/commonobject.class.php
- * \ingroup core
- * \brief File of parent class of all other business classes (invoices, contracts, proposals, orders, ...)
- */
- /**
- * Parent class of all other business classes (invoices, contracts, proposals, orders, ...)
- */
- abstract class CommonObject {
- protected $db;
- public $error;
- public $errors;
- public $canvas; // Contains canvas name if it is
- /**
- * class constructor
- *
- * @param couchClient $db Database handler
- */
- function __construct($db = '') {
- global $conf;
- $this->db = $db;
- return 1;
- }
- /**
- * Return full name (civility+' '+name+' '+lastname)
- *
- * @param Translate $langs Language object for translation of civility
- * @param int $option 0=No option, 1=Add civility
- * @param int $nameorder -1=Auto, 0=Lastname+Firstname, 1=Firstname+Lastname
- * @param int $maxlen Maximum length
- * @return string String with full name
- */
- function getFullName($langs, $option = 0, $nameorder = -1, $maxlen = 0) {
- global $conf;
- $lastname = $this->Lastname;
- $firstname = $this->Firstname;
- if (empty($lastname))
- $lastname = ($this->name ? $this->name : $this->nom);
- if (empty($firstname))
- $firstname = $this->prenom;
- $ret = '';
- if ($option && $this->civilite_id) {
- if ($langs->transnoentitiesnoconv("Civility" . $this->civilite_id) != "Civility" . $this->civilite_id)
- $ret.=$langs->transnoentitiesnoconv("Civility" . $this->civilite_id) . ' ';
- else
- $ret.=$this->civilite_id . ' ';
- }
- // If order not defined, we use the setup
- if ($nameorder < 0)
- $nameorder = (empty($conf->global->MAIN_FIRSTNAME_NAME_POSITION));
- if ($nameorder) {
- $ret.=$firstname;
- if ($firstname && $lastname)
- $ret.=' ';
- $ret.=$lastname;
- }
- else {
- $ret.=$lastname;
- if ($firstname && $lastname)
- $ret.=' ';
- $ret.=$firstname;
- }
- return dol_trunc($ret, $maxlen);
- }
- /**
- * Check if ref is used.
- *
- * @return int <0 if KO, 0 if not found, >0 if found
- */
- function verifyNumRef() {
- global $conf;
- $sql = "SELECT rowid";
- $sql.= " FROM " . MAIN_DB_PREFIX . $this->table_element;
- $sql.= " WHERE ref = '" . $this->ref . "'";
- $sql.= " AND entity = " . $conf->entity;
- dol_syslog(get_class($this) . "::verifyNumRef sql=" . $sql, LOG_DEBUG);
- $resql = $this->db->query($sql);
- if ($resql) {
- $num = $this->db->num_rows($resql);
- return $num;
- } else {
- $this->error = $this->db->lasterror();
- dol_syslog(get_class($this) . "::verifyNumRef " . $this->error, LOG_ERR);
- return -1;
- }
- }
- /**
- * Add a link between element $this->element and a contact
- *
- * @param int $fk_socpeople Id of contact to link
- * @param int $type_contact Type of contact (code or id)
- * @param int $source external=Contact extern (llx_socpeople), internal=Contact intern (llx_user)
- * @param int $notrigger Disable all triggers
- * @return int <0 if KO, >0 if OK
- */
- function add_contact($fk_socpeople, $type_contact, $source = 'external', $notrigger = 0) {
- global $user, $conf, $langs;
- $error = 0;
- dol_syslog(get_class($this) . "::add_contact $fk_socpeople, $type_contact, $source");
- // Check parameters
- if ($fk_socpeople <= 0) {
- $this->error = $langs->trans("ErrorWrongValueForParameter", "1");
- dol_syslog(get_class($this) . "::add_contact " . $this->error, LOG_ERR);
- return -1;
- }
- if (!$type_contact) {
- $this->error = $langs->trans("ErrorWrongValueForParameter", "2");
- dol_syslog(get_class($this) . "::add_contact " . $this->error, LOG_ERR);
- return -2;
- }
- $id_type_contact = 0;
- if (is_numeric($type_contact)) {
- $id_type_contact = $type_contact;
- } else {
- // On recherche id type_contact
- $sql = "SELECT tc.rowid";
- $sql.= " FROM " . MAIN_DB_PREFIX . "c_type_contact as tc";
- $sql.= " WHERE element='" . $this->element . "'";
- $sql.= " AND source='" . $source . "'";
- $sql.= " AND code='" . $type_contact . "' AND active=1";
- $resql = $this->db->query($sql);
- if ($resql) {
- $obj = $this->db->fetch_object($resql);
- $id_type_contact = $obj->rowid;
- }
- }
- $datecreate = dol_now();
- // Insertion dans la base
- $sql = "INSERT INTO " . MAIN_DB_PREFIX . "element_contact";
- $sql.= " (element_id, fk_socpeople, datecreate, statut, fk_c_type_contact) ";
- $sql.= " VALUES (" . $this->id . ", " . $fk_socpeople . " , ";
- $sql.= $this->db->idate($datecreate);
- $sql.= ", 4, '" . $id_type_contact . "' ";
- $sql.= ")";
- dol_syslog(get_class($this) . "::add_contact sql=" . $sql);
- $resql = $this->db->query($sql);
- if ($resql) {
- if (!$notrigger) {
- // Call triggers
- include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php';
- $interface = new Interfaces($this->db);
- $result = $interface->run_triggers(strtoupper($this->element) . '_ADD_CONTACT', $this, $user, $langs, $conf);
- if ($result < 0) {
- $error++;
- $this->errors = $interface->errors;
- }
- // End call triggers
- }
- return 1;
- } else {
- if ($this->db->errno() == 'DB_ERROR_RECORD_ALREADY_EXISTS') {
- $this->error = $this->db->errno();
- return -2;
- } else {
- $this->error = $this->db->error();
- dol_syslog($this->error, LOG_ERR);
- return -1;
- }
- }
- }
- /**
- * Update a link to contact line
- *
- * @param int $rowid Id of line contact-element
- * @param int $statut New status of link
- * @param int $type_contact_id Id of contact type (not modified if 0)
- * @return int <0 if KO, >= 0 if OK
- */
- function update_contact($rowid, $statut, $type_contact_id = 0) {
- // Insertion dans la base
- $sql = "UPDATE " . MAIN_DB_PREFIX . "element_contact set";
- $sql.= " statut = " . $statut;
- if ($type_contact_id)
- $sql.= ", fk_c_type_contact = '" . $type_contact_id . "'";
- $sql.= " where rowid = " . $rowid;
- $resql = $this->db->query($sql);
- if ($resql) {
- return 0;
- } else {
- $this->error = $this->db->lasterror();
- return -1;
- }
- }
- /**
- * Delete a link to contact line
- *
- * @param int $rowid Id of contact link line to delete
- * @param int $notrigger Disable all triggers
- * @return int >0 if OK, <0 if KO
- */
- function delete_contact($rowid, $notrigger = 0) {
- global $user, $langs, $conf;
- $error = 0;
- $sql = "DELETE FROM " . MAIN_DB_PREFIX . "element_contact";
- $sql.= " WHERE rowid =" . $rowid;
- dol_syslog(get_class($this) . "::delete_contact sql=" . $sql);
- if ($this->db->query($sql)) {
- if (!$notrigger) {
- // Call triggers
- include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php';
- $interface = new Interfaces($this->db);
- $result = $interface->run_triggers(strtoupper($this->element) . '_DELETE_CONTACT', $this, $user, $langs, $conf);
- if ($result < 0) {
- $error++;
- $this->errors = $interface->errors;
- }
- // End call triggers
- }
- return 1;
- } else {
- $this->error = $this->db->lasterror();
- dol_syslog(get_class($this) . "::delete_contact error=" . $this->error, LOG_ERR);
- return -1;
- }
- }
- /**
- * Delete all links between an object $this and all its contacts
- *
- * @return int >0 if OK, <0 if KO
- */
- function delete_linked_contact() {
- $temp = array();
- $typeContact = $this->liste_type_contact('');
- foreach ($typeContact as $key => $value) {
- array_push($temp, $key);
- }
- $listId = implode(",", $temp);
- $sql = "DELETE FROM " . MAIN_DB_PREFIX . "element_contact";
- $sql.= " WHERE element_id =" . $this->id;
- $sql.= " AND fk_c_type_contact IN (" . $listId . ")";
- dol_syslog(get_class($this) . "::delete_linked_contact sql=" . $sql, LOG_DEBUG);
- if ($this->db->query($sql)) {
- return 1;
- } else {
- $this->error = $this->db->lasterror();
- dol_syslog(get_class($this) . "::delete_linked_contact error=" . $this->error, LOG_ERR);
- return -1;
- }
- }
- /**
- * Get array of all contacts for an object
- *
- * @param int $statut Status of lines to get (-1=all)
- * @param string $source Source of contact: external or thirdparty (llx_socpeople) or internal (llx_user)
- * @param int $list 0:Return array contains all properties, 1:Return array contains just id
- * @return array Array of contacts
- */
- function liste_contact($statut = -1, $source = 'external', $list = 0) {
- global $langs;
- $tab = array();
- $sql = "SELECT ec.rowid, ec.statut, ec.fk_socpeople as id"; // This field contains id of llx_socpeople or id of llx_user
- if ($source == 'internal')
- $sql.=", '-1' as socid";
- if ($source == 'external' || $source == 'thirdparty')
- $sql.=", t.fk_soc as socid";
- $sql.= ", t.civilite as civility, t.name as lastname, t.firstname, t.email";
- $sql.= ", tc.source, tc.element, tc.code, tc.libelle";
- $sql.= " FROM " . MAIN_DB_PREFIX . "c_type_contact tc";
- $sql.= ", " . MAIN_DB_PREFIX . "element_contact ec";
- if ($source == 'internal')
- $sql.=" LEFT JOIN " . MAIN_DB_PREFIX . "user t on ec.fk_socpeople = t.rowid";
- if ($source == 'external' || $source == 'thirdparty')
- $sql.=" LEFT JOIN " . MAIN_DB_PREFIX . "socpeople t on ec.fk_socpeople = t.rowid";
- $sql.= " WHERE ec.element_id =" . $this->id;
- $sql.= " AND ec.fk_c_type_contact=tc.rowid";
- $sql.= " AND tc.element='" . $this->element . "'";
- if ($source == 'internal')
- $sql.= " AND tc.source = 'internal'";
- if ($source == 'external' || $source == 'thirdparty')
- $sql.= " AND tc.source = 'external'";
- $sql.= " AND tc.active=1";
- if ($statut >= 0)
- $sql.= " AND ec.statut = '" . $statut . "'";
- $sql.=" ORDER BY t.name ASC";
- dol_syslog(get_class($this) . "::liste_contact sql=" . $sql);
- $resql = $this->db->query($sql);
- if ($resql) {
- $num = $this->db->num_rows($resql);
- $i = 0;
- while ($i < $num) {
- $obj = $this->db->fetch_object($resql);
- if (!$list) {
- $transkey = "TypeContact_" . $obj->element . "_" . $obj->source . "_" . $obj->code;
- $libelle_type = ($langs->trans($transkey) != $transkey ? $langs->trans($transkey) : $obj->libelle);
- $tab[$i] = array('source' => $obj->source, 'socid' => $obj->socid, 'id' => $obj->id,
- 'nom' => $obj->lastname, // For backward compatibility
- 'civility' => $obj->civility, 'lastname' => $obj->lastname, 'firstname' => $obj->firstname, 'email' => $obj->email,
- 'rowid' => $obj->rowid, 'code' => $obj->code, 'libelle' => $libelle_type, 'status' => $obj->statut);
- } else {
- $tab[$i] = $obj->id;
- }
- $i++;
- }
- return $tab;
- } else {
- $this->error = $this->db->error();
- dol_print_error($this->db);
- return -1;
- }
- }
- /**
- * Update status of a contact linked to object
- *
- * @param int $rowid Id of link between object and contact
- * @return int <0 if KO, >=0 if OK
- */
- function swapContactStatus($rowid) {
- $sql = "SELECT ec.datecreate, ec.statut, ec.fk_socpeople, ec.fk_c_type_contact,";
- $sql.= " tc.code, tc.libelle";
- //$sql.= ", s.fk_soc";
- $sql.= " FROM (" . MAIN_DB_PREFIX . "element_contact as ec, " . MAIN_DB_PREFIX . "c_type_contact as tc)";
- //$sql.= " LEFT JOIN ".MAIN_DB_PREFIX."socpeople as s ON ec.fk_socpeople=s.rowid"; // Si contact de type external, alors il est lie a une societe
- $sql.= " WHERE ec.rowid =" . $rowid;
- $sql.= " AND ec.fk_c_type_contact=tc.rowid";
- $sql.= " AND tc.element = '" . $this->element . "'";
- dol_syslog(get_class($this) . "::swapContactStatus sql=" . $sql);
- $resql = $this->db->query($sql);
- if ($resql) {
- $obj = $this->db->fetch_object($resql);
- $newstatut = ($obj->statut == 4) ? 5 : 4;
- $result = $this->update_contact($rowid, $newstatut);
- $this->db->free($resql);
- return $result;
- } else {
- $this->error = $this->db->error();
- dol_print_error($this->db);
- return -1;
- }
- }
- /**
- * Return array with list of possible values for type of contacts
- *
- * @param string $source 'internal', 'external' or 'all'
- * @param string $order Sort order by : 'code' or 'rowid'
- * @param string $option 0=Return array id->label, 1=Return array code->label
- * @return array Array list of type of contacts (id->label if option=0, code->label if option=1)
- */
- function liste_type_contact($source = 'internal', $order = 'code', $option = 0) {
- global $langs;
- $tab = array();
- $sql = "SELECT DISTINCT tc.rowid, tc.code, tc.libelle";
- $sql.= " FROM " . MAIN_DB_PREFIX . "c_type_contact as tc";
- $sql.= " WHERE tc.element='" . $this->element . "'";
- if (!empty($source))
- $sql.= " AND tc.source='" . $source . "'";
- $sql.= " ORDER by tc." . $order;
- //print "sql=".$sql;
- $resql = $this->db->query($sql);
- if ($resql) {
- $num = $this->db->num_rows($resql);
- $i = 0;
- while ($i < $num) {
- $obj = $this->db->fetch_object($resql);
- $transkey = "TypeContact_" . $this->element . "_" . $source . "_" . $obj->code;
- $libelle_type = ($langs->trans($transkey) != $transkey ? $langs->trans($transkey) : $obj->libelle);
- if (empty($option))
- $tab[$obj->rowid] = $libelle_type;
- else
- $tab[$obj->code] = $libelle_type;
- $i++;
- }
- return $tab;
- }
- else {
- $this->error = $this->db->lasterror();
- //dol_print_error($this->db);
- return null;
- }
- }
- /**
- * Return id of contacts for a source and a contact code.
- * Example: contact client de facturation ('external', 'BILLING')
- * Example: contact client de livraison ('external', 'SHIPPING')
- * Example: contact interne suivi paiement ('internal', 'SALESREPFOLL')
- *
- * @param string $source 'external' or 'internal'
- * @param string $code 'BILLING', 'SHIPPING', 'SALESREPFOLL', ...
- * @param int $status limited to a certain status
- * @return array List of id for such contacts
- */
- function getIdContact($source, $code, $status = 0) {
- global $conf;
- $result = array();
- $i = 0;
- $sql = "SELECT ec.fk_socpeople";
- $sql.= " FROM " . MAIN_DB_PREFIX . "element_contact as ec,";
- if ($source == 'internal')
- $sql.= " " . MAIN_DB_PREFIX . "user as c,";
- if ($source == 'external')
- $sql.= " " . MAIN_DB_PREFIX . "socpeople as c,";
- $sql.= " " . MAIN_DB_PREFIX . "c_type_contact as tc";
- $sql.= " WHERE ec.element_id = " . $this->id;
- $sql.= " AND ec.fk_socpeople = c.rowid";
- if ($source == 'internal')
- $sql.= " AND c.entity IN (0," . $conf->entity . ")";
- if ($source == 'external')
- $sql.= " AND c.entity IN (" . getEntity('societe', 1) . ")";
- $sql.= " AND ec.fk_c_type_contact = tc.rowid";
- $sql.= " AND tc.element = '" . $this->element . "'";
- $sql.= " AND tc.source = '" . $source . "'";
- $sql.= " AND tc.code = '" . $code . "'";
- $sql.= " AND tc.active = 1";
- if ($status)
- $sql.= " AND ec.statut = " . $status;
- dol_syslog(get_class($this) . "::getIdContact sql=" . $sql);
- $resql = $this->db->query($sql);
- if ($resql) {
- while ($obj = $this->db->fetch_object($resql)) {
- $result[$i] = $obj->fk_socpeople;
- $i++;
- }
- } else {
- $this->error = $this->db->error();
- dol_syslog(get_class($this) . "::getIdContact " . $this->error, LOG_ERR);
- return null;
- }
- return $result;
- }
- /**
- * Charge le contact d'id $id dans this->contact
- *
- * @param int $contactid Id du contact
- * @return int <0 if KO, >0 if OK
- */
- function fetch_contact($contactid) {
- require_once DOL_DOCUMENT_ROOT . '/contact/class/contact.class.php';
- $contact = new Contact($this->db);
- $result = $contact->fetch($contactid);
- $this->contact = $contact;
- return $result;
- }
- /**
- * Load the third party of object from id $this->socid into this->thirdpary
- *
- * @return int <0 if KO, >0 if OK
- */
- function fetch_thirdparty() {
- global $conf;
- if (empty($this->socid))
- return 0;
- $thirdparty = new Societe($this->db);
- $result = $thirdparty->fetch($this->socid);
- //$this->client = $thirdparty; // deprecated
- $this->thirdparty = $thirdparty;
- // Use first price level if level not defined for third party
- if (!empty($conf->global->PRODUIT_MULTIPRICES) && empty($this->thirdparty->price_level)) {
- $this->client->price_level = 1; // deprecated
- $this->thirdparty->price_level = 1;
- }
- return $result;
- }
- /**
- * Load data for barcode
- *
- * @return int <0 if KO, >=0 if OK
- */
- function fetch_barcode() {
- global $conf;
- dol_syslog(get_class($this) . '::fetch_barcode this->element=' . $this->element . ' this->barcode_type=' . $this->barcode_type);
- $idtype = $this->barcode_type;
- if (!$idtype) {
- if ($this->element == 'product')
- $idtype = $conf->global->PRODUIT_DEFAULT_BARCODE_TYPE;
- else if ($this->element == 'societe')
- $idtype = $conf->global->GENBARCODE_BARCODETYPE_THIRDPARTY;
- else
- dol_print_error('', 'Call fetch_barcode with barcode_type not defined and cant be guessed');
- }
- if ($idtype > 0) {
- if (empty($this->barcode_type) || empty($this->barcode_type_code) || empty($this->barcode_type_label) || empty($this->barcode_type_coder)) { // If data not already loaded
- $sql = "SELECT rowid, code, libelle as label, coder";
- $sql.= " FROM " . MAIN_DB_PREFIX . "c_barcode_type";
- $sql.= " WHERE rowid = " . $idtype;
- dol_syslog(get_class($this) . '::fetch_barcode sql=' . $sql);
- $resql = $this->db->query($sql);
- if ($resql) {
- $obj = $this->db->fetch_object($resql);
- $this->barcode_type = $obj->rowid;
- $this->barcode_type_code = $obj->code;
- $this->barcode_type_label = $obj->label;
- $this->barcode_type_coder = $obj->coder;
- return 1;
- } else {
- dol_print_error($this->db);
- return -1;
- }
- }
- }
- else
- return 0;
- }
- /**
- * Charge le projet d'id $this->fk_project dans this->projet
- *
- * @return int <0 if KO, >=0 if OK
- */
- function fetch_projet() {
- if (empty($this->fk_project))
- return 0;
- $project = new Project($this->db);
- $result = $project->fetch($this->fk_project);
- $this->projet = $project;
- return $result;
- }
- /**
- * Charge le user d'id userid dans this->user
- *
- * @param int $userid Id du contact
- * @return int <0 if KO, >0 if OK
- */
- function fetch_user($userid) {
- $user = new User($this->db);
- $result = $user->fetch($userid);
- $this->user = $user;
- return $result;
- }
- /**
- * Read linked origin object
- *
- * @return void
- */
- function fetch_origin() {
- // TODO uniformise code
- if ($this->origin == 'shipping')
- $this->origin = 'expedition';
- if ($this->origin == 'delivery')
- $this->origin = 'livraison';
- $object = $this->origin;
- $classname = ucfirst($object);
- $this->$object = new $classname($this->db);
- $this->$object->fetch($this->origin_id);
- }
- /**
- * Load object from specific field
- *
- * @param string $table Table element or element line
- * @param string $field Field selected
- * @param string $key Import key
- * @return int <0 if KO, >0 if OK
- */
- function fetchObjectFrom($table, $field, $key) {
- global $conf;
- $result = false;
- $sql = "SELECT rowid FROM " . MAIN_DB_PREFIX . $table;
- $sql.= " WHERE " . $field . " = '" . $key . "'";
- $sql.= " AND entity = " . $conf->entity;
- dol_syslog(get_class($this) . '::fetchObjectFrom sql=' . $sql);
- $resql = $this->db->query($sql);
- if ($resql) {
- $row = $this->db->fetch_row($resql);
- $result = $this->fetch($row[0]);
- }
- return $result;
- }
- /**
- * Load value from specific field
- *
- * @param string $table Table of element or element line
- * @param int $id Element id
- * @param string $field Field selected
- * @return int <0 if KO, >0 if OK
- */
- function getValueFrom($table, $id, $field) {
- $result = false;
- $sql = "SELECT " . $field . " FROM " . MAIN_DB_PREFIX . $table;
- $sql.= " WHERE rowid = " . $id;
- dol_syslog(get_class($this) . '::getValueFrom sql=' . $sql);
- $resql = $this->db->query($sql);
- if ($resql) {
- $row = $this->db->fetch_row($resql);
- $result = $row[0];
- }
- return $result;
- }
- /**
- * Update a specific field from an object
- *
- * @param string $field Field to update
- * @param mixte $value New value
- * @param string $table To force other table element or element line
- * @param int $id To force other object id
- * @param string $format Data format ('text' by default, 'date')
- * @return int <0 if KO, >0 if OK
- */
- function setValueFrom($field, $value, $table = '', $id = '', $format = 'text') {
- global $conf;
- if (empty($table))
- $table = $this->table_element;
- if (empty($id))
- $id = $this->id;
- $this->db->begin();
- $sql = "UPDATE " . MAIN_DB_PREFIX . $table . " SET ";
- if ($format == 'text')
- $sql.= $field . " = '" . $this->db->escape($value) . "'";
- else if ($format == 'date')
- $sql.= $field . " = '" . $this->db->idate($value) . "'";
- $sql.= " WHERE rowid = " . $id;
- dol_syslog(get_class($this) . "::setValueFrom sql=" . $sql, LOG_DEBUG);
- $resql = $this->db->query($sql);
- if ($resql) {
- $this->db->commit();
- return 1;
- } else {
- $this->error = $this->db->lasterror();
- $this->db->rollback();
- return -1;
- }
- }
- /**
- * Load properties id_previous and id_next
- *
- * @param string $filter Optional filter
- * @param int $fieldid Name of field to use for the select MAX and MIN
- * @return int <0 if KO, >0 if OK
- */
- function load_previous_next_ref($filter, $fieldid) {
- global $conf, $user;
- if (!$this->table_element) {
- dol_print_error('', get_class($this) . "::load_previous_next_ref was called on objet with property table_element not defined", LOG_ERR);
- return -1;
- }
- // this->ismultientitymanaged contains
- // 0=No test on entity, 1=Test with field entity, 2=Test with link by societe
- $alias = 's';
- if ($this->element == 'societe')
- $alias = 'te';
- $sql = "SELECT MAX(te." . $fieldid . ")";
- $sql.= " FROM " . MAIN_DB_PREFIX . $this->table_element . " as te";
- if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 2 || ($this->element != 'societe' && empty($this->isnolinkedbythird) && empty($user->rights->societe->client->voir)))
- $sql.= ", " . MAIN_DB_PREFIX . "societe as s"; // If we need to link to societe to limit select to entity
- if (empty($this->isnolinkedbythird) && !$user->rights->societe->client->voir)
- $sql.= " LEFT JOIN " . MAIN_DB_PREFIX . "societe_commerciaux as sc ON " . $alias . ".rowid = sc.fk_soc";
- $sql.= " WHERE te." . $fieldid . " < '" . $this->db->escape($this->ref) . "'";
- if (empty($this->isnolinkedbythird) && !$user->rights->societe->client->voir)
- $sql.= " AND sc.fk_user = " . $user->id;
- if (!empty($filter))
- $sql.=" AND " . $filter;
- if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 2 || ($this->element != 'societe' && empty($this->isnolinkedbythird) && !$user->rights->societe->client->voir))
- $sql.= ' AND te.fk_soc = s.rowid'; // If we need to link to societe to limit select to entity
- if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1)
- $sql.= ' AND te.entity IN (' . getEntity($this->element, 1) . ')';
- //print $sql."<br>";
- $result = $this->db->query($sql);
- if (!$result) {
- $this->error = $this->db->error();
- return -1;
- }
- $row = $this->db->fetch_row($result);
- $this->ref_previous = $row[0];
- $sql = "SELECT MIN(te." . $fieldid . ")";
- $sql.= " FROM " . MAIN_DB_PREFIX . $this->table_element . " as te";
- if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 2 || ($this->element != 'societe' && empty($this->isnolinkedbythird) && !$user->rights->societe->client->voir))
- $sql.= ", " . MAIN_DB_PREFIX . "societe as s"; // If we need to link to societe to limit select to entity
- if (empty($this->isnolinkedbythird) && !$user->rights->societe->client->voir)
- $sql.= " LEFT JOIN " . MAIN_DB_PREFIX . "societe_commerciaux as sc ON " . $alias . ".rowid = sc.fk_soc";
- $sql.= " WHERE te." . $fieldid . " > '" . $this->db->escape($this->ref) . "'";
- if (empty($this->isnolinkedbythird) && !$user->rights->societe->client->voir)
- $sql.= " AND sc.fk_user = " . $user->id;
- if (!empty($filter))
- $sql.=" AND " . $filter;
- if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 2 || ($this->element != 'societe' && empty($this->isnolinkedbythird) && !$user->rights->societe->client->voir))
- $sql.= ' AND te.fk_soc = s.rowid'; // If we need to link to societe to limit select to entity
- if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1)
- $sql.= ' AND te.entity IN (' . getEntity($this->element, 1) . ')';
- // Rem: Bug in some mysql version: SELECT MIN(rowid) FROM llx_socpeople WHERE rowid > 1 when one row in database with rowid=1, returns 1 instead of null
- //print $sql."<br>";
- $result = $this->db->query($sql);
- if (!$result) {
- $this->error = $this->db->error();
- return -2;
- }
- $row = $this->db->fetch_row($result);
- $this->ref_next = $row[0];
- return 1;
- }
- /**
- * Return list of id of contacts of project
- *
- * @param string $source Source of contact: external (llx_socpeople) or internal (llx_user) or thirdparty (llx_societe)
- * @return array Array of id of contacts (if source=external or internal)
- * Array of id of third parties with at least one contact on project (if source=thirdparty)
- */
- function getListContactId($source = 'external') {
- $contactAlreadySelected = array();
- $tab = $this->liste_contact(-1, $source);
- $num = count($tab);
- $i = 0;
- while ($i < $num) {
- if ($source == 'thirdparty')
- $contactAlreadySelected[$i] = $tab[$i]['socid'];
- else
- $contactAlreadySelected[$i] = $tab[$i]['id'];
- $i++;
- }
- return $contactAlreadySelected;
- }
- /**
- * Link element with a project
- *
- * @param int $projectid Project id to link element to
- * @return int <0 if KO, >0 if OK
- */
- function setProject($projectid) {
- if (!$this->table_element) {
- dol_syslog(get_class($this) . "::setProject was called on objet with property table_element not defined", LOG_ERR);
- return -1;
- }
- $sql = 'UPDATE ' . MAIN_DB_PREFIX . $this->table_element;
- if ($projectid)
- $sql.= ' SET fk_projet = ' . $projectid;
- else
- $sql.= ' SET fk_projet = NULL';
- $sql.= ' WHERE rowid = ' . $this->id;
- dol_syslog(get_class($this) . "::setProject sql=" . $sql);
- if ($this->db->query($sql)) {
- $this->fk_project = $projectid;
- return 1;
- } else {
- dol_print_error($this->db);
- return -1;
- }
- }
- /**
- * Change the payments methods
- *
- * @param int $id Id of new payment method
- * @return int >0 if OK, <0 if KO
- */
- function setPaymentMethods($id) {
- dol_syslog(get_class($this) . '::setPaymentMethods(' . $id . ')');
- if ($this->statut >= 0 || $this->element == 'societe') {
- // TODO uniformize field name
- $fieldname = 'fk_mode_reglement';
- if ($this->element == 'societe')
- $fieldname = 'mode_reglement';
- $sql = 'UPDATE ' . MAIN_DB_PREFIX . $this->table_element;
- $sql .= ' SET ' . $fieldname . ' = ' . $id;
- $sql .= ' WHERE rowid=' . $this->id;
- if ($this->db->query($sql)) {
- $this->mode_reglement_id = $id;
- $this->mode_reglement = $id; // for compatibility
- return 1;
- } else {
- dol_syslog(get_class($this) . '::setPaymentMethods Erreur ' . $sql . ' - ' . $this->db->error());
- $this->error = $this->db->error();
- return -1;
- }
- } else {
- dol_syslog(get_class($this) . '::setPaymentMethods, status of the object is incompatible');
- $this->error = 'Status of the object is incompatible ' . $this->statut;
- return -2;
- }
- }
- /**
- * Change the payments terms
- *
- * @param int $id Id of new payment terms
- * @return int >0 if OK, <0 if KO
- */
- function setPaymentTerms($id) {
- dol_syslog(get_class($this) . '::setPaymentTerms(' . $id . ')');
- if ($this->statut >= 0 || $this->element == 'societe') {
- // TODO uniformize field name
- $fieldname = 'fk_cond_reglement';
- if ($this->element == 'societe')
- $fieldname = 'cond_reglement';
- $sql = 'UPDATE ' . MAIN_DB_PREFIX . $this->table_element;
- $sql .= ' SET ' . $fieldname . ' = ' . $id;
- $sql .= ' WHERE rowid=' . $this->id;
- if ($this->db->query($sql)) {
- $this->cond_reglement_id = $id;
- $this->cond_reglement = $id; // for compatibility
- return 1;
- } else {
- dol_syslog(get_class($this) . '::setPaymentTerms Erreur ' . $sql . ' - ' . $this->db->error());
- $this->error = $this->db->error();
- return -1;
- }
- } else {
- dol_syslog(get_class($this) . '::setPaymentTerms, status of the object is incompatible');
- $this->error = 'Status of the object is incompatible ' . $this->statut;
- return -2;
- }
- }
- /**
- * Define delivery address
- *
- * @param int $id Address id
- * @return int <0 si ko, >0 si ok
- */
- function setDeliveryAddress($id) {
- $fieldname = 'fk_adresse_livraison';
- if ($this->element == 'delivery' || $this->element == 'shipping')
- $fieldname = 'fk_address';
- $sql = "UPDATE " . MAIN_DB_PREFIX . $this->table_element . " SET " . $fieldname . " = " . $id;
- $sql.= " WHERE rowid = " . $this->id . " AND fk_statut = 0";
- if ($this->db->query($sql)) {
- $this->fk_delivery_address = $id;
- return 1;
- } else {
- $this->error = $this->db->error();
- dol_syslog(get_class($this) . '::setDeliveryAddress Erreur ' . $sql . ' - ' . $this->error);
- return -1;
- }
- }
- /**
- * Set last model used by doc generator
- *
- * @param User $user User object that make change
- * @param string $modelpdf Modele name
- * @return int <0 if KO, >0 if OK
- */
- function setDocModel($user, $modelpdf) {
- $newmodelpdf = dol_trunc($modelpdf, 255);
- if ($this->modelpdf != $newmodelpdf) {
- $this->modelpdf = $newmodelpdf;
- $this->record();
- }
- return 1;
- }
- /**
- * Save a new position (field rang) for details lines.
- * You can choose to ser position for lines with already a position or lines wihtout any position defined.
- * Call this function only for table that contains a field fk_parent_line.
- *
- * @param boolean $renum true to renum all already ordered lines, false to renum only not already ordered lines.
- * @param string $rowidorder ASC or DESC
- * @return void
- */
- function line_order($renum = false, $rowidorder = 'ASC') {
- if (!$this->table_element_line) {
- dol_syslog(get_class($this) . "::line_order was called on objet with property table_element_line not defined", LOG_ERR);
- return -1;
- }
- if (!$this->fk_element) {
- dol_syslog(get_class($this) . "::line_order was called on objet with property fk_element not defined", LOG_ERR);
- return -1;
- }
- // Count number of lines to reorder (according to choice $renum)
- $nl = 0;
- $sql = 'SELECT count(rowid) FROM ' . MAIN_DB_PREFIX . $this->table_element_line;
- $sql.= ' WHERE ' . $this->fk_element . '=' . $this->id;
- if (!$renum)
- $sql.= ' AND rang = 0';
- if ($renum)
- $sql.= ' AND rang <> 0';
- dol_syslog(get_class($this) . "::line_order sql=" . $sql, LOG_DEBUG);
- $resql = $this->db->query($sql);
- if ($resql) {
- $row = $this->db->fetch_row($resql);
- $nl = $row[0];
- }
- else
- dol_print_error($this->db);
- if ($nl > 0) {
- // The goal of this part is to reorder all lines, with all children lines sharing the same
- // counter that parents.
- $rows = array();
- // We frist search all lines that are parent lines (for multilevel details lines)
- $sql = 'SELECT rowid FROM ' . MAIN_DB_PREFIX . $this->table_element_line;
- $sql.= ' WHERE ' . $this->fk_element . ' = ' . $this->id;
- $sql.= ' AND fk_parent_line IS NULL';
- $sql.= ' ORDER BY rang ASC, rowid ' . $rowidorder;
- dol_syslog(get_class($this) . "::line_order search all parent lines sql=" . $sql, LOG_DEBUG);
- $resql = $this->db->query($sql);
- if ($resql) {
- $i = 0;
- $num = $this->db->num_rows($resql);
- while ($i < $num) {
- $row = $this->db->fetch_row($resql);
- $rows[] = $row[0]; // Add parent line into array rows
- $childrens = $this->getChildrensOfLine($row[0]);
- if (!empty($childrens)) {
- foreach ($childrens as $child) {
- array_push($rows, $child);
- }
- }
- $i++;
- }
- // Now we set a new number for each lines (parent and children with children included into parent tree)
- if (!empty($rows)) {
- foreach ($rows as $key => $row) {
- $this->updateRangOfLine($row, ($key + 1));
- }
- }
- } else {
- dol_print_error($this->db);
- }
- }
- }
- /**
- * Get childrens of line
- *
- * @param int $id Id of parent line
- * @return array Array with list of child lines id
- */
- function getChildrensOfLine($id) {
- $rows = array();
- $sql = 'SELECT rowid FROM ' . MAIN_DB_PREFIX . $this->table_element_line;
- $sql.= ' WHERE ' . $this->fk_element . ' = ' . $this->id;
- $sql.= ' AND fk_parent_line = ' . $id;
- $sql.= ' ORDER BY rang ASC';
- dol_syslog(get_class($this) . "::getChildrenOfLines search children lines for line " . $id . " sql=" . $sql, LOG_DEBUG);
- $resql = $this->db->query($sql);
- if ($resql) {
- $i = 0;
- $num = $this->db->num_rows($resql);
- while ($i < $num) {
- $row = $this->db->fetch_row($resql);
- $rows[$i] = $row[0];
- $i++;
- }
- }
- return $rows;
- }
- /**
- * Update a line to have a lower rank
- *
- * @param int $rowid Id of line
- * @return void
- */
- function line_up($rowid) {
- $this->line_order();
- // Get rang of line
- $rang = $this->getRangOfLine($rowid);
- // Update position of line
- $this->updateLineUp($rowid, $rang);
- }
- /**
- * Update a line to have a higher rank
- *
- * @param int $rowid Id of line
- * @return void
- */
- function line_down($rowid) {
- $this->line_order();
- // Get rang of line
- $rang = $this->getRangOfLine($rowid);
- // Get max value for rang
- $max = $this->line_max();
- // Update position of line
- $this->updateLineDown($rowid, $rang, $max);
- }
- /**
- * Update position of line (rang)
- *
- * @param int $rowid Id of line
- * @param int $rang Position
- * @return void
- */
- function updateRangOfLine($rowid, $rang) {
- $sql = 'UPDATE ' . MAIN_DB_PREFIX . $this->table_element_line . ' SET rang = ' . $rang;
- $sql.= ' WHERE rowid = ' . $rowid;
- dol_syslog(get_class($this) . "::updateRangOfLine sql=" . $sql, LOG_DEBUG);
- if (!$this->db->query($sql)) {
- dol_print_error($this->db);
- }
- }
- /**
- * Update position of line with ajax (rang)
- *
- * @param array $rows Array of rows
- * @return void
- */
- function line_ajaxorder($rows) {
- $num = count($rows);
- for ($i = 0; $i < $num; $i++) {
- $this->updateRangOfLine($rows[$i], ($i + 1));
- }
- }
- /**
- * Update position of line up (rang)
- *
- * @param int $rowid Id of line
- * @param int $rang Position
- * @return void
- */
- function updateLineUp($rowid, $rang) {
- if ($rang > 1) {
- $sql = 'UPDATE ' . MAIN_DB_PREFIX . $this->table_element_line . ' SET rang = ' . $rang;
- $sql.= ' WHERE ' . $this->fk_element . ' = ' . $this->id;
- $sql.= ' AND rang = ' . ($rang - 1);
- if ($this->db->query($sql)) {
- $sql = 'UPDATE ' . MAIN_DB_PREFIX . $this->table_element_line . ' SET rang = ' . ($rang - 1);
- $sql.= ' WHERE rowid = ' . $rowid;
- if (!$this->db->query($sql)) {
- dol_print_error($this->db);
- }
- } else {
- dol_print_error($this->db);
- }
- }
- }
- /**
- * Update position of line down (rang)
- *
- * @param int $rowid Id of line
- * @param int $rang Position
- * @param int $max Max
- * @return void
- */
- function updateLineDown($rowid, $rang, $max) {
- if ($rang < $max) {
- $sql = 'UPDATE ' . MAIN_DB_PREFIX . $this->table_element_line . ' SET rang = ' . $rang;
- $sql.= ' WHERE ' . $this->fk_element . ' = ' . $this->id;
- $sql.= ' AND rang = ' . ($rang + 1);
- if ($this->db->query($sql)) {
- $sql = 'UPDATE ' . MAIN_DB_PREFIX . $this->table_element_line . ' SET rang = ' . ($rang + 1);
- $sql.= ' WHERE rowid = ' . $rowid;
- if (!$this->db->query($sql)) {
- dol_print_error($this->db);
- }
- } else {
- dol_print_error($this->db);
- }
- }
- }
- /**
- * Get position of line (rang)
- *
- * @param int $rowid Id of line
- * @return int Value of rang in table of lines
- */
- function getRangOfLine($rowid) {
- $sql = 'SELECT rang FROM ' . MAIN_DB_PREFIX . $this->table_element_line;
- $sql.= ' WHERE rowid =' . $rowid;
- dol_syslog(get_class($this) . "::getRangOfLine sql=" . $sql, LOG_DEBUG);
- $resql = $this->db->query($sql);
- if ($resql) {
- $row = $this->db->fetch_row($resql);
- return $row[0];
- }
- }
- /**
- * Get rowid of the line relative to its position
- *
- * @param int $rang Rang value
- * @return int Rowid of the line
- */
- function getIdOfLine($rang) {
- $sql = 'SELECT rowid FROM ' . MAIN_DB_PREFIX . $this->table_element_line;
- $sql.= ' WHERE ' . $this->fk_element . ' = ' . $this->id;
- $sql.= ' AND rang = ' . $rang;
- $resql = $this->db->query($sql);
- if ($resql) {
- $row = $this->db->fetch_row($resql);
- return $row[0];
- }
- }
- /**
- * Get max value used for position of line (rang)
- *
- * @param int $fk_parent_line Parent line id
- * @return int Max value of rang in table of lines
- */
- function line_max($fk_parent_line = 0) {
- // Search the last rang with fk_parent_line
- if ($fk_parent_line) {
- $sql = 'SELECT max(rang) FROM ' . MAIN_DB_PREFIX . $this->table_element_line;
- $sql.= ' WHERE ' . $this->fk_element . ' = ' . $this->id;
- $sql.= ' AND fk_parent_line = ' . $fk_parent_line;
- dol_syslog(get_class($this) . "::line_max sql=" . $sql, LOG_DEBUG);
- $resql = $this->db->query($sql);
- if ($resql) {
- $row = $this->db->fetch_row($resql);
- if (!empty($row[0])) {
- return $row[0];
- } else {
- return $this->getRangOfLine($fk_parent_line);
- }
- }
- }
- // If not, search the last rang of element
- else {
- $sql = 'SELECT max(rang) FROM ' . MAIN_DB_PREFIX . $this->table_element_line;
- $sql.= ' WHERE ' . $this->fk_element . ' = ' . $this->id;
- dol_syslog(get_class($this) . "::line_max sql=" . $sql, LOG_DEBUG);
- $resql = $this->db->query($sql);
- if ($resql) {
- $row = $this->db->fetch_row($resql);
- return $row[0];
- }
- }
- }
- /**
- * Update external ref of element
- *
- * @param string $ref_ext Update field ref_ext
- * @return int <0 if KO, >0 if OK
- */
- function update_ref_ext($ref_ext) {
- if (!$this->table_element) {
- dol_syslog(get_class($this) . "::update_ref_ext was called on objet with property table_element not defined", LOG_ERR);
- return -1;
- }
- $sql = 'UPDATE ' . MAIN_DB_PREFIX . $this->table_element;
- $sql.= " SET ref_ext = '" . $this->db->escape($ref_ext) . "'";
- $sql.= " WHERE " . (isset($this->table_rowid) ? $this->table_rowid : 'rowid') . " = " . $this->id;
- dol_syslog(get_class($this) . "::update_ref_ext sql=" . $sql, LOG_DEBUG);
- if ($this->db->query($sql)) {
- $this->ref_ext = $ref_ext;
- return 1;
- } else {
- $this->error = $this->db->error();
- dol_syslog(get_class($this) . "::update_ref_ext error=" . $this->error, LOG_ERR);
- return -1;
- }
- }
- /**
- * Update private note of element
- *
- * @param string $note New value for note
- * @return int <0 if KO, >0 if OK
- */
- function update_note($note) {
- if (!$this->table_element) {
- dol_syslog(get_class($this) . "::update_note was called on objet with property table_element not defined", LOG_ERR);
- return -1;
- }
- $sql = 'UPDATE ' . MAIN_DB_PREFIX . $this->table_element;
- // TODO uniformize fields to note_private
- if ($this->table_element == 'fichinter' || $this->table_element == 'projet' || $this->table_element == 'projet_task') {
- $sql.= " SET note_private = '" . $this->db->escape($note) . "'";
- } else {
- $sql.= " SET note = '" . $this->db->escape($note) . "'";
- }
- $sql.= " WHERE rowid =" . $this->id;
- dol_syslog(get_class($this) . "::update_note sql=" . $sql, LOG_DEBUG);
- if ($this->db->query($sql)) {
- $this->note = $note; // deprecated
- $this->note_private = $note;
- return 1;
- } else {
- $this->error = $this->db->error();
- dol_syslog(get_class($this) . "::update_note error=" . $this->error, LOG_ERR);
- return -1;
- }
- }
- /**
- * Update public note of element
- *
- * @param string $note_public New value for note
- * @return int <0 if KO, >0 if OK
- */
- function update_note_public($note_public) {
- if (!$this->table_element) {
- dol_syslog(get_class($this) . "::update_note_public was called on objet with property table_element not defined", LOG_ERR);
- return -1;
- }
- $sql = 'UPDATE ' . MAIN_DB_PREFIX . $this->table_element;
- $sql.= " SET note_public = '" . $this->db->escape($note_public) . "'";
- $sql.= " WHERE rowid =" . $this->id;
- dol_syslog(get_class($this) . "::update_note_public sql=" . $sql);
- if ($this->db->query($sql)) {
- $this->note_public = $note_public;
- return 1;
- } else {
- $this->error = $this->db->error();
- return -1;
- }
- }
- /**
- * Update total_ht, total_ttc and total_vat for an object (sum of lines)
- *
- * @param int $exclspec Exclude special product (product_type=9)
- * @param int $roundingadjust -1=Use default method (MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND or 0), 0=Use total of rounding, 1=Use rounding of total
- * @param int $nodatabaseupdate 1=Do not update database. Update only properties of object.
- * @return int <0 if KO, >0 if…
Large files files are truncated, but you can click here to view the full file