dolibarr-dev
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Dolibarr-dev] Proposition patch pour rendre saph ir plus robuste + idée


From: Raphaël Bertrand (Résultic)
Subject: [Dolibarr-dev] Proposition patch pour rendre saph ir plus robuste + idée compteur à masque client
Date: Tue, 10 Jun 2008 15:20:53 +0200
User-agent: Thunderbird 2.0.0.14 (Windows/20080421)

Suite au problème rencontré par Lionel (et par d'autres en cas de changement de système de numérotation en cours de route ou de bidouillage), je me suis penché sur le code de saphir pour chercher pourquoi il pouvait ainsi être trompé par la présence de commandes ne respectant pas son masque. Là je me suis aperçu que le module de numérotation se contentait de repérer les débuts et fin logique du compteur pour lui, et de faire ses comparaisons (de même pour le test de date). Or, dans le cas d'une modification manuelle ou d'un changement de standard, des lettres peuvent se trouver en lieu et place des chiffres attendus, ce qui cause alors une ré initialisation du compteur, et du même coup une erreur lors de l'insertion car le numéro existe déjà.

Pour contrer cela, je propose donc dans le patch ci-présent de remplacer le test d'absence de parenthèse (pour les cas des commandes provisoires), par un test d'expression régulière vérifiant que les lettres préfixes et suffixes correspondent, et que les codes spéciaux sont bien remplacés par des chiffres, avant de considérer un enregistrement comme étant créé par le masque et donc avant d'incrémenter le compteur.

Si cela vous intéresse, je peux essayer de le porter sur les autres modules de numérotation.

D'autre part, nous trouverions intéressant de pouvoir effectuer une numérotation tenant compte du code client, afin de disposer une valeur de compteur propre à chaque client, améliorant ainsi le suivi par client. Qu'en pensez vous ?

Post de Lionel:
http://www.dolibarr.fr/component/option,com_fireboard/Itemid,32/func,view/catid,5/id,8910/lang,fr/#8910
Article de la FAQ:
http://www.dolibarr.com/wikidev/index.php/FAQ_D%C3%A9veloppeur#Changer_mon_syst.C3.A8me_de_num.C3.A9rotation_des_factures_en_cours_de_route


--
*Raphaël Bertrand*
Résultic - Management & Informatique
Siège : 11 rue Tronchet - 69006 LYON
Bureaux : 11 pl Maréchal Lyautey - 69006 LYON
Fixe. 08 74 77 00 70
Fax. 08 25 24 85 02
E-Mail : address@hidden
Index: mod_commande_saphir.php
===================================================================
RCS file: 
/sources/dolibarr/dolibarr/htdocs/includes/modules/commande/mod_commande_saphir.php,v
retrieving revision 1.16
diff -u -r1.16 mod_commande_saphir.php
--- mod_commande_saphir.php     31 Mar 2008 04:26:54 -0000      1.16
+++ mod_commande_saphir.php     10 Jun 2008 13:01:31 -0000
@@ -122,7 +122,7 @@
                $maskwithnocode=eregi_replace('\{y\}','y',$maskwithnocode);
                $maskwithnocode=eregi_replace('\{mm\}','mm',$maskwithnocode);
                //print "maskwithonlyymcode=".$maskwithonlyymcode." 
maskwithnocode=".$maskwithnocode."\n<br>";
-
+               
                // 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]);
@@ -160,11 +160,22 @@
                $sqlstring='SUBSTRING(ref, '.($posnumstart+1).', 
'.strlen($maskcounter).')';
                //print "x".$sqlstring;
                
+               // Build maskRegexp
+               $maskRegexp = preg_quote($mask);
+               // Replace protected special codes with matching regexp
+               $maskRegexp = 
str_replace(preg_quote('{yyyy}'),'([0-9]{4})',$maskRegexp);
+               $maskRegexp = 
str_replace(preg_quote('{yy}'),'([0-9]{2})',$maskRegexp);
+               $maskRegexp = 
str_replace(preg_quote('{y}'),'([0-9])',$maskRegexp);
+               $maskRegexp = 
str_replace(preg_quote('{mm}'),'([0-1])([0-9])',$maskRegexp);
+               $maskRegexp = 
str_replace(preg_quote('{dd}'),'([0-3])([0-9])',$maskRegexp);
+               $maskRegexp = 
str_replace(preg_quote('{'.$masktri.'}'),'([0-9]{'.strlen($maskcounter).'})',$maskRegexp);
+               
                // Get counter in database
                $counter=0;
                $sql = "SELECT MAX(".$sqlstring.") as val";
                $sql.= " FROM ".MAIN_DB_PREFIX."commande";
-               $sql.= " WHERE ref not like '(%'";
+               //$sql.= " WHERE ref not like '(%'";
+               $sql.= " WHERE (ref REGEXP '".$maskRegexp."')";
                if ($sqlwhere) $sql.=' AND '.$sqlwhere;
                
                //print $sql;
@@ -193,6 +204,7 @@
                $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);


reply via email to

[Prev in Thread] Current Thread [Next in Thread]