* Copyright (C) 2008 Raphael Bertrand (Resultic) * * 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/ */ /** * \file htdocs/lib/functions2.lib.php * \brief A set of functions for Dolibarr * This file contains all rare functions. * \version $Id$ */ /** * \brief Show informations on an object * \param object Objet to show */ function dol_print_object_info($object) { global $langs; $langs->load("other"); if (isset($object->user_creation) && $object->user_creation->fullname) print $langs->trans("CreatedBy")." : " . $object->user_creation->fullname . '
'; if (isset($object->date_creation)) print $langs->trans("DateCreation")." : " . dolibarr_print_date($object->date_creation,"dayhourtext") . '
'; if (isset($object->user_modification) && $object->user_modification->fullname) print $langs->trans("ModifiedBy")." : " . $object->user_modification->fullname . '
'; if (isset($object->date_modification)) print $langs->trans("DateLastModification")." : " . dolibarr_print_date($object->date_modification,"dayhourtext") . '
'; if (isset($object->user_validation) && $object->user_validation->fullname) print $langs->trans("ValidatedBy")." : " . $object->user_validation->fullname . '
'; if (isset($object->date_validation)) print $langs->trans("DateValidation")." : " . dolibarr_print_date($object->date_validation,"dayhourtext") . '
'; if (isset($object->user_cloture) && $object->user_cloture->fullname ) print $langs->trans("ClosedBy")." : " . $object->user_cloture->fullname . '
'; if (isset($object->date_cloture)) print $langs->trans("DateClosing")." : " . dolibarr_print_date($object->date_cloture,"dayhourtext") . '
'; if (isset($object->user_rappro) && $object->user_rappro->fullname ) print $langs->trans("ConciliatedBy")." : " . $object->user_rappro->fullname . '
'; if (isset($object->date_rappro)) print $langs->trans("DateConciliating")." : " . dolibarr_print_date($object->date_rappro,"dayhourtext") . '
'; } /** * \brief Return true if email syntax is ok * \param address email (Ex: "toto@titi.com", "John Do ") * \return boolean true if email ok, false if ko */ function ValidEmail($address) { if (eregi(".*<(.+)>", $address, $regs)) { $address = $regs[1]; } if (eregi("^[^@ ]+@([a-zA-Z0-9\-]+\.)+([a-zA-Z0-9\-]{2}|asso|aero|biz|com|coop|edu|gov|info|int|mil|name|net|org|pro)\$",$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 ") * \return boolean true si email valide, false sinon */ function CheckMailDomain($mail) { list($user, $domain) = split("@", $mail, 2); if (checkdnsrr($domain, "MX")) { return true; } else { return false; } } /** * \brief Return lines of an html table from an array * \remarks Used by array2table function only */ function array2tr($data,$troptions='',$tdoptions=''){ $text = '' ; foreach($data as $key => $item){ $text.= ''.$item.'' ; } $text.= '' ; return $text ; } /** * \brief Return an html table from an array */ function array2table($data,$tableMarkup=1,$tableoptions='',$troptions='',$tdoptions=''){ $text='' ; if($tableMarkup) $text = '' ; foreach($data as $key => $item){ if(is_array($item)){ $text.=array2tr($item,$troptions,$tdoptions) ; } else { $text.= '' ; $text.= '' ; $text.= '' ; $text.= '' ; } } if($tableMarkup) $text.= '
'.$key.''.$item.'
' ; return $text ; } /** * Return next value for a mask * * @param unknown_type $db Database handler * @param $mask Mask to use * @param unknown_type $table Table containing field with counter * @param unknown_type $field Field containing already used values of counter * @param unknown_type $where To add a filter on selection (for exemple to filter on invoice types) * @param unknown_type $valueforccc * @param unknown_type $date * @return string New value */ function get_next_value($db,$mask,$table,$field,$where='',$valueforccc='',$date='') { // Clean parameters if ($date == '') $date=mktime(); // We use local year and month of PHP server to search numbers // but we should use local year and month of user // Extract value for mask counter, mask raz and mask offset if (! eregi('\{(0+)([@\+][0-9]+)?([@\+][0-9]+)?\}',$mask,$reg)) return 'ErrorBadMask'; $masktri=$reg[1].$reg[2].$reg[3]; $maskcounter=$reg[1]; $maskraz=-1; $maskoffset=0; if (strlen($maskcounter) < 3) return 'CounterMustHaveMoreThan3Digits'; // Extract value for third party mask counter if (eregi('\{(c+)(0*)\}',$mask,$regClientRef)) { $maskrefclient=$regClientRef[1].$regClientRef[2]; $maskrefclient_maskclientcode=$regClientRef[1]; $maskrefclient_maskcounter=$regClientRef[2]; $maskrefclient_maskoffset=0; //default value of maskrefclient_counter offset $maskrefclient_clientcode=substr($valueforccc,0,strlen($maskrefclient_maskclientcode));//get n first characters of client code to form maskrefclient_clientcode $maskrefclient_clientcode=str_pad($maskrefclient_clientcode,strlen($maskrefclient_maskclientcode),"#",STR_PAD_RIGHT);//padding maskrefclient_clientcode for having exactly n characters in maskrefclient_clientcode $maskrefclient_clientcode=dol_string_nospecial($maskrefclient_clientcode);//sanitize maskrefclient_clientcode for sql insert and sql select like if (strlen($maskrefclient_maskcounter) > 0 && strlen($maskrefclient_maskcounter) < 3) return 'CounterMustHaveMoreThan3Digits'; } else $maskrefclient=''; $maskwithonlyymcode=$mask; $maskwithonlyymcode=eregi_replace('\{(0+)([@\+][0-9]+)?([@\+][0-9]+)?\}',$maskcounter,$maskwithonlyymcode); $maskwithonlyymcode=eregi_replace('\{dd\}','dd',$maskwithonlyymcode); $maskwithonlyymcode=eregi_replace('\{(c+)(0*)\}',$maskrefclient,$maskwithonlyymcode); $maskwithnocode=$maskwithonlyymcode; $maskwithnocode=eregi_replace('\{yyyy\}','yyyy',$maskwithnocode); $maskwithnocode=eregi_replace('\{yy\}','yy',$maskwithnocode); $maskwithnocode=eregi_replace('\{y\}','y',$maskwithnocode); $maskwithnocode=eregi_replace('\{mm\}','mm',$maskwithnocode); // Now maskwithnocode = 0000ddmmyyyyccc for example // and maskcounter = 0000 for example //print "maskwithonlyymcode=".$maskwithonlyymcode." maskwithnocode=".$maskwithnocode."\n
"; // If an offset is asked if (! empty($reg[2]) && eregi('^\+',$reg[2])) $maskoffset=eregi_replace('^\+','',$reg[2]); if (! empty($reg[3]) && eregi('^\+',$reg[3])) $maskoffset=eregi_replace('^\+','',$reg[3]); // Define $sqlwhere // If a restore to zero after a month is asked we check if there is already a value for this year. if (! empty($reg[2]) && eregi('^@',$reg[2])) $maskraz=eregi_replace('^@','',$reg[2]); if (! empty($reg[3]) && eregi('^@',$reg[3])) $maskraz=eregi_replace('^@','',$reg[3]); if ($maskraz >= 0) { if ($maskraz > 12) return 'ErrorBadMaskBadRazMonth'; // Define reg if ($maskraz > 1 && ! eregi('^(.*)\{(y+)\}\{(m+)\}',$maskwithonlyymcode,$reg)) return 'ErrorCantUseRazInStartedYearIfNoYearMonthInMask'; if ($maskraz <= 1 && ! eregi('^(.*)\{(y+)\}',$maskwithonlyymcode,$reg)) return 'ErrorCantUseRazIfNoYearInMask'; //print "x".$maskwithonlyymcode." ".$maskraz; // Define $yearcomp and $monthcomp (that will be use in the select where to search max number) $monthcomp=$maskraz; $yearoffset=0; $yearcomp=0; if (date("m",$date) < $maskraz) { $yearoffset=-1; } // If current month lower that month of return to zero, year is previous year if (strlen($reg[2]) == 4) $yearcomp=sprintf("%04d",date("Y",$date)+$yearoffset); if (strlen($reg[2]) == 2) $yearcomp=sprintf("%02d",date("y",$date)+$yearoffset); if (strlen($reg[2]) == 1) $yearcomp=substr(date("y",$date),2,1)+$yearoffset; $sqlwhere=''; $sqlwhere.='( (SUBSTRING('.$field.', '.(strlen($reg[1])+1).', '.strlen($reg[2]).') >= '.$yearcomp; if ($monthcomp > 1) // Test useless if monthcomp = 1 (or 0 is same as 1) { $sqlwhere.=' AND SUBSTRING('.$field.', '.(strlen($reg[1])+strlen($reg[2])+1).', '.strlen($reg[3]).') >= '.$monthcomp.')'; $sqlwhere.=' OR SUBSTRING('.$field.', '.(strlen($reg[1])+1).', '.strlen($reg[2]).') >= '.sprintf("%02d",($yearcomp+1)).' )'; } else { $sqlwhere.=') )'; } } //print "masktri=".$masktri." maskcounter=".$maskcounter." maskraz=".$maskraz." maskoffset=".$maskoffset."
\n"; // Define $sqlstring $posnumstart=strpos($maskwithnocode,$maskcounter); // Pos of counter in final string (from 0 to ...) if ($posnumstart < 0) return 'ErrorBadMaskFailedToLocatePosOfSequence'; $sqlstring='SUBSTRING('.$field.', '.($posnumstart+1).', '.strlen($maskcounter).')'; //print "x".$sqlstring; // Define $maskLike $maskLike = dol_string_nospecial($mask); $maskLike = str_replace("%","_",$maskLike); // Replace protected special codes with matching number of _ as wild card caracter $maskLike = str_replace(dol_string_nospecial('{yyyy}'),'____',$maskLike); $maskLike = str_replace(dol_string_nospecial('{yy}'),'__',$maskLike); $maskLike = str_replace(dol_string_nospecial('{y}'),'_',$maskLike); $maskLike = str_replace(dol_string_nospecial('{mm}'),'__',$maskLike); $maskLike = str_replace(dol_string_nospecial('{dd}'),'__',$maskLike); $maskLike = str_replace(dol_string_nospecial('{'.$masktri.'}'),str_pad("",strlen($maskcounter),"_"),$maskLike); if ($maskrefclient) $maskLike = str_replace(dol_string_nospecial('{'.$maskrefclient.'}'),str_pad("",strlen($maskrefclient),"_"),$maskLike); // Get counter in database $counter=0; $sql = "SELECT MAX(".$sqlstring.") as val"; $sql.= " FROM ".MAIN_DB_PREFIX.$table; // $sql.= " WHERE ".$field." not like '(%'"; $sql.= " WHERE ".$field." like '".$maskLike."'"; if ($where) $sql.=$where; if ($sqlwhere) $sql.=' AND '.$sqlwhere; //print $sql; dolibarr_syslog("functions2::get_next_value sql=".$sql, LOG_DEBUG); $resql=$db->query($sql); if ($resql) { $obj = $db->fetch_object($resql); $counter = $obj->val; } else dolibarr_print_error($db); if (empty($counter) || eregi('[^0-9]',$counter)) $counter=$maskoffset; $counter++; if ($maskrefclient_maskcounter) { //print "maskrefclient_maskcounter=".$maskrefclient_maskcounter." maskwithnocode=".$maskwithnocode." maskrefclient=".$maskrefclient."\n
"; // Define $sqlstring $maskrefclient_posnumstart=strpos($maskwithnocode,$maskrefclient_maskcounter,strpos($maskwithnocode,$maskrefclient)); // Pos of counter in final string (from 0 to ...) if ($maskrefclient_posnumstart <= 0) return 'ErrorBadMask'; $maskrefclient_sqlstring='SUBSTRING('.$field.', '.($maskrefclient_posnumstart+1).', '.strlen($maskrefclient_maskcounter).')'; //print "x".$sqlstring; // Define $maskrefclient_maskLike $maskrefclient_maskLike = dol_string_nospecial($mask); $maskrefclient_maskLike = str_replace("%","_",$maskrefclient_maskLike); // Replace protected special codes with matching number of _ as wild card caracter $maskrefclient_maskLike = str_replace(dol_string_nospecial('{yyyy}'),'____',$maskrefclient_maskLike); $maskrefclient_maskLike = str_replace(dol_string_nospecial('{yy}'),'__',$maskrefclient_maskLike); $maskrefclient_maskLike = str_replace(dol_string_nospecial('{y}'),'_',$maskrefclient_maskLike); $maskrefclient_maskLike = str_replace(dol_string_nospecial('{mm}'),'__',$maskrefclient_maskLike); $maskrefclient_maskLike = str_replace(dol_string_nospecial('{dd}'),'__',$maskrefclient_maskLike); $maskrefclient_maskLike = str_replace(dol_string_nospecial('{'.$masktri.'}'),str_pad("",strlen($maskcounter),"_"),$maskrefclient_maskLike); $maskrefclient_maskLike = str_replace(dol_string_nospecial('{'.$maskrefclient.'}'),$maskrefclient_clientcode.str_pad("",strlen($maskrefclient_maskcounter),"_"),$maskrefclient_maskLike); // Get counter in database $maskrefclient_counter=0; $maskrefclient_sql = "SELECT MAX(".$maskrefclient_sqlstring.") as val"; $maskrefclient_sql.= " FROM ".MAIN_DB_PREFIX.$table; //$sql.= " WHERE ".$field." not like '(%'"; $maskrefclient_sql.= " WHERE ".$field." like '".$maskrefclient_maskLike."'"; if ($where) $maskrefclient_sql.=$where; //use the same optional where as general mask if ($sqlwhere) $maskrefclient_sql.=' AND '.$sqlwhere; //use the same sqlwhere as general mask $maskrefclient_sql.=' AND (SUBSTRING('.$field.', '.(strpos($maskwithnocode,$maskrefclient)+1).', '.strlen($maskrefclient_maskclientcode).")='".$maskrefclient_clientcode."')"; dolibarr_syslog("functions2::get_next_value maskrefclient_sql=".$maskrefclient_sql, LOG_DEBUG); $maskrefclient_resql=$db->query($maskrefclient_sql); if ($maskrefclient_resql) { $maskrefclient_obj = $db->fetch_object($maskrefclient_resql); $maskrefclient_counter = $maskrefclient_obj->val; } else dolibarr_print_error($db); if (empty($maskrefclient_counter) || eregi('[^0-9]',$maskrefclient_counter)) $maskrefclient_counter=$maskrefclient_maskoffset; $maskrefclient_counter++; } // Build numFinal $numFinal = $mask; // We replace special codes except refclient $numFinal = str_replace('{yyyy}',date("Y",$date),$numFinal); $numFinal = str_replace('{yy}',date("y",$date),$numFinal); $numFinal = str_replace('{y}' ,substr(date("y",$date),2,1),$numFinal); $numFinal = str_replace('{mm}',date("m",$date),$numFinal); $numFinal = str_replace('{dd}',date("d",$date),$numFinal); if ($maskclientcode) $numFinal = str_replace(('{'.$maskclientcode.'}'),$clientcode,$numFinal); // Now we replace the counter $maskbefore='{'.$masktri.'}'; $maskafter=str_pad($counter,strlen($maskcounter),"0",STR_PAD_LEFT); //print 'x'.$maskbefore.'-'.$maskafter.'y'; $numFinal = str_replace($maskbefore,$maskafter,$numFinal); // Now we replace the refclient if ($maskrefclient) { //print "maskrefclient=".$maskrefclient." maskwithonlyymcode=".$maskwithonlyymcode." maskwithnocode=".$maskwithnocode."\n
"; $maskrefclient_maskbefore='{'.$maskrefclient.'}'; $maskrefclient_maskafter=$maskrefclient_clientcode.str_pad($maskrefclient_counter,strlen($maskrefclient_maskcounter),"0",STR_PAD_LEFT); $numFinal = str_replace($maskrefclient_maskbefore,$maskrefclient_maskafter,$numFinal); } dolibarr_syslog("functions2::get_next_value return ".$numFinal,LOG_DEBUG); return $numFinal; } /** * Check value * * @param unknown_type $db Database handler * @param $mask Mask to use * @param unknown_type $table Table containing field with counter * @param unknown_type $field Field containing already used values of counter * @param unknown_type $where To add a filter on selection (for exemple to filter on invoice types) * @param unknown_type $valueforccc * @param unknown_type $date * @return int <0 if KO, 0 if OK */ function check_value($mask,$value) { $result=0; // Extract value for mask counter, mask raz and mask offset if (! eregi('\{(0+)([@\+][0-9]+)?([@\+][0-9]+)?\}',$mask,$reg)) return 'ErrorBadMask'; $masktri=$reg[1].$reg[2].$reg[3]; $maskcounter=$reg[1]; $maskraz=-1; $maskoffset=0; if (strlen($maskcounter) < 3) return 'CounterMustHaveMoreThan3Digits'; // Extract value for third party mask counter if (eregi('\{(c+)(0*)\}',$mask,$regClientRef)) { $maskrefclient=$regClientRef[1].$regClientRef[2]; $maskrefclient_maskclientcode=$regClientRef[1]; $maskrefclient_maskcounter=$regClientRef[2]; $maskrefclient_maskoffset=0; //default value of maskrefclient_counter offset $maskrefclient_clientcode=substr($valueforccc,0,strlen($maskrefclient_maskclientcode));//get n first characters of client code to form maskrefclient_clientcode $maskrefclient_clientcode=str_pad($maskrefclient_clientcode,strlen($maskrefclient_maskclientcode),"#",STR_PAD_RIGHT);//padding maskrefclient_clientcode for having exactly n characters in maskrefclient_clientcode $maskrefclient_clientcode=dol_string_nospecial($maskrefclient_clientcode);//sanitize maskrefclient_clientcode for sql insert and sql select like if (strlen($maskrefclient_maskcounter) > 0 && strlen($maskrefclient_maskcounter) < 3) return 'CounterMustHaveMoreThan3Digits'; } else $maskrefclient=''; $maskwithonlyymcode=$mask; $maskwithonlyymcode=eregi_replace('\{(0+)([@\+][0-9]+)?([@\+][0-9]+)?\}',$maskcounter,$maskwithonlyymcode); $maskwithonlyymcode=eregi_replace('\{dd\}','dd',$maskwithonlyymcode); $maskwithonlyymcode=eregi_replace('\{(c+)(0*)\}',$maskrefclient,$maskwithonlyymcode); $maskwithnocode=$maskwithonlyymcode; $maskwithnocode=eregi_replace('\{yyyy\}','yyyy',$maskwithnocode); $maskwithnocode=eregi_replace('\{yy\}','yy',$maskwithnocode); $maskwithnocode=eregi_replace('\{y\}','y',$maskwithnocode); $maskwithnocode=eregi_replace('\{mm\}','mm',$maskwithnocode); // Now maskwithnocode = 0000ddmmyyyyccc for example // and maskcounter = 0000 for example //print "maskwithonlyymcode=".$maskwithonlyymcode." maskwithnocode=".$maskwithnocode."\n
"; // If an offset is asked if (! empty($reg[2]) && eregi('^\+',$reg[2])) $maskoffset=eregi_replace('^\+','',$reg[2]); if (! empty($reg[3]) && eregi('^\+',$reg[3])) $maskoffset=eregi_replace('^\+','',$reg[3]); // Define $sqlwhere // If a restore to zero after a month is asked we check if there is already a value for this year. if (! empty($reg[2]) && eregi('^@',$reg[2])) $maskraz=eregi_replace('^@','',$reg[2]); if (! empty($reg[3]) && eregi('^@',$reg[3])) $maskraz=eregi_replace('^@','',$reg[3]); if ($maskraz >= 0) { if ($maskraz > 12) return 'ErrorBadMaskBadRazMonth'; // Define reg if ($maskraz > 1 && ! eregi('^(.*)\{(y+)\}\{(m+)\}',$maskwithonlyymcode,$reg)) return 'ErrorCantUseRazInStartedYearIfNoYearMonthInMask'; if ($maskraz <= 1 && ! eregi('^(.*)\{(y+)\}',$maskwithonlyymcode,$reg)) return 'ErrorCantUseRazIfNoYearInMask'; //print "x".$maskwithonlyymcode." ".$maskraz; } //print "masktri=".$masktri." maskcounter=".$maskcounter." maskraz=".$maskraz." maskoffset=".$maskoffset."
\n"; // Check we have a number in ($posnumstart+1).', '.strlen($maskcounter) // // Check length $len=strlen($maskwithnocode); if (strlen($value) != $len) $result=-1; // Define $maskLike $maskLike = dol_string_nospecial($mask); $maskLike = str_replace("%","_",$maskLike); // Replace protected special codes with matching number of _ as wild card caracter $maskLike = str_replace(dol_string_nospecial('{yyyy}'),'____',$maskLike); $maskLike = str_replace(dol_string_nospecial('{yy}'),'__',$maskLike); $maskLike = str_replace(dol_string_nospecial('{y}'),'_',$maskLike); $maskLike = str_replace(dol_string_nospecial('{mm}'),'__',$maskLike); $maskLike = str_replace(dol_string_nospecial('{dd}'),'__',$maskLike); $maskLike = str_replace(dol_string_nospecial('{'.$masktri.'}'),str_pad("",strlen($maskcounter),"_"),$maskLike); if ($maskrefclient) $maskLike = str_replace(dol_string_nospecial('{'.$maskrefclient.'}'),str_pad("",strlen($maskrefclient),"_"),$maskLike); dolibarr_syslog("functions2::check_value result=".$result,LOG_DEBUG); return $result; } /** * \brief Convert a binary data to string that represent hexadecimal value * \param bin Value to convert * \param pad Add 0 * \param upper Convert to tupper * \return string x */ function binhex($bin, $pad=false, $upper=false) { $last = strlen($bin)-1; for($i=0; $i<=$last; $i++){ $x += $bin[$last-$i] * pow(2,$i); } $x = dechex($x); if($pad){ while(strlen($x) < intval(strlen($bin))/4){ $x = "0$x"; } } if($upper){ $x = strtoupper($x); } return $x; } /** * \brief Convertir de l'hexadecimal en binaire * \param string hexa * \return string bin */ function hexbin($hexa) { $bin=''; for($i=0;$i4) // du Vendredi au Samedi $jeudiSemaine = mktime(12,0,0,$mois,$jour,$annee)-(date("w",mktime(12,0,0,$mois,$jour,$annee))-4)*24*60*60; else // Jeudi $jeudiSemaine = mktime(12,0,0,$mois,$jour,$annee); // D�finition du premier Jeudi de l'ann�e if (date("w",mktime(12,0,0,1,1,date("Y",$jeudiSemaine)))==0) // Dimanche { $premierJeudiAnnee = mktime(12,0,0,1,1,date("Y",$jeudiSemaine))+4*24*60*60; } else if (date("w",mktime(12,0,0,1,1,date("Y",$jeudiSemaine)))<4) // du Lundi au Mercredi { $premierJeudiAnnee = mktime(12,0,0,1,1,date("Y",$jeudiSemaine))+(4-date("w",mktime(12,0,0,1,1,date("Y",$jeudiSemaine))))*24*60*60; } else if (date("w",mktime(12,0,0,1,1,date("Y",$jeudiSemaine)))>4) // du Vendredi au Samedi { $premierJeudiAnnee = mktime(12,0,0,1,1,date("Y",$jeudiSemaine))+(7-(date("w",mktime(12,0,0,1,1,date("Y",$jeudiSemaine)))-4))*24*60*60; } else // Jeudi { $premierJeudiAnnee = mktime(12,0,0,1,1,date("Y",$jeudiSemaine)); } // D�finition du num�ro de semaine: nb de jours entre "premier Jeudi de l'ann�e" et "Jeudi de la semaine"; $numeroSemaine = ( ( date("z",mktime(12,0,0,date("m",$jeudiSemaine),date("d",$jeudiSemaine),date("Y",$jeudiSemaine))) - date("z",mktime(12,0,0,date("m",$premierJeudiAnnee),date("d",$premierJeudiAnnee),date("Y",$premierJeudiAnnee))) ) / 7 ) + 1; // Cas particulier de la semaine 53 if ($numeroSemaine==53) { // Les ann�es qui commence un Jeudi et les ann�es bissextiles commen�ant un Mercredi en poss�de 53 if (date("w",mktime(12,0,0,1,1,date("Y",$jeudiSemaine)))==4 || (date("w",mktime(12,0,0,1,1,date("Y",$jeudiSemaine)))==3 && date("z",mktime(12,0,0,12,31,date("Y",$jeudiSemaine)))==365)) { $numeroSemaine = 53; } else { $numeroSemaine = 1; } } //echo $jour."-".$mois."-".$annee." (".date("d-m-Y",$premierJeudiAnnee)." - ".date("d-m-Y",$jeudiSemaine).") -> ".$numeroSemaine."
"; return sprintf("%02d",$numeroSemaine); } /** * \brief Convertit une masse d'une unite vers une autre unite * \param weight float Masse a convertir * \param from_unit int Unite originale en puissance de 10 * \param to_unit int Nouvelle unite en puissance de 10 * \return float Masse convertie */ function weight_convert($weight,&$from_unit,$to_unit) { /* Pour convertire 320 gr en Kg appeler * $f = -3 * weigh_convert(320, $f, 0) retournera 0.32 * */ while ($from_unit <> $to_unit) { if ($from_unit > $to_unit) { $weight = $weight * 10; $from_unit = $from_unit - 1; $weight = weight_convert($weight,$from_unit, $to_unit); } if ($from_unit < $to_unit) { $weight = $weight / 10; $from_unit = $from_unit + 1; $weight = weight_convert($weight,$from_unit, $to_unit); } } return $weight; } /** * \brief Save personnal parameter * \param db Handler database * \param user Object user * \param tab Tableau (cle=>valeur) des parametres a sauvegarder * \return int <0 if KO, >0 if OK */ function dol_set_user_param($db, &$user, $tab) { // Verification parametres if (sizeof($tab) < 1) return -1; $db->begin(); // We remove old parameters for all keys in $tab $sql = "DELETE FROM ".MAIN_DB_PREFIX."user_param"; $sql.= " WHERE fk_user = ".$user->id; $sql.= " AND param in ("; $i=0; foreach ($tab as $key => $value) { if ($i > 0) $sql.=','; $sql.="'".$key."'"; $i++; } $sql.= ")"; dolibarr_syslog("functions2.lib::dol_set_user_param sql=".$sql, LOG_DEBUG); $resql=$db->query($sql); if (! $resql) { dolibarr_print_error($db); $db->rollback(); return -1; } foreach ($tab as $key => $value) { // Set new parameters if ($value && (! $url || in_array($key,array('sortfield','sortorder','begin','page')))) { $sql = "INSERT INTO ".MAIN_DB_PREFIX."user_param(fk_user,param,value)"; $sql.= " VALUES (".$user->id.","; $sql.= " '".$key."','".addslashes($value)."');"; dolibarr_syslog("functions2.lib::dol_set_user_param sql=".$sql, LOG_DEBUG); $result=$db->query($sql); if (! $result) { dolibarr_print_error($db); $db->rollback(); return -1; } $user->page_param[$key] = $value; } } $db->commit(); return 1; } /** * \brief Returns formated reduction * \param reduction Reduction percentage * \return string Formated reduction */ function dol_print_reduction($reduction=0,$langs) { $string = ''; if ($reduction == 100) { $string = $langs->trans("Offered"); } else { $string = $reduction.'%'; } return $string; }