You are not logged in.
Bonjour,
nous avons fait un léger hack de GLPI pour autogénérer un numéro d'inventaire de la forme : YYMM0000
ou 0000 est incrémenté à chaque ajout de nouveau matériel dans le mois et l'année en cours .. Il faut MySQL 4 pour que cela fonctionne (UNION)
Si vous trouvez l'idée intéressante, cela sera bien si on pouvait l'integrer à une release de GLPI sous forme d'option...!
Voici le code :
[glpi/common/functions.inc.php]
FUNCTION RenvoiNumeroInventaire()
{
$db = new DB;
$REQSelectionNoInv = "SELECT ";
$REQSelectionNoInv .= "LPAD(MAX(CONVERT(otherserial,unsigned integer)+1),8,'0') AS otherserial from (SELECT otherserial ";
$REQSelectionNoInv .= "FROM glpi_computers ";
$REQSelectionNoInv .= "UNION ";
$REQSelectionNoInv .= "SELECT otherserial FROM glpi_monitors ";
$REQSelectionNoInv .= "UNION ";
$REQSelectionNoInv .= "SELECT otherserial FROM glpi_networking ";
$REQSelectionNoInv .= "UNION ";
$REQSelectionNoInv .= "SELECT otherserial FROM glpi_peripherals ";
$REQSelectionNoInv .= "UNION ";
$REQSelectionNoInv .= "SELECT otherserial FROM glpi_printers ";
$REQSelectionNoInv .= "UNION ";
$REQSelectionNoInv .= "SELECT ";
$REQSelectionNoInv .= "LPAD(CONVERT(CONCAT(SUBSTRING(YEAR(current_date()),";
$REQSelectionNoInv .= "2),LPAD( MONTH( current_date( ) ) , 2, '0' ),'0000'),unsigned integer)-1,8,'0') ";
$REQSelectionNoInv .= "AS otherserial) ";
$REQSelectionNoInv .= "AS tbl";
$RESSelectionNoInv = $db->query($REQSelectionNoInv);
$NumeroInventaire = $db->result($RESSelectionNoInv,0,"otherserial");
RETURN($NumeroInventaire);
}
[glpi/computers/functions.inc.php]
if($withtemplate==2)
{
$NumeroInventaire = RenvoiNumeroInventaire();
echo '<td><input type="text" size="20" name="otherserial" VALUE="'.$NumeroInventaire.'" READONLY>';
}
else
{
echo "<td><input type='text' size='20' name='otherserial' value=\"".$comp->fields["otherserial"]."\" READONLY>";
}
[glpi/monitors/functions.inc.php]
if($withtemplate==2)
{
$NumeroInventaire = RenvoiNumeroInventaire();
echo '<td><input type="text" size="20" name="otherserial" value="'.$NumeroInventaire.'" READONLY>';
}
else
{
echo "<td><input type='text' size='20' name='otherserial' value=\"".$mon->fields["otherserial"]."\" READONLY></td>";
}
.... etc ...
Last edited by therebel (2006-01-11 18:27:26)
Offline
idée intérresante effectivement.
a voir avec les dev cela peux etre une options dans le plugin d'OCS
Jm0u
Navigateurs : Chrome
Installation : Package GLPI 0.84.2
Serveur : Apache 2 / Base : 5.0.15 / Langage : PHP 4.4.1 pl1 / PhpMyAdmin 2.6.4-pl3
Offline
Merci pour votre contribution,
ça me parait spécifique comme numérotation, c'est le pb
JMD / Jean-Mathieu Doléans - Glpi-project.org - Association Indepnet
Apportez votre pierre au projet GLPI : Soutenir
Offline
Oui, c'est vrai ..
Il faudrait voir si d'autres personnes ont d'autres numérotations et en faire un système de numérotation générique ...
Offline
Bonjour
en ce qui nous concerne, le numéro d'inventaire n'est pas basé sur le même principe de numérotation. Il n'y a pas que le matériel informatique qui est inventorié, l'incrémentation de ce numéro ne me semble donc, en ce qui nous concerne pas très interessant...
voilà pour notre avis... maintenant, c'est à voir pour les autres....
glpi 0.72.3 ( MAJ de version 0.68) - depuis tar.gz
centos 4.8 - 2.6.9-89.0.16.E - php 5.2.3 - mysql 4.1.22
Offline
C'est surtout que ce n'est pas applicable pour des pc immobilisé les années précédentes
Xavier Caillaud
Blog GLPI Infotel
Offline
Bonjour,
Si cette modification était apportée, ce serait bien qu'elle soit au choix de l'utilisateur lors de la configuration. En effet, je numérote différemment les éléments de mon parc, par exemple, ajout d'une lettre à la fin du numéro pour différencier (dans le tableur lors de l'export) la nature de ces éléments : R pour réseau, IP pour imprimante portable, P pour pc portable, etc....
OU dans forêt AD - système : serveur: ubuntu server 10.10 - Apache/2.2.16 (Ubuntu) - Version du client MySQL: 5.1.49 -
OCS server linux 2.0RC2 - agent windows 4.0.5.4 - GLPI 0.78.2 - Firefox 3.6
-o-o-o-o-o-
Ce n'est pas parce que c'est difficile qu'on n'ose pas, C'est parce qu'on n'ose pas que c'est difficile.
Offline
Je trouve cette inplémentation tres interessante, c'est d'ailleurs pour moi un des points le plus bloquant a la mise en prod de GLPI nous numérotons spécifiquement notre matériel par type (ecran, UC, consommable, imprimante) puis par entité (pôle fonctionnel de notre groupe) et cela m'interaisserai vivmenet que au moins GLPI puisse numéroter de façon plus intelligente le matériel. de plus pour qu'il puisse aparaitre de façon claire sur no stickage d'UC
Je pense que notre stagiaire développement WEB vas s'occuper de cela assez vite car ça nous manque, si vous avez des idées la dessus on pourrai créer une numérotation symbolique pouvant convenir a une grande majorité de nous tous
Cordialement
Offline
Je ne saisi pas bien là où se situe le pb.
GLPI ne propose pas de numérotation intelligente ou stupide d'ailleurs....
Vous avez un disposition un champs numéro de série ou numéro d'inventaire vous mettez ce que vous voulez avec vos contraintes.
De plus avec le lien OCS-NG cette problématique peut être reportée sur le client ocs.
JMD / Jean-Mathieu Doléans - Glpi-project.org - Association Indepnet
Apportez votre pierre au projet GLPI : Soutenir
Offline
J'ajouterais qu'il y a très peu de chances que tous les utilisateurs utilisent une règle de numérotation similaire : chez moi par exemple, le numéro est de la forme
xxxyzzzz avec
xxx = type de matériel (SRV = serveur, UCD = desktop, UCP = portable, IMP = imprimante ...)
y = N° correspondant au site
zzzz = N° d'ordre.
Certaines applications de type GED permettent de paramétrer la génération du code, mais je pense que ce sera très compliqué de satisfaire tout le monde.
GLPI 0.71.5 / OS : Windows 2000 Server - SP4 / Décompactage : 7zip
Installation : Package Ocs NG 1.0 - Navigateurs : Internet Explorer 7
Serveur : Apache 2.2.3 / Base : mysql 5.0.27 / Langage : PHP 5.2.0 / PhpMyAdmin 2.9.1.1
Offline
Pour répondre à JMD,
effectivement libre à chacun de saisir un numéro d'inventaire comme il le souhaite, mais c'est bien là le problème :
La personne avant de créer un matériel doit s'assurer que le numéro d'inventaire n'est pas pris .. Générallement, c'est au moment précis ou elle saisit le champ qu'elle se pose la question .. => La generation automatique evite cela ..
D'autre part, il peut arriver qu'une personne se trompe et saisisse un numéro d'inventaire déjà existant (l'erreur est humaine) => idem
En tout cas, il est clair que développer un système générique de numéro d'inventaires n'est pas trivial ..
Offline
Dans la 0.65 vous bénéficierez d'un système d'autocomplétion au fur et à mesure que vous saisissez votre numéro de série (et d'autres entrées d'ailleurs) glpi vous affichera les existants.
JMD / Jean-Mathieu Doléans - Glpi-project.org - Association Indepnet
Apportez votre pierre au projet GLPI : Soutenir
Offline
et bien VANB jen'utilise pas du tout ta codification mais je peux dire sans probleme qu'elle pourrai tout a fait me convenir car elle ressemble beaucoup a la mienne
et comme tu le dis une GED propose des codifications et on fait avec ... et moi je ferai bien avec kke chose car ça me manque ..!
je pense tout de meme que l'on pourrai developper une plug-in assez complet de numérotation automatique du champ inventaire on a tout les données que l'on veux ici, si des gens on besoin d'autre chose c'est clair que l'on peu rien y faire comme c'est le cas pour Alpha28, mais la c'est que il n'y'a pas que l'informatique qui est numéroté de façon incrémentielle, donc il a ou un autre outil ou un bon cahier lol mais nous ce qu'il nous faut c'est clairement un complément a l'ID, qui est pour moi une numérotation tout bête.
mais il es clair que le type de matériel (ecran, desktop, serveur ... enfin le contenu de la dropdown type en fait) pkoi pas la veleur du champ domaine ou reseau ou autre dropdown plus l'ID et pkoi pas la date je vois pas quoi faire de mieux si un champ libre, mais moi je trouve que la numérotation de VANB est des plus logique et me conviendrai meme a moi
au fait félicatation les Développeurs d'OCS et GLPI superbe présentation a Linux solution .. encore clap clap
Last edited by ddfdom (2006-01-31 23:53:36)
Offline
au fait félicatation les Développeurs d'OCS et GLPI superbe présentation a Linux solution .. encore clap clap
Merci pour vos encouragements
JMD / Jean-Mathieu Doléans - Glpi-project.org - Association Indepnet
Apportez votre pierre au projet GLPI : Soutenir
Offline
Bonjour à tous,
Je propose ici une solution à la numérotation automatique. Elle a le mérite d'être paramétrable
La fonction ci après est à insérer dans glpi/glpi/common/functions_db.php (c'est l'endroit qui m'a paru le plus approprié). Elle peut être appliquée à tout champ texte de tout objet de l'inventaire : nom, numéro d'inventaire ...
//***************************************************************
// Création automatique d'un nouveau code à partir du gabarit
// @object : objet concerné
// @field : nom de champ du gabarit contenant le format du code
// @isTemplate : true si template new
// @type : type d'objet
function autoName(&$object, $field, $isTemplate, $type)
{
global $LINK_ID_TABLE;
$objectName = isset($object->fields[$field]) ? $object->fields[$field] : '';
$len = strlen($objectName);
if($isTemplate && $len > 8
&& substr($objectName,0,4) === '<' && substr($objectName,$len - 4,4) === '>')
{
$autoNum = substr($objectName, 4, $len - 8);
$mask = '';
if(preg_match( "/\\#{1,10}/", $autoNum, $mask))
{
$global = strpos($autoNum, '\\g') !== false && $type != INFOCOM_TYPE ? 1 : 0;
$autoNum = str_replace(array('\\y','\\Y','\\m','\\d','_','%','\\g'), array(date('y'),date('Y'),date('m'),date('d'),'\\_','\\%',''), $autoNum);
$mask = $mask[0];
$pos = strpos($autoNum, $mask) + 1;
$len = strlen($mask);
$like = str_replace('#', '_', $autoNum);
if ($global == 1)
{
$query = "";
$first = 1;
foreach($LINK_ID_TABLE as $t=>$table)
{
if ($t == COMPUTER_TYPE || $t == MONITOR_TYPE || $t == NETWORKING_TYPE
|| $t == PERIPHERAL_TYPE || $t == PRINTER_TYPE || $t == PHONE_TYPE)
{
$query .= ($first ? "select " : " union select ")."$field as code from $table where $field like('$like') "
."and deleted = 'N' and is_template = '0'";
$first = 0;
}
}
$query = "select cast(substring(code, $pos, $len) as unsigned) as no from ($query) as codes";
}
else
{
$table = $LINK_ID_TABLE[$type];
$query = "select cast(substring($field, $pos, $len) as unsigned) as no from $table"
." where $field like('$like')";
if ($type != INFOCOM_TYPE)
$query .= " and deleted = 'N' and is_template = '0'";
}
$query = "select max(Num.no) as lastNo from (".$query.") as Num";
$db = new db;
$resultNo = $db->query($query) or die($db->error());
if ($db->numrows($resultNo)>0)
{
$data = $db->fetch_array($resultNo);
$newNo = $data['lastNo'] + 1;
}
else
$newNo = 0;
$objectName = str_replace(array($mask,'\\_','\\%'), array(str_pad($newNo, $len, '0', STR_PAD_LEFT),'_','%'), $autoNum);
}
}
return $objectName;
}
Il faut ensuite insérer l'appel à cette fonction dans les pages de type glpi/glpi/computers/functions.php
Par exemple pour les ordinateurs :
remplacer
autocompletionTextField("name","glpi_computers","name",$comp->fields["name"],20);
par
$objectName = autoName($comp, "name", ($template === "newcomp"), COMPUTER_TYPE);
autocompletionTextField("name","glpi_computers","name",$objectName,20);
Par exemple pour les noms d'imprimantes:
remplacer
autocompletionTextField("name","glpi_printers","name",$printer->fields["name"],20);
par
$objectName = autoName($printer, "name", ($template === "newcomp"), PRINTER_TYPE);
autocompletionTextField("name","glpi_printers","name",$objectName,20);
Pour l'utiliser, il faut insérer une chaine de formatage dans le champ du gabarit qui doit être en numérotation automatique, le nom par exemple.
Le format est de la forme :
<XXX####X>
< et > en début et fin du format indiquent qu'il s'agit d'un format.
X représente un caractère quelconque
\g : recherche du numéro parmis tous les champs identiques basés sur le même format
# : emplacement du numéro à incrémenter nombre de chiffres égal au nombre de #
\Y : année sur 4 chiffres
\y : année sur 2 chiffres
\m : mois
\d : jour
Si le format n'est pas reconnu, GLPI ne fait rien et conserve le nom saisi dans le gabarit lors de la création de l'objet.
Si le format est reconnu, la fonction renverra le plus grand code de la forme XXX####X avec le numéro incrémenté de 1.
Par exemple j'ai défini plusieurs gabarits avec les formats suivants :
Gabarit desktop : format du nom = <UCD3####>
Gabarit portable : format du nom = <UCP3####>
Gabarit imprimante: format du nom = <IMP3####>
Le format du code de therebel (premier post de ce sujet) s'écrirait :
<\g\y\m####>
A la création de chacun des objets, le nom est défini automatiquement sur le suivant dans sa catégorie, par exemple UCD30235.
La fonction pourrait être améliorée pour traiter d'autres éléments.
Il resterait à pouvoir définir le nombre de machines à ajouter lors d'une création pour en générer toute une série et répondre à un bon nombre de demandes du forum.
Cordialement
Last edited by VANB (2006-03-25 11:44:12)
GLPI 0.71.5 / OS : Windows 2000 Server - SP4 / Décompactage : 7zip
Installation : Package Ocs NG 1.0 - Navigateurs : Internet Explorer 7
Serveur : Apache 2.2.3 / Base : mysql 5.0.27 / Langage : PHP 5.2.0 / PhpMyAdmin 2.9.1.1
Offline
alors la je dis bravo .... c'est vriament une belle idée d'utiliser les gabarits .. meme si ça risque d'en embetter certains
moi je dis bravo et je vais aller tester cela dès ce soir sur ma plateforme de test
mais je jubile d'avance
Offline
Merci pour ton enthousiasme. Il n'y a pas de raison pour que ça embète quelqu'un : c'est complètement transparent si on n'utilise pas une valeur conforme au format. De plus, cela fonctionne aussi dans le "blank template" que l'on utilise obligatoirement si l'on n'a pas créé de gabarits. Dans mon cas, je suis obkigé de le faire car le premier chiffre après les lettres indique le site : les formats seront :
<UCD1####> pour le site 1
<UCD2####> pour le site 2
...
avec un gabarit pour chaque type de machine dans chaque site : on peut les appeler par exemple :
Site 1 Desktop
Site 2 Desktop
...
Petit bonus : on peut appliquer la méthode aux champs des informations commerciales (numéro d'inventaire par exemple).
Dans glpi/glpi/infocoms/functions.php
Remplacer
autocompletionTextField("num_immo","glpi_infocoms","num_immo",$ic->fields["num_immo"],25,$option);
par
$objectName = autoName($ic, "num_immo", ($withtemplate==2), INFOCOM_TYPE);
autocompletionTextField("num_immo","glpi_infocoms","num_immo",$objectName,25,$option);
et dans glpi/glpi/computers/functions.php
// ADD Infocoms
$ic= new Infocom();
if ($ic->getFromDB(COMPUTER_TYPE,$oldID)){
$ic->fields["FK_device"]=$newID;
// Ajouter le 2 lignes qui suivent
if (isset($ic->fields["num_immo"])) {
$ic->fields["num_immo"] = autoName($ic, "num_immo", 1, INFOCOM_TYPE);
}
// fin de patch
unset ($ic->fields["ID"]);
$ic->addToDB();
J'espère que les devs prendront cela en compte car il y a des modifs à beaucoup d'endroits, surtout si on l'étend à tous les objets et tous les champs susceptibles d'une numérotation automatique, et les refaire à chaque release sera vite fastidieux. Donc, merci à eux d'avance si mon idée est acceptée
Last edited by VANB (2006-03-25 11:45:54)
GLPI 0.71.5 / OS : Windows 2000 Server - SP4 / Décompactage : 7zip
Installation : Package Ocs NG 1.0 - Navigateurs : Internet Explorer 7
Serveur : Apache 2.2.3 / Base : mysql 5.0.27 / Langage : PHP 5.2.0 / PhpMyAdmin 2.9.1.1
Offline
moi je trouve la technique tres bonne et je te remercie beaucoup pour ton travail en esperant une intégration par les devs
je parlais de probleme si tu avais des templates séparés pour plour plusieurs types de machines alors que les numeros doivent ce suivre ... enfin je ne sais pas si je suis clair
Offline
Si, je crois comprendre. Tout dépend de ta codification. La numérotation est liée au format et non au gabarit.
Voila deux exemples. On suppose qu'il n'y a aucune machine au départ.
Si tu enregistres le même format sur plusieurs gabarits, la numérotation sera continue pour tous les gabarits :
Gabarit 1 - format <ABC####>
Gabarit 2 - format <ABC####>
on crée une machine avec Gabarit 1 : son numéro est ABC0001
on crée une machine avec Gabarit 2 : son numéro est ABC0002
Si les formats sont différents, la numérotation sera continue pour chaque gabarit :
Gabarit 1 - format <ABC####>
Gabarit 2 - format <DEF####>
on crée une machine avec Gabarit 1 : son numéro est ABC0001
on crée une machine avec Gabarit 2 : son numéro est DEF0001
GLPI 0.71.5 / OS : Windows 2000 Server - SP4 / Décompactage : 7zip
Installation : Package Ocs NG 1.0 - Navigateurs : Internet Explorer 7
Serveur : Apache 2.2.3 / Base : mysql 5.0.27 / Langage : PHP 5.2.0 / PhpMyAdmin 2.9.1.1
Offline
alors la je te tire mon chapeau,
j'ai pas trop analysé ton code ( je suis pas un expert en codage mais j'arrive a me demerder a lire du PHP) que je regarde un peu ton super boulot
encore une fois super ...
et surtout merci
Offline
Merci de tes encouragements.
J'ai modifié un peu la fonction dans le premier post pour couvrir le besoin à l'origine de ce sujet. Si tu l'as déjà utilisée, il suffit que tu recopies la nouvelle version à la place de l'ancienne.
On peut maintenant introduire des dates dans le code :
\Y : année sur 4 chiffres
\y : année sur 2 chiffres
\m : mois
\d : jour
Le format du code du premier post de ce sujet s'écrirait :
<\y\m####>
Last edited by VANB (2006-03-18 11:11:16)
GLPI 0.71.5 / OS : Windows 2000 Server - SP4 / Décompactage : 7zip
Installation : Package Ocs NG 1.0 - Navigateurs : Internet Explorer 7
Serveur : Apache 2.2.3 / Base : mysql 5.0.27 / Langage : PHP 5.2.0 / PhpMyAdmin 2.9.1.1
Offline
J'ai compété la fonction pour que sur option, la recherche se fasse sur tous les objets de l'inventaire (voir le post plus haut : je l'ai modifié pour ne pas trop charger le forum). Il faut bien-sur que les champs concernés existent dans toutes les tables, mais c'est le cas pour ceux susceptibles de contenir un code et nos chers devs ont eu la bonne idée de leur donner le même nom (merci à eux ).
GLPI 0.71.5 / OS : Windows 2000 Server - SP4 / Décompactage : 7zip
Installation : Package Ocs NG 1.0 - Navigateurs : Internet Explorer 7
Serveur : Apache 2.2.3 / Base : mysql 5.0.27 / Langage : PHP 5.2.0 / PhpMyAdmin 2.9.1.1
Offline
Alors ddfom, as-tu testé et est-ce que cela répond à ton besoin ?
GLPI 0.71.5 / OS : Windows 2000 Server - SP4 / Décompactage : 7zip
Installation : Package Ocs NG 1.0 - Navigateurs : Internet Explorer 7
Serveur : Apache 2.2.3 / Base : mysql 5.0.27 / Langage : PHP 5.2.0 / PhpMyAdmin 2.9.1.1
Offline
alors la chapeau j'ai testé hier soir (pas eu le tps avant en fait) et c'est vraiment pas mal ......
on a vu cet AM avec mes collègues comment nous allions former nos templates pour gérer cela
si il serai ptet sympa c'est de pouvoir intéger un des champs (quelconque et customisable je sais j'exagere) dans la numérotation
mais moi ça me parfait deja tres bien
aah si ptet la j'y pense ... peut on modifier le type de zone pour lorsqu'elle détecte un format de numéro auto que le champ ne soi vérouillé ... c'est ptet pas tres intélligent mais ce sera ptet une demande
je fait que donné mes idées
mais je te félicite c'est ttres bien ainsi clap clap
y'a plus qu'a voir si les devs peuvent l'intégrer au code de GLPI parce que je pense qu'un plug ins est pas réalisable de la sorte
Offline
aah si je vois ptet un soucis dans une gestion fine des templates
genre je fait des templates de différents portable mais je voudrai qu'ils soient tous numérotés sous la même typologie
un exemple des fois c'est mieux
j'ai des portables P123 et des portable P456 j'ai fait deux templates différents
mais je voudrai qu'ils soient tous les deux numérotés sous la meme référence de type UC_P_XXXX
j'avous ne pas avoir tester si cela fonctionnai ?? mais je ne pense pas
mans dans l'etat actuel des choses ça me conviens tres bien
Offline