2
0
forked from Wavyzz/dolibarr
Files
dolibarr-fork/htdocs/lib/functions.inc.php

1412 lines
38 KiB
PHP
Raw Blame History

<?PHP
/* Copyright (C) 2000-2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
* Copyright (C) 2003 Jean-Louis Bergamo <jlb@j1b.org>
* Copyright (C) 2004-2005 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2004 Sebastien Di Cintio <sdicintio@ressource-toi.org>
* Copyright (C) 2004 Benoit Mortier <benoit.mortier@opensides.be>
* Copyright (C) 2004 Christophe Combelles <ccomb@free.fr>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
* or see http://www.gnu.org/
*
* $Id$
* $Source$
*
*/
/** \file htdocs/lib/functions.inc.php
\brief Ensemble de fonctions de base de dolibarr sous forme d'include
\author Rodolphe Quiedeville
\author Jean-Louis Bergamo
\author Laurent Destailleur
\author Sebastien Di Cintio
\author Benoit Mortier
\version $Revision$
Ensemble de fonctions de base de dolibarr sous forme d'include
*/
/**
\brief Renvoi vrai si l'email est syntaxiquement valide
\param address adresse email (Ex: "toto@titi.com", "John Do <johndo@titi.com>")
\return boolean true si email valide, false sinon
*/
function ValidEmail($address)
{
if (ereg( ".*<(.+)>", $address, $regs)) {
$address = $regs[1];
}
if (ereg( "^[^@ ]+@([a-zA-Z0-9\-]+\.)+([a-zA-Z0-9\-]{2}|net|com|gov|mil|org|edu|int)\$",$address))
{
return true;
}
else
{
return false;
}
}
/**
\brief Renvoi vrai si l'email a un nom de domaine qui r<>soud via dns
\param mail adresse email (Ex: "toto@titi.com", "John Do <johndo@titi.com>")
\return boolean true si email valide, false sinon
*/
function check_mail ($mail)
{
list($user, $domain) = split("@", $mail, 2);
if (checkdnsrr($domain, "MX"))
{
return true;
}
else
{
return false;
}
}
/**
\brief Envoi des messages dolibarr dans syslog.
\param message message a envoyer a syslog
\param level Niveau de l'erreur
\remarks Cette fonction ne marchera qui si la constante MAIN_DEBUG = 1
Le message est envoy<6F> dans syslog dans la cat<61>gorie LOG_USER.
*/
function dolibarr_syslog($message, $level=LOG_ERR)
{
if (defined("MAIN_DEBUG") && MAIN_DEBUG) {
openlog("dolibarr", LOG_PID | LOG_PERROR, LOG_USER); # LOG_USER au lieu de LOG_LOCAL0 car non accept<70> par tous les PHP
syslog($level, $message);
closelog();
}
}
/**
\brief Affiche le header d'une fiche
\param links liens
\param active 0 par d<>faut
\param title titre ("" par defaut)
*/
function dolibarr_fiche_head($links, $active=0, $title='')
{
print "<!-- fiche --><div class=\"tabs\">\n";
if (strlen($title))
{
$limittitle=30;
if (strlen($title) > $limittitle) print '<a class="tabTitle">'.substr($title,0,$limittitle).'...</a>';
else print '<a class="tabTitle">'.$title.'</a>';
}
for ($i = 0 ; $i < sizeof($links) ; $i++)
{
if ($links[$i][2] == 'image')
{
print '<a class="tabimage" href="'.$links[$i][0].'">'.$links[$i][1].'</a>'."\n";
}
else
{
if ($i == $active)
{
print '<a id="active" class="tab" href="'.$links[$i][0].'">'.$links[$i][1].'</a>'."\n";
}
else
{
print '<a class="tab" href="'.$links[$i][0].'">'.$links[$i][1].'</a>'."\n";
}
}
}
print "</div>\n";
print "<div class=\"tabBar\">\n<br>\n";
}
/**
\brief Insertion d'une constante dans la base de donn<6E>es.
\param db handler d'acc<63>s base
\param name nom de la constante
\param value valeur de la constante
\param type type de constante (chaine par d<>faut)
\param visible la constante est t'elle visible (0 par d<>faut)
\param note explication de la constante
\return 0 pour rat<61>, 1 pour r<>ussi
\see dolibarr_del_const
*/
function dolibarr_set_const($db, $name, $value, $type='chaine', $visible=0, $note='')
{
$sql = "DELETE FROM llx_const WHERE name = '$name';";
$db->query($sql);
$sqql = "INSERT INTO llx_const(name,value,type,visible,note) VALUES
('$name','$value','$type',$visible,'$note');";
$db->query($sql);
//$sql = "DELETE FROM llx_const WHERE name = '$name' and value = '$value' ;";
//$db->query($sql);
//$sql2 = "INSERT INTO llx_const VALUES('$name','$value','$type',$visible,'$note');";
//$db->query($sql);
if ($db->query($sqql))
{
return 1;
}
else
{
return 0;
}
}
/**
\brief Effacement d'une constante dans la base de donn<6E>es
\param db handler d'acc<63>s base
\param name nom ou rowid de la constante
\return 0 pour rat<61>, 1 pour r<>ussi
\see dolibarr_set_const
*/
function dolibarr_del_const($db, $name)
{
$sql = "DELETE FROM llx_const WHERE name='$name' or rowid='$name'";
if ($db->query($sql))
{
return 1;
}
else
{
return 0;
}
}
/**
\brief Formattage des nombres
\param ca valeur a formater
\return int valeur format<61>e
*/
function dolibarr_print_ca($ca)
{
if ($ca > 1000)
{
$cat = round(($ca / 1000),2);
$cat = "$cat Keuros";
}
else
{
$cat = round($ca,2);
$cat = "$cat euros";
}
if ($ca > 1000000)
{
$cat = round(($ca / 1000000),2);
$cat = "$cat Meuros";
}
return $cat;
}
/**
\brief Formattage de la date
\param time date timestamp ou au format YYYY-MM-DD
\param format format de la date "%d %b %Y"
\return string date format<61>e
*/
function dolibarr_print_date($time,$format="%d %b %Y")
{
// Analyse de la date
if (eregi('^([0-9]+)\-([0-9]+)\-([0-9]+)\s?([0-9]+)?:?([0-9]+)?',$time,$reg)) {
// Date au format 'YYYY-MM-DD' ou 'YYYY-MM-DD HH:MM:SS'
$syear = $reg[1];
$smonth = $reg[2];
$sday = $reg[3];
$shour = $reg[4];
$smin = $reg[5];
if ($syear < 1970 && $_SERVER["WINDIR"])
{
// Le formatage ne peut etre appliqu<71> car windows ne supporte pas la fonction
// mktime si l'ann<6E>e est inf<6E>rieur <20> 1970. On retourne un format fixe
return "$syear-$smonth-$sday";
}
else
{
return strftime($format,mktime($shour,$smin,0,$smonth,$sday,$syear));
}
}
else {
// Date est un timestamps
return strftime($format,$time);
}
}
/**
\brief Affiche les informations d'un objet
\param object objet a afficher
*/
function dolibarr_print_object_info($object)
{
global $langs;
if (isset($object->user_creation))
print $langs->trans("CreatedBy")." : " . $object->user_creation->fullname . '<br>';
if (isset($object->date_creation))
print $langs->trans("DateCreation")." : " . dolibarr_print_date($object->date_creation,"%A %d %B %Y %H:%M:%S") . '<br>';
if (isset($object->user_modification))
print $langs->trans("ModifiedBy")." : " . $object->user_modification->fullname . '<br>';
if (isset($object->date_modification))
print $langs->trans("DateModification")." : " . dolibarr_print_date($object->date_modification,"%A %d %B %Y %H:%M:%S") . '<br>';
if (isset($object->user_validation))
print $langs->trans("ValidatedBy")." : " . $object->user_validation->fullname . '<br>';
if (isset($object->date_validation))
print $langs->trans("DateValidation")." : " . dolibarr_print_date($object->date_modification,"%A %d %B %Y %H:%M:%S") . '<br>';
if (isset($object->user_cloture))
print $langs->trans("ClosedBy")." : " . $object->user_cloture->fullname . '<br>';
if (isset($object->date_cloture))
print $langs->trans("DateClosing")." : " . dolibarr_print_date($object->date_modification,"%A %d %B %Y %H:%M:%S") . '<br>';
}
/**
\brief Formatage des num<75>ros de telephone en fonction du format d'un pays
\param phone Num<75>ro de telephone <20> formater
\param country Pays selon lequel formatter
\return string Num<75>ro de t<>l<EFBFBD>phone format<61>
*/
function dolibarr_print_phone($phone,$country="FR")
{
$phone=trim($phone);
if (strstr($phone, ' ')) { return $phone; }
if (strtoupper($country) == "FR") {
// France
if (strlen($phone) == 10) {
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);
}
elseif (strlen($phone) == 7)
{
return substr($phone,0,3)."&nbsp;".substr($phone,3,2)."&nbsp;".substr($phone,5,2);
}
elseif (strlen($phone) == 9)
{
return substr($phone,0,2)."&nbsp;".substr($phone,2,3)."&nbsp;".substr($phone,5,2)."&nbsp;".substr($phone,7,2);
}
elseif (strlen($phone) == 11)
{
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);
}
elseif (strlen($phone) == 12)
{
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);
}
}
return $phone;
}
/**
\brief Affiche logo propre <20> une notion (fonction g<>n<EFBFBD>rique)
\param alt Texte sur le alt de l'image
\param object Objet pour lequel il faut afficher le logo (exemple: user, group, action, bill, contract, propal, product, ...)
*/
function img_object($alt, $object)
{
global $conf,$langs;
return '<img src="'.DOL_URL_ROOT.'/theme/'.$conf->theme.'/img/object_'.$object.'.png" border="0" alt="'.$alt.'" title="'.$alt.'">';
}
/**
\brief Affiche logo fichier
*/
function img_file($alt = "default")
{
global $conf,$langs;
if ($alt=="default") $alt=$langs->trans("Show");
return '<img src="'.DOL_URL_ROOT.'/theme/'.$conf->theme.'/img/file.png" border="0" alt="'.$alt.'" title="'.$alt.'">';
}
/**
\brief Affiche logo dossier
*/
function img_folder($alt = "default")
{
global $conf,$langs;
if ($alt=="default") $alt=$langs->trans("Dossier");
return '<img src="'.DOL_URL_ROOT.'/theme/'.$conf->theme.'/img/folder.png" border="0" alt="'.$alt.'" title="'.$alt.'">';
}
/**
\brief Affiche logo nouveau fichier
*/
function img_file_new($alt = "default")
{
global $conf,$langs;
if ($alt=="default") $alt=$langs->trans("Show");
return '<img src="'.DOL_URL_ROOT.'/theme/'.$conf->theme.'/img/filenew.png" border="0" alt="'.$alt.'" title="'.$alt.'">';
}
/**
\brief Affiche logo pdf
*/
function img_pdf($alt = "default")
{
global $conf,$langs;
if ($alt=="default") $alt=$langs->trans("Show");
return '<img src="'.DOL_URL_ROOT.'/theme/'.$conf->theme.'/img/pdf.png" border="0" alt="'.$alt.'" title="'.$alt.'">';
}
/**
\brief Affiche logo +
*/
function img_edit_add($alt = "default")
{
global $conf,$langs;
if ($alt=="default") $alt=$langs->trans("Add");
return '<img src="'.DOL_URL_ROOT.'/theme/'.$conf->theme.'/img/edit_add.png" border="0" alt="'.$alt.'" title="'.$alt.'">';
}
/**
\brief Affiche logo -
*/
function img_edit_remove($alt = "default")
{
global $conf,$langs;
if ($alt=="default") $alt=$langs->trans("Remove");
return '<img src="'.DOL_URL_ROOT.'/theme/'.$conf->theme.'/img/edit_remove.png" border="0" alt="'.$alt.'" title="'.$alt.'">';
}
/**
\brief Affiche logo editer/modifier fiche
*/
function img_edit($alt = "default")
{
global $conf,$langs;
if ($alt=="default") $alt=$langs->trans("Modify");
return '<img src="'.DOL_URL_ROOT.'/theme/'.$conf->theme.'/img/edit.png" border="0" alt="'.$alt.'" title="'.$alt.'">';
}
/**
\brief Affiche logo effacer
*/
function img_delete($alt = "default")
{
global $conf,$langs;
if ($alt=="default") $alt=$langs->trans("Delete");
return '<img src="'.DOL_URL_ROOT.'/theme/'.$conf->theme.'/img/delete.png" border="0" alt="'.$alt.'" title="'.$alt.'">';
}
/**
\brief Affiche logo d<>sactiver
*/
function img_disable($alt = "default")
{
global $conf,$langs;
if ($alt=="default") $alt=$langs->trans("Disable");
return '<img src="'.DOL_URL_ROOT.'/theme/'.$conf->theme.'/img/disable.png" border="0" alt="'.$alt.'" title="'.$alt.'">';
}
/**
\brief Affiche logo info
*/
function img_info($alt = "default")
{
global $conf,$langs;
if ($alt=="default") $alt=$langs->trans("Informations");
return '<img src="'.DOL_URL_ROOT.'/theme/'.$conf->theme.'/img/info.png" border="0" alt="'.$alt.'" title="'.$alt.'">';
}
/**
\brief Affiche logo warning
*/
function img_warning($alt = "default")
{
global $conf,$langs;
if ($alt=="default") $alt=$langs->trans("Show");
return '<img src="'.DOL_URL_ROOT.'/theme/'.$conf->theme.'/img/warning.png" border="0" alt="'.$alt.'" title="'.$alt.'">';
}
/**
\brief Affiche logo alerte
*/
function img_alerte($alt = "default")
{
global $conf,$langs;
if ($alt=="default") $alt=$langs->trans("Alert");
return '<img src="'.DOL_URL_ROOT.'/theme/'.$conf->theme.'/img/alerte.png" border="0" alt="'.$alt.'" title="'.$alt.'">';
}
/**
\brief Affiche logo t<>l<EFBFBD>phone in
*/
function img_phone_in($alt = "default")
{
global $conf,$langs;
if ($alt=="default") $alt=$langs->trans("Modify");
return '<img src="'.DOL_URL_ROOT.'/theme/'.$conf->theme.'/img/call.png" border="0" alt="'.$alt.'" title="'.$alt.'">';
}
/**
\brief Affiche logo t<>l<EFBFBD>phone out
*/
function img_phone_out($alt = "default")
{
global $conf,$langs;
if ($alt=="default") $alt=$langs->trans("Modify");
return '<img src="'.DOL_URL_ROOT.'/theme/'.$conf->theme.'/img/call.png" border="0" alt="'.$alt.'" title="'.$alt.'">';
}
/**
\brief Affiche logo suivant
*/
function img_next($alt = "default")
{
global $conf,$langs;
if ($alt=="default") {
$alt=$langs->trans("Next");
}
return '<img src="'.DOL_URL_ROOT.'/theme/'.$conf->theme.'/img/next.png" border="0" alt="'.$alt.'" title="'.$alt.'">';
}
/**
\brief Affiche logo pr<70>c<EFBFBD>dent
*/
function img_previous($alt = "default")
{
global $conf,$langs;
if ($alt=="default") $alt=$langs->trans("Previous");
return '<img src="'.DOL_URL_ROOT.'/theme/'.$conf->theme.'/img/previous.png" border="0" alt="'.$alt.'" title="'.$alt.'">';
}
/**
\brief Affiche logo bas
*/
function img_down($alt = "default")
{
global $conf,$langs;
if ($alt=="default") $alt=$langs->trans("Down");
return '<img src="'.DOL_URL_ROOT.'/theme/'.$conf->theme.'/img/1downarrow.png" border="0" alt="'.$alt.'" title="'.$alt.'">';
}
/**
\brief Affiche logo haut
*/
function img_up($alt = "default")
{
global $conf,$langs;
if ($alt=="default") $alt=$langs->trans("Up");
return '<img src="'.DOL_URL_ROOT.'/theme/'.$conf->theme.'/img/1uparrow.png" border="0" alt="'.$alt.'" title="'.$alt.'">';
}
/**
\brief fonction de login
\remarks il faut changer le code html dans la fonction pour changer le design
*/
function loginfunction()
{
print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">';
print "\n<html><head><title>Dolibarr Authentification</title>";
print '<link rel="stylesheet" type="text/css" href="lib/login.css">
</head>
<body onload="donnefocus();">
<div class="main">
<div class="header">';
print 'Dolibarr '.DOL_VERSION;
print '
</div>
<div class="main-inside">
';
echo '<form method="post" action="' . $_SERVER['PHP_SELF'] . '" name="identification">';
print '<table><tr>';
print '<td>Login : </td><td><input type="text" name="username"></td></tr>';;
print '<tr><td>Password : </td><td><input type="password" name="password"></td></tr>';
echo '</table>
<p align="center"><input value="Login" type="submit">
</form>';
}
/**
\brief Affiche message erreur de type acces interdit et arrete le programme
\remarks L'appel a cette fonction termine le code.
*/
function accessforbidden()
{
global $user, $langs;
$langs->load("other");
llxHeader();
print '<div class="error">'.$langs->trans("ErrorForbidden").'</div>';
print '<br>';
if ($user->login) {
print $langs->trans("Login").": ".$user->login."<br>";
print $langs->trans("ErrorForbidden2",$langs->trans("Home"),$langs->trans("Users"));
}
else {
print $langs->trans("ErrorForbidden3");
}
llxFooter();
exit(0);
}
/**
\brief Affiche message erreur system avec toutes les informations pour faciliter le diagnostique et la remont<6E>e des bugs.
On doit appeler cette fonction quand une erreur technique bloquante est rencontr<74>e.
Toutefois, il faut essayer de ne l'appeler qu'au sein de page php, les classes devant
renvoyer leur erreur par l'interm<72>diaire de leur propri<72>t<EFBFBD> "error".
\param db Handler de base utilis<69>
\param msg Message compl<70>mentaire <20> afficher
*/
function dolibarr_print_error($db='',$msg='')
{
global $langs;
$syslog = '';
if ($_SERVER['DOCUMENT_ROOT']) // Mode web
{
print "Dolibarr a d<>tect<63> une erreur technique.<br>\n";
print "Voici les informations qui pourront aider au diagnostique:<br><br>\n";
print "<b>".$langs->trans("Server").":</b> ".$_SERVER["SERVER_SOFTWARE"]."<br>\n";;
print "<b>URL sollicit<69>e:</b> ".$_SERVER["REQUEST_URI"]."<br>\n";;
print "<b>QUERY_STRING:</b> ".$_SERVER["QUERY_STRING"]."<br>\n";;
print "<b>Referer:</b> ".$_SERVER["HTTP_REFERER"]."<br>\n";;
$syslog.="url=".$_SERVER["REQUEST_URI"];
$syslog.=", query_string=".$_SERVER["QUERY_STRING"];
}
else // Mode CLI
{
print "Erreur interne d<>tect<63>e...\n";
$syslog.="pid=".getmypid();
}
if ($db) {
if ($_SERVER['DOCUMENT_ROOT']) // Mode web
{
print "<br>\n";
print "<b>Requete dernier acces en base:</b> ".$db->lastquery()."<br>\n";
print "<b>Code retour dernier acces en base:</b> ".$db->errno()."<br>\n";
print "<b>Information sur le dernier acc<63>s en base:</b> ".$db->error()."<br>\n";
}
else // Mode CLI
{
print "Requete dernier acces en base:\n".$db->lastquery()."\n";
print "Code retour dernier acces en base:\n".$db->errno()."\n";
print "Information sur le dernier acc<63>s en base:\n".$db->error()."\n";
}
$syslog.=", sql=".$db->lastquery();
$syslog.=", db_error=".$db->error();
}
if ($msg) {
if ($_SERVER['DOCUMENT_ROOT']) // Mode web
{
print "<b>".$langs->trans("Message").":</b> ".$msg."<br>\n" ;
}
else // Mode CLI
{
print $langs->trans("Message").":\n".$msg."\n" ;
}
$syslog.=", msg=".$msg;
}
dolibarr_syslog("Error $syslog");
}
/**
\brief Deplacer les fichiers telecharg<72>s
\param src_file fichier source
\param dest_file fichier de destination
\return int le resultat du move_uploaded_file
*/
function doliMoveFileUpload($src_file, $dest_file)
{
$file_name = $dest_file;
if (substr($file_name, strlen($file_name) -3 , 3) == 'php')
{
$file_name = $dest_file . ".txt";
}
return move_uploaded_file($src_file, $file_name);
}
/**
\brief
\param db handler d'acc<63>s base
\param user object utilisateur
*/
function dolibarr_user_page_param($db, &$user)
{
foreach ($GLOBALS["_GET"] as $key=>$value)
{
if ($key == "sortfield")
{
$sql = "DELETE FROM ".MAIN_DB_PREFIX."user_param WHERE fk_user = $user->id ;";
$db->query($sql);
$sql = "INSERT INTO ".MAIN_DB_PREFIX."user_param(fk_user,page,param,value) VALUES
($user->id,'".$GLOBALS["SCRIPT_URL"]."','sortfield','".urlencode($value)."');";
$db->query($sql);
$user->page_param["sortfield"] = $value;
}
if ($key == "sortorder")
{
$sql = "DELETE FROM ".MAIN_DB_PREFIX."user_param WHERE fk_user = $user->id ;";
$db->query($sql);
$sql = "INSERT INTO ".MAIN_DB_PREFIX."user_param(fk_user,page,param,value) VALUES
($user->id,'".$GLOBALS["SCRIPT_URL"]."','sortfield','".urlencode($value)."');";
$db->query($sql);
$user->page_param["sortorder"] = $value;
}
if ($key == "begin")
{
$sql = "DELETE FROM ".MAIN_DB_PREFIX."user_param WHERE fk_user = $user->id ;";
$db->query($sql);
$sql = "INSERT INTO ".MAIN_DB_PREFIX."user_param(fk_user,page,param,value) VALUES
($user->id,'".$GLOBALS["SCRIPT_URL"]."','sortfield','".urlencode($value)."'); ";
$db->query($sql);
$user->page_param["begin"] = $value;
}
if ($key == "page")
{
$sql = "DELETE FROM ".MAIN_DB_PREFIX."user_param WHERE fk_user = $user->id ;";
$db->query($sql);
$sql = "INSERT INTO ".MAIN_DB_PREFIX."user_param(fk_user,page,param,value) VALUES
($user->id,'".$GLOBALS["SCRIPT_URL"]."','sortfield','".urlencode($value)."'); ";
$db->query($sql);
$user->page_param["page"] = $value;
}
}
}
/**
\brief Transcodage de francs en euros
\param zonein zone de depart
\param devise type de devise
\return r resultat transcod<6F>
*/
function transcoS2L($zonein,$devise)
{
// Open source offert par <A HREF="mailto:alainfloch@free.fr?subject=chif2let">alainfloch@free.fr</A> 28/10/2001, sans garantie.
// d<>but de la fonction de transcodification de somme en toutes lettres
/* $zonein = "123,56";
* $devise = "E"; // pr<70>ciser F si francs , sinon ce sera de l'euro
* $r = transcoS2L($zonein,$devise); // appeler la fonction
* echo "r<>sultat vaut $r<br>";
* $zonelettresM = strtoupper($r); // si vous voulez la m<>me zone mais tout en majuscules
* echo "r<>sultat en Majuscules vaut $zonelettresM<br>";
* $zonein = "1,01";
* $r = transcoS2L($zonein,$devise);
* echo "r<>sultat vaut $r<br>";
*/
if ($devise == "F")
{
$unite_singulier = " franc ";
$unite_pluriel = " francs ";
$cent_singulier = " centime";
}
else
{
$unite_singulier = " euro ";
$unite_pluriel = " euros ";
$cent_singulier = " centime";
}
$arr1_99 = array("z<EFBFBD>ro","un","deux","trois",
"quatre","cinq","six","sept",
"huit","neuf","dix","onze","douze",
"treize","quatorze","quinze","seize",
"dix-sept","dix-huit","dix-neuf","vingt ");
$arr1_99[30] = "trente ";
$arr1_99[40] = "quarante ";
$arr1_99[50] = "cinquante ";
$arr1_99[60] = "soixante ";
$arr1_99[70] = "soixante-dix ";
$arr1_99[71] = "soixante et onze";
$arr1_99[80] = "quatre-vingts ";
$i = 22;
while ($i < 63) {// initialise la table
$arr1_99[$i - 1] = $arr1_99[$i - 2]." et un";
$j = 0;
while ($j < 8) {
$k = $i + $j;
$arr1_99[$k] = $arr1_99[$i - 2].$arr1_99[$j + 2];
$j++;
}
$i = $i + 10;
} // fin initialise la table
$i = 12;
while ($i < 20) {// initialise la table (suite)
$j = 60 + $i;
$arr1_99[$j] = "soixante-".$arr1_99[$i];
$i++;
} // fin initialise la table (suite)
$i = 1;
while ($i < 20) {// initialise la table (fin)
$j = 80 + $i;
$arr1_99[$j] = "quatre-vingt-".$arr1_99[$i];
$i++;
} // fin initialise la table (fin)
// echo "Pour une valeur en entr<74>e = $zonein<br>"; //pour ceux qui ne croient que ce qu'ils voient !
// quelques petits controles s'imposent !!
$valid = "[a-zA-Z\&\<EFBFBD>\"\'\(\-\<EFBFBD>\_\<EFBFBD>\<EFBFBD>\)\=\;\:\!\*\$\^\<\>]";
if (ereg($valid,$zonein))
{
$r = "<b>la cha<68>ne ".$zonein." n'est pas valide</b>";
return($r);
}
$zone = explode(" ",$zonein); // supprimer les blancs s<>parateurs
$zonein = implode("",$zone); // reconcat<61>ne la zone input
$zone = explode(".",$zonein); // supprimer les points s<>parateurs
$zonein = implode("",$zone); // reconcat<61>ne la zone input, <20>a c'est fort ! merci PHP
$virg = strpos($zonein,",",1); // <20> la poursuite de la virgule
$i = strlen($zonein); // et de la longueur de la zone input
if ($virg == 0) { // ya pas de virgule
if ($i > 7)
{
$r = "<b>la cha<68>ne ".$zonein." est trop longue (maxi = 9 millions)</b>";
return($r);
}
$deb = 7 - $i;
$zoneanaly = substr($zonechiffres,0,$deb).$zonein.",00";
}
else
{ //ya une virgule
$ti = explode(",",$zonein); // mettre de c<>t<EFBFBD> ce qu'il y a devant la virgule
$i = strlen($ti[0]); // en controler la longueur
$zonechiffres = "0000000,00";
if ($i > 7)
{
$r = "<b>la cha<68>ne ".$zonein." est trop longue (maxi = 9 millions,00)</b>";
return($r);
}
$deb = 7 - $i;
$zoneanaly = substr($zonechiffres,0,$deb).$zonein;
}
$M= substr($zoneanaly,0,1);
if ($M != 0)
{ // qui veut gagner des millions
$r = $arr1_99[$M]." million";
if ($M ==1) $r = $r." ";
else $r = $r."s ";
if (substr($zoneanaly,1,6)==0)
{
if ($devise == 'F') $r = $r." de ";
else $r = $r."d'";
}
}
$CM= substr($zoneanaly,1,1);
if ($CM == 1)
{ // qui veut gagner des centaines de mille
$r = $r." cent ";
}
else
{ // ya des centaines de mille
if ($CM > 1)
{
$r = $r. $arr1_99[$CM]." cent ";
}
} // fin du else ya des centaines de mille
$MM= substr($zoneanaly,2,2);
if (substr($zoneanaly,2,1)==0){ $MM = substr($zoneanaly,3,1);} // enlever le z<>ro des milliers cause indexation
if ($MM ==0 && $CM > 0)
{
$r = $r."mille ";
}
if ($MM != 0)
{
if ($MM == 80)
{
$r = $r."quatre-vingt mille ";
}
else
{
if ($MM > 1 )
{
$r = $r.$arr1_99[$MM]." mille ";
}
else
{
if ($CM == 0) $r = $r." mille ";
else
{
$r = $r.$arr1_99[$MM]." mille ";
}
}
}
}
$C2= substr($zoneanaly,5,2);
if (substr($zoneanaly,5,1)==0){ $C2 = substr($zoneanaly,6,1);} // enlever le z<>ro des centaines cause indexation
$C1= substr($zoneanaly,4,1);
if ($C2 ==0 && $C1 > 1)
{
$r = $r.$arr1_99[$C1]." cents ";
}
else
{
if ($C1 == 1) $r = $r." cent ";
else
{
if ($C1 > 1) $r = $r.$arr1_99[$C1]." cent ";
}
}
if ($C2 != 0)
{
$r = $r.$arr1_99[$C2];
}
if ($virg !=0)
{
if ($ti[0] > 1) $r = $r. $unite_pluriel; else $r = "un ".$unite_singulier;
}
else
{
if ($zonein > 1) $r = $r.$unite_pluriel; else $r = "un ".$unite_singulier;
}
$UN= substr($zoneanaly,8,2);
if ($UN != "00")
{
$cts = $UN;
if (substr($UN,0,1)==0){ $cts = substr($UN,1,1);} // enlever le z<>ro des centimes cause indexation
$r = $r." et ". $arr1_99[$cts].$cent_singulier;
if ($UN > 1) $r =$r."s"; // accorde au pluriel
}
$r1 = ltrim($r); // enleve quelques blancs possibles en d<>but de zone
$r = ucfirst($r1); // met le 1er caract<63>re en Majuscule, c'est + zoli
return($r); // retourne le r<>sultat
} // fin fonction transcoS2L
/**
\brief Affichage de la ligne de titre d'un tabelau
\param name
\param file
\param field
\param begin ("" par defaut)
\param options ("" par defaut)
\param td param<61>tres de l'attribut td ("" par defaut)
\param sortfield nom du champ sur lequel est effectu<74> le tri du tableau
*/
function print_liste_field_titre($name, $file, $field, $begin="", $options="", $td="", $sortfield="")
{
global $conf;
// Le champ de tri est mis en <20>vidence.
// Exemple si (sortfield,field)=("nom","xxx.nom") ou (sortfield,field)=("nom","nom")
if ($sortfield == $field || $sortfield == ereg_replace("^[^\.]+\.","",$field))
{
print '<td class="menusel" '. $td.'>';
}
else
{
print '<td '. $td.'>';
}
print $name."&nbsp;";
print '<a href="'.$file.'?sortfield='.$field.'&amp;sortorder=asc&amp;begin='.$begin.$options.'">'.img_down("A-Z").'</a>';
print '<a href="'.$file.'?sortfield='.$field.'&amp;sortorder=desc&amp;begin='.$begin.$options.'">'.img_up("Z-A").'</a>';
print "</td>";
}
/**
\brief Affichage d'un titre
\param titre Le titre a afficher
*/
function print_titre($titre)
{
print '<div class="titre">'.$titre.'</div>';
}
/**
\brief Affichage d'un titre d'une fiche, align<67> a gauche
\param titre Le titre a afficher
\param mesg Message supl<70>mentaire <20> afficher <20> droite
*/
function print_fiche_titre($titre, $mesg='')
{
print "\n".'<table width="100%" border="0" cellpadding="3" cellspacing="0">';
print '<tr><td><div class="titre" valign="middle">'.$titre.'</div></td>';
if (strlen($mesg))
{
print '<td align="right" valign="middle"><b>'.$mesg.'</b></td>';
}
print '</tr></table>'."\n";
}
/**
\brief Effacement d'un fichier
\param file fichier a effacer
*/
function dol_delete_file($file)
{
return unlink($file);
}
/**
\brief Fonction print_barre_liste
\param titre titre de la page
\param page num<75>ro de la page
\param file lien
\param options
\param sortfield
\param sortorder
\param form
\param num nombre d'<27>l<EFBFBD>ment total
*/
function print_barre_liste($titre, $page, $file, $options='', $sortfield='', $sortorder='', $form='', $num=-1)
{
global $conf;
if ($num > $conf->liste_limit or $num == -1)
{
$nextpage = 1;
}
else
{
$nextpage = 0;
}
print '<table width="100%" class="noborder">';
if ($page > 0 || $num > $conf->liste_limit)
{
print '<tr><td><div class="titre">'.$titre.' - page '.($page+1);
print '</div></td>';
}
else
{
print '<tr><td><div class="titre">'.$titre.'</div></td>';
}
if ($form)
{
print '<td align="left">'.$form.'</td>';
}
print '<td align="right">';
if (strlen($sortfield))
{
$options .= "&amp;sortfield=$sortfield";
}
if (strlen($sortorder))
{
$options .= "&amp;sortorder=$sortorder";
}
// Affichage des fleches de navigation
print_fleche_navigation($page,$file,$options,$nextpage);
print '</td></tr></table><br>';
}
/**
\brief Fonction servant a afficher les fleches de navigation dans les pages de listes
\param page num<75>ro de la page
\param file lien
\param options autres parametres d'url a propager dans les liens ("" par defaut)
\param nextpage faut-il une page suivante
*/
function print_fleche_navigation($page,$file,$options='',$nextpage)
{
global $conf, $langs;
if ($page > 0)
{
print '<a href="'.$file.'?page='.($page-1).$options.'">'.img_previous($langs->trans("Previous")).'</a>';
}
if ($nextpage > 0)
{
print '<a href="'.$file.'?page='.($page+1).$options.'">'.img_next($langs->trans("Next")).'</a>';
}
}
/**
\brief Fonction servant a afficher un menu d<>roulant sur le type de paiement
\param db handler d'acc<63>s base
\param nomselect Nom de la zone select html
\param value Critere de filtrage sur les type de paiement
*/
function print_type_paiement_select($db,$nomselect,$value=-1)
{
print "<select name=\"$nomselect\">";
$sql = "SELECT tp.code, tp.libelle";
$sql .= " FROM ".MAIN_DB_PREFIX."c_paiement as tp";
if ($value >= 0)
{
$sql.="WHERE type = $value";
}
$sql.=" ORDER by tp.libelle";
if ( $db->query($sql) ) {
$i=0;
$num = $db->num_rows();
while ($i < $num)
{
$obj = $db->fetch_object();
print "<option value=\"$obj->code\">$obj->libelle</option>";
$i++;
}
}
print "</select>\n";
}
/**
\brief Fonction servant a afficher les mois dans un liste d<>roulante
\param set_time ("" par defaut)
*/
function print_date_select($set_time='')
{
if (! $set_time)
{
$set_time = time();
}
$strmonth[1] = "Janvier";
$strmonth[2] = "F&eacute;vrier";
$strmonth[3] = "Mars";
$strmonth[4] = "Avril";
$strmonth[5] = "Mai";
$strmonth[6] = "Juin";
$strmonth[7] = "Juillet";
$strmonth[8] = "Ao&ucirc;t";
$strmonth[9] = "Septembre";
$strmonth[10] = "Octobre";
$strmonth[11] = "Novembre";
$strmonth[12] = "D&eacute;cembre";
$smonth = 1; $endmonth = 12;
$sday = 1; $endday = 31;
$cday = date("d", $set_time);
$cmonth = date("n", $set_time);
$syear = date("Y", $set_time);
print "<select name=\"reday\">";
for ($day = 1 ; $day <= $endday ; $day++)
{
if ($day == $cday)
{
print "<option value=\"$day\" selected>$day";
}
else
{
print "<option value=\"$day\">$day";
}
}
print "</select>";
print "<select name=\"remonth\">";
for ($month = $smonth ; $month <= $endmonth ; $month++)
{
if ($month == $cmonth)
{
print "<option value=\"$month\" selected>" . $strmonth[$month];
}
else
{
print "<option value=\"$month\">" . $strmonth[$month];
}
}
print "</select>";
print "<select name=\"reyear\">";
for ($year = $syear - 2; $year < $syear + 5 ; $year++)
{
if ($year == $syear)
{
print "<option value=\"$year\" selected>$year";
}
else
{
print "<option value=\"$year\">$year";
}
}
print "</select>\n";
}
/**
\brief Fonction servant a afficher les heures/minutes dans un liste d<>roulante
\param prefix
\param begin (1 par defaut)
\param end (23 par defaut)
*/
function print_heure_select($prefix,$begin=1,$end=23) {
print '<select name="'.$prefix.'hour">';
for ($hour = $begin ; $hour <= $end ; $hour++) {
print "<option value=\"$hour\">$hour";
}
print "</select>&nbsp;H&nbsp;";
print '<select name="'.$prefix.'min">';
for ($min = 0 ; $min < 60 ; $min=$min+5) {
if ($min < 10) {
$min = "0" . $min;
}
print "<option value=\"$min\">$min";
}
print "</select>\n";
}
/**
\brief Fonction servant a afficher une dur<75>e dans une liste d<>roulante
\param prefix prefix
*/
function print_duree_select($prefix)
{
print '<select name="'.$prefix.'hour">';
print "<option value=\"0\">0";
print "<option value=\"1\" selected>1";
for ($hour = 2 ; $hour < 13 ; $hour++)
{
print "<option value=\"$hour\">$hour";
}
print "</select>&nbsp;H&nbsp;";
print '<select name="'.$prefix.'min">';
for ($min = 0 ; $min < 55 ; $min=$min+5)
{
print "<option value=\"$min\">$min";
}
print "</select>\n";
}
/**
\brief Fonction qui retourne un montant mon<6F>taire format<61>
\param amount montant a formater
\param html formatage html ou pas (0 par defaut)
\remarks fonction utilis<69>e dans les pdf et les pages html
*/
function price($amount, $html=0)
{
if ($html)
{
$dec='.'; $thousand=' ';
return ereg_replace(' ','&nbsp;',number_format($amount, 2, $dec, $thousand));
}
else
{
return number_format($amount, 2, '.', ' ');
}
}
/**
\brief Fonction qui convertit des euros en francs
\param euros somme en euro <20> convertir
\return price prix converti et format<61>
*/
function francs($euros)
{
return price($euros * 6.55957);
}
/**
\brief Fonction qui calcule la tva
\param euros somme en euro
\param taux taux de tva
*/
function tva($euros, $taux=19.6)
{
$taux = $taux / 100 ;
return sprintf("%01.2f",($euros * $taux));
}
/**
\brief Fonction qui calcule le montant tva incluse
\param euros somme en euro
\param taux taux de tva
*/
function inctva($euros, $taux=1.196)
{
return sprintf("%01.2f",($euros * $taux));
}
/**
\brief Renvoie oui ou non dans la langue choisie
\param yesno variable pour test si oui ou non
\param case Oui/Non ou oui/non
*/
function yn($yesno, $case=1) {
global $langs;
if ($yesno == 0 || $yesno == 'no' || $yesno == 'false')
return $case?$langs->trans("No"):$langs->trans("no");
if ($yesno == 1 || $yesno == 'yes' || $yesno == 'true')
return $case?$langs->trans("Yes"):$langs->trans("yes");
return "unknown";
}
/**
\brief Fonction pour cr<63>er un mot de passe al<61>atoire
\param longueur longueur du mot de passe (8 par defaut)
\param sel donn<6E>e al<61>atoire
\remarks la fonction a <20>t<EFBFBD> prise sur http://www.uzine.net/spip
*/
function creer_pass_aleatoire($longueur = 8, $sel = "") {
$seed = (double) (microtime() + 1) * time();
srand($seed);
for ($i = 0; $i < $longueur; $i++) {
if (!$s) {
if (!$s) $s = rand();
$s = substr(md5(uniqid($s).$sel), 0, 16);
}
$r = unpack("Cr", pack("H2", $s.$s));
$x = $r['r'] & 63;
if ($x < 10) $x = chr($x + 48);
else if ($x < 36) $x = chr($x + 55);
else if ($x < 62) $x = chr($x + 61);
else if ($x == 63) $x = '/';
else $x = '.';
$pass .= $x;
$s = substr($s, 2);
}
return $pass;
}
/**
\brief Fonction pour initialiser sel
\remarks la fonction a <20>t<EFBFBD> prise sur http://www.uzine.net/spip
*/
function initialiser_sel() {
global $htsalt;
$htsalt = '$1$'.creer_pass_aleatoire();
}
/**
\brief Fonction pour qui retourne le rowid d'un departement par son code
\param db handler d'acc<63>s base
\param code Code r<>gion
\param pays_id Id du pays
*/
function departement_rowid($db,$code, $pays_id)
{
$sql = "SELECT c.rowid FROM ".MAIN_DB_PREFIX."c_departements as c,".MAIN_DB_PREFIX."c_regions as r";
$sql .= " WHERE c.code_departement=". $code;
$sql .= " AND c.fk_region = r.code_region";
$sql .= " AND r.fk_pays =".$pays_id;
if ($db->query($sql))
{
$num = $db->num_rows();
if ($num)
{
$obj = $db->fetch_object();
return $obj->rowid;
}
else
{
return 0;
}
$db->free();
}
else
{
return 0;
}
}
function get_exdir($num)
{
$num = substr("000".$num, -3);
return substr($num, 0,1).'/'.substr($num, 1,1).'/'.substr($num, 2,1).'/';
}
/*
* Cr<43>ation de r<>pertoire recursive
*
*/
function create_exdir($dir)
{
$ccdir = '';
$cdir = explode("/",substr($dir,1));
for ($i = 0 ; $i < sizeof($cdir) ; $i++)
{
$ccdir .= "/".$cdir[$i];
if (! file_exists($ccdir))
{
umask(0);
if (! @mkdir($ccdir, 0755))
{
dolibarr_syslog("create_exdir Erreur: Le r<EFBFBD>pertoire '$ccdir' n'existe pas et Dolibarr n'a pu le cr<EFBFBD>er.");
}
else
{
dolibarr_syslog("create_exdir Le r<EFBFBD>pertoire '$ccdir' created");
}
}
}
}
?>