[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Dolibarr-dev] patch compteur à masque client et numéro chrono
From: |
Raphaël Bertrand (Résultic) |
Subject: |
Re: [Dolibarr-dev] patch compteur à masque client et numéro chrono |
Date: |
Wed, 18 Jun 2008 18:35:03 +0200 |
User-agent: |
Thunderbird 2.0.0.14 (Windows/20080421) |
Avec celui là ce sera mieux...
*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
Raphaël Bertrand (Résultic) a écrit :
Bonjour,
Voici ci-joint le patch demandé.
On peut maintenant utiliser dans tous les compteurs saphir & co les
filtres {cccc} et {cccc000} qui n'influencent pas le compteur général,
excepté par le fait qu'ils changent la structure du filtre.
Afin d'ignorer les enregistrements pouvant entrer en conflit,
Ces compteurs vérifient maintenant que les enregistrement correspondent
au filtre avec un test en Like complet, qui teste la structure du filtre
avec sa taille, en ignorant toutefois la correspondance de caractères
pour tout ce qui va être remplacé par un filtre (utilisation d'un
caractère joker _), ainsi que les caractères spéciaux.
*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
Eldy a écrit :
Raphaël Bertrand (Résultic) a écrit :
Merci pour la réponse, je la lirais à nouveau et ferais le patch
correspondant à priori pour demain.
Concernant la gestion des codes clients, ok pour un {cccc} qui est
remplacé par exactement 4 caractères (les premiers du code client
unique complété par *).
Par contre est que c'est ok aussi pour un {cccc0000} fonctionnant sur
le même principe mais incluant une numérotation spécifique au client?
Ok, je commence à comprendre. Tu peux effectivement mettre cela en
place, par contre tu devras donc faire 2 requetes.
- Une pour retrouve le max du numéro {0000} avec les substring pour ne
récupérer que le chiffre en position juste.
- Une autre requete (uniquement si on a un {cccc0000}) pour retrouver
la aussi le max propre au client, mais la encore il faut réaliser la
recherche par un select avec substring, chose qui devient possible car
tout étant de longueur fixe, on sait combien de carac avant et apres
enlevé dans le substring pour retrouver le max.
*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
Eldy a écrit :
Peux-tu en replacement de tous les patch fournis précédemment
fournir un fichier patch qui intégrerait:
* Pour modifier le test en 'not like' par un test en like qui teste
certains caractères du masque pour le rendre moins sensible à la
présence de données ne suivant pas ce masque (limite les cas où l'on
est obligé d'altérer toute l'ancienne numérotation pour faire
fonctionner la nouvelle).
OK
* - Pour faire fonctionner le module de comptage d'intervention
arctic, qui n'était actuellement plus fonctionnel, n'allant pas
chercher ses numéros dans la bonne table.
OK
* Par contre pour le support du code client, il faut simplifier ton
approche.
En effet, tous critères personnalisés de type {xxx} doit avoir une
longueur fixe. Ceci évite ainsi des règles complexe comme "ça marche
mais il faut pas qu'il y ait ceci après ou avant".
Ceci vaut donc pour le code client {cccc}. Il faut donc y placer des
* par exemple si le code client est trop court pour avoir une
longeur fixe de compteur..
Ceci permet d'avoir la possibilité de mettre {cccc} ou non sans se
soucier de quoi que ce soit.
Et cette evol doit aussi être présente dans le module facture.
En effet, ce qui est important dans le module facture c'est que le
{00000} qui indique la numérotation soit présente, unique et
continu. Rien n'empeche de mettre un prefix {cccc} en plus avant ou
après, du moment qu'on a notre compteur continu.
Et vu que pour rechercher le numéro suivant on fait une recherche
sur substring avec tous les caractères qui ne sont pas le compteur
mis à _ et qu'on a QUE des tags de longeurs fixe, le {cccc} peut
etre placé où on veut sans souci, au même titre que tous les autres
tags.
Je pense qu'il faut ne pas essayer de faire des modules de num trop
complexes juste dans le but de pouvoir gérer des changement de
normes de numérotation car il y aura tjs un cas non géré de toute
façon qui ne passera pas.
De plus il n'est pas nécessaire de prévoir autre chose que {cccc} (
donc pas de {cccc+x} ).
Si le code client n'est pas défini, ou pas assez de caractères, on y
met * pour compléter devant.
Il ne faut pas perdre de vue que Dolibarr doit ensuite être utilisé
et compris par des gens qui n'ont pas notre tournure d'esprit
farfelue d'informaticien et qu'il faut ensuite répondre aux
questions des utilisateurs qui ne comprennent pas comment définir
leur module donc gare à ne pas faire trop complexe, car les
explication textes par mail ou forum seront alors difficiles. Et un
utilisateur qui utilise un logiciel opensource dont on ne peut etre
débloqué par une simple explication mail sera un utilisateur qui se
dira que ce n'est pas un BON logiciel opensource.
Un simple {cccc}, si on décide que le champ substitué sera de
longeur fixe égal au nb de c, s'intègre très facilement dans le code
des modules de numérotation actuel et cela sans aucune contrainte
(comme on le fait pour l'année qui vaut {yyyy}). Et cela reste
facile à comprendre. Je ne pense pas qu'on ait besoin de plus.
Seul le numéro de compteur {0000} obligatoire doit offrir des
variantes d'offset ou de remise à zero, les autres tags doivent etre
de simple "remplacé par".
Raphaël Bertrand (Résultic) a écrit :
Voici le patch qui met à jour les modules saphir, mercure et arctic
(propales, commandes, fichinter, factures)
- Pour modifier le test en 'not like' par un test en like qui teste
certains caractères du masque pour le rendre moins sensible à la
présence de données ne suivant pas ce masque (limite les cas où
l'on est obligé d'altérer toute l'ancienne numérotation pour faire
fonctionner la nouvelle).
- Pour faire fonctionner le module de comptage d'intervention
arctic, qui n'était actuellement plus fonctionnel, n'allant pas
chercher ses numéros dans la bonne table.
- Pour ajouter le support du filtre {cccc} qui transforme le
compteur général en compteur propre au client, en incluant dans le
masque le code client unique, dans la limite des caractères
définissant le code client.
(NON intégré dans mercure pour respecter la législation qui impose
la présence d'un compteur global)
- Pour ajouter le support du filtre {-cccc0000} / {-ccccSEP000+10}
décrit dans les mails précédents, et qui permet d'ajouter un
suffixe muni d'un compteur propre au client, et comportant les n
(n=nombre de c) premières lettres du code client unique (dans la
limite de ce qui est défini), et pouvant comporter un préfixe d'une
lettre différente de c, ainsi qu'un séparateur de longueur
quelconque mais ne comportant ni de c ni de 0. Le compteur client
peut être initialisé à une valeur d'offset, et est obligatoirement
réinitialisé en même temps que le compteur global.
La possibilité d'intégrer ces caractères au sein du filtre
s'explique par le fait qu'elle permet d'ajouter ce suffixe sans
réinitialiser le compteur préexistant.
*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
Raphaël Bertrand (Résultic) a écrit :
Voici maintenant une version modifiée de mon patch pour la
numérotation de propales saphir qui permet l'ajout d'un filtre
évolué suivant l'expression régulière
'\{([^c])?(c+)([^0c]*)(0+)(\+[0-9]+)?\}'
Soit 1 caractère de préfixe optionnel (différent de c majuscule ou
minuscule), suivi d'un nombre quelconque c (autant de c que le
nombre maximum de caractères à récupérer du code client), suivi
d'une chaine optionnelle servant de séparateur (ne contenant ni de
0 ni de c majuscule ou minuscule), suivi d'un nombre de zéro
correspondant au nombre de chiffres du compteur propre au client,
et éventuellement suivi d'un marqueur d'offset.
Le résultat est un suffixe n'interférant pas sur la numérotation
standard.
Exemple: pour le masque address@hidden
ayant déjà 7 propositions suivant le masque address@hidden, et 0
suivant ce nouveau masque, le module propose PR0800008-0057 si pas
de référence client (l'exemple de numérotation), et
PR0800008-CLIE0057
pour un client ayant comme code client CLIENT.
Si on valide cette proposition et l'on en crée aussitôt une autre
pour le même client, on obtient PR0800009-CLIE0058
Avec le masque address@hidden
on aurait eu PR0800008-CLIE-0001 puis PR0800009-CLIE-0002
et avec address@hidden, PR0800008CLIE-NUM-0001
puis PR0800008CLIE-NUM-0002
*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
Raphaël Bertrand (Résultic) a écrit :
Bonjour,
Sauf erreur de ma part, c'est justement de ce code client unique
dont je me sers. La seule chose qu'il peut se passer, c'est que
si l'on choisit moins de lettres dans le masque que le nombre de
lettre que font les codes clients, il peut y avoir des codes
clients distincts qui se retrouvent avec le même masque. Mais
rien n'empêche de mettre suffisamment de c pour que cela ne se
produise pas (si il y a plus de c que de lettres pour les codes
clients, on se contente de retourner l'intégralité du code client).
La seule restriction qui demeure, c'est qu'il ne faut pas que les
codes clients se terminent par un 0 si ils sont utilisés juste
avant le compteur (sans séparation), car alors ils rentrent en
conflit avec lui comme c'est le cas actuellement si l'on met un 0
dans son masque juste avant le compteur.
Pour l'idée du compteur propre au client avec mention du code
client et utilisé en suffixe, venant se surajouter au compteur
global, je vais voir comment cela peut se faire.
*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
Rodolphe Quiedeville a écrit :
Raphaël Bertrand (Résultic) a écrit :
En me servant du patch permettant de rendre saphir plus robuste,
j'ai rajouté la prise en compte du code client via le masque
{cccc}
Bonjour,
Il existe déjà un code client unique pourquoi ne pas l'utiliser ?
Après pour les facture une sequence :
08-00001-CD54-0001
08-00002-CD54-0002
08-00003-EB54-0001
08-00004-CD54-0003
Avec l'année sur 2 digit, compteur total sur 5 digits, code client,
compteur client sera valide auprès des institutions. Il contient
bien
une séquence unique qui servira de base comptable. Le changement
lors de
changement d'année est régulièrement accepté ou à la fin de
l'exercice.
En fait c'est juste une séquence unique et continue avec un suffix.
A++
_______________________________________________
Dolibarr-dev mailing list
address@hidden
http://lists.nongnu.org/mailman/listinfo/dolibarr-dev
------------------------------------------------------------------------
_______________________________________________
Dolibarr-dev mailing list
address@hidden
http://lists.nongnu.org/mailman/listinfo/dolibarr-dev
------------------------------------------------------------------------
_______________________________________________
Dolibarr-dev mailing list
address@hidden
http://lists.nongnu.org/mailman/listinfo/dolibarr-dev
_______________________________________________
Dolibarr-dev mailing list
address@hidden
http://lists.nongnu.org/mailman/listinfo/dolibarr-dev
------------------------------------------------------------------------
_______________________________________________
Dolibarr-dev mailing list
address@hidden
http://lists.nongnu.org/mailman/listinfo/dolibarr-dev
Index: fichinter/fiche.php
===================================================================
RCS file: /sources/dolibarr/dolibarr/htdocs/fichinter/fiche.php,v
retrieving revision 1.96
diff -u -r1.96 fiche.php
--- fichinter/fiche.php 9 Apr 2008 18:13:49 -0000 1.96
+++ fichinter/fiche.php 13 Jun 2008 15:33:00 -0000
@@ -382,22 +382,15 @@
$modFicheinter = new $obj;
$numpr = $modFicheinter->getNextValue($societe,$ficheinter);
+ if ($_GET["socid"])
+ {
print "<form name='fichinter' action=\"fiche.php\" method=\"post\">";
print '<table class="border" width="100%">';
- if ($_GET["socid"])
- {
print '<input type="hidden" name="socid"
value='.$_GET["socid"].'>';
print
"<tr><td>".$langs->trans("Company")."</td><td>".$societe->getNomUrl(1)."</td></tr>";
- }
- else
- {
- print "<tr><td>".$langs->trans("Company")."</td><td>";
- $html->select_societes('','socid','',1);
- print "</td></tr>";
- }
-
+
print "<tr><td>".$langs->trans("Date")."</td><td>";
$html->select_date(time(),"p",'','','','fichinter');
print "</td></tr>";
@@ -407,7 +400,7 @@
print "<tr><td>".$langs->trans("Ref")."</td>";
print "<td><input name=\"ref\" value=\"$numpr\"></td></tr>\n";
- if ($conf->projet->enabled && $_GET["socid"])
+ if ($conf->projet->enabled)
{
// Projet associe
$langs->load("project");
@@ -466,6 +459,22 @@
print '</table>';
print '</form>';
+ }
+ else
+ {
+ print "<form name='fichinter' action=\"fiche.php\"
method=\"get\">";
+ print '<table class="border" width="100%">';
+ print "<tr><td>".$langs->trans("Company")."</td><td>";
+ $html->select_societes('','socid','',1);
+ print "</td></tr>";
+ print '<tr><td colspan="2" align="center">';
+ print "<input type=\"hidden\" name=\"action\"
value=\"create\">";
+ print '<input type="submit" class="button"
value="'.$langs->trans("CreateDraftIntervention").'">';
+ print '</td></tr>';
+ print '</table>';
+ print '</form>';
+ }
+
}
elseif ($_GET["id"] > 0)
{
Index: includes/modules/commande/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
--- includes/modules/commande/mod_commande_saphir.php 31 Mar 2008 04:26:54
-0000 1.16
+++ includes/modules/commande/mod_commande_saphir.php 18 Jun 2008 16:31:51
-0000
@@ -2,6 +2,7 @@
/* Copyright (C) 2003-2007 Rodolphe Quiedeville <address@hidden>
* Copyright (C) 2004-2007 Laurent Destailleur <address@hidden>
* Copyright (C) 2005-2007 Regis Houssin <address@hidden>
+ * Copyright (C) 2008 Raphael Bertrand (Resultic) <address@hidden>
*
* 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
@@ -112,10 +113,34 @@
$maskraz=-1;
$maskoffset=0;
if (strlen($maskcounter) < 3) return
'CounterMustHaveMoreThan3Digits';
+
+ if (eregi('\{(c+)\}',$mask,$regClientCode))
+ {
+ $maskclientcode=$regClientCode[1];
+
$clientcode=substr($objsoc->code_client,0,strlen($maskclientcode));//get n
first characters of client code to form maskrefclient_clientcode
+
$clientcode=str_pad($clientcode,strlen($maskclientcode),"_",STR_PAD_RIGHT);//padding
maskrefclient_clientcode for having exactly n characters in
maskrefclient_clientcode
+ $clientcode=sanitize_string($clientcode);//sanitize
maskrefclient_clientcode for sql insert and sql select like
+ }
+ else $maskclientcode='';
+
+ 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($objsoc->code_client,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) < 3) return
'CounterMustHaveMoreThan3Digits';
+ }
+ else $maskrefclient='';
$maskwithonlyymcode=$mask;
$maskwithonlyymcode=eregi_replace('\{(0+)(address@hidden)?(address@hidden)?\}',$maskcounter,$maskwithonlyymcode);
$maskwithonlyymcode=eregi_replace('\{dd\}','dd',$maskwithonlyymcode);
+
$maskwithonlyymcode=eregi_replace('\{(c+)\}',$maskclientcode,$maskwithonlyymcode);
+
$maskwithonlyymcode=eregi_replace('\{(c+)(0+)\}',$maskrefclient,$maskwithonlyymcode);
$maskwithnocode=$maskwithonlyymcode;
$maskwithnocode=eregi_replace('\{yyyy\}','yyyy',$maskwithnocode);
$maskwithnocode=eregi_replace('\{yy\}','yy',$maskwithnocode);
@@ -160,11 +185,25 @@
$sqlstring='SUBSTRING(ref, '.($posnumstart+1).',
'.strlen($maskcounter).')';
//print "x".$sqlstring;
+ // Build 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 ($maskclientcode) $maskLike =
str_replace(sanitize_string('{'.$maskclientcode.'}'),str_pad("",strlen($maskclientcode),"_"),$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."commande";
- $sql.= " WHERE ref not like '(%'";
+ //$sql.= " WHERE ref not like '(%'";
+ $sql.= " WHERE ref like '".$maskLike."'";
if ($sqlwhere) $sql.=' AND '.$sqlwhere;
//print $sql;
@@ -179,15 +218,58 @@
if (empty($counter) || eregi('[^0-9]',$counter))
$counter=$maskoffset;
$counter++;
+ if($maskrefclient)
+ {
+
+
$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(ref,
'.($maskrefclient_posnumstart+1).', '.strlen($maskrefclient_maskcounter).')';
+ //print "x".$sqlstring;
+
+ // Build 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);
+ if ($maskclientcode) $maskrefclient_maskLike =
str_replace(sanitize_string('{'.$maskclientcode.'}'),str_pad("",strlen($maskclientcode),"_"),$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."commande";
+ //$sql.= " WHERE ref not like '(%'";
+ $maskrefclient_sql.= " WHERE ref like
'".$maskrefclient_maskLike."'";
+ if ($sqlwhere) $maskrefclient_sql.=' AND '.$sqlwhere;
//use the same sqlwhere as general mask
+ $maskrefclient_sql.=' AND (SUBSTRING(ref,
'.(strpos($maskwithnocode,$maskrefclient)+1).',
'.strlen($maskrefclient_maskclientcode).")='".$maskrefclient_clientcode."')";
+
+ //print $sql;
+ dolibarr_syslog("mod_commande_saphir::getNextValue
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
+ // 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.'}';
@@ -195,6 +277,14 @@
//print 'x'.$maskbefore.'-'.$maskafter.'y';
$numFinal = str_replace($maskbefore,$maskafter,$numFinal);
+ // Now we replace the refclient
+ if($maskrefclient)
+ {
+ $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("mod_commande_saphir::getNextValue return
".$numFinal);
return $numFinal;
}
Index: includes/modules/facture/mercure/mercure.modules.php
===================================================================
RCS file:
/sources/dolibarr/dolibarr/htdocs/includes/modules/facture/mercure/mercure.modules.php,v
retrieving revision 1.13
diff -u -r1.13 mercure.modules.php
--- includes/modules/facture/mercure/mercure.modules.php 31 Mar 2008
04:26:54 -0000 1.13
+++ includes/modules/facture/mercure/mercure.modules.php 18 Jun 2008
16:31:13 -0000
@@ -2,6 +2,7 @@
/* Copyright (C) 2003-2007 Rodolphe Quiedeville <address@hidden>
* Copyright (C) 2004-2007 Laurent Destailleur <address@hidden>
* Copyright (C) 2005-2007 Regis Houssin <address@hidden>
+ * Copyright (C) 2008 Raphael Bertrand (Resultic) <address@hidden>
*
* 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
@@ -118,10 +119,34 @@
$maskraz=-1;
$maskoffset=0;
if (strlen($maskcounter) < 3) return
'CounterMustHaveMoreThan3Digits';
+
+ if (eregi('\{(c+)\}',$mask,$regClientCode))
+ {
+ $maskclientcode=$regClientCode[1];
+
$clientcode=substr($objsoc->code_client,0,strlen($maskclientcode));//get n
first characters of client code to form maskrefclient_clientcode
+
$clientcode=str_pad($clientcode,strlen($maskclientcode),"_",STR_PAD_RIGHT);//padding
maskrefclient_clientcode for having exactly n characters in
maskrefclient_clientcode
+ $clientcode=sanitize_string($clientcode);//sanitize
maskrefclient_clientcode for sql insert and sql select like
+ }
+ else $maskclientcode='';
+
+ 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($objsoc->code_client,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) < 3) return
'CounterMustHaveMoreThan3Digits';
+ }
+ else $maskrefclient='';
$maskwithonlyymcode=$mask;
$maskwithonlyymcode=eregi_replace('\{(0+)(address@hidden)?(address@hidden)?\}',$maskcounter,$maskwithonlyymcode);
$maskwithonlyymcode=eregi_replace('\{dd\}','dd',$maskwithonlyymcode);
+
$maskwithonlyymcode=eregi_replace('\{(c+)\}',$maskclientcode,$maskwithonlyymcode);
+
$maskwithonlyymcode=eregi_replace('\{(c+)(0+)\}',$maskrefclient,$maskwithonlyymcode);
$maskwithnocode=$maskwithonlyymcode;
$maskwithnocode=eregi_replace('\{yyyy\}','yyyy',$maskwithnocode);
$maskwithnocode=eregi_replace('\{yy\}','yy',$maskwithnocode);
@@ -166,11 +191,25 @@
$sqlstring='SUBSTRING(facnumber, '.($posnumstart+1).',
'.strlen($maskcounter).')';
//print "x".$sqlstring;
+ // Build 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 ($maskclientcode) $maskLike =
str_replace(sanitize_string('{'.$maskclientcode.'}'),str_pad("",strlen($maskclientcode),"_"),$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."facture";
- $sql.= " WHERE facnumber not like '(%'";
+// $sql.= " WHERE facnumber not like '(%'";
+ $sql.= " WHERE facnumber like '".$maskLike."'";
if ($facture->type == 2) $sql.= " AND type = 2";
else $sql.=" AND type != 2";
if ($sqlwhere) $sql.=' AND '.$sqlwhere;
@@ -187,22 +226,73 @@
if (empty($counter) || eregi('[^0-9]',$counter))
$counter=$maskoffset;
$counter++;
+ if($maskrefclient)
+ {
+
+
$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(facnumber,
'.($maskrefclient_posnumstart+1).', '.strlen($maskrefclient_maskcounter).')';
+ //print "x".$sqlstring;
+
+ // Build 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);
+ if ($maskclientcode) $maskrefclient_maskLike =
str_replace(sanitize_string('{'.$maskclientcode.'}'),str_pad("",strlen($maskclientcode),"_"),$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."facture";
+ //$sql.= " WHERE facnumber not like '(%'";
+ $maskrefclient_sql.= " WHERE facnumber like
'".$maskrefclient_maskLike."'";
+ if ($sqlwhere) $maskrefclient_sql.=' AND '.$sqlwhere;
//use the same sqlwhere as general mask
+ $maskrefclient_sql.=' AND (SUBSTRING(facnumber,
'.(strpos($maskwithnocode,$maskrefclient)+1).',
'.strlen($maskrefclient_maskclientcode).")='".$maskrefclient_clientcode."')";
+
+ //print $sql;
+ dolibarr_syslog("mod_facture_mercure::getNextValue
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
+ // 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)
+ {
+ $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("mod_facture_mercure::getNextValue return
".$numFinal);
return $numFinal;
}
Index: includes/modules/fichinter/mod_arctic.php
===================================================================
RCS file:
/sources/dolibarr/dolibarr/htdocs/includes/modules/fichinter/mod_arctic.php,v
retrieving revision 1.8
diff -u -r1.8 mod_arctic.php
--- includes/modules/fichinter/mod_arctic.php 12 May 2008 22:50:39 -0000
1.8
+++ includes/modules/fichinter/mod_arctic.php 18 Jun 2008 16:31:02 -0000
@@ -2,6 +2,7 @@
/* Copyright (C) 2003-2007 Rodolphe Quiedeville <address@hidden>
* Copyright (C) 2004-2008 Laurent Destailleur <address@hidden>
* Copyright (C) 2005-2007 Regis Houssin <address@hidden>
+ * Copyright (C) 2008 Raphael Bertrand (Resultic) <address@hidden>
*
* 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
@@ -116,10 +117,34 @@
$maskraz=-1;
$maskoffset=0;
if (strlen($maskcounter) < 3) return
'CounterMustHaveMoreThan3Digits';
+
+ if (eregi('\{(c+)\}',$mask,$regClientCode))
+ {
+ $maskclientcode=$regClientCode[1];
+
$clientcode=substr($objsoc->code_client,0,strlen($maskclientcode));//get n
first characters of client code to form maskrefclient_clientcode
+
$clientcode=str_pad($clientcode,strlen($maskclientcode),"_",STR_PAD_RIGHT);//padding
maskrefclient_clientcode for having exactly n characters in
maskrefclient_clientcode
+ $clientcode=sanitize_string($clientcode);//sanitize
maskrefclient_clientcode for sql insert and sql select like
+ }
+ else $maskclientcode='';
+
+ 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($objsoc->code_client,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) < 3) return
'CounterMustHaveMoreThan3Digits';
+ }
+ else $maskrefclient='';
$maskwithonlyymcode=$mask;
$maskwithonlyymcode=eregi_replace('\{(0+)(address@hidden)?(address@hidden)?\}',$maskcounter,$maskwithonlyymcode);
$maskwithonlyymcode=eregi_replace('\{dd\}','dd',$maskwithonlyymcode);
+
$maskwithonlyymcode=eregi_replace('\{(c+)\}',$maskclientcode,$maskwithonlyymcode);
+
$maskwithonlyymcode=eregi_replace('\{(c+)(0+)\}',$maskrefclient,$maskwithonlyymcode);
$maskwithnocode=$maskwithonlyymcode;
$maskwithnocode=eregi_replace('\{yyyy\}','yyyy',$maskwithnocode);
$maskwithnocode=eregi_replace('\{yy\}','yy',$maskwithnocode);
@@ -164,11 +189,25 @@
$sqlstring='SUBSTRING(ref, '.($posnumstart+1).',
'.strlen($maskcounter).')';
//print "x".$sqlstring;
+ // Build 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 ($maskclientcode) $maskLike =
str_replace(sanitize_string('{'.$maskclientcode.'}'),str_pad("",strlen($maskclientcode),"_"),$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."propal";
- $sql.= " WHERE ref not like '(%'";
+ $sql.= " FROM ".MAIN_DB_PREFIX."fichinter";
+ //$sql.= " WHERE ref not like '(%'";
+ $sql.= " WHERE ref like '".$maskLike."'";
if ($sqlwhere) $sql.=' AND '.$sqlwhere;
//print $sql;
@@ -183,22 +222,74 @@
if (empty($counter) || eregi('[^0-9]',$counter))
$counter=$maskoffset;
$counter++;
+ if($maskrefclient)
+ {
+
+
$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(ref,
'.($maskrefclient_posnumstart+1).', '.strlen($maskrefclient_maskcounter).')';
+ //print "x".$sqlstring;
+
+ // Build 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);
+ if ($maskclientcode) $maskrefclient_maskLike =
str_replace(sanitize_string('{'.$maskclientcode.'}'),str_pad("",strlen($maskclientcode),"_"),$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."fichinter";
+ //$sql.= " WHERE ref not like '(%'";
+ $maskrefclient_sql.= " WHERE ref like
'".$maskrefclient_maskLike."'";
+ if ($sqlwhere) $maskrefclient_sql.=' AND '.$sqlwhere;
//use the same sqlwhere as general mask
+ $maskrefclient_sql.=' AND (SUBSTRING(ref,
'.(strpos($maskwithnocode,$maskrefclient)+1).',
'.strlen($maskrefclient_maskclientcode).")='".$maskrefclient_clientcode."')";
+
+
+ //print $sql;
+ dolibarr_syslog("mod_arctic::getNextValue
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
+ // 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)
+ {
+ $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("mod_arctic::getNextValue return ".$numFinal);
return $numFinal;
}
Index: includes/modules/propale/mod_propale_saphir.php
===================================================================
RCS file:
/sources/dolibarr/dolibarr/htdocs/includes/modules/propale/mod_propale_saphir.php,v
retrieving revision 1.17
diff -u -r1.17 mod_propale_saphir.php
--- includes/modules/propale/mod_propale_saphir.php 1 May 2008 09:38:28
-0000 1.17
+++ includes/modules/propale/mod_propale_saphir.php 18 Jun 2008 16:32:25
-0000
@@ -2,6 +2,7 @@
/* Copyright (C) 2003-2007 Rodolphe Quiedeville <address@hidden>
* Copyright (C) 2004-2007 Laurent Destailleur <address@hidden>
* Copyright (C) 2005-2007 Regis Houssin <address@hidden>
+ * Copyright (C) 2008 Raphael Bertrand (Resultic) <address@hidden>
*
* 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
@@ -110,11 +111,36 @@
$maskcounter=$reg[1];
$maskraz=-1;
$maskoffset=0;
- if (strlen($maskcounter) < 3) return
'CounterMustHaveMoreThan3Digits';
+ if (strlen($maskcounter) < 3) return
'CounterMustHaveMoreThan3Digits';
+
+ if (eregi('\{(c+)\}',$mask,$regClientCode))
+ {
+ $maskclientcode=$regClientCode[1];
+
$clientcode=substr($objsoc->code_client,0,strlen($maskclientcode));//get n
first characters of client code to form maskrefclient_clientcode
+
$clientcode=str_pad($clientcode,strlen($maskclientcode),"_",STR_PAD_RIGHT);//padding
maskrefclient_clientcode for having exactly n characters in
maskrefclient_clientcode
+ $clientcode=sanitize_string($clientcode);//sanitize
maskrefclient_clientcode for sql insert and sql select like
+ }
+ else $maskclientcode='';
+
+ 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($objsoc->code_client,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) < 3) return
'CounterMustHaveMoreThan3Digits';
+ }
+ else $maskrefclient='';
+
$maskwithonlyymcode=$mask;
$maskwithonlyymcode=eregi_replace('\{(0+)(address@hidden)?(address@hidden)?\}',$maskcounter,$maskwithonlyymcode);
$maskwithonlyymcode=eregi_replace('\{dd\}','dd',$maskwithonlyymcode);
+
$maskwithonlyymcode=eregi_replace('\{(c+)\}',$maskclientcode,$maskwithonlyymcode);
+
$maskwithonlyymcode=eregi_replace('\{(c+)(0+)\}',$maskrefclient,$maskwithonlyymcode);
$maskwithnocode=$maskwithonlyymcode;
$maskwithnocode=eregi_replace('\{yyyy\}','yyyy',$maskwithnocode);
$maskwithnocode=eregi_replace('\{yy\}','yy',$maskwithnocode);
@@ -159,11 +185,25 @@
$sqlstring='SUBSTRING(ref, '.($posnumstart+1).',
'.strlen($maskcounter).')';
//print "x".$sqlstring;
+ // Build 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 ($maskclientcode) $maskLike =
str_replace(sanitize_string('{'.$maskclientcode.'}'),str_pad("",strlen($maskclientcode),"_"),$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."propal";
- $sql.= " WHERE ref not like '(%'";
+ //$sql.= " WHERE ref not like '(%'";
+ $sql.= " WHERE ref like '".$maskLike."'";
if ($sqlwhere) $sql.=' AND '.$sqlwhere;
//print $sql;
@@ -178,15 +218,58 @@
if (empty($counter) || eregi('[^0-9]',$counter))
$counter=$maskoffset;
$counter++;
+ if($maskrefclient)
+ {//get refclient values
+
+
$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(ref,
'.($maskrefclient_posnumstart+1).', '.strlen($maskrefclient_maskcounter).')';
+ //print "x".$maskrefclient_sqlstring;
+
+ // Build 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);
+ if ($maskclientcode) $maskrefclient_maskLike =
str_replace(sanitize_string('{'.$maskclientcode.'}'),str_pad("",strlen($maskclientcode),"_"),$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."propal";
+ //$sql.= " WHERE ref not like '(%'";
+ $maskrefclient_sql.= " WHERE ref like
'".$maskrefclient_maskLike."'";
+ if ($sqlwhere) $maskrefclient_sql.=' AND '.$sqlwhere;
//use the same sqlwhere as general mask
+ $maskrefclient_sql.=' AND (SUBSTRING(ref,
'.(strpos($maskwithnocode,$maskrefclient)+1).',
'.strlen($maskrefclient_maskclientcode).")='".$maskrefclient_clientcode."')";
+
+ //print $maskrefclient_sql;
+ dolibarr_syslog("mod_propale_saphir::getNextValue
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
+ // 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.'}';
@@ -194,6 +277,14 @@
//print 'x'.$maskbefore.'-'.$maskafter.'y';
$numFinal = str_replace($maskbefore,$maskafter,$numFinal);
+ // Now we replace the refclient
+ if($maskrefclient)
+ {
+ $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("mod_propale_saphir::getNextValue return
".$numFinal);
return $numFinal;
}
- Re: [Dolibarr-dev] idée compteur à ma sque client, (continued)
- Re: [Dolibarr-dev] idée compteur à ma sque client, Raphaël Bertrand (Résultic), 2008/06/12
- Re: [Dolibarr-dev] idée compteur à ma sque client, Rodolphe Quiedeville, 2008/06/12
- Re: [Dolibarr-dev] idée compteur à ma sque client, Raphaël Bertrand (Résultic), 2008/06/13
- Re: [Dolibarr-dev] idée compteur à ma sque client (patch saphir propales), Raphaël Bertrand (Résultic), 2008/06/13
- Re: [Dolibarr-dev] patch compteur à masque client et numéro chrono, Raphaël Bertrand (Résultic), 2008/06/13
- Re: [Dolibarr-dev] patch selection client fichinter obligatoire avant saisie, Raphaël Bertrand (Résultic), 2008/06/13
- Re: [Dolibarr-dev] patch compteur à masque client et numéro chrono, Eldy, 2008/06/17
- Re: [Dolibarr-dev] patch compteur à masque client et numéro chrono, Raphaël Bertrand (Résultic), 2008/06/17
- Re: [Dolibarr-dev] patch compteur à masque client et numéro chrono, Eldy, 2008/06/17
- Re: [Dolibarr-dev] patch compteur à masque client et numéro chrono, Raphaël Bertrand (Résultic), 2008/06/18
- Re: [Dolibarr-dev] patch compteur à masque client et numéro chrono,
Raphaël Bertrand (Résultic) <=
- Re: [Dolibarr-dev] patch compteur à masque client et numéro chrono, Eldy, 2008/06/20
- Re: [Dolibarr-dev] patch compteur à masque client et numéro chrono, Raphaël Bertrand (Résultic), 2008/06/23
- Re: [Dolibarr-dev] patch compteur à masque client et numéro chrono, Raphaël Bertrand (Résultic), 2008/06/23
- Re: [Dolibarr-dev] patch compteur à masque client et numéro chrono, Eldy, 2008/06/28
- Re: [Dolibarr-dev] patch compteur à masque client et numéro chrono, Raphaël Bertrand (Résultic), 2008/06/30
- Re: [Dolibarr-dev] patch compteur à masque client et numéro chrono, Raphaël Bertrand (Résultic), 2008/06/23