[ Index ]
 

Code source de Dolibarr 2.0.1

Accédez au Source d'autres logiciels libres

Classes | Fonctions | Variables | Constantes | Tables

title

Body

[fermer]

/htdocs/lib/ -> functions.inc.php (source)

   1  <?php
   2  /* Copyright (C) 2000-2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
   3   * Copyright (C) 2003      Jean-Louis Bergamo   <jlb@j1b.org>
   4   * Copyright (C) 2004-2005 Laurent Destailleur  <eldy@users.sourceforge.net>
   5   * Copyright (C) 2004      Sebastien Di Cintio  <sdicintio@ressource-toi.org>
   6   * Copyright (C) 2004      Benoit Mortier       <benoit.mortier@opensides.be>
   7   * Copyright (C) 2004      Christophe Combelles <ccomb@free.fr>
   8   *
   9   * This program is free software; you can redistribute it and/or modify
  10   * it under the terms of the GNU General Public License as published by
  11   * the Free Software Foundation; either version 2 of the License, or
  12   * (at your option) any later version.
  13   *
  14   * This program is distributed in the hope that it will be useful,
  15   * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17   * GNU General Public License for more details.
  18   *
  19   * You should have received a copy of the GNU General Public License
  20   * along with this program; if not, write to the Free Software
  21   * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  22   * or see http://www.gnu.org/
  23   *
  24   * $Id: functions.inc.php,v 1.161.2.3 2006/01/06 14:43:08 eldy Exp $
  25   * $Source: /cvsroot/dolibarr/dolibarr/htdocs/lib/functions.inc.php,v $
  26   */
  27  
  28  /**
  29          \file       htdocs/lib/functions.inc.php
  30          \brief      Ensemble de fonctions de base de dolibarr sous forme d'include
  31          \author     Rodolphe Quiedeville
  32          \author        Jean-Louis Bergamo
  33          \author        Laurent Destailleur
  34          \author     Sebastien Di Cintio
  35          \author     Benoit Mortier
  36          \version    $Revision: 1.161.2.3 $
  37  
  38          Ensemble de fonctions de base de dolibarr sous forme d'include
  39  */
  40  
  41  
  42  /**
  43          \brief      Renvoi une version en chaine depuis une version en tableau
  44          \param        versionarray        Tableau de version (vermajeur,vermineur,autre)
  45          \return     string              Chaine version
  46  */
  47  function versiontostring($versionarray)
  48  {
  49      $string='?';
  50      if (isset($versionarray[0])) $string=$versionarray[0];
  51      if (isset($versionarray[1])) $string.='.'.$versionarray[1];
  52      if (isset($versionarray[2])) $string.='.'.$versionarray[2];
  53      return $string;
  54  }
  55  
  56  /**
  57          \brief      Compare 2 versions
  58          \param        versionarray1       Tableau de version (vermajeur,vermineur,autre)
  59          \param        versionarray2       Tableau de version (vermajeur,vermineur,autre)
  60          \return     int                 <0 si versionarray1>versionarray2, 0 si =, >0 si versionarray1>versionarray2
  61  */
  62  function versioncompare($versionarray1,$versionarray2)
  63  {
  64      $ret=0;
  65      $i=0;
  66      while ($i < max(sizeof($versionarray1),sizeof($versionarray1)))
  67      {
  68          $operande1=isset($versionarray1[$i])?$versionarray1[$i]:0;
  69          $operande2=isset($versionarray2[$i])?$versionarray2[$i]:0;
  70          if ($operande1 < $operande2) { $ret = -1; break; }
  71          if ($operande1 > $operande2) { $ret =  1; break; }
  72          $i++;
  73      }    
  74      return $ret;
  75  }
  76  
  77  
  78  /**
  79          \brief      Compare 2 versions
  80          \return     array               Tableau de version (vermajeur,vermineur,autre)
  81  */
  82  function versionphp()
  83  {
  84      return split('\.',PHP_VERSION);
  85  }
  86  
  87  
  88  /**
  89          \brief      Renvoi vrai si l'email est syntaxiquement valide
  90          \param        address     adresse email (Ex: "toto@titi.com", "John Do <johndo@titi.com>")
  91          \return     boolean     true si email valide, false sinon
  92  */
  93  function ValidEmail($address)
  94  {
  95    if (ereg( ".*<(.+)>", $address, $regs)) {
  96      $address = $regs[1];
  97    }
  98    if (ereg( "^[^@  ]+@([a-zA-Z0-9\-]+\.)+([a-zA-Z0-9\-]{2}|net|com|gov|mil|org|edu|info|name|int)\$",$address))
  99      {
 100        return true;
 101      }
 102    else
 103      {
 104        return false;
 105      }
 106  }
 107  
 108  /**
 109          \brief      Renvoi vrai si l'email a un nom de domaine qui résoud via dns
 110          \param        mail        adresse email (Ex: "toto@titi.com", "John Do <johndo@titi.com>")
 111          \return     boolean     true si email valide, false sinon
 112  */
 113  function check_mail ($mail)
 114  {
 115    list($user, $domain) = split("@", $mail, 2);
 116    if (checkdnsrr($domain, "MX"))
 117      {
 118        return true;
 119      }
 120    else
 121      {
 122        return false;
 123      }
 124  }
 125  
 126  /**
 127          \brief          Nettoie chaine de caractère des accents
 128          \param          str             Chaine a nettoyer
 129          \return         string          Chaine nettoyé
 130  */
 131  function unaccent($str)
 132  {
 133    $acc = array("à","ä","é","è","ë","ï","î","ö","ô","ù","ü","'");
 134    $uac = array("a","a","e","e","e","i","i","o","o","u","u","");
 135  
 136    return str_replace($acc, $uac, $str);
 137  }
 138  
 139  /**
 140          \brief          Nettoie chaine de caractère de caractères spéciaux
 141          \param          str             Chaine a nettoyer
 142          \return         string          Chaine nettoyé
 143  */
 144  function sanitize_string($str)
 145  {
 146      $forbidden_chars=array(" ","'","/","\\",":","*","?","\"","<",">","|","[","]",",",";","="); 
 147      return str_replace($forbidden_chars,"_",$str);
 148  }
 149  
 150  
 151  /**
 152     \brief       Envoi des messages dolibarr dans syslog ou dans un fichier
 153                  Pour syslog:    facility défini par SYSLOG_FACILITY
 154                  Pour fichier:   fichier défini par SYSLOG_FILE
 155     \param       message            Message a envoyer a syslog
 156     \param       level           Niveau de l'erreur
 157     \remarks     Cette fonction n'a un effet que si le module syslog est activé.
 158                  Warning, les fonctions syslog sont buggués sous Windows et génèrent des
 159                  fautes de protection mémoire. Pour résoudre, utiliser le loggage fichier,
 160                  au lieu du loggage syslog (configuration du module).
 161  */
 162  function dolibarr_syslog($message, $level=LOG_ERR)
 163  {
 164      global $conf,$user,$langs;
 165      
 166      if ($conf->syslog->enabled)
 167      {
 168          // Ajout user a la log
 169          $login='???';
 170          if (is_object($user) && $user->id) $login=$user->login;
 171          $message=sprintf("%-8s",$login)." ".$message;
 172  
 173          if (defined("SYSLOG_FILE") && SYSLOG_FILE)
 174          {
 175              $file=fopen(SYSLOG_FILE,"a+");
 176              if ($file) {
 177                  fwrite($file,strftime("%Y-%m-%d %H:%M:%S",time())." ".$level." ".$message."\n");
 178                  fclose($file);
 179              }
 180              else {
 181                  $langs->load("main");
 182                  print $langs->trans("ErrorFailedToOpenFile",SYSLOG_FILE);
 183              }
 184          }
 185          else
 186          {
 187              //define_syslog_variables(); déjà définit dans master.inc.php
 188          
 189              if (defined("MAIN_SYSLOG_FACILITY") && MAIN_SYSLOG_FACILITY)
 190              {
 191                  $facility = MAIN_SYSLOG_FACILITY;
 192              }
 193              elseif (defined("SYSLOG_FACILITY") && SYSLOG_FACILITY && defined(SYSLOG_FACILITY))
 194              {
 195                  // Exemple: SYSLOG_FACILITY vaut LOG_USER qui vaut 8. On a besoin de 8 dans $facility.
 196                  $facility = constant(SYSLOG_FACILITY);
 197              }
 198              else
 199              {
 200                  $facility = LOG_USER;
 201              }
 202          
 203              openlog("dolibarr", LOG_PID | LOG_PERROR, $facility);
 204          
 205              if (! $level)
 206              {
 207                  syslog(LOG_ERR, $message);
 208              }
 209              else
 210              {
 211                  syslog($level, $message);
 212              }
 213          
 214              closelog();
 215          }
 216      }
 217  }
 218  
 219  
 220  /**
 221          \brief      Affiche le header d'une fiche
 222          \param        links        Tableau de titre d'onglets
 223          \param        active      0=onglet non actif, 1=onglet actif
 224          \param      title       Titre tabelau ("" par defaut)
 225  */
 226  function dolibarr_fiche_head($links, $active=0, $title='')
 227  {
 228      print '<div class="tabs">'."\n";
 229  
 230      // Affichage titre
 231      if ($title)
 232      {
 233          $limittitle=30;
 234          print '<a class="tabTitle">';
 235          print 
 236              ((!defined('MAIN_USE_SHORT_TITLE')) || (defined('MAIN_USE_SHORT_TITLE') &&  MAIN_USE_SHORT_TITLE))
 237              ? dolibarr_trunc($title,$limittitle)
 238              : $title;
 239          print '</a>';
 240      }
 241  
 242      // Affichage onglets
 243      for ($i = 0 ; $i < sizeof($links) ; $i++)
 244      {
 245          if ($links[$i][2] == 'image')
 246          {
 247              print '<a class="tabimage" href="'.$links[$i][0].'">'.$links[$i][1].'</a>'."\n";
 248          }
 249          else
 250          {
 251              if ($i == $active)
 252              {
 253                  print '<a id="active" class="tab" href="'.$links[$i][0].'">'.$links[$i][1].'</a>'."\n";
 254              }
 255              else
 256              {
 257                  print '<a class="tab" href="'.$links[$i][0].'">'.$links[$i][1].'</a>'."\n";
 258              }
 259          }
 260      }
 261  
 262      print "</div>\n";
 263      
 264      print '<div class="tabBar">'."\n\n";
 265  }
 266  
 267  /**
 268          \brief      Récupère une constante depuis la base de données.
 269          \see        dolibarr_del_const, dolibarr_set_const
 270          \param        db          Handler d'accès base
 271          \param        name        Nom de la constante
 272          \return     string      Valeur de la constante
 273  */
 274  function dolibarr_get_const($db, $name)
 275  {
 276      $value='';
 277      
 278      $sql ="SELECT value";
 279      $sql.=" FROM llx_const";
 280      $sql.=" WHERE name = '$name';";         
 281      $resql=$db->query($sql);    
 282      if ($resql)
 283      {
 284          $obj=$db->fetch_object($resql);
 285          $value=stripslashes($obj->value);
 286      }
 287      return $value;
 288  }
 289  
 290  
 291  /**
 292          \brief      Insertion d'une constante dans la base de données.
 293          \see        dolibarr_del_const, dolibarr_get_const
 294          \param        db          Handler d'accès base
 295          \param        name        Nom de la constante
 296          \param        value        Valeur de la constante
 297          \param        type        Type de constante (chaine par défaut)
 298          \param        visible        La constante est elle visible (0 par défaut)
 299          \param        note        Explication de la constante
 300          \return     int         <0 si ko, >0 si ok
 301  */
 302  function dolibarr_set_const($db, $name, $value, $type='chaine', $visible=0, $note='')
 303  {
 304      global $conf;
 305      
 306      $db->begin();
 307      
 308      //dolibarr_syslog("dolibarr_set_const name=$name, value=$value");
 309      $sql = "DELETE FROM llx_const WHERE name = '$name';";         
 310      $resql=$db->query($sql);    
 311      
 312      $sql = "INSERT INTO llx_const(name,value,type,visible,note)";
 313      $sql.= " VALUES ('$name','".addslashes($value)."','$type',$visible,'".addslashes($note)."');";
 314      $resql=$db->query($sql);    
 315  
 316      if ($resql)
 317      {
 318          $db->commit();
 319          $conf->global->$name=$value;
 320          return 1;
 321      }
 322      else
 323      {
 324          $db->rollback();
 325          return -1;
 326      }
 327  }
 328  
 329  /**
 330          \brief      Effacement d'une constante dans la base de données
 331          \see        dolibarr_get_const, dolibarr_sel_const
 332          \param        db          Handler d'accès base
 333          \param        name        Nom ou rowid de la constante
 334          \return     int         <0 si ko, >0 si ok
 335  */
 336  function dolibarr_del_const($db, $name)
 337  {
 338      $sql = "DELETE FROM llx_const WHERE name='$name' or rowid='$name'";
 339      $resql=$db->query($sql);
 340  
 341      if ($resql)
 342      {
 343          return 1;
 344      }
 345      else
 346      {
 347          return -1;
 348      }
 349  }
 350  
 351  /**
 352          \brief  Formattage des nombres
 353          \param    ca            valeur a formater
 354          \return    int            valeur formatée
 355  */
 356  function dolibarr_print_ca($ca)
 357  {
 358      global $langs,$conf;
 359      
 360      if ($ca > 1000)
 361      {
 362        $cat = round(($ca / 1000),2);
 363        $cat = "$cat K".$langs->trans("Currency".$conf->monnaie);
 364      }
 365      else
 366      {
 367        $cat = round($ca,2);
 368        $cat = "$cat ".$langs->trans("Currency".$conf->monnaie);
 369      }
 370  
 371      if ($ca > 1000000)
 372      {
 373        $cat = round(($ca / 1000000),2);
 374        $cat = "$cat M".$langs->trans("Currency".$conf->monnaie);
 375      }
 376  
 377      return $cat;
 378  }
 379  
 380  
 381  /**
 382          \brief      Effectue un décalage de date par rapport à une durée
 383          \param        time                Date timestamp ou au format YYYY-MM-DD
 384          \param        duration_value      Valeur de la durée à ajouter
 385          \param        duration_unit       Unité de la durée à ajouter (d, m, y)
 386          \return     int                 Nouveau timestamp
 387  */
 388  function dolibarr_time_plus_duree($time,$duration_value,$duration_unit)
 389  {
 390      $deltastring="+$duration_value";
 391      if ($duration_unit == 'd') { $deltastring.=" day"; }
 392      if ($duration_unit == 'm') { $deltastring.=" month"; }
 393      if ($duration_unit == 'y') { $deltastring.=" year"; }
 394      return strtotime($deltastring,$time);
 395  }
 396  
 397  
 398  /**
 399          \brief      Formattage de la date en fonction de la langue $conf->langage
 400          \param        time        Date 'timestamp' ou format 'YYYY-MM-DD' ou 'YYYY-MM-DD HH:MM:SS'
 401          \param        format      Format d'affichage de la date ("%d %b %Y", "%d/%m/%Y", ...)
 402          \return     string      Date formatée ou '?' si time null
 403  */
 404  function dolibarr_print_date($time,$format='')
 405  {
 406      global $conf;
 407      
 408      // Si format non défini, on prend $conf->format_date_text_short
 409      if (! $format) $format=$conf->format_date_text_short;
 410  
 411      // Si date non définie, on renvoie '?'
 412      if (! $time) return '?';
 413  
 414      // Analyse de la date
 415      if (eregi('^([0-9]+)\-([0-9]+)\-([0-9]+)\s?([0-9]+)?:?([0-9]+)?',$time,$reg))
 416      {
 417          // Date est au format 'YYYY-MM-DD' ou 'YYYY-MM-DD HH:MM:SS'
 418          $syear = $reg[1];
 419          $smonth = $reg[2];
 420          $sday = $reg[3];
 421          $shour = $reg[4];
 422          $smin = $reg[5];
 423          if ($syear < 1970 && isset($_SERVER["WINDIR"]))
 424          {
 425              // Le formatage ne peut etre appliqué car windows ne supporte pas la fonction
 426              // mktime si l'année est inférieur à 1970. On retourne un format fixe
 427              return "$syear-$smonth-$sday";
 428          }
 429          else
 430          {
 431              return strftime($format,mktime($shour,$smin,0,$smonth,$sday,$syear));
 432          }
 433      }
 434      else
 435      {
 436          // Date est un timestamps
 437          return strftime($format,$time);
 438      }
 439  }
 440  
 441  
 442  /**
 443          \brief  Affiche les informations d'un objet
 444          \param    object            objet a afficher
 445  */
 446  function dolibarr_print_object_info($object)
 447  {
 448      global $langs;
 449  
 450      if (isset($object->user_creation) && $object->user_creation->fullname)
 451          print $langs->trans("CreatedBy")." : " . $object->user_creation->fullname . '<br>';
 452  
 453      if (isset($object->date_creation))
 454          print $langs->trans("DateCreation")." : " . dolibarr_print_date($object->date_creation,"%A %d %B %Y %H:%M:%S") . '<br>';
 455      
 456      if (isset($object->user_modification) && $object->user_modification->fullname)
 457          print $langs->trans("ModifiedBy")." : " . $object->user_modification->fullname . '<br>';
 458          
 459      if (isset($object->date_modification))
 460          print $langs->trans("DateLastModification")." : " . dolibarr_print_date($object->date_modification,"%A %d %B %Y %H:%M:%S") . '<br>';
 461      
 462      if (isset($object->user_validation) && $object->user_validation->fullname)
 463          print $langs->trans("ValidatedBy")." : " . $object->user_validation->fullname . '<br>';
 464      
 465      if (isset($object->date_validation))
 466          print $langs->trans("DateValidation")." : " . dolibarr_print_date($object->date_validation,"%A %d %B %Y %H:%M:%S") . '<br>';
 467  
 468      if (isset($object->user_cloture) && $object->user_cloture->fullname )
 469          print $langs->trans("ClosedBy")." : " . $object->user_cloture->fullname . '<br>';
 470  
 471      if (isset($object->date_cloture))
 472          print $langs->trans("DateClosing")." : " . dolibarr_print_date($object->date_cloture,"%A %d %B %Y %H:%M:%S") . '<br>';
 473  
 474      if (isset($object->user_rappro) && $object->user_rappro->fullname )
 475          print $langs->trans("ConciliatedBy")." : " . $object->user_rappro->fullname . '<br>';
 476  
 477      if (isset($object->date_rappro))
 478          print $langs->trans("DateConciliating")." : " . dolibarr_print_date($object->date_rappro,"%A %d %B %Y %H:%M:%S") . '<br>';
 479  }
 480  
 481  /**
 482          \brief      Formatage des numéros de telephone en fonction du format d'un pays
 483          \param        phone            Numéro de telephone à formater
 484          \param        country            Pays selon lequel formatter
 485          \return     string            Numéro de téléphone formaté
 486  */
 487  function dolibarr_print_phone($phone,$country="FR")
 488  {
 489      $phone=trim($phone);
 490      if (strstr($phone, ' ')) { return $phone; }
 491      if (strtoupper($country) == "FR") {
 492          // France
 493          if (strlen($phone) == 10) {
 494              return substr($phone,0,2)."&nbsp;".substr($phone,2,2)."&nbsp;".substr($phone,4,2)."&nbsp;".substr($phone,6,2)."&nbsp;".substr($phone,8,2);
 495          }
 496          elseif (strlen($phone) == 7)
 497          {
 498              return substr($phone,0,3)."&nbsp;".substr($phone,3,2)."&nbsp;".substr($phone,5,2);
 499          }
 500          elseif (strlen($phone) == 9)
 501          {
 502              return substr($phone,0,2)."&nbsp;".substr($phone,2,3)."&nbsp;".substr($phone,5,2)."&nbsp;".substr($phone,7,2);
 503          }
 504          elseif (strlen($phone) == 11)
 505          {
 506              return substr($phone,0,3)."&nbsp;".substr($phone,3,2)."&nbsp;".substr($phone,5,2)."&nbsp;".substr($phone,7,2)."&nbsp;".substr($phone,9,2);
 507          }
 508          elseif (strlen($phone) == 12)
 509          {
 510              return substr($phone,0,4)."&nbsp;".substr($phone,4,2)."&nbsp;".substr($phone,6,2)."&nbsp;".substr($phone,8,2)."&nbsp;".substr($phone,10,2);
 511          }
 512      }
 513      return $phone;
 514  }
 515  
 516  /**
 517          \brief      Tronque une chaine à une taille donnée en ajoutant les points de suspension si cela dépasse
 518          \param      string        Chaine à tronquer
 519          \param      size        Longueur max de la chaine
 520          \return     string        Chaine tronquée
 521  */
 522  function dolibarr_trunc($string,$size=40)
 523  {
 524      if (strlen($string) > $size)
 525          return substr($string,0,$size).'...';
 526      else
 527          return $string;
 528  }
 529  
 530  /**
 531          \brief      Affiche picto propre à une notion/module (fonction générique)
 532          \param      alt         Texte sur le alt de l'image
 533          \param      object      Objet pour lequel il faut afficher le logo (exemple: user, group, action, bill, contract, propal, product, ...)
 534          \return     string      Retourne tag img
 535  */
 536  function img_object($alt, $object)
 537  {
 538    global $conf,$langs;
 539    return '<img src="'.DOL_URL_ROOT.'/theme/'.$conf->theme.'/img/object_'.$object.'.png" border="0" alt="'.$alt.'" title="'.$alt.'">';
 540  }
 541  
 542  /**
 543          \brief      Affiche picto (fonction générique)
 544          \param      alt         Texte sur le alt de l'image
 545          \param      picto       Nom de l'image a afficher
 546          \return     string      Retourne tag img
 547  */
 548  function img_picto($alt, $picto)
 549  {
 550    global $conf,$langs;
 551    return '<img src="'.DOL_URL_ROOT.'/theme/'.$conf->theme.'/img/'.$picto.'.png" border="0" alt="'.$alt.'" title="'.$alt.'">';
 552  }
 553  
 554  /**
 555          \brief      Affiche logo action
 556          \param      alt         Texte sur le alt de l'image
 557          \param      numaction   Determine image action
 558          \return     string      Retourne tag img
 559  */
 560  function img_action($alt = "default", $numaction)
 561  {
 562    global $conf,$langs;
 563    if ($alt=="default") {
 564      if ($numaction == -1) $alt=$langs->trans("ChangeDoNotContact");
 565      if ($numaction == 0)  $alt=$langs->trans("ChangeNeverContacted");
 566      if ($numaction == 1)  $alt=$langs->trans("ChangeToContact");
 567      if ($numaction == 2)  $alt=$langs->trans("ChangeContactInProcess");
 568      if ($numaction == 3)  $alt=$langs->trans("ChangeContactDone");
 569    }
 570    return '<img align="absmiddle" src="'.DOL_URL_ROOT.'/theme/'.$conf->theme.'/img/stcomm'.$numaction.'.png" border="0" alt="'.$alt.'" title="'.$alt.'">';
 571  }
 572  
 573  /**
 574          \brief      Affiche logo statut
 575          \param      num         Numéro statut
 576          \param      alt         Texte a afficher sur alt
 577          \return     string      Retourne tag img
 578  */
 579  function img_statut($num,$alt = "default")
 580  {
 581      global $conf,$langs;
 582      if ($alt=="default") {
 583          if ($num == 0) $alt=$langs->trans("Draft");
 584          if ($num == 1) $alt=$langs->trans("Late");
 585          if ($num == 4) $alt=$langs->trans("Running");
 586          if ($num == 5) $alt=$langs->trans("Closed");
 587      } 
 588      return '<img src="'.DOL_URL_ROOT.'/theme/'.$conf->theme.'/img/statut'.$num.'.png" border="0" alt="'.$alt.'" title="'.$alt.'">';
 589  }
 590  
 591  /**
 592          \brief      Affiche logo fichier
 593          \param      alt         Texte sur le alt de l'image
 594          \return     string      Retourne tag img
 595  */
 596  function img_file($alt = "default")
 597  {
 598    global $conf,$langs;
 599    if ($alt=="default") $alt=$langs->trans("Show");
 600    return '<img src="'.DOL_URL_ROOT.'/theme/'.$conf->theme.'/img/file.png" border="0" alt="'.$alt.'" title="'.$alt.'">';
 601  }
 602  
 603  /**
 604          \brief      Affiche logo dossier
 605          \param      alt         Texte sur le alt de l'image
 606          \return     string      Retourne tag img
 607  */
 608  function img_folder($alt = "default")
 609  {
 610    global $conf,$langs;
 611    if ($alt=="default") $alt=$langs->trans("Dossier");
 612    return '<img src="'.DOL_URL_ROOT.'/theme/'.$conf->theme.'/img/folder.png" border="0" alt="'.$alt.'" title="'.$alt.'">';
 613  }
 614  
 615  /**
 616          \brief      Affiche logo nouveau fichier
 617          \param      alt         Texte sur le alt de l'image
 618          \return     string      Retourne tag img
 619  */
 620  function img_file_new($alt = "default")
 621  {
 622    global $conf,$langs;
 623    if ($alt=="default") $alt=$langs->trans("Show");
 624    return '<img src="'.DOL_URL_ROOT.'/theme/'.$conf->theme.'/img/filenew.png" border="0" alt="'.$alt.'" title="'.$alt.'">';
 625  }
 626  
 627  /**
 628          \brief      Affiche logo pdf
 629          \param      alt         Texte sur le alt de l'image
 630          \return     string      Retourne tag img
 631  */
 632  function img_pdf($alt = "default")
 633  {
 634    global $conf,$langs;
 635    if ($alt=="default") $alt=$langs->trans("Show");
 636    return '<img src="'.DOL_URL_ROOT.'/theme/'.$conf->theme.'/img/pdf.png" border="0" alt="'.$alt.'" title="'.$alt.'">';
 637  }
 638  
 639  /**
 640          \brief      Affiche logo +
 641          \param      alt         Texte sur le alt de l'image
 642          \return     string      Retourne tag img
 643  */
 644  function img_edit_add($alt = "default")
 645  {
 646    global $conf,$langs;
 647    if ($alt=="default") $alt=$langs->trans("Add");
 648    return '<img src="'.DOL_URL_ROOT.'/theme/'.$conf->theme.'/img/edit_add.png" border="0" alt="'.$alt.'" title="'.$alt.'">';
 649  }
 650  /**
 651          \brief      Affiche logo -
 652          \param      alt         Texte sur le alt de l'image
 653          \return     string      Retourne tag img
 654  */
 655  function img_edit_remove($alt = "default")
 656  {
 657    global $conf,$langs;
 658    if ($alt=="default") $alt=$langs->trans("Remove");
 659    return '<img src="'.DOL_URL_ROOT.'/theme/'.$conf->theme.'/img/edit_remove.png" border="0" alt="'.$alt.'" title="'.$alt.'">';
 660  }
 661  
 662  /**
 663          \brief      Affiche logo editer/modifier fiche
 664          \param      alt         Texte sur le alt de l'image
 665          \param      float       Si il faut y mettre le style "float: right"
 666          \return     string      Retourne tag img
 667  */
 668  function img_edit($alt = "default",$float=0)
 669  {
 670      global $conf,$langs;
 671      if ($alt=="default") $alt=$langs->trans("Modify");
 672      $img='<img src="'.DOL_URL_ROOT.'/theme/'.$conf->theme.'/img/edit.png" border="0" alt="'.$alt.'" title="'.$alt.'"';
 673      if ($float) $img.=' style="float: right"';
 674      $img.='>';
 675      return $img;
 676  }
 677  
 678  /**
 679          \brief      Affiche logo effacer
 680          \param      alt         Texte sur le alt de l'image
 681          \return     string      Retourne tag img
 682  */
 683  function img_delete($alt = "default")
 684  {
 685    global $conf,$langs;
 686    if ($alt=="default") $alt=$langs->trans("Delete");
 687    return '<img src="'.DOL_URL_ROOT.'/theme/'.$conf->theme.'/img/delete.png" border="0" alt="'.$alt.'" title="'.$alt.'">';
 688  }
 689  
 690  /**
 691          \brief      Affiche logo désactiver
 692          \param      alt         Texte sur le alt de l'image
 693          \return     string      Retourne tag img
 694  */
 695  function img_disable($alt = "default")
 696  {
 697    global $conf,$langs;
 698    if ($alt=="default") $alt=$langs->trans("Disable");
 699    return '<img src="'.DOL_URL_ROOT.'/theme/'.$conf->theme.'/img/disable.png" border="0" alt="'.$alt.'" title="'.$alt.'">';
 700  }
 701  
 702  
 703  /**
 704          \brief      Affiche logo help avec curseur "?"
 705          \return     string      Retourne tag img
 706  */
 707  function img_help()
 708  {
 709    global $conf,$langs;
 710    return '<img style="cursor: help;" src="'.DOL_URL_ROOT.'/theme/'.$conf->theme.'/img/help.png" border="0" alt="" title="">';
 711  }
 712  
 713  /**
 714          \brief      Affiche logo info
 715          \param      alt         Texte sur le alt de l'image
 716          \return     string      Retourne tag img
 717  */
 718  function img_info($alt = "default")
 719  {
 720    global $conf,$langs;
 721    if ($alt=="default") $alt=$langs->trans("Informations");
 722    return '<img style="cursor: help;" src="'.DOL_URL_ROOT.'/theme/'.$conf->theme.'/img/info.png" border="0" alt="'.$alt.'" title="'.$alt.'">';
 723  }
 724  
 725  /**
 726          \brief      Affiche logo warning
 727          \param      alt         Texte sur le alt de l'image
 728          \param      float       Si il faut afficher le style "float: right"
 729          \return     string      Retourne tag img
 730  */
 731  function img_warning($alt = "default",$float=0)
 732  {
 733      global $conf,$langs;
 734      if ($alt=="default") $alt=$langs->trans("Warning");
 735      $img='<img src="'.DOL_URL_ROOT.'/theme/'.$conf->theme.'/img/warning.png" border="0" alt="'.$alt.'" title="'.$alt.'"';
 736      if ($float) $img.=' style="float: right"';
 737      $img.='>';
 738      
 739      return $img;
 740  }
 741  
 742  /**
 743          \brief      Affiche logo warning
 744          \param      alt         Texte sur le alt de l'image
 745          \return     string      Retourne tag img
 746  */
 747  function img_error($alt = "default")
 748  {
 749    global $conf,$langs;
 750    if ($alt=="default") $alt=$langs->trans("Error");
 751    return '<img src="'.DOL_URL_ROOT.'/theme/'.$conf->theme.'/img/error.png" border="0" alt="'.$alt.'" title="'.$alt.'">';
 752  }
 753  
 754  /**
 755          \brief      Affiche logo alerte
 756          \param      alt         Texte sur le alt de l'image
 757          \return     string      Retourne tag img
 758  */
 759  function img_alerte($alt = "default")
 760  {
 761    global $conf,$langs;
 762    if ($alt=="default") $alt=$langs->trans("Alert");
 763    return '<img src="'.DOL_URL_ROOT.'/theme/'.$conf->theme.'/img/alerte.png" border="0" alt="'.$alt.'" title="'.$alt.'">';
 764  }
 765  
 766  /**
 767          \brief      Affiche logo téléphone in
 768          \param      alt         Texte sur le alt de l'image
 769          \return     string      Retourne tag img
 770  */
 771  function img_phone_in($alt = "default")
 772  {
 773    global $conf,$langs;
 774    if ($alt=="default") $alt=$langs->trans("Modify");
 775    return '<img src="'.DOL_URL_ROOT.'/theme/'.$conf->theme.'/img/call.png" border="0" alt="'.$alt.'" title="'.$alt.'">';
 776  }
 777  
 778  /**
 779          \brief      Affiche logo téléphone out
 780          \param      alt         Texte sur le alt de l'image
 781          \return     string      Retourne tag img
 782  */
 783  function img_phone_out($alt = "default")
 784  {
 785    global $conf,$langs;
 786    if ($alt=="default") $alt=$langs->trans("Modify");
 787    return '<img src="'.DOL_URL_ROOT.'/theme/'.$conf->theme.'/img/call.png" border="0" alt="'.$alt.'" title="'.$alt.'">';
 788  }
 789  
 790  /**
 791          \brief      Affiche logo suivant
 792          \param      alt         Texte sur le alt de l'image
 793          \return     string      Retourne tag img
 794  */
 795  function img_next($alt = "default")
 796  {
 797    global $conf,$langs;
 798    if ($alt=="default") {
 799      $alt=$langs->trans("Next");
 800    }
 801    return '<img src="'.DOL_URL_ROOT.'/theme/'.$conf->theme.'/img/next.png" border="0" alt="'.$alt.'" title="'.$alt.'">';
 802  }
 803  
 804  /**
 805          \brief      Affiche logo précédent
 806          \param      alt     Texte sur le alt de l'image
 807          \return     string      Retourne tag img
 808  */
 809  function img_previous($alt = "default")
 810  {
 811    global $conf,$langs;
 812    if ($alt=="default") $alt=$langs->trans("Previous");
 813    return '<img src="'.DOL_URL_ROOT.'/theme/'.$conf->theme.'/img/previous.png" border="0" alt="'.$alt.'" title="'.$alt.'">';
 814  }
 815  
 816  /**
 817          \brief      Affiche logo bas
 818          \param      alt         Texte sur le alt de l'image
 819          \param      selected    Affiche version "selected" du logo
 820          \return     string      Retourne tag img
 821  */
 822  function img_down($alt = "default", $selected=1)
 823  {
 824      global $conf,$langs;
 825      if ($alt=="default") $alt=$langs->trans("Down");
 826      if ($selected) return '<img src="'.DOL_URL_ROOT.'/theme/'.$conf->theme.'/img/1downarrow.png" border="0" alt="'.$alt.'" title="'.$alt.'">';
 827      else return '<img src="'.DOL_URL_ROOT.'/theme/'.$conf->theme.'/img/1downarrow_notselected.png" border="0" alt="'.$alt.'" title="'.$alt.'">';
 828  }
 829  
 830  /**
 831          \brief      Affiche logo haut
 832          \param      alt         Texte sur le alt de l'image
 833          \param      selected    Affiche version "selected" du logo
 834          \return     string      Retourne tag img
 835  */
 836  function img_up($alt = "default", $selected=1)
 837  {
 838      global $conf,$langs;
 839      if ($alt=="default") $alt=$langs->trans("Up");
 840      if ($selected) return '<img src="'.DOL_URL_ROOT.'/theme/'.$conf->theme.'/img/1uparrow.png" border="0" alt="'.$alt.'" title="'.$alt.'">';
 841      else return '<img src="'.DOL_URL_ROOT.'/theme/'.$conf->theme.'/img/1uparrow_notselected.png" border="0" alt="'.$alt.'" title="'.$alt.'">';
 842  }
 843  
 844  
 845  /**
 846          \brief      Affiche logo tick
 847          \param      alt         Texte sur le alt de l'image
 848          \return     string      Retourne tag img
 849  */
 850  function img_tick($alt = "default")
 851  {
 852    global $conf,$langs;
 853    if ($alt=="default") $alt=$langs->trans("Active");
 854    return '<img src="'.DOL_URL_ROOT.'/theme/'.$conf->theme.'/img/tick.png" border="0" alt="'.$alt.'" title="'.$alt.'">';
 855  }
 856  
 857  /**
 858          \brief      Affiche le logo tick si allow
 859          \param      allow       Authorise ou non
 860          \return     string      Retourne tag img
 861  */
 862  function img_allow($allow)
 863  {
 864    global $conf,$langs;
 865    if ($alt=="default") $alt=$langs->trans("Active");
 866  
 867    if ($allow == 1)
 868      {
 869        return '<img src="'.DOL_URL_ROOT.'/theme/'.$conf->theme.'/img/tick.png" border="0" alt="'.$alt.'" title="'.$alt.'">';
 870      }
 871    else
 872      {
 873        return "-";
 874      }
 875  }
 876  
 877  /**
 878          \brief      Affiche formulaire de login
 879          \remarks    il faut changer le code html dans cette fonction pour changer le design
 880  */
 881  function loginfunction()
 882  {
 883      global $langs,$conf;
 884      $langs->load("main");
 885      
 886      $conf->css  = "theme/".$conf->theme."/".$conf->theme.".css";
 887      // Si feuille de style en php existe
 888      if (file_exists(DOL_DOCUMENT_ROOT.'/'.$conf->css.".php")) $conf->css.=".php";
 889      
 890      print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">';
 891      print "\n<html><head><title>Dolibarr Authentification</title>\n";
 892      
 893      print '<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.'/'.$conf->css.'">'."\n";
 894      
 895      
 896      
 897      print '<style type="text/css">'."\n";
 898      print '<!--'."\n";
 899      print '#login {';
 900      print '  margin-top: 70px;';
 901      print '  margin-bottom: 50px;';
 902      print '  text-align: center;';
 903      print '  font: 12px arial,helvetica;';
 904      print '}'."\n";
 905      print '#login table {';
 906      print '  border: 1px solid #C0C0C0;';
 907      if (file_exists(DOL_URL_ROOT.'/theme/'.$conf->theme.'/img/login_background.png'))
 908      {
 909        print 'background: #F0F0F0 url('.DOL_URL_ROOT.'/theme/'.$conf->theme.'/img/login_background.png) repeat-x;';
 910      }
 911      else
 912      {
 913        print 'background: #F0F0F0 url('.DOL_URL_ROOT.'/theme/login_background.png) repeat-x;';
 914      }
 915      print 'font-size: 12px;';
 916      print '}'."\n";
 917      print '-->'."\n";
 918      print '</style>'."\n";
 919      print '<script type="text/javascript">'."\n";
 920      print "function donnefocus() {\n";
 921      print "document.getElementsByTagName('INPUT')[0].focus();";
 922      print "}\n";
 923      print '</script>'."\n";
 924      print '</head>'."\n";
 925      print '<body class="body" onload="donnefocus();">';
 926      
 927      print '<form id="login" method="post" action="';
 928      print $_SERVER['PHP_SELF'];
 929      print $_SERVER["QUERY_STRING"]?'?'.$_SERVER["QUERY_STRING"]:'';
 930      print '" name="identification">';
 931      
 932      print '<table cellpadding="0" cellspacing="0" border="0" align="center" width="350">';
 933      
 934      
 935      if (file_exists(DOL_DOCUMENT_ROOT.'/logo.png'))
 936      {
 937        print '<tr><td colspan="3" style="text-align:center;">';
 938        print '<img src="/logo.png"></td></tr>';
 939      }
 940      else
 941      {
 942        print '<tr class="vmenu"><td>Dolibarr '.DOL_VERSION.'</td></tr>';
 943      }
 944      
 945      print'</table>
 946  
 947  <br>
 948  
 949  <table cellpadding="2" align="center" width="350">
 950  
 951  <tr><td colspan="3">&nbsp;</td></tr>
 952  
 953  <tr><td align="left"> &nbsp; <b>'.$langs->trans("Login").'</b>  &nbsp;</td>
 954  <td><input name="username" class="flat" size="15" maxlength="25" value="" tabindex="1" /></td>
 955  ';
 956  
 957      // Affiche logo du theme si existe, sinon logo commun
 958      if (file_exists(DOL_DOCUMENT_ROOT.'/theme/'.$conf->theme.'/img/login_logo.png'))
 959      {
 960          print '<td rowspan="2"><img src="'.DOL_URL_ROOT.'/theme/'.$conf->theme.'/img/login_logo.png"></td>';
 961      }
 962      else 
 963      {
 964          print '<td rowspan="2"><img src="'.DOL_URL_ROOT.'/theme/login_logo.png"></td>';
 965      }
 966  
 967      print '
 968  </tr>
 969  
 970  <tr><td align="left"> &nbsp; <b>'.$langs->trans("Password").'</b> &nbsp; </a></td>
 971  <td><input name="password" class="flat" type="password" size="15" maxlength="30" tabindex="2" />
 972  </td></tr>
 973  
 974  <tr><td colspan="3" style="text-align:center;"><br>
 975  <input type="submit" class="button" value="&nbsp; '.$langs->trans("Connection").' &nbsp;" tabindex="4" />
 976  </td></tr>
 977  ';
 978      print '
 979  </table>
 980  <input type="hidden" name="loginfunction" value="loginfunction" />
 981  ';
 982  
 983      print '</form>';
 984  
 985  }
 986  
 987  
 988  /**
 989          \brief      Affiche message erreur de type acces interdit et arrete le programme
 990          \remarks    L'appel a cette fonction termine le code.
 991  */
 992  function accessforbidden()
 993  {
 994    global $user, $langs;
 995    $langs->load("other");
 996    
 997    llxHeader();
 998    print '<div class="error">'.$langs->trans("ErrorForbidden").'</div>';
 999    print '<br>';
1000    if ($user->login)
1001    {
1002      print $langs->trans("CurrentLogin").': <font class="error">'.$user->login.'</font><br>';
1003      print $langs->trans("ErrorForbidden2",$langs->trans("Home"),$langs->trans("Users"));
1004    }
1005    elseif (! empty($_SERVER["REMOTE_USER"]))
1006    {
1007      print $langs->trans("CurrentLogin").': <font class="error">'.$_SERVER["REMOTE_USER"]."</font><br>";
1008      print $langs->trans("ErrorForbidden2",$langs->trans("Home"),$langs->trans("Users"));
1009    }
1010    else
1011    {
1012      print $langs->trans("ErrorForbidden3");
1013    }
1014    llxFooter();
1015    exit(0);
1016  }
1017  
1018  
1019  /**
1020          \brief      Affiche message erreur system avec toutes les informations pour faciliter le diagnostic et la remontée des bugs.
1021                      On doit appeler cette fonction quand une erreur technique bloquante est rencontrée.
1022                      Toutefois, il faut essayer de ne l'appeler qu'au sein de pages php, les classes devant
1023                      renvoyer leur erreur par l'intermédiaire de leur propriété "error".
1024          \param      db      Handler de base utilisé
1025          \param      msg     Message complémentaire à afficher
1026  */
1027  function dolibarr_print_error($db='',$msg='')
1028  {
1029      global $langs;
1030      $syslog = '';
1031      
1032      // Si erreur intervenue avant chargement langue
1033      if (! $langs) {
1034          require_once (DOL_DOCUMENT_ROOT ."/translate.class.php");
1035          $langs = new Translate(DOL_DOCUMENT_ROOT ."/langs", "en_US");
1036          $langs->load("main");
1037      }
1038      
1039      if ($_SERVER['DOCUMENT_ROOT'])    // Mode web
1040      {
1041          print $langs->trans("DolibarrHasDetectedError").".<br>\n";
1042          print $langs->trans("InformationToHelpDiagnose").":<br><br>\n";
1043      
1044          print "<b>".$langs->trans("Server").":</b> ".$_SERVER["SERVER_SOFTWARE"]."<br>\n";;
1045          print "<b>".$langs->trans("RequestedUrl").":</b> ".$_SERVER["REQUEST_URI"]."<br>\n";;
1046          print "<b>QUERY_STRING:</b> ".$_SERVER["QUERY_STRING"]."<br>\n";;
1047          print "<b>".$langs->trans("Referer").":</b> ".$_SERVER["HTTP_REFERER"]."<br>\n";;
1048          $syslog.="url=".$_SERVER["REQUEST_URI"];
1049          $syslog.=", query_string=".$_SERVER["QUERY_STRING"];
1050      }
1051      else                              // Mode CLI
1052      {
1053      
1054          print $langs->trans("ErrorInternalErrorDetected")."\n";
1055          $syslog.="pid=".getmypid();
1056      }
1057      
1058      if ($db)
1059      {
1060          if ($_SERVER['DOCUMENT_ROOT'])  // Mode web
1061          {
1062              print "<br>\n";
1063              print "<b>".$langs->trans("DatabaseTypeManager").":</b> ".$db->type."<br>\n";
1064              print "<b>".$langs->trans("RequestLastAccess").":</b> ".($db->lastquery()?$db->lastquery():$langs->trans("ErrorNoRequestRan"))."<br>\n";
1065              print "<b>".$langs->trans("ReturnCodeLastAccess").":</b> ".$db->errno()."<br>\n";
1066              print "<b>".$langs->trans("InformationLastAccess").":</b> ".$db->error()."<br>\n";
1067          }
1068          else                            // Mode CLI
1069          {
1070              print $langs->trans("DatabaseTypeManager").":\n".$db->type."\n";
1071              print $langs->trans("RequestLastAccess").":\n".($db->lastquery()?$db->lastquery():$langs->trans("ErrorNoRequestRan"))."\n";
1072              print $langs->trans("ReturnCodeLastAccess").":\n".$db->errno()."\n";
1073              print $langs->trans("InformationLastAccess").":\n".$db->error()."\n";
1074      
1075          }
1076          $syslog.=", sql=".$db->lastquery();
1077          $syslog.=", db_error=".$db->error();
1078      }
1079      
1080      if ($msg) {
1081          if ($_SERVER['DOCUMENT_ROOT'])  // Mode web
1082          {
1083              print "<b>".$langs->trans("Message").":</b> ".$msg."<br>\n" ;
1084          }
1085          else                            // Mode CLI
1086          {
1087              print $langs->trans("Message").":\n".$msg."\n" ;
1088          }
1089          $syslog.=", msg=".$msg;
1090      }
1091      
1092      dolibarr_syslog("Error $syslog");
1093  }
1094  
1095  
1096  /**
1097          \brief  Deplacer les fichiers telechargés
1098          \param    src_file    fichier source
1099          \param    dest_file    fichier de destination
1100          \return int         le resultat du move_uploaded_file
1101  */
1102  function doliMoveFileUpload($src_file, $dest_file)
1103  {
1104    $file_name = $dest_file;
1105  
1106    if (substr($file_name, strlen($file_name) -3 , 3) == 'php')
1107      {
1108        $file_name = $dest_file . ".txt";
1109      }
1110  
1111    return move_uploaded_file($src_file, $file_name);
1112  }
1113  
1114  
1115  /**
1116          \brief      Sauvegarde parametrage personnel
1117          \param        db          Handler d'accès base
1118          \param        user        Objet utilisateur
1119          \param        url         Si defini, on sauve parametre du tableau tab dont clé = sortfield, sortorder, begin et page
1120                                  Si non defini on sauve tous parametres du tableau tab
1121          \param        tab         Tableau (clé=>valeur) des paramètres à sauvegarder
1122  */
1123  function dolibarr_set_user_page_param($db, &$user, $url='', $tab)
1124  {
1125      $db->begin();
1126      
1127      // On efface paramètres anciens
1128      $sql = "DELETE FROM ".MAIN_DB_PREFIX."user_param";
1129      $sql.= " WHERE fk_user = ".$user->id;
1130      if ($url) $sql.=" AND page='".$url."'";
1131      else $sql.=" AND page=''";
1132      $sql.=";";
1133      $resql=$db->query($sql);
1134      if (! $resql)
1135      {
1136          dolibarr_print_error($db);
1137      }
1138      dolibarr_syslog("functions.inc.php::dolibarr_set_user_page_param $sql");
1139  
1140      foreach ($tab as $key=>$value)
1141      {
1142          // On positionne nouveaux paramètres
1143          if ($value && (! $url || in_array($key,array('sortfield','sortorder','begin','page'))))
1144          {
1145              $sql = "INSERT INTO ".MAIN_DB_PREFIX."user_param(fk_user,page,param,value)";
1146              $sql.= " VALUES (".$user->id.",";
1147              if ($url) $sql.= " '".urlencode($url)."',";
1148              else $sql.= " '',";
1149              $sql.= " '".$key."','".addslashes($value)."');";
1150              dolibarr_syslog("functions.inc.php::dolibarr_set_user_page_param $sql");
1151              $db->query($sql);
1152  
1153              $user->page_param[$key] = $value;
1154          }
1155      }
1156  
1157      $db->commit();
1158  }
1159  
1160  /**
1161          \brief  Transcodage de francs en euros
1162          \param    zonein        zone de depart
1163          \param    devise        type de devise
1164          \return    r           resultat transcodé
1165  */
1166  function transcoS2L($zonein,$devise)
1167  {
1168    // Open source offert par <A HREF="mailto:alainfloch@free.fr?subject=chif2let">alainfloch@free.fr</A> 28/10/2001, sans garantie.
1169    // début de la fonction de transcodification de somme en toutes lettres
1170  
1171    /*  $zonein = "123,56";
1172     *  $devise = "E"; // préciser F si francs , sinon ce sera de l'euro
1173     *  $r = transcoS2L($zonein,$devise); // appeler la fonction
1174     *  echo "résultat   vaut $r<br>";
1175     *  $zonelettresM =  strtoupper($r); // si vous voulez la même zone mais tout en majuscules
1176     *  echo "résultat en Majuscules  vaut $zonelettresM<br>";
1177     *  $zonein = "1,01";
1178     *  $r = transcoS2L($zonein,$devise);
1179     *  echo "résultat   vaut $r<br>";
1180     */
1181  
1182  
1183    if ($devise == "F")
1184      {
1185        $unite_singulier = " franc ";
1186        $unite_pluriel = " francs ";
1187        $cent_singulier = " centime";
1188      }
1189    else
1190      {
1191        $unite_singulier = " euro ";
1192        $unite_pluriel = " euros ";
1193        $cent_singulier = " centime";
1194      }
1195  
1196    $arr1_99 = array("zéro","un","deux","trois",
1197             "quatre","cinq","six","sept",
1198             "huit","neuf","dix","onze","douze",
1199             "treize","quatorze","quinze","seize",
1200             "dix-sept","dix-huit","dix-neuf","vingt ");
1201  
1202    $arr1_99[30] = "trente ";
1203    $arr1_99[40] = "quarante ";
1204    $arr1_99[50] = "cinquante ";
1205    $arr1_99[60] = "soixante ";
1206    $arr1_99[70] = "soixante-dix ";
1207    $arr1_99[71] = "soixante et onze";
1208    $arr1_99[80] = "quatre-vingts ";
1209    $i = 22;
1210    while ($i < 63) {// initialise la  table
1211      $arr1_99[$i - 1] = $arr1_99[$i - 2]." et un";
1212      $j = 0;
1213      while ($j < 8) {
1214        $k = $i + $j;
1215        $arr1_99[$k] = $arr1_99[$i - 2].$arr1_99[$j + 2];
1216        $j++;
1217      }
1218      $i = $i + 10;
1219    } // fin initialise la table
1220  
1221    $i = 12;
1222    while ($i < 20) {// initialise la  table (suite)
1223      $j = 60 + $i;
1224      $arr1_99[$j] = "soixante-".$arr1_99[$i];
1225      $i++;
1226    } // fin initialise la  table (suite)
1227  
1228    $i = 1;
1229    while ($i < 20) {// initialise la  table (fin)
1230      $j = 80 + $i;
1231      $arr1_99[$j] = "quatre-vingt-".$arr1_99[$i];
1232      $i++;
1233    } // fin initialise la  table (fin)
1234    // echo "Pour une valeur en entrée = $zonein<br>"; //pour ceux qui ne croient que ce qu'ils voient !
1235    // quelques petits controles s'imposent !! 
1236    $valid = "[a-zA-Z\&\é\"\'\(\-\è\_\ç\à\)\=\;\:\!\*\$\^\<\>]";
1237    if (ereg($valid,$zonein))
1238      {
1239        $r = "<b>la chaîne ".$zonein." n'est pas valide</b>";
1240        return($r);
1241      }
1242    $zone = explode(" ",$zonein); // supprimer les blancs séparateurs
1243    $zonein = implode("",$zone); // reconcatène la zone input
1244    $zone = explode(".",$zonein); // supprimer les points séparateurs
1245    $zonein = implode("",$zone); // reconcatène la zone input, ça c'est fort ! merci PHP
1246    $virg = strpos($zonein,",",1); // à la poursuite de la virgule
1247    $i = strlen($zonein); // et de la longueur de la zone input
1248    if ($virg == 0) { // ya pas de virgule
1249      if ($i > 7)
1250        {
1251      $r = "<b>la chaîne ".$zonein." est trop longue (maxi = 9 millions)</b>";
1252      return($r);
1253        }
1254      $deb = 7 - $i;
1255      $zoneanaly = substr($zonechiffres,0,$deb).$zonein.",00";
1256    }
1257    else
1258      { //ya une virgule
1259        $ti = explode(",",$zonein); // mettre de côté ce qu'il y a devant la virgule
1260        $i = strlen($ti[0]); // en controler la longueur
1261        $zonechiffres = "0000000,00";
1262        if ($i > 7)
1263      {
1264        $r = "<b>la chaîne ".$zonein." est trop longue (maxi = 9 millions,00)</b>";
1265        return($r);
1266      }
1267        $deb = 7 - $i;
1268        $zoneanaly = substr($zonechiffres,0,$deb).$zonein;
1269      }
1270    $M= substr($zoneanaly,0,1);
1271    if ($M != 0)
1272      { // qui veut gagner des millions
1273        $r =   $arr1_99[$M]." million";
1274        if ($M ==1) $r =  $r." ";
1275        else $r = $r."s ";
1276        if (substr($zoneanaly,1,6)==0)
1277      {
1278        if ($devise == 'F') $r = $r." de ";
1279        else $r = $r."d'";
1280      }
1281      }
1282    $CM= substr($zoneanaly,1,1);
1283    if ($CM == 1)
1284      { // qui veut gagner des centaines de mille
1285        $r = $r." cent ";
1286      }
1287   else
1288     { // ya des centaines de mille
1289      if ($CM > 1)
1290        {
1291          $r = $r. $arr1_99[$CM]." cent ";
1292          }
1293     } // fin du else ya des centaines de mille
1294    $MM= substr($zoneanaly,2,2);
1295    if (substr($zoneanaly,2,1)==0){ $MM = substr($zoneanaly,3,1);} // enlever le zéro des milliers cause indexation
1296    if ($MM ==0 && $CM > 0)
1297      {
1298        $r = $r."mille ";
1299      }
1300    if ($MM != 0)
1301      {
1302        if ($MM == 80)
1303      {
1304        $r = $r."quatre-vingt mille ";
1305      }
1306        else
1307      {
1308        if ($MM > 1 )
1309          {
1310            $r = $r.$arr1_99[$MM]." mille ";
1311          }
1312        else
1313          {
1314            if ($CM == 0)    $r = $r." mille ";
1315            else
1316          {
1317            $r = $r.$arr1_99[$MM]." mille ";
1318          }
1319          }
1320      }
1321      }
1322    $C2= substr($zoneanaly,5,2);
1323    if (substr($zoneanaly,5,1)==0){ $C2 = substr($zoneanaly,6,1);} // enlever le zéro des centaines cause indexation
1324    $C1= substr($zoneanaly,4,1);
1325    if ($C2 ==0 && $C1 > 1)
1326      {
1327        $r = $r.$arr1_99[$C1]." cents ";
1328      }
1329    else
1330      {
1331        if ($C1 == 1) $r = $r." cent ";
1332        else
1333      {
1334        if ($C1 > 1) $r = $r.$arr1_99[$C1]." cent ";
1335      }
1336      }
1337    if ($C2 != 0)
1338      {
1339        $r = $r.$arr1_99[$C2];
1340      }
1341    if ($virg !=0)
1342      {
1343        if ($ti[0] > 1) $r = $r. $unite_pluriel; else $r = "un ".$unite_singulier;
1344      }
1345    else
1346      {
1347        if ($zonein > 1) $r = $r.$unite_pluriel; else $r = "un ".$unite_singulier;
1348      }
1349    $UN= substr($zoneanaly,8,2);
1350    if ($UN != "00")
1351      {
1352        $cts = $UN;
1353        if (substr($UN,0,1)==0){ $cts = substr($UN,1,1);} // enlever le zéro des centimes cause indexation
1354        $r = $r." et ". $arr1_99[$cts].$cent_singulier;
1355        if ($UN > 1) $r =$r."s"; // accorde au pluriel
1356      }
1357    $r1 = ltrim($r); // enleve quelques blancs possibles en début de zone
1358    $r = ucfirst($r1); // met le 1er caractère en Majuscule, c'est + zoli
1359    return($r); // retourne le résultat
1360  } // fin fonction transcoS2L
1361  
1362  
1363  /**
1364          \brief      Affichage de la ligne de titre d'un tabelau
1365          \param        name        libelle champ
1366          \param        file        url pour clic sur tri
1367          \param        field       champ de tri
1368          \param        begin       ("" par defaut)
1369          \param        options     ("" par defaut)
1370          \param      td          options de l'attribut td ("" par defaut)
1371          \param      sortfield   nom du champ sur lequel est effectué le tri du tableau
1372          \param      sortorder   ordre du tri
1373  */
1374  function print_liste_field_titre($name, $file, $field, $begin="", $options="", $td="", $sortfield="", $sortorder="")
1375  {
1376      global $conf;
1377      // Le champ de tri est mis en évidence.
1378      // Exemple si (sortfield,field)=("nom","xxx.nom") ou (sortfield,field)=("nom","nom")
1379      if ($sortfield == $field || $sortfield == ereg_replace("^[^\.]+\.","",$field))
1380      {
1381          print '<td class="liste_titre_sel" '. $td.'>';
1382      }
1383      else
1384      {
1385          print '<td class="liste_titre" '. $td.'>';
1386      }
1387      print $name."&nbsp;";
1388      if (! $sortorder)
1389      {
1390          print '<a href="'.$file.'?sortfield='.$field.'&amp;sortorder=asc&amp;begin='.$begin.$options.'">'.img_down("A-Z",1).'</a>';
1391          print '<a href="'.$file.'?sortfield='.$field.'&amp;sortorder=desc&amp;begin='.$begin.$options.'">'.img_up("Z-A",1).'</a>';
1392      }
1393      else
1394      {
1395          if ($field != $sortfield) {
1396              print '<a href="'.$file.'?sortfield='.$field.'&amp;sortorder=asc&amp;begin='.$begin.$options.'">'.img_down("A-Z",1).'</a>';
1397              print '<a href="'.$file.'?sortfield='.$field.'&amp;sortorder=desc&amp;begin='.$begin.$options.'">'.img_up("Z-A",1).'</a>';
1398          }
1399          else {
1400              if ($sortorder == 'DESC' ) {
1401                  print '<a href="'.$file.'?sortfield='.$field.'&amp;sortorder=asc&amp;begin='.$begin.$options.'">'.img_down("A-Z",1).'</a>';
1402                  print '<a href="'.$file.'?sortfield='.$field.'&amp;sortorder=desc&amp;begin='.$begin.$options.'">'.img_up("Z-A",0).'</a>';
1403              }
1404              if ($sortorder == 'ASC' ) {
1405                  print '<a href="'.$file.'?sortfield='.$field.'&amp;sortorder=asc&amp;begin='.$begin.$options.'">'.img_down("A-Z",0).'</a>';
1406                  print '<a href="'.$file.'?sortfield='.$field.'&amp;sortorder=desc&amp;begin='.$begin.$options.'">'.img_up("Z-A",1).'</a>';
1407              }
1408          }
1409      }
1410      print "</td>";
1411  }
1412  
1413  /**
1414          \brief  Affichage d'un titre
1415          \param    titre            Le titre a afficher
1416  */
1417  function print_titre($titre)
1418  {
1419      print '<div class="titre">'.$titre.'</div>';
1420  }
1421  
1422  /**
1423          \brief  Affichage d'un titre d'une fiche, aligné a gauche
1424          \param    titre            Le titre a afficher
1425          \param    mesg            Message suplémentaire à afficher à droite
1426  */
1427  function print_fiche_titre($titre, $mesg='')
1428  {
1429      print "\n";
1430      print '<table width="100%" border="0" class="notopnoleftnoright">';
1431      print '<tr><td class="notopnoleftnoright"><div class="titre">'.$titre.'</div></td>';
1432      if (strlen($mesg))
1433      {
1434          print '<td align="right" valign="middle"><b>'.$mesg.'</b></td>';
1435      }
1436      print '</tr></table>'."\n";
1437  }
1438  
1439  /**
1440          \brief  Effacement d'un fichier
1441          \param    file            fichier a effacer
1442  */
1443  function dol_delete_file($file)
1444  {
1445    return unlink($file);
1446  }
1447  
1448  
1449  /**
1450          \brief  Fonction print_barre_liste
1451          \param    titre            titre de la page
1452          \param    page            numéro de la page
1453          \param    file            lien
1454          \param    options         options cellule td ('' par defaut)
1455          \param    sortfield       champ de tri ('' par defaut)
1456          \param    sortorder       ordre de tri ('' par defaut)
1457          \param    center          chaine du centre ('' par defaut)
1458          \param    num             nombre d'élément total
1459  */
1460  function print_barre_liste($titre, $page, $file, $options='', $sortfield='', $sortorder='', $center='', $num=-1)
1461  {
1462      global $conf;
1463  
1464      if ($num > $conf->liste_limit or $num == -1)
1465      {
1466          $nextpage = 1;
1467      }
1468      else
1469      {
1470          $nextpage = 0;
1471      }
1472  
1473      print '<table width="100%" border="0" class="notopnoleftnoright">';
1474  
1475      if ($page > 0 || $num > $conf->liste_limit)
1476      {
1477          print '<tr><td><div class="titre">'.$titre.' - page '.($page+1);
1478          print '</div></td>';
1479      }
1480      else
1481      {
1482          print '<tr><td class="notopnoleftnoright"><div class="titre">'.$titre.'</div></td>';
1483      }
1484  
1485      if ($center)
1486      {
1487          print '<td align="left">'.$center.'</td>';
1488      }
1489  
1490      print '<td align="right">';
1491  
1492      if ($sortfield) $options .= "&amp;sortfield=$sortfield";
1493      if ($sortorder) $options .= "&amp;sortorder=$sortorder";
1494  
1495      // Affichage des fleches de navigation
1496      print_fleche_navigation($page,$file,$options,$nextpage);
1497  
1498      print '</td></tr></table>';
1499  }
1500  
1501  /**
1502          \brief  Fonction servant a afficher les fleches de navigation dans les pages de listes
1503          \param    page            numéro de la page
1504          \param    file            lien
1505          \param    options         autres parametres d'url a propager dans les liens ("" par defaut)
1506          \param    nextpage        faut-il une page suivante
1507  */
1508  function print_fleche_navigation($page,$file,$options='',$nextpage)
1509  {
1510    global $conf, $langs;
1511    if ($page > 0)
1512      {
1513        print '<a href="'.$file.'?page='.($page-1).$options.'">'.img_previous($langs->trans("Previous")).'</a>';
1514      }
1515  
1516    if ($nextpage > 0)
1517      {
1518        print '<a href="'.$file.'?page='.($page+1).$options.'">'.img_next($langs->trans("Next")).'</a>';
1519      }
1520  }
1521  
1522  
1523  /**
1524          \brief  Fonction servant a afficher les heures/minutes dans un liste déroulante
1525          \param    prefix
1526          \param    begin (1 par defaut)
1527          \param    end (23 par defaut)
1528  */
1529  function print_heure_select($prefix,$begin=1,$end=23) {
1530    
1531    print '<select name="'.$prefix.'hour">';
1532    for ($hour = $begin ; $hour <= $end ; $hour++) {
1533      print "<option value=\"$hour\">$hour";
1534    }
1535    print "</select>&nbsp;H&nbsp;";
1536    print '<select name="'.$prefix.'min">';
1537    for ($min = 0 ; $min < 60 ; $min=$min+5) {
1538      if ($min < 10) {
1539        $min = "0" . $min;
1540      }
1541      print "<option value=\"$min\">$min";
1542    }
1543    print "</select>\n";  
1544  }
1545  
1546  /**
1547          \brief  Fonction servant a afficher une durée dans une liste déroulante
1548          \param    prefix  prefix
1549  */
1550  function print_duree_select($prefix)
1551  {  
1552    print '<select name="'.$prefix.'hour">';
1553    print "<option value=\"0\">0</option>";
1554    print "<option value=\"1\" selected=\"true\">1</option>";
1555  
1556    for ($hour = 2 ; $hour < 13 ; $hour++)
1557      {
1558        print "<option value=\"$hour\">$hour</option>";
1559      }
1560    print "</select>&nbsp;H&nbsp;";
1561    print '<select name="'.$prefix.'min">';
1562    for ($min = 0 ; $min < 55 ; $min=$min+5)
1563      {
1564        print "<option value=\"$min\">$min</option>";
1565      }
1566    print "</select>\n";  
1567  }
1568  
1569  
1570  /**
1571          \brief      Fonction qui retourne un montant monétaire formaté
1572          \remarks    Fonction utilisée dans les pdf et les pages html
1573          \param        amount        montant a formater
1574          \param        html        formatage html ou pas (0 par defaut)
1575  
1576  */
1577  function price($amount, $html=0)
1578  {
1579    if ($html)
1580      {
1581  
1582        $dec='.'; $thousand=' ';
1583        return ereg_replace(' ','&nbsp;',number_format($amount, 2, $dec, $thousand));
1584  
1585      }
1586    else
1587      {
1588        return number_format($amount, 2, '.', ' ');
1589      }
1590  
1591  }
1592  
1593  /**
1594          \brief      Fonction qui retourne un numérique depuis un montant formaté
1595          \remarks    Fonction à appeler sur montants saisi avant un insert
1596          \param        amount        montant a formater
1597  */
1598  function price2num($amount)
1599  {
1600      $amount=ereg_replace(',','.',$amount);
1601      $amount=ereg_replace(' ','',$amount);
1602      return $amount;
1603  }
1604  
1605  
1606  /**
1607   *        \brief      Fonction qui renvoie la tva d'une ligne (en fonction du vendeur, acheteur et taux du produit)
1608   *      \remarks    Si vendeur non assujeti à TVA, TVA par défaut=0. Fin de règle.
1609   *                  Si le (pays vendeur = pays acheteur) alors la TVA par défaut=TVA du produit vendu. Fin de règle.
1610   *                  Si vendeur et acheteur dans Communauté européenne et bien vendu = moyen de transports neuf (auto, bateau, avion), TVA par défaut=0 (La TVA doit être payé par l'acheteur au centre d'impots de son pays et non au vendeur). Fin de règle.
1611   *                  Si vendeur et acheteur dans Communauté européenne et bien vendu autre que transport neuf alors la TVA par défaut=TVA du produit vendu. Fin de règle.
1612   *                  Sinon la TVA proposée par défaut=0. Fin de règle.
1613   *      \param      societe_vendeuse    Objet société vendeuse
1614   *      \param      societe_acheteuse   Objet société acheteuse
1615   *      \param      taux_produit        Taux par defaut du produit vendu
1616   *      \return     float               Taux de tva de la ligne
1617   */
1618  function get_default_tva($societe_vendeuse='', $societe_acheteuse='', $taux_produit='')
1619  {
1620      $tva=$taux_produit;
1621  
1622      // \todo       fonction a ecrire
1623  
1624      return '';
1625  }
1626  
1627  
1628  /**
1629          \brief  Fonction qui calcule la tva
1630          \param    euros            somme en euro
1631          \param    taux            taux de tva
1632  */
1633  function tva($euros, $taux=19.6)
1634  {
1635    $taux = $taux / 100 ;
1636  
1637    return sprintf("%01.2f",($euros * $taux));
1638  }
1639  
1640  /**
1641          \brief  Renvoie oui ou non dans la langue choisie
1642          \param    yesno            variable pour test si oui ou non
1643          \param    case            Oui/Non ou oui/non
1644  */
1645  function yn($yesno, $case=1) {
1646      global $langs;
1647      if ($yesno == 0 || $yesno == 'no' || $yesno == 'false') 
1648          return $case?$langs->trans("No"):$langs->trans("no");
1649      if ($yesno == 1 || $yesno == 'yes' || $yesno == 'true') 
1650          return $case?$langs->trans("Yes"):$langs->trans("yes");
1651      return "unknown";
1652  }
1653  
1654  
1655  /**
1656          \brief      Fonction pour créer un mot de passe aléatoire
1657          \param        longueur    longueur du mot de passe (8 par defaut)
1658          \param        sel            donnée aléatoire
1659          \remarks    la fonction a été prise sur http://www.uzine.net/spip
1660  */
1661  function creer_pass_aleatoire($longueur = 8, $sel = "") {
1662    $seed = (double) (microtime() + 1) * time();
1663    srand($seed);
1664  
1665    for ($i = 0; $i < $longueur; $i++) {
1666      if (!$s) {
1667        if (!$s) $s = rand();
1668        $s = substr(md5(uniqid($s).$sel), 0, 16);
1669      }
1670      $r = unpack("Cr", pack("H2", $s.$s));
1671      $x = $r['r'] & 63;
1672      if ($x < 10) $x = chr($x + 48);
1673      else if ($x < 36) $x = chr($x + 55);
1674      else if ($x < 62) $x = chr($x + 61);
1675      else if ($x == 63) $x = '/';
1676      else $x = '.';
1677      $pass .= $x;
1678      $s = substr($s, 2);
1679    }
1680    return $pass;
1681  }
1682  
1683  /**
1684          \brief      Fonction pour initialiser sel
1685          \remarks    la fonction a été prise sur http://www.uzine.net/spip
1686  */
1687  function initialiser_sel() {
1688    global $htsalt;
1689  
1690    $htsalt = '$1$'.creer_pass_aleatoire();
1691  }
1692  
1693  /**
1694          \brief  Fonction pour qui retourne le rowid d'un departement par son code
1695          \param  db          handler d'accès base
1696          \param    code        Code région
1697          \param    pays_id        Id du pays
1698  */
1699  function departement_rowid($db,$code, $pays_id)
1700  {
1701    $sql = "SELECT c.rowid FROM ".MAIN_DB_PREFIX."c_departements as c,".MAIN_DB_PREFIX."c_regions as r";
1702    $sql .= " WHERE c.code_departement=". $code;
1703    $sql .= " AND c.fk_region = r.code_region";
1704    $sql .= " AND r.fk_pays =".$pays_id;
1705  
1706    if ($db->query($sql))
1707      {
1708        $num = $db->num_rows();
1709        if ($num)
1710      {
1711        $obj = $db->fetch_object();
1712        return  $obj->rowid;
1713      }
1714        else
1715      {
1716        return 0;
1717      }
1718        $db->free();
1719      }
1720    else
1721      {
1722        return 0;
1723      }
1724  }
1725  
1726  /**
1727   *      \brief      Renvoi un chemin de classement répertoire en fonction d'un id
1728   *                  Examples: 1->"0/0/1/", 15->"0/1/5/"
1729   *      \param      $num        id à décomposer
1730   */
1731  function get_exdir($num)
1732  {
1733      $num = substr("000".$num, -3);
1734      return substr($num, 0,1).'/'.substr($num, 1,1).'/'.substr($num, 2,1).'/';
1735  }
1736  
1737  /**
1738   *      \brief      Création de répertoire recursive
1739   *      \param      $dir        Répertoire à créer
1740   *      \return     int         < 0 si erreur, >= 0 si succès
1741   */
1742  function create_exdir($dir)
1743  {
1744      dolibarr_syslog("functions.inc.php::create_exdir dir=$dir");
1745  
1746      $nberr=0;
1747      $nbcreated=0;
1748      $lasterr=0;
1749  
1750      $ccdir = '';
1751      $cdir = explode("/",$dir);
1752  
1753      // On boucle sur toutes les parties. Meme si on tombe en erreur sur les premiers 
1754      // repertoires, on continue car l'erreur peut etre due à un test is_dir faux
1755      // alors que le rep existe (suite a activation de open_basedir).
1756      // On va donc jusqu'au bout et on renvoi l'erreur de creation du dernier niveau
1757      for ($i = 0 ; $i < sizeof($cdir) ; $i++)
1758      {
1759          if ($i > 0) $ccdir .= '/'.$cdir[$i];
1760          else $ccdir = $cdir[$i];
1761          if (eregi("^.:$",$ccdir,$regs)) continue;     // Si chemin Windows incomplet, on poursuit par rep suivant
1762  
1763          //print "${ccdir}<br>\n";
1764          if ($ccdir)
1765          {
1766              if (! is_dir($ccdir))
1767              {
1768                  umask(0);
1769                  if (! @mkdir($ccdir, 0755))
1770                  {
1771                      dolibarr_syslog("functions.inc.php::create_exdir Erreur: Le répertoire '$ccdir' n'existe pas et Dolibarr n'a pu le créer.");
1772                      $nberr++;
1773                      $lasterr=$nberr;
1774                  }
1775                  else
1776                  {
1777                      dolibarr_syslog("functions.inc.php::create_exdir Directory '$ccdir' created");
1778                      $nbcreated++;
1779                      $lasterr=0;
1780                  }
1781              }
1782              else
1783              {
1784                  $lasterr=0;   
1785              }
1786          }
1787      }
1788      if (! $lasterr) return $nbcreated;  // Dernier niveau ok
1789      return -$nberr;
1790  }
1791  
1792  ?>


Généré le : Mon Nov 26 12:29:37 2007 par Balluche grâce à PHPXref 0.7
  Clicky Web Analytics