* Copyright (C) 2004-2005 Laurent Destailleur * Copyright (C) 2004 Eric Seigne * Copyright (C) 2003 Brian Fraval * * * 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 2 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, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * $Id$ * $Source$ * */ /** \file htdocs/societe.class.php \ingroup societe \brief Fichier de la classe des societes \version $Revision$ */ /** \class Societe \brief Classe permettant la gestion des societes */ class Societe { var $db; var $id; var $nom; var $adresse; var $cp; var $ville; var $departement_id; var $pays_id; var $tel; var $fax; var $url; var $siren; var $forme_juridique_code; var $forme_juridique; var $client; var $note; var $fournisseur; var $code_client; var $code_compta; /** * \brief Constructeur de la classe * \param DB handler accès base de données * \param id id societe (0 par defaut) */ function Societe($DB, $id=0) { global $config; $this->creation_bit = 0; $this->db = $DB; $this->id = $id; $this->client = 0; $this->fournisseur = 0; $this->effectif_id = 0; $this->forme_juridique_code = 0; if (defined('CODECLIENT_ADDON') && strlen(CODECLIENT_ADDON) > 0) { require_once DOL_DOCUMENT_ROOT.'/includes/modules/societe/'.CODECLIENT_ADDON.'.php'; $var = CODECLIENT_ADDON; } else { require_once DOL_DOCUMENT_ROOT.'/includes/modules/societe/mod_codeclient_leopard.php'; $var = "mod_codeclient_leopard"; } $this->mod_codeclient = new $var; $this->codeclient_modifiable = $this->mod_codeclient->modifiable; return 1; } /** * \brief Crée la societe en base * \param user Utilisateur qui demande la création */ function create($user='') { $result = $this->verify(); if ($result == 0) { $sql = "INSERT INTO ".MAIN_DB_PREFIX."societe (nom, datec, datea, fk_user_creat) "; $sql .= " VALUES ('".trim($this->nom)."', now(), now(), '".$user->id."');"; if ($this->db->query($sql) ) { $this->id = $this->db->last_insert_id(); } $this->creation_bit = 1; $result = $this->update($this->id); return $result; } else { return -1; } } /** * \brief Verification lors de la modification */ function verify() { $result = 0; $this->error_message = ""; if (strlen(trim($this->nom)) == 0) { $this->error_message = "Le nom de la société ne peut être vide.\n"; $result = -2; } if ($this->codeclient_modifiable == 1) { // On ne vérifie le code client que si celui-ci est modifiable // Si il n'est pas modifiable il n'est pas mis à jour lors de l'update $rescode = $this->verif_codeclient(); if ($rescode <> 0) { if ($rescode == -1) { $this->error_message .= "La syntaxe du code client est incorrecte.\n"; } if ($rescode == -2) { $this->error_message .= "Vous devez saisir un code client.\n"; } if ($rescode == -3) { $this->error_message .= "Ce code client est déjà utilisé.\n"; } $result = -3; } } return $result; } /** * \brief Mise a jour des paramètres de la société * \param id id societe * \param user Utilisateur qui demande la mise à jour */ function update($id, $user='') { dolibarr_syslog("Societe::Update"); $result = $this->verify(); if ($result == 0) { dolibarr_syslog("Societe::Update verify ok"); if (strlen(trim($this->capital)) == 0) { $this->capital = 0; } $this->tel = ereg_replace(" ","",$this->tel); $this->tel = ereg_replace("\.","",$this->tel); $this->fax = ereg_replace(" ","",$this->fax); $this->fax = ereg_replace("\.","",$this->fax); /* * \todo simpliste pour l'instant mais remplit 95% des cas à améliorer */ if ($this->departement_id == -1 && $this->pays_id == 1) { if (strlen(trim($this->cp)) == 5) { $depid = departement_rowid($this->db, substr(trim($this->cp),0,2), $this->pays_id); if ($depid > 0) { $this->departement_id = $depid; } } } /* * Supression des if (trim(valeur)) pour construire la requete * sinon il est impossible de vider les champs */ $sql = "UPDATE ".MAIN_DB_PREFIX."societe "; $sql .= " SET nom = '" . addslashes(trim($this->nom)) ."'"; // Champ obligatoire $sql .= ",address = '" . addslashes(trim($this->adresse)) ."'"; if (trim($this->cp)) { $sql .= ",cp = '" . trim($this->cp) ."'"; } if (trim($this->ville)) { $sql .= ",ville = '" . addslashes(trim($this->ville)) ."'"; } if (trim($this->departement_id)) { $sql .= ",fk_departement = '" . $this->departement_id ."'"; } if (trim($this->pays_id)) { $sql .= ",fk_pays = '" . $this->pays_id ."'"; } $sql .= ",tel = '" . trim($this->tel) ."'"; $sql .= ",fax = '" . trim($this->fax) ."'"; $sql .= ",url = '" . trim($this->url) ."'"; $sql .= ",siren = '" . trim($this->siren) ."'"; $sql .= ",siret = '" . trim($this->siret) ."'"; $sql .= ",ape = '" . trim($this->ape) ."'"; if (trim($this->prefix_comm)) { $sql .= ",prefix_comm = '" . trim($this->prefix_comm) ."'"; } if (trim($this->tva_intra)) { $sql .= ",tva_intra = '" . trim($this->tva_intra) ."'"; } if (trim($this->capital)) { $sql .= ",capital = '" . trim($this->capital) ."'"; } if (trim($this->effectif_id)) { $sql .= ",fk_effectif = '" . trim($this->effectif_id) ."'"; } if (trim($this->forme_juridique_code)) { $sql .= ",fk_forme_juridique = '".trim($this->forme_juridique_code)."'"; } $sql .= ",client = " . $this->client; $sql .= ",fournisseur = " . $this->fournisseur; if ($user) { $sql .= ",fk_user_modif = '".$user->id."'"; } if ($this->creation_bit || $this->codeclient_modifiable) { // Attention check_codeclient peut modifier le code // suivant le module utilisé $this->check_codeclient(); $sql .= ", code_client = '". $this->code_client ."'"; // Attention check_codecompta peut modifier le code // suivant le module utilisé $this->check_codecompta(); $sql .= ", code_compta = '". $this->code_compta ."'"; } $sql .= " WHERE idp = '" . $id ."'"; if ($this->db->query($sql)) { $result = 0; } else { if ($this->db->errno() == $this->db->ERROR_DUPLICATE) { // Doublon $this->error_message = "Erreur, le prefix '".$this->prefix_comm."' existe déjà vous devez en choisir un autre"; $result = -1; } else { dolibarr_syslog("Societe::Update echec sql=$sql"); $result = -2; } } } return $result; } /** * \brief Recupére l'objet societe * \param socid id de la société à charger en mémoire */ function fetch($socid) { $this->id = $socid; $sql = "SELECT s.idp, s.nom, s.address,".$this->db->pdate("s.datec")." as dc, prefix_comm"; $sql .= ",". $this->db->pdate("s.tms")." as date_update"; $sql .= ", s.tel, s.fax, s.url,s.cp,s.ville, s.note, s.siren, client, fournisseur"; $sql .= ", s.siret, s.capital, s.ape, s.tva_intra, s.rubrique, s.fk_effectif"; $sql .= ", e.libelle as effectif, e.id as effectif_id"; $sql .= ", s.fk_forme_juridique as forme_juridique_code, fj.libelle as forme_juridique"; $sql .= ", s.code_client, s.code_compta, s.parent"; $sql .= ", s.fk_departement, s.fk_pays, s.fk_stcomm, s.remise_client"; $sql .= ", p.libelle as pays"; $sql .= ", st.libelle as stcomm"; $sql .= " FROM ".MAIN_DB_PREFIX."societe as s"; $sql .= ", ".MAIN_DB_PREFIX."c_effectif as e"; $sql .= ", ".MAIN_DB_PREFIX."c_pays as p"; $sql .= ", ".MAIN_DB_PREFIX."c_stcomm as st"; $sql .= ", ".MAIN_DB_PREFIX."c_forme_juridique as fj"; $sql .= " WHERE s.idp = ".$this->id; $sql .= " AND s.fk_stcomm = st.id"; $sql .= " AND s.fk_effectif = e.id"; $sql .= " AND s.fk_pays = p.rowid"; $sql .= " AND s.fk_forme_juridique = fj.code"; if ($this->db->query($sql)) { if ($this->db->num_rows()) { $obj = $this->db->fetch_object(); $this->date_update = $obj->date_update; $this->nom = stripslashes($obj->nom); $this->adresse = stripslashes($obj->address); $this->cp = $obj->cp; $this->ville = stripslashes($obj->ville); $this->adresse_full = stripslashes($obj->address) . "\n". $obj->cp . " ". stripslashes($obj->ville); $this->departement_id = $obj->fk_departement; $this->pays_id = $obj->fk_pays; $this->pays = $obj->fk_pays?$obj->pays:''; $this->stcomm_id = $obj->fk_stcomm; // statut commercial $this->statut_commercial = $obj->stcomm; // statut commercial $this->url = $obj->url; $this->tel = $obj->tel; $this->fax = $obj->fax; $this->parent = $obj->parent; $this->siren = $obj->siren; $this->siret = $obj->siret; $this->ape = $obj->ape; $this->capital = $obj->capital; $this->code_client = $obj->code_client; if (strlen($this->code_client) == 0 && $this->mod_codeclient->code_modifiable_null == 1) { $this->codeclient_modifiable = 1; } $this->code_compta = $obj->code_compta; $this->tva_intra = $obj->tva_intra; $this->tva_intra_code = substr($obj->tva_intra,0,2); $this->tva_intra_num = substr($obj->tva_intra,2); $this->effectif = $obj->effectif; $this->effectif_id = $obj->effectif_id; $this->forme_juridique_code= $obj->forme_juridique_code; $this->forme_juridique = $obj->forme_juridique; $this->prefix_comm = $obj->prefix_comm; $this->remise_client = $obj->remise_client; $this->client = $obj->client; $this->fournisseur = $obj->fournisseur; if ($this->client == 1) { $this->nom_url = ''.$obj->nom.''; } elseif($this->client == 2) { $this->nom_url = ''.$obj->nom.''; } else { $this->nom_url = ''.$obj->nom.''; } $this->rubrique = $obj->rubrique; $this->note = $obj->note; $result = 1; } else { dolibarr_syslog("Erreur Societe::Fetch aucune societe avec id=".$this->id); $result = -2; } $this->db->free(); } else { dolibarr_syslog("Erreur Societe::Fetch echec sql=$sql"); $result = -3; } return $result; } /** * \brief Suppression d'une societe de la base * \todo Cette fonction n'est pas utilisée. Attente des contraintes d'intégrité dans MySql */ function delete($id) { dolibarr_syslog("Societe::Delete"); $sqr = 0; if ( $this->db->query("BEGIN") ) { $sql = "DELETE from ".MAIN_DB_PREFIX."socpeople "; $sql .= " WHERE fk_soc = " . $id .";"; if ($this->db->query($sql)) { $sqr++; } else { $this->error_message .= "Impossible de supprimer les contacts.\n"; dolibarr_syslog("Societe::Delete erreur -1"); } $sql = "DELETE from ".MAIN_DB_PREFIX."societe_rib "; $sql .= " WHERE fk_soc = " . $id .";"; if ($this->db->query($sql)) { $sqr++; } else { $this->error_message .= "Impossible de supprimer le RIB.\n"; dolibarr_syslog("Societe::Delete erreur -2"); } $sql = "DELETE from ".MAIN_DB_PREFIX."societe "; $sql .= " WHERE idp = " . $id .";"; if ($this->db->query($sql)) { $sqr++; } else { $this->error_message .= "Impossible de supprimer la société.\n"; dolibarr_syslog("Societe::Delete erreur -3"); } if ($sqr == 3) { $this->db->query("COMMIT"); // Suppression du répertoire document $docdir = $conf->societe->dir_output . "/" . $id; if (file_exists ($docdir)) { $this->deldir($docdir); } return 0; } else { $this->db->query("ROLLBACK"); return -1; } } } /** * \brief Cette fonction permet de supprimer le répertoire de la societe * et sous répertoire, meme s'ils contiennent des documents. * \param dir repertoire a supprimer */ function deldir($dir) { $current_dir = opendir($dir); while($entryname = readdir($current_dir)) { if(is_dir("$dir/$entryname") and ($entryname != "." and $entryname!="..")) { deldir("${dir}/${entryname}"); } elseif($entryname != "." and $entryname!="..") { unlink("${dir}/${entryname}"); } } closedir($current_dir); rmdir(${dir}); } /** * \brief Retournes les factures impayées de la société * \return array tableau des id de factures impayées * */ function factures_impayes() { $facimp = array(); /* * Lignes */ $sql = "SELECT f.rowid"; $sql .= " FROM ".MAIN_DB_PREFIX."facture as f WHERE f.fk_soc = '".$this->id . "'"; $sql .= " AND f.fk_statut = '1' AND f.paye = '0'"; if ($this->db->query($sql)) { $num = $this->db->num_rows(); $i = 0; while ($i < $num) { $objp = $this->db->fetch_object(); $array_push($facimp, $objp->rowid); $i++; print $i; } $this->db->free(); } return $facimp; } /** * \brief Attribut le prefix de la société en base * */ function attribute_prefix() { $sql = "SELECT nom FROM ".MAIN_DB_PREFIX."societe WHERE idp = '$this->id'"; if ( $this->db->query( $sql) ) { if ( $this->db->num_rows() ) { $nom = preg_replace("/[[:punct:]]/","",$this->db->result(0,0)); $this->db->free(); $prefix = $this->genprefix($nom,4); $sql = "SELECT count(*) FROM ".MAIN_DB_PREFIX."societe WHERE prefix_comm = '$prefix'"; if ( $this->db->query( $sql) ) { if ( $this->db->result(0, 0) ) { $this->db->free(); } else { $this->db->free(); $sql = "UPDATE ".MAIN_DB_PREFIX."societe set prefix_comm='$prefix' WHERE idp='$this->id'"; if ( $this->db->query( $sql) ) { } else { dolibarr_print_error($this->db); } } } else { dolibarr_print_error($this->db); } } } else { dolibarr_print_error($this->db); } return $prefix; } /** * \brief Génère le préfix de la société * \param nom nom de la société * \param taille taille du prefix à retourner * \param mot l'indice du mot à utiliser * */ function genprefix($nom, $taille=4,$mot=0) { $retour = ""; $tab = explode(" ",$nom); if($mot < count($tab)) { $prefix = strtoupper(substr($tab[$mot],0,$taille)); //On vérifie que ce prefix n'a pas déjà été pris ... $sql = "SELECT count(*) FROM ".MAIN_DB_PREFIX."societe WHERE prefix_comm = '$prefix'"; if ( $this->db->query( $sql) ) { if ( $this->db->result(0, 0) ) { $this->db->free(); $retour = $this->genprefix($nom,$taille,$mot+1); } else { $retour = $prefix; } } } return $retour; } /** * \brief Définit la société comme un client * */ function set_as_client() { if ($this->id) { $sql = "UPDATE ".MAIN_DB_PREFIX."societe "; $sql .= " SET client = 1"; $sql .= " WHERE idp = " . $this->id .";"; return $this->db->query($sql); } } /** * \brief Définit la société comme un client * \param remise montant de la remise * \param user utilisateur qui place la remise * */ function set_remise_client($remise, $user) { if ($this->id) { $sql = "UPDATE ".MAIN_DB_PREFIX."societe "; $sql .= " SET remise_client = '".$remise."'"; $sql .= " WHERE idp = " . $this->id .";"; $this->db->query($sql); $sql = "INSERT INTO ".MAIN_DB_PREFIX."societe_remise "; $sql .= " ( datec, fk_soc, remise_client, fk_user_author )"; $sql .= " VALUES (now(),".$this->id.",'".$remise."',".$user->id.")"; if (! $this->db->query($sql) ) { dolibarr_print_error($this->db); } } } /** * \brief Définit la société comme un client * \param remise montant de la remise * \param user utilisateur qui place la remise * */ function set_remise_except($remise, $user) { if ($this->id) { $remise = ereg_replace(",",".",$remise); $sql = "DELETE FROM ".MAIN_DB_PREFIX."societe_remise_except "; $sql .= " WHERE fk_soc = " . $this->id ." AND fk_facture IS NULL;"; $this->db->query($sql); $sql = "INSERT INTO ".MAIN_DB_PREFIX."societe_remise_except "; $sql .= " ( datec, fk_soc, amount_ht, fk_user )"; $sql .= " VALUES (now(),".$this->id.",'".$remise."',".$user->id.")"; if (! $this->db->query($sql) ) { dolibarr_print_error($this->db); } } } /** * \brief Renvoie le nom d'une societe a partir d'un id * \param id id de la société recherchée * */ function get_nom($id) { $sql = "SELECT nom FROM ".MAIN_DB_PREFIX."societe WHERE idp='$id';"; $result = $this->db->query($sql); if ($result) { if ($this->db->num_rows()) { $obj = $this->db->fetch_object($result); return $obj->nom; } $this->db->free(); } else { dolibarr_print_error($this->db); } } /** * \brief Renvoie la liste des contacts emails existant pour la société * \return array tableau des contacts emails */ function contact_email_array() { $contact_email = array(); $sql = "SELECT idp, email, name, firstname FROM ".MAIN_DB_PREFIX."socpeople WHERE fk_soc = '$this->id'"; if ($this->db->query($sql) ) { $nump = $this->db->num_rows(); if ($nump) { $i = 0; while ($i < $nump) { $obj = $this->db->fetch_object(); $contact_email[$obj->idp] = "$obj->firstname $obj->name <$obj->email>"; $i++; } } return $contact_email; } else { dolibarr_print_error($this->db); } } /** * \brief Renvoie la liste des contacts de cette société * \return array tableau des contacts */ function contact_array() { $contacts = array(); $sql = "SELECT idp, name, firstname FROM ".MAIN_DB_PREFIX."socpeople WHERE fk_soc = '$this->id'"; if ($this->db->query($sql) ) { $nump = $this->db->num_rows(); if ($nump) { $i = 0; while ($i < $nump) { $obj = $this->db->fetch_object(); $contacts[$obj->idp] = "$obj->firstname $obj->name"; $i++; } } return $contacts; } else { dolibarr_print_error($this->db); } } /** * \brief Renvoie l'email d'un contact par son id * \param rowid id du contact * \return string email du contact */ function contact_get_email($rowid) { $sql = "SELECT idp, email, name, firstname FROM ".MAIN_DB_PREFIX."socpeople WHERE idp = '$rowid'"; if ($this->db->query($sql) ) { $nump = $this->db->num_rows(); if ($nump) { $obj = $this->db->fetch_object(); $contact_email = "$obj->firstname $obj->name <$obj->email>"; } return $contact_email; } else { dolibarr_print_error($this->db); } } /** * \brief Renvoie la liste des types de parties * \return array tableau des types */ function typent_array() { $effs = array(); /* * Lignes */ $sql = "SELECT id, libelle"; $sql .= " FROM ".MAIN_DB_PREFIX."c_typent"; $sql .= " ORDER BY id ASC"; if ($this->db->query($sql)) { $num = $this->db->num_rows(); $i = 0; while ($i < $num) { $objp = $this->db->fetch_object(); $effs[$objp->id] = $objp->libelle; $i++; } $this->db->free(); } return $effs; } /** * \brief Renvoie la liste des types d'effectifs possibles * \return array tableau des types d'effectifs */ function effectif_array() { $effs = array(); /* * Lignes */ $sql = "SELECT id, libelle"; $sql .= " FROM ".MAIN_DB_PREFIX."c_effectif"; $sql .= " ORDER BY id ASC"; if ($this->db->query($sql)) { $num = $this->db->num_rows(); $i = 0; while ($i < $num) { $objp = $this->db->fetch_object(); $effs[$objp->id] = $objp->libelle; $i++; } $this->db->free(); } return $effs; } /** * \brief Renvoie la liste des formes juridiques existantes * \return array tableau des formes juridiques */ function forme_juridique_array() { $fj = array(); /* * Lignes */ $sql = "SELECT code, libelle"; $sql .= " FROM ".MAIN_DB_PREFIX."c_forme_juridique"; $sql .= " ORDER BY code ASC"; if ($this->db->query($sql)) { $num = $this->db->num_rows(); $i = 0; while ($i < $num) { $objp = $this->db->fetch_object(); $fj[$objp->code] = $objp->libelle; $i++; } $this->db->free(); } return $fj; } /** * \brief Affiche le rib */ function display_rib() { require_once DOL_DOCUMENT_ROOT . "/companybankaccount.class.php"; $bac = new CompanyBankAccount($this->db, $this->id); $bac->fetch(); $rib = $bac->code_banque." ".$bac->code_guichet." ".$bac->number." ".$bac->cle_rib; return $rib; } function rib() { require_once DOL_DOCUMENT_ROOT . "/companybankaccount.class.php"; $bac = new CompanyBankAccount($this->db, $this->id); $bac->fetch(); $this->bank_account = $bac; return 1; } function verif_rib() { $this->rib(); return $this->bank_account->verif(); } /** * \brief Verifie code client * \return Renvoie 0 si ok, peut modifier le code client suivant le module utilisé */ function verif_codeclient() { if (defined('CODECLIENT_ADDON') && strlen(CODECLIENT_ADDON) > 0) { require_once DOL_DOCUMENT_ROOT.'/includes/modules/societe/'.CODECLIENT_ADDON.'.php'; $var = CODECLIENT_ADDON; $mod = new $var; return $mod->verif($this->db, $this->code_client, $this->id); } else { return 0; } } function check_codeclient() { if (defined('CODECLIENT_ADDON') && strlen(CODECLIENT_ADDON) > 0) { require_once DOL_DOCUMENT_ROOT.'/includes/modules/societe/'.CODECLIENT_ADDON.'.php'; $var = CODECLIENT_ADDON; $mod = new $var; return $mod->verif($this->db, $this->code_client); } else { return 0; } } /** * \brief Renvoie un code compta, suivant le module le code compta renvoyé * peut être identique à celui saisit ou généré automatiquement * * A ce jour seul la génération automatique est implémentée */ function check_codecompta() { if (defined('CODECOMPTA_ADDON') && strlen(CODECOMPTA_ADDON) > 0) { require_once DOL_DOCUMENT_ROOT.'/includes/modules/societe/'.CODECOMPTA_ADDON.'.php'; $var = CODECOMPTA_ADDON; $mod = new $var; $result = $mod->get_code($this->db, $this); $this->code_compta = $mod->code; return $result; } else { $this->code_compta = ''; return 0; } } /** * \brief Définit la société mère pour les filiales * */ function set_parent($id) { if ($this->id) { $sql = "UPDATE ".MAIN_DB_PREFIX."societe "; $sql .= " SET parent = ".$id; $sql .= " WHERE idp = " . $this->id .";"; if ( $this->db->query($sql) ) { return 0; } } } } ?>