| [ Index ] |
|
Code source de Dolibarr 2.0.1 |
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)." ".substr($phone,2,2)." ".substr($phone,4,2)." ".substr($phone,6,2)." ".substr($phone,8,2); 495 } 496 elseif (strlen($phone) == 7) 497 { 498 return substr($phone,0,3)." ".substr($phone,3,2)." ".substr($phone,5,2); 499 } 500 elseif (strlen($phone) == 9) 501 { 502 return substr($phone,0,2)." ".substr($phone,2,3)." ".substr($phone,5,2)." ".substr($phone,7,2); 503 } 504 elseif (strlen($phone) == 11) 505 { 506 return substr($phone,0,3)." ".substr($phone,3,2)." ".substr($phone,5,2)." ".substr($phone,7,2)." ".substr($phone,9,2); 507 } 508 elseif (strlen($phone) == 12) 509 { 510 return substr($phone,0,4)." ".substr($phone,4,2)." ".substr($phone,6,2)." ".substr($phone,8,2)." ".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"> </td></tr> 952 953 <tr><td align="left"> <b>'.$langs->trans("Login").'</b> </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"> <b>'.$langs->trans("Password").'</b> </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=" '.$langs->trans("Connection").' " 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." "; 1388 if (! $sortorder) 1389 { 1390 print '<a href="'.$file.'?sortfield='.$field.'&sortorder=asc&begin='.$begin.$options.'">'.img_down("A-Z",1).'</a>'; 1391 print '<a href="'.$file.'?sortfield='.$field.'&sortorder=desc&begin='.$begin.$options.'">'.img_up("Z-A",1).'</a>'; 1392 } 1393 else 1394 { 1395 if ($field != $sortfield) { 1396 print '<a href="'.$file.'?sortfield='.$field.'&sortorder=asc&begin='.$begin.$options.'">'.img_down("A-Z",1).'</a>'; 1397 print '<a href="'.$file.'?sortfield='.$field.'&sortorder=desc&begin='.$begin.$options.'">'.img_up("Z-A",1).'</a>'; 1398 } 1399 else { 1400 if ($sortorder == 'DESC' ) { 1401 print '<a href="'.$file.'?sortfield='.$field.'&sortorder=asc&begin='.$begin.$options.'">'.img_down("A-Z",1).'</a>'; 1402 print '<a href="'.$file.'?sortfield='.$field.'&sortorder=desc&begin='.$begin.$options.'">'.img_up("Z-A",0).'</a>'; 1403 } 1404 if ($sortorder == 'ASC' ) { 1405 print '<a href="'.$file.'?sortfield='.$field.'&sortorder=asc&begin='.$begin.$options.'">'.img_down("A-Z",0).'</a>'; 1406 print '<a href="'.$file.'?sortfield='.$field.'&sortorder=desc&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 .= "&sortfield=$sortfield"; 1493 if ($sortorder) $options .= "&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> H "; 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> H "; 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(' ',' ',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 ?>
titre
Description
Corps
titre
Description
Corps
titre
Description
Corps
titre
Corps
| Généré le : Mon Nov 26 12:29:37 2007 | par Balluche grâce à PHPXref 0.7 |
|