diff --git a/htdocs/fichinter/fiche.php b/htdocs/fichinter/fiche.php index 68bc803164e..8a89e1a854d 100644 --- a/htdocs/fichinter/fiche.php +++ b/htdocs/fichinter/fiche.php @@ -382,22 +382,15 @@ if ($_GET["action"] == 'create') $modFicheinter = new $obj; $numpr = $modFicheinter->getNextValue($societe,$ficheinter); + if ($_GET["socid"]) + { print "
"; print ''; - if ($_GET["socid"]) - { print ''; print ""; - } - else - { - print ""; - } - + print ""; @@ -407,7 +400,7 @@ if ($_GET["action"] == 'create') print ""; print "\n"; - if ($conf->projet->enabled && $_GET["socid"]) + if ($conf->projet->enabled) { // Projet associe $langs->load("project"); @@ -466,6 +459,22 @@ if ($_GET["action"] == 'create') print '
".$langs->trans("Company")."".$societe->getNomUrl(1)."
".$langs->trans("Company").""; - $html->select_societes('','socid','',1); - print "
".$langs->trans("Date").""; $html->select_date(time(),"p",'','','','fichinter'); print "
".$langs->trans("Ref")."
'; print '
'; + } + else + { + print "
"; + print ''; + print ""; + print ''; + print '
".$langs->trans("Company").""; + $html->select_societes('','socid','',1); + print "
'; + print ""; + print ''; + print '
'; + print '
'; + } + } elseif ($_GET["id"] > 0) { diff --git a/htdocs/fourn/commande/modules/mod_commande_fournisseur_orchidee.php b/htdocs/fourn/commande/modules/mod_commande_fournisseur_orchidee.php index 4dbb12782e7..cee14ce67e5 100644 --- a/htdocs/fourn/commande/modules/mod_commande_fournisseur_orchidee.php +++ b/htdocs/fourn/commande/modules/mod_commande_fournisseur_orchidee.php @@ -48,7 +48,8 @@ class mod_commande_fournisseur_orchidee extends ModeleNumRefSuppliersOrders global $conf,$langs; $langs->load("bills"); - + $langs->load("admin"); + $form = new Form($db); $texte = $langs->trans('GenericNumRefModelDesc')."
\n"; @@ -78,8 +79,11 @@ class mod_commande_fournisseur_orchidee extends ModeleNumRefSuppliersOrders { global $conf,$langs,$mysoc; - $numExample = $this->getNextValue($mysoc,$commandespecimen); - + $old_code_client=$mysoc->code_client; + $mysoc->code_client='CCCCCCCCCC'; + $numExample = $this->getNextValue($mysoc,''); + $mysoc->code_client=$old_code_client; + if (! $numExample) { $numExample = $langs->trans('NotConfigured'); @@ -96,6 +100,8 @@ class mod_commande_fournisseur_orchidee extends ModeleNumRefSuppliersOrders { global $db,$conf; + require_once(DOL_DOCUMENT_ROOT ."/lib/functions2.lib.php"); + // On défini critere recherche compteur $mask=$conf->global->COMMANDE_FOURNISSEUR_ORCHIDEE_MASK; @@ -105,97 +111,8 @@ class mod_commande_fournisseur_orchidee extends ModeleNumRefSuppliersOrders return 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'; - - $maskwithonlyymcode=$mask; - $maskwithonlyymcode=eregi_replace('\{(0+)([@\+][0-9]+)?([@\+][0-9]+)?\}',$maskcounter,$maskwithonlyymcode); - $maskwithonlyymcode=eregi_replace('\{dd\}','dd',$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); - //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]); - - // 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 'ErrorBadMask'; - 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 de filter request to search max number) - $monthcomp=$maskraz; - $yearoffset=0; - $yearcomp=0; - if (date("m") < $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")+$yearoffset); - if (strlen($reg[2]) == 2) $yearcomp=sprintf("%02d",date("y")+$yearoffset); - if (strlen($reg[2]) == 1) $yearcomp=substr(date("y"),2,1)+$yearoffset; - - $sqlwhere=''; - $sqlwhere.='SUBSTRING(ref, '.(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(ref, '.(strlen($reg[1])+strlen($reg[2])+1).', '.strlen($reg[3]).') >= '.$monthcomp; - } - } - //print "masktri=".$masktri." maskcounter=".$maskcounter." maskraz=".$maskraz." maskoffset=".$maskoffset."
\n"; + $numFinal=get_next_value($db,$mask,'commande_fournisseur','ref','',$objsoc->code_client); - $posnumstart=strpos($maskwithnocode,$maskcounter); // Pos of counter in final string (from 0 to ...) - if ($posnumstart < 0) return 'ErrorBadMask'; - $sqlstring='SUBSTRING(ref, '.($posnumstart+1).', '.strlen($maskcounter).')'; - //print "x".$sqlstring; - - // Get counter in database - $counter=0; - $sql = "SELECT MAX(".$sqlstring.") as val"; - $sql.= " FROM ".MAIN_DB_PREFIX."commande_fournisseur"; - $sql.= " WHERE ref not like '(%'"; - if ($sqlwhere) $sql.=' AND '.$sqlwhere; - - //print $sql; - dolibarr_syslog("mod_commande_fournisseur_orchidee::getNextValue 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++; - - // Build numFinal - $numFinal = $mask; - - // We replace special codes - $numFinal = str_replace('{yyyy}',date("Y"),$numFinal); - $numFinal = str_replace('{yy}',date("y"),$numFinal); - $numFinal = str_replace('{y}' ,substr(date("y"),2,1),$numFinal); - $numFinal = str_replace('{mm}',date("m"),$numFinal); - $numFinal = str_replace('{dd}',date("d"),$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); - - dolibarr_syslog("mod_commande_fournisseur_orchidee::getNextValue return ".$numFinal); return $numFinal; } diff --git a/htdocs/includes/modules/commande/mod_commande_opale.php b/htdocs/includes/modules/commande/mod_commande_opale.php index 0532783e482..75eba5b1686 100644 --- a/htdocs/includes/modules/commande/mod_commande_opale.php +++ b/htdocs/includes/modules/commande/mod_commande_opale.php @@ -15,95 +15,95 @@ * 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/includes/modules/commande/mod_commande_opale.php - \ingroup commande - \brief Fichier contenant la classe du modèle de numérotation de référence de commande Opale - \version $Revision$ -*/ +/** + \file htdocs/includes/modules/commande/mod_commande_opale.php + \ingroup commande + \brief Fichier contenant la classe du modèle de numérotation de référence de commande Opale + \version $Id$ + */ include_once("modules_commande.php"); /** - \class mod_commande_opale - \brief Classe du modèle de numérotation de référence de commande Opale -*/ + \class mod_commande_opale + \brief Classe du modèle de numérotation de référence de commande Opale + */ class mod_commande_opale extends ModeleNumRefCommandes { + var $version='dolibarr'; // 'development', 'experimental', 'dolibarr' + var $error = ''; + var $nom = 'Opale'; - /** \brief Constructeur - */ - function mod_commande_opale() - { - $this->nom = "Opale"; - } + + /** \brief Constructeur + */ + function mod_commande_opale() + { + $this->nom = "Opale"; + } - /** \brief Renvoi la description du modele de numérotation - * \return string Texte descripif - */ - function info() - { - return "Renvoie le numéro sous la forme numérique COMhexa, où hexa représente un incrément global codé en héxadécimal. (COM-000-001 à COM-FFF-FFF)"; - } - - /** \brief Renvoi un exemple de numérotation - * \return string Example - */ - function getExample() - { - return "COM-000-001"; - } + /** \brief Renvoi la description du modele de numérotation + * \return string Texte descripif + */ + function info() + { + return "Renvoie le numéro sous la forme numérique COMhexa, où hexa représente un incrément global codé en héxadécimal. (COM-000-001 à COM-FFF-FFF)"; + } - - /** \brief Renvoi prochaine valeur attribuée - * \return string Valeur - */ - function getNextValue() - { - global $db; + /** \brief Renvoi un exemple de numérotation + * \return string Example + */ + function getExample() + { + return "COM-000-001"; + } - // D'abord on récupère la valeur max (réponse immédiate car champ indéxé) - $com=''; - $sql = "SELECT MAX(ref)"; - $sql.= " FROM ".MAIN_DB_PREFIX."commande"; - $sql.= " WHERE ref like 'COM%'"; - $resql=$db->query($sql); - if ($resql) - { - $row = $db->fetch_row($resql); - if ($row) - { - //on extrait la valeur max et on la passe en décimale - $max = hexdec((substr($row[0],4,3)).(substr($row[0],8,3))); - } - } - else - { - $max=0; - } - $yy = strftime("%y",time()); - $hex = strtoupper(dechex($max+1)); - $ref = substr("000000".($hex),-6); - - return 'COM-'.substr($ref,0,3)."-".substr($ref,3,3); - } - - /** \brief Renvoie la référence de commande suivante non utilisée - * \param objsoc Objet société - * \return string Texte descripif - */ - function commande_get_num($objsoc=0) - { - return $this->getNextValue(); - } + + /** \brief Renvoi prochaine valeur attribuée + * \return string Valeur + */ + function getNextValue() + { + global $db; + + // D'abord on récupère la valeur max (réponse immédiate car champ indéxé) + $com=''; + $sql = "SELECT MAX(ref)"; + $sql.= " FROM ".MAIN_DB_PREFIX."commande"; + $sql.= " WHERE ref like 'COM%'"; + $resql=$db->query($sql); + if ($resql) + { + $row = $db->fetch_row($resql); + if ($row) + { + //on extrait la valeur max et on la passe en décimale + $max = hexdec((substr($row[0],4,3)).(substr($row[0],8,3))); + } + } + else + { + $max=0; + } + $yy = strftime("%y",time()); + $hex = strtoupper(dechex($max+1)); + $ref = substr("000000".($hex),-6); + + return 'COM-'.substr($ref,0,3)."-".substr($ref,3,3); + } + + /** \brief Renvoie la référence de commande suivante non utilisée + * \param objsoc Objet société + * \return string Texte descripif + */ + function commande_get_num($objsoc=0) + { + return $this->getNextValue(); + } } ?> diff --git a/htdocs/includes/modules/commande/mod_commande_saphir.php b/htdocs/includes/modules/commande/mod_commande_saphir.php index 57c30ea6083..fa87ac14a1d 100644 --- a/htdocs/includes/modules/commande/mod_commande_saphir.php +++ b/htdocs/includes/modules/commande/mod_commande_saphir.php @@ -2,6 +2,7 @@ /* Copyright (C) 2003-2007 Rodolphe Quiedeville * Copyright (C) 2004-2007 Laurent Destailleur * Copyright (C) 2005-2007 Regis Houssin + * 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 @@ -48,7 +49,7 @@ class mod_commande_saphir extends ModeleNumRefCommandes global $conf,$langs; $langs->load("bills"); - + $form = new Form($db); $texte = $langs->trans('GenericNumRefModelDesc')."
\n"; @@ -78,8 +79,11 @@ class mod_commande_saphir extends ModeleNumRefCommandes { global $conf,$langs,$mysoc; - $numExample = $this->getNextValue($mysoc,$propalspecimen); - + $old_code_client=$mysoc->code_client; + $mysoc->code_client='CCCCCCCCCC'; + $numExample = $this->getNextValue($mysoc,''); + $mysoc->code_client=$old_code_client; + if (! $numExample) { $numExample = $langs->trans('NotConfigured'); @@ -96,6 +100,8 @@ class mod_commande_saphir extends ModeleNumRefCommandes { global $db,$conf; + require_once(DOL_DOCUMENT_ROOT ."/lib/functions2.lib.php"); + // On défini critere recherche compteur $mask=$conf->global->COMMANDE_SAPHIR_MASK; @@ -105,97 +111,8 @@ class mod_commande_saphir extends ModeleNumRefCommandes return 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'; - - $maskwithonlyymcode=$mask; - $maskwithonlyymcode=eregi_replace('\{(0+)([@\+][0-9]+)?([@\+][0-9]+)?\}',$maskcounter,$maskwithonlyymcode); - $maskwithonlyymcode=eregi_replace('\{dd\}','dd',$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); - //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]); - - // 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 'ErrorBadMask'; - 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 de filter request to search max number) - $monthcomp=$maskraz; - $yearoffset=0; - $yearcomp=0; - if (date("m") < $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")+$yearoffset); - if (strlen($reg[2]) == 2) $yearcomp=sprintf("%02d",date("y")+$yearoffset); - if (strlen($reg[2]) == 1) $yearcomp=substr(date("y"),2,1)+$yearoffset; - - $sqlwhere=''; - $sqlwhere.='SUBSTRING(ref, '.(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(ref, '.(strlen($reg[1])+strlen($reg[2])+1).', '.strlen($reg[3]).') >= '.$monthcomp; - } - } - //print "masktri=".$masktri." maskcounter=".$maskcounter." maskraz=".$maskraz." maskoffset=".$maskoffset."
\n"; + $numFinal=get_next_value($db,$mask,'commande','ref','',$objsoc->code_client); - $posnumstart=strpos($maskwithnocode,$maskcounter); // Pos of counter in final string (from 0 to ...) - if ($posnumstart < 0) return 'ErrorBadMask'; - $sqlstring='SUBSTRING(ref, '.($posnumstart+1).', '.strlen($maskcounter).')'; - //print "x".$sqlstring; - - // Get counter in database - $counter=0; - $sql = "SELECT MAX(".$sqlstring.") as val"; - $sql.= " FROM ".MAIN_DB_PREFIX."commande"; - $sql.= " WHERE ref not like '(%'"; - if ($sqlwhere) $sql.=' AND '.$sqlwhere; - - //print $sql; - dolibarr_syslog("mod_commande_saphir::getNextValue 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++; - - // Build numFinal - $numFinal = $mask; - - // We replace special codes - $numFinal = str_replace('{yyyy}',date("Y"),$numFinal); - $numFinal = str_replace('{yy}',date("y"),$numFinal); - $numFinal = str_replace('{y}' ,substr(date("y"),2,1),$numFinal); - $numFinal = str_replace('{mm}',date("m"),$numFinal); - $numFinal = str_replace('{dd}',date("d"),$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); - - dolibarr_syslog("mod_commande_saphir::getNextValue return ".$numFinal); return $numFinal; } diff --git a/htdocs/includes/modules/facture/mercure/mercure.modules.php b/htdocs/includes/modules/facture/mercure/mercure.modules.php index b0072a347bc..0b3ef1943ef 100644 --- a/htdocs/includes/modules/facture/mercure/mercure.modules.php +++ b/htdocs/includes/modules/facture/mercure/mercure.modules.php @@ -2,6 +2,7 @@ /* Copyright (C) 2003-2007 Rodolphe Quiedeville * Copyright (C) 2004-2007 Laurent Destailleur * Copyright (C) 2005-2007 Regis Houssin + * 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 @@ -83,7 +84,10 @@ class mod_facture_mercure extends ModeleNumRefFactures { global $conf,$langs,$mysoc; - $numExample = $this->getNextValue($mysoc,$facturespecimen); + $old_code_client=$mysoc->code_client; + $mysoc->code_client='CCCCCCCCCC'; + $numExample = $this->getNextValue($mysoc,''); + $mysoc->code_client=$old_code_client; if (! $numExample) { @@ -101,8 +105,10 @@ class mod_facture_mercure extends ModeleNumRefFactures { global $db,$conf; - // On défini critere recherche compteur - if ($facture->type == 2) $mask=$conf->global->FACTURE_MERCURE_MASK_CREDIT; + require_once(DOL_DOCUMENT_ROOT ."/lib/functions2.lib.php"); + + // On defini critere recherche compteur + if (is_object($facture) && $facture->type == 2) $mask=$conf->global->FACTURE_MERCURE_MASK_CREDIT; else $mask=$conf->global->FACTURE_MERCURE_MASK_INVOICE; if (! $mask) @@ -111,99 +117,12 @@ class mod_facture_mercure extends ModeleNumRefFactures return 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'; - - $maskwithonlyymcode=$mask; - $maskwithonlyymcode=eregi_replace('\{(0+)([@\+][0-9]+)?([@\+][0-9]+)?\}',$maskcounter,$maskwithonlyymcode); - $maskwithonlyymcode=eregi_replace('\{dd\}','dd',$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); - //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]); - - // 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 'ErrorBadMask'; - 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 de filter request to search max number) - $monthcomp=$maskraz; - $yearoffset=0; - $yearcomp=0; - if (date("m") < $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")+$yearoffset); - if (strlen($reg[2]) == 2) $yearcomp=sprintf("%02d",date("y")+$yearoffset); - if (strlen($reg[2]) == 1) $yearcomp=substr(date("y"),2,1)+$yearoffset; - - $sqlwhere=''; - $sqlwhere.='SUBSTRING(facnumber, '.(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(facnumber, '.(strlen($reg[1])+strlen($reg[2])+1).', '.strlen($reg[3]).') >= '.$monthcomp; - } - } - //print "masktri=".$masktri." maskcounter=".$maskcounter." maskraz=".$maskraz." maskoffset=".$maskoffset."
\n"; + $where=''; + if ($facture->type == 2) $where.= " AND type = 2"; + else $where.=" AND type != 2"; - $posnumstart=strpos($maskwithnocode,$maskcounter); // Pos of counter in final string (from 0 to ...) - if ($posnumstart < 0) return 'ErrorBadMask'; - $sqlstring='SUBSTRING(facnumber, '.($posnumstart+1).', '.strlen($maskcounter).')'; - //print "x".$sqlstring; + $numFinal=get_next_value($db,$mask,'facture','facnumber',$where,$objsoc->code_client); - // Get counter in database - $counter=0; - $sql = "SELECT MAX(".$sqlstring.") as val"; - $sql.= " FROM ".MAIN_DB_PREFIX."facture"; - $sql.= " WHERE facnumber not like '(%'"; - if ($facture->type == 2) $sql.= " AND type = 2"; - else $sql.=" AND type != 2"; - if ($sqlwhere) $sql.=' AND '.$sqlwhere; - - //print $sql; - dolibarr_syslog("mod_facture_mercure::getNextValue 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++; - - // Build numFinal - $numFinal = $mask; - - // We replace special codes - $numFinal = str_replace('{yyyy}',date("Y"),$numFinal); - $numFinal = str_replace('{yy}',date("y"),$numFinal); - $numFinal = str_replace('{y}' ,substr(date("y"),2,1),$numFinal); - $numFinal = str_replace('{mm}',date("m"),$numFinal); - $numFinal = str_replace('{dd}',date("d"),$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); - - dolibarr_syslog("mod_facture_mercure::getNextValue return ".$numFinal); return $numFinal; } diff --git a/htdocs/includes/modules/fichinter/mod_arctic.php b/htdocs/includes/modules/fichinter/mod_arctic.php index 7f9434a8ab6..c2c95efdf08 100644 --- a/htdocs/includes/modules/fichinter/mod_arctic.php +++ b/htdocs/includes/modules/fichinter/mod_arctic.php @@ -2,6 +2,7 @@ /* Copyright (C) 2003-2007 Rodolphe Quiedeville * Copyright (C) 2004-2008 Laurent Destailleur * Copyright (C) 2005-2007 Regis Houssin + * 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 @@ -53,7 +54,7 @@ class mod_arctic extends ModeleNumRefFicheinter global $conf,$langs; $langs->load("bills"); - + $form = new Form($db); $texte = $langs->trans('GenericNumRefModelDesc')."
\n"; @@ -83,8 +84,11 @@ class mod_arctic extends ModeleNumRefFicheinter { global $conf,$langs,$mysoc; - $numExample = $this->getNextValue($mysoc,$propalspecimen); - + $old_code_client=$mysoc->code_client; + $mysoc->code_client='CCCCCCCCCC'; + $numExample = $this->getNextValue($mysoc,''); + $mysoc->code_client=$old_code_client; + if (! $numExample) { $numExample = $langs->trans('NotConfigured'); @@ -94,12 +98,15 @@ class mod_arctic extends ModeleNumRefFicheinter /** \brief Renvoi prochaine valeur attribuée * \param objsoc Objet société + * \param ficheinter Object ficheinter * \return string Valeur */ function getNextValue($objsoc=0,$ficheinter='') { global $db,$conf; + require_once(DOL_DOCUMENT_ROOT ."/lib/functions2.lib.php"); + // On défini critere recherche compteur $mask=$conf->global->FICHINTER_ARTIC_MASK; @@ -109,97 +116,8 @@ class mod_arctic extends ModeleNumRefFicheinter return 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'; - - $maskwithonlyymcode=$mask; - $maskwithonlyymcode=eregi_replace('\{(0+)([@\+][0-9]+)?([@\+][0-9]+)?\}',$maskcounter,$maskwithonlyymcode); - $maskwithonlyymcode=eregi_replace('\{dd\}','dd',$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); - //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]); - - // 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 'ErrorBadMask'; - 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 de filter request to search max number) - $monthcomp=$maskraz; - $yearoffset=0; - $yearcomp=0; - if (date("m") < $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")+$yearoffset); - if (strlen($reg[2]) == 2) $yearcomp=sprintf("%02d",date("y")+$yearoffset); - if (strlen($reg[2]) == 1) $yearcomp=substr(date("y"),2,1)+$yearoffset; - - $sqlwhere=''; - $sqlwhere.='SUBSTRING(ref, '.(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(ref, '.(strlen($reg[1])+strlen($reg[2])+1).', '.strlen($reg[3]).') >= '.$monthcomp; - } - } - //print "masktri=".$masktri." maskcounter=".$maskcounter." maskraz=".$maskraz." maskoffset=".$maskoffset."
\n"; + $numFinal=get_next_value($db,$mask,'fichinter','ref','',$objsoc->code_client); - $posnumstart=strpos($maskwithnocode,$maskcounter); // Pos of counter in final string (from 0 to ...) - if ($posnumstart < 0) return 'ErrorBadMask'; - $sqlstring='SUBSTRING(ref, '.($posnumstart+1).', '.strlen($maskcounter).')'; - //print "x".$sqlstring; - - // Get counter in database - $counter=0; - $sql = "SELECT MAX(".$sqlstring.") as val"; - $sql.= " FROM ".MAIN_DB_PREFIX."propal"; - $sql.= " WHERE ref not like '(%'"; - if ($sqlwhere) $sql.=' AND '.$sqlwhere; - - //print $sql; - dolibarr_syslog("mod_arctic::getNextValue 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++; - - // Build numFinal - $numFinal = $mask; - - // We replace special codes - $numFinal = str_replace('{yyyy}',date("Y"),$numFinal); - $numFinal = str_replace('{yy}',date("y"),$numFinal); - $numFinal = str_replace('{y}' ,substr(date("y"),2,1),$numFinal); - $numFinal = str_replace('{mm}',date("m"),$numFinal); - $numFinal = str_replace('{dd}',date("d"),$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); - - dolibarr_syslog("mod_arctic::getNextValue return ".$numFinal); return $numFinal; } diff --git a/htdocs/includes/modules/propale/mod_propale_saphir.php b/htdocs/includes/modules/propale/mod_propale_saphir.php index dcc8eef36b1..46fcea46df4 100644 --- a/htdocs/includes/modules/propale/mod_propale_saphir.php +++ b/htdocs/includes/modules/propale/mod_propale_saphir.php @@ -2,6 +2,7 @@ /* Copyright (C) 2003-2007 Rodolphe Quiedeville * Copyright (C) 2004-2007 Laurent Destailleur * Copyright (C) 2005-2007 Regis Houssin + * 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 @@ -48,7 +49,7 @@ class mod_propale_saphir extends ModeleNumRefPropales global $conf,$langs; $langs->load("bills"); - + $form = new Form($db); $texte = $langs->trans('GenericNumRefModelDesc')."
\n"; @@ -78,8 +79,11 @@ class mod_propale_saphir extends ModeleNumRefPropales { global $conf,$langs,$mysoc; - $numExample = $this->getNextValue($mysoc); - + $old_code_client=$mysoc->code_client; + $mysoc->code_client='CCCCCCCCCC'; + $numExample = $this->getNextValue($mysoc,''); + $mysoc->code_client=$old_code_client; + if (! $numExample) { $numExample = $langs->trans('NotConfigured'); @@ -89,12 +93,15 @@ class mod_propale_saphir extends ModeleNumRefPropales /** \brief Return next value * \param objsoc Object third party + * \param propal Object commercial proposal * \return string Value if OK, 0 if KO */ - function getNextValue($objsoc) + function getNextValue($objsoc,$propal='') { global $db,$conf; + require_once(DOL_DOCUMENT_ROOT ."/lib/functions2.lib.php"); + // On défini critere recherche compteur $mask=$conf->global->PROPALE_SAPHIR_MASK; @@ -104,97 +111,8 @@ class mod_propale_saphir extends ModeleNumRefPropales return 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'; - - $maskwithonlyymcode=$mask; - $maskwithonlyymcode=eregi_replace('\{(0+)([@\+][0-9]+)?([@\+][0-9]+)?\}',$maskcounter,$maskwithonlyymcode); - $maskwithonlyymcode=eregi_replace('\{dd\}','dd',$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); - //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]); - - // 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 'ErrorBadMask'; - 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 de filter request to search max number) - $monthcomp=$maskraz; - $yearoffset=0; - $yearcomp=0; - if (date("m") < $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")+$yearoffset); - if (strlen($reg[2]) == 2) $yearcomp=sprintf("%02d",date("y")+$yearoffset); - if (strlen($reg[2]) == 1) $yearcomp=substr(date("y"),2,1)+$yearoffset; - - $sqlwhere=''; - $sqlwhere.='SUBSTRING(ref, '.(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(ref, '.(strlen($reg[1])+strlen($reg[2])+1).', '.strlen($reg[3]).') >= '.$monthcomp; - } - } - //print "masktri=".$masktri." maskcounter=".$maskcounter." maskraz=".$maskraz." maskoffset=".$maskoffset."
\n"; + $numFinal=get_next_value($db,$mask,'propal','ref','',$objsoc->code_client); - $posnumstart=strpos($maskwithnocode,$maskcounter); // Pos of counter in final string (from 0 to ...) - if ($posnumstart < 0) return 'ErrorBadMask'; - $sqlstring='SUBSTRING(ref, '.($posnumstart+1).', '.strlen($maskcounter).')'; - //print "x".$sqlstring; - - // Get counter in database - $counter=0; - $sql = "SELECT MAX(".$sqlstring.") as val"; - $sql.= " FROM ".MAIN_DB_PREFIX."propal"; - $sql.= " WHERE ref not like '(%'"; - if ($sqlwhere) $sql.=' AND '.$sqlwhere; - - //print $sql; - dolibarr_syslog("mod_propale_saphir::getNextValue 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++; - - // Build numFinal - $numFinal = $mask; - - // We replace special codes - $numFinal = str_replace('{yyyy}',date("Y"),$numFinal); - $numFinal = str_replace('{yy}',date("y"),$numFinal); - $numFinal = str_replace('{y}' ,substr(date("y"),2,1),$numFinal); - $numFinal = str_replace('{mm}',date("m"),$numFinal); - $numFinal = str_replace('{dd}',date("d"),$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); - - dolibarr_syslog("mod_propale_saphir::getNextValue return ".$numFinal); return $numFinal; } diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index ca3b652aabf..fb5a15b5917 100644 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -190,12 +190,13 @@ SetupIsReadyForUse=Install is finished and Dolibarr is ready to use with this ne CurrentVersion=Dolibarr current version CallUpdatePage=Go to the page that updates database structure and datas %s. LastStableVersion=Last stable version -GenericMaskCodes=You may enter any numbering mask. In this mask, the following tags could be used:
{000000} corresponds to a number which will be incremented on each %s. Enter as many zeros as the desired length of the counter. The counter will be completed by zeros from the left in order to have as many zeros as the mask.
{000000+000} same as previous but an offset corresponding to the number to the right of the + sign is applied starting on first %s.
{000000@x} same as previous but the counter is reset to zero when month x is reached (x between 1 and 12). If this option is used, tag {yy} is required and also {mm} if x is 2 or higher.
{dd} day (01 to 31).
{mm} month (01 to 12).
{yy}, {yyyy} or {y} year over 2, 4 or 1 numbers.
All other characters in the mask will remain intact.
Spaces are not allowed.

Example on the 99th %s of the third party TheCompany done 31/01/2007:
ABC{yy}{mm}-{000000} will give ABC0701-000099
{0000+100}-ZZZ/{dd}/XXX will give 0199-ZZZ/31/XXX
+GenericMaskCodes=You may enter any numbering mask. In this mask, the following tags could be used:
{000000} corresponds to a number which will be incremented on each %s. Enter as many zeros as the desired length of the counter. The counter will be completed by zeros from the left in order to have as many zeros as the mask.
{000000+000} same as previous but an offset corresponding to the number to the right of the + sign is applied starting on first %s.
{000000@x} same as previous but the counter is reset to zero when month x is reached (x between 1 and 12). If this option is used and x is 2 or higher, then sequence {yy}{mm} or {yyyy}{mm} is also required.
{dd} day (01 to 31).
{mm} month (01 to 12).
{yy}, {yyyy} or {y} year over 2, 4 or 1 numbers.
All other characters in the mask will remain intact.
Spaces are not allowed.

Example on the 99th %s of the third party TheCompany done 31/01/2007:
ABC{yy}{mm}-{000000} will give ABC0701-000099
{0000+100}-ZZZ/{dd}/XXX will give 0199-ZZZ/31/XXX
GenericNumRefModelDesc=Return a customizable number according to a defined mask. ServerAvailableOnIPOrPort=Server is available at address %s on port %s ServerNotAvailableOnIPOrPort=Server is not available at address %s on port %s DoTestServerAvailability=Test server connectivity DoTestSend=Test sending +ErrorCantUseRazInStartedYearIfNoYearMonthInMask=Error, can't user option @ if sequence {yy}{mm} or {yyyy}{mm} is not in mask. # Modules Module0Name=Users & groups diff --git a/htdocs/langs/fr_FR/admin.lang b/htdocs/langs/fr_FR/admin.lang index 3a4c11de2ea..06edc2977f5 100644 --- a/htdocs/langs/fr_FR/admin.lang +++ b/htdocs/langs/fr_FR/admin.lang @@ -189,12 +189,14 @@ SetupIsReadyForUse=L'installation est termin CurrentVersion=Version en cours de Dolibarr CallUpdatePage=Appeler la page de mise a jour de la structure et données de la base %s. LastStableVersion=Dernière version stable -GenericMaskCodes=Vous pouvez saisir tout masque de numérotation. Dans ce masque, les balises suivantes peuvent etre utilisées:
{000000} correspond a un numéro qui sera incrémenté à chaque %s. Mettre autant de zéro que la longueur désirée du compteur. Le compteur sera complété par des 0 à gauche afin d'avoir autant de zéro que dans le masque.
{000000+000} idem précédemment mais un offset correpondant au nombre à droite du + est appliqué dès la premiere %s.
{000000@x} idem précédemment mais le compteur est remis à zero le xeme mois de l'année (x entre 1 et 12). Si cette option est utilisée, la balise {yy} est aussi obligatoire ainsi que {mm} si x vaut 2 ou plus.
{dd} jour (01 à 31).
{mm} mois (01 à 12).
{yy}, {yyyy} ou {y} annee sur 2, 4 ou 1 chiffres.
Tout autre caractère dans le masque sera laissé inchangé.
Les espaces ne sont pas permis.

Exemple sur la 99eme %s du tiers LaCompanie faite le 31/03/2007:
ABC{yy}{mm}-{000000} donnera ABC0703-000099
{0000+100}-XXX/{dd}/YYY donnera 0199-XXX/31/YYY
+GenericMaskCodes=Vous pouvez saisir tout masque de numérotation. Dans ce masque, les balises suivantes peuvent etre utilisées:
{000000} correspond a un numéro qui sera incrémenté à chaque %s. Mettre autant de zéro que la longueur désirée du compteur. Le compteur sera complété par des 0 à gauche afin d'avoir autant de zéro que dans le masque.
{000000+000} idem précédemment mais un offset correpondant au nombre à droite du + est appliqué dès la premiere %s.
{000000@x} idem précédemment mais le compteur est remis à zero le xeme mois de l'année (x entre 1 et 12). Si cette option est utilisée et x vaut 2 ou plus, alors la sequence {yy}{mm} ou {yyyy}{mm} est obligatoire.
{dd} jour (01 à 31).
{mm} mois (01 à 12).
{yy}, {yyyy} ou {y} annee sur 2, 4 ou 1 chiffres.
Tout autre caractère dans le masque sera laissé inchangé.
Les espaces ne sont pas permis.

Exemple sur la 99eme %s du tiers LaCompanie faite le 31/03/2007:
ABC{yy}{mm}-{000000} donnera ABC0703-000099
{0000+100}-XXX/{dd}/YYY donnera 0199-XXX/31/YYY
GenericNumRefModelDesc=Renvoie un numéro personalisable selon un masque à définir. ServerAvailableOnIPOrPort=Serveur disponible a l'adresse %s sur le port %s ServerNotAvailableOnIPOrPort=Serveur non disponible à l'adresse %s sur le port %s DoTestServerAvailability=Tester disponibilité serveur DoTestSend=Tester envoi +ErrorCantUseRazInStartedYearIfNoYearMonthInMask=Erreur, ne peut utiliser l'option @ si la séquence {yy}{mm} ou {yyyy}{mm} n'est pas dans le masque. + # Modules Module0Name=Utilisateurs & groupes Module0Desc=Gestion des utilisateurs et groupes diff --git a/htdocs/lib/functions2.lib.php b/htdocs/lib/functions2.lib.php new file mode 100644 index 00000000000..f4adf048590 --- /dev/null +++ b/htdocs/lib/functions2.lib.php @@ -0,0 +1,218 @@ + + * 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/functions.lib.php + \brief Ensemble de fonctions de base de dolibarr sous forme d'include + \version $Id$ + */ + + +/** + * Return next value for a mask + * + * @param unknown_type $db + * @param $mask + * @param unknown_type $table + * @param unknown_type $field + * @return string New value + */ +function get_next_value($db,$mask,$table,$field,$where='',$valueforccc='') +{ + // 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=sanitize_string($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") < $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")+$yearoffset); + if (strlen($reg[2]) == 2) $yearcomp=sprintf("%02d",date("y")+$yearoffset); + if (strlen($reg[2]) == 1) $yearcomp=substr(date("y"),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; + } + } + //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 = sanitize_string($mask); + $maskLike = str_replace("%","_",$maskLike); + // Replace protected special codes with matching number of _ as wild card caracter + $maskLike = str_replace(sanitize_string('{yyyy}'),'____',$maskLike); + $maskLike = str_replace(sanitize_string('{yy}'),'__',$maskLike); + $maskLike = str_replace(sanitize_string('{y}'),'_',$maskLike); + $maskLike = str_replace(sanitize_string('{mm}'),'__',$maskLike); + $maskLike = str_replace(sanitize_string('{dd}'),'__',$maskLike); + $maskLike = str_replace(sanitize_string('{'.$masktri.'}'),str_pad("",strlen($maskcounter),"_"),$maskLike); + if ($maskrefclient) $maskLike = str_replace(sanitize_string('{'.$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; + + 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 = sanitize_string($mask); + $maskrefclient_maskLike = str_replace("%","_",$maskrefclient_maskLike); + // Replace protected special codes with matching number of _ as wild card caracter + $maskrefclient_maskLike = str_replace(sanitize_string('{yyyy}'),'____',$maskrefclient_maskLike); + $maskrefclient_maskLike = str_replace(sanitize_string('{yy}'),'__',$maskrefclient_maskLike); + $maskrefclient_maskLike = str_replace(sanitize_string('{y}'),'_',$maskrefclient_maskLike); + $maskrefclient_maskLike = str_replace(sanitize_string('{mm}'),'__',$maskrefclient_maskLike); + $maskrefclient_maskLike = str_replace(sanitize_string('{dd}'),'__',$maskrefclient_maskLike); + $maskrefclient_maskLike = str_replace(sanitize_string('{'.$masktri.'}'),str_pad("",strlen($maskcounter),"_"),$maskrefclient_maskLike); + $maskrefclient_maskLike = str_replace(sanitize_string('{'.$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 ($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"),$numFinal); + $numFinal = str_replace('{yy}',date("y"),$numFinal); + $numFinal = str_replace('{y}' ,substr(date("y"),2,1),$numFinal); + $numFinal = str_replace('{mm}',date("m"),$numFinal); + $numFinal = str_replace('{dd}',date("d"),$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; +} \ No newline at end of file diff --git a/htdocs/livraison/mods/mod_livraison_saphir.php b/htdocs/livraison/mods/mod_livraison_saphir.php index f81e88fb5df..655646319ce 100644 --- a/htdocs/livraison/mods/mod_livraison_saphir.php +++ b/htdocs/livraison/mods/mod_livraison_saphir.php @@ -21,7 +21,7 @@ /** \file htdocs/includes/modules/commande/mod_livraison_saphir.php - \ingroup commande + \ingroup expedition \brief Fichier contenant la classe du modèle de numérotation de référence de livraison Saphir \version $Id$ */ @@ -47,7 +47,7 @@ class mod_livraison_saphir extends ModeleNumRefDeliveryOrder global $conf,$langs; $langs->load("bills"); - + $form = new Form($db); $texte = $langs->trans('GenericNumRefModelDesc')."
\n"; @@ -77,8 +77,11 @@ class mod_livraison_saphir extends ModeleNumRefDeliveryOrder { global $conf,$langs,$mysoc; - $numExample = $this->getNextValue($mysoc,$propalspecimen); - + $old_code_client=$mysoc->code_client; + $mysoc->code_client='CCCCCCCCCC'; + $numExample = $this->getNextValue($mysoc,''); + $mysoc->code_client=$old_code_client; + if (! $numExample) { $numExample = $langs->trans('NotConfigured'); @@ -96,6 +99,8 @@ class mod_livraison_saphir extends ModeleNumRefDeliveryOrder { global $db,$conf; + require_once(DOL_DOCUMENT_ROOT ."/lib/functions2.lib.php"); + // On défini critere recherche compteur $mask=$conf->global->LIVRAISON_SAPHIR_MASK; @@ -105,97 +110,8 @@ class mod_livraison_saphir extends ModeleNumRefDeliveryOrder return 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'; - - $maskwithonlyymcode=$mask; - $maskwithonlyymcode=eregi_replace('\{(0+)([@\+][0-9]+)?([@\+][0-9]+)?\}',$maskcounter,$maskwithonlyymcode); - $maskwithonlyymcode=eregi_replace('\{dd\}','dd',$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); - //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]); - - // 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 'ErrorBadMask'; - 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 de filter request to search max number) - $monthcomp=$maskraz; - $yearoffset=0; - $yearcomp=0; - if (date("m") < $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")+$yearoffset); - if (strlen($reg[2]) == 2) $yearcomp=sprintf("%02d",date("y")+$yearoffset); - if (strlen($reg[2]) == 1) $yearcomp=substr(date("y"),2,1)+$yearoffset; - - $sqlwhere=''; - $sqlwhere.='SUBSTRING(ref, '.(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(ref, '.(strlen($reg[1])+strlen($reg[2])+1).', '.strlen($reg[3]).') >= '.$monthcomp; - } - } - //print "masktri=".$masktri." maskcounter=".$maskcounter." maskraz=".$maskraz." maskoffset=".$maskoffset."
\n"; + $numFinal=get_next_value($db,$mask,'livraison','ref','',$objsoc->code_client); - $posnumstart=strpos($maskwithnocode,$maskcounter); // Pos of counter in final string (from 0 to ...) - if ($posnumstart < 0) return 'ErrorBadMask'; - $sqlstring='SUBSTRING(ref, '.($posnumstart+1).', '.strlen($maskcounter).')'; - //print "x".$sqlstring; - - // Get counter in database - $counter=0; - $sql = "SELECT MAX(".$sqlstring.") as val"; - $sql.= " FROM ".MAIN_DB_PREFIX."livraison"; - $sql.= " WHERE ref not like '(%'"; - if ($sqlwhere) $sql.=' AND '.$sqlwhere; - - //print $sql; - dolibarr_syslog("mod_livraison_saphir::getNextValue 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++; - - // Build numFinal - $numFinal = $mask; - - // We replace special codes - $numFinal = str_replace('{yyyy}',date("Y"),$numFinal); - $numFinal = str_replace('{yy}',date("y"),$numFinal); - $numFinal = str_replace('{y}' ,substr(date("y"),2,1),$numFinal); - $numFinal = str_replace('{mm}',date("m"),$numFinal); - $numFinal = str_replace('{dd}',date("d"),$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); - - dolibarr_syslog("mod_livraison_saphir::getNextValue return ".$numFinal); return $numFinal; }