Pages : 1
#1 Le 27/01/2014, à 21:13
- chris_wafer
Numéro unique pour une facture
Bonjour,
Je cherche à faire un script qui me permettrait de donner un numéro unique à des factures à chaque fois qu'il se lance.
Comment faire? Il faut prendre la date?
Merci d'avance.
Hors ligne
#2 Le 27/01/2014, à 21:20
- pingouinux
Re : Numéro unique pour une facture
Bonsoir,
Si les numéros n'ont pas besoin d'être consécutifs :
date -u +"%s"
C'est le nombre de secondes écoulées depuis le 1er janvier 1970.
Hors ligne
#3 Le 27/01/2014, à 21:23
- chris_wafer
Re : Numéro unique pour une facture
Et si je fais deux demandes dans la même seconde?
Hors ligne
#4 Le 28/01/2014, à 06:55
- pingouinux
Re : Numéro unique pour une facture
C'est que tu es rapide, ou alors c'est un script qui génère les numéros. Tu peux dans ce cas ajouter les nanosecondes.
date -u +"%s%N"
Hors ligne
#5 Le 28/01/2014, à 10:30
- moths-art
Re : Numéro unique pour une facture
La meilleur normalisation de numéro de facture (parce tout n'est pas légal en France), à ma connaissance, est d'utiliser la date suivit d'un incrément.
exemple : 18-02-2014-06
On voit tout de suite que c'est la 6ème facture du 18 février 2014.
Pour la date :
date -u +"%d-%m-%Y"
Pour l'incrément, si tu veux faire simple :
créer un fichier qui contient la valeur de l'incrément (soit "0" pour commencer):
cat > increment_file << EOF
0
EOF
à chaque lancement, tu vérifies que le fichier a bien la date d'aujourd'hui.
sinon, réinitialisation. (commande "touch")
Puis tu récupères la valeur et tu l'incrémentes.
if [ $(date -u +"%d-%m-%Y") == $(find increment_file -printf "%Td-%Tm-%TY\n") ];then
INC=$(expr $(cat increment_file) + 1);
echo $(date -u +"%d-%m-%Y")'-'$INC;
cat > increment_file << EOF
$INC
else
touch increment_file;
cat > increment_file << EOF
0
fi
Il existe bien évidement d'autres méthodes plus complexe : enregistrement en base de donnée etc.
Site : https://mothsart.github.io Dépôts Git : https://github.com/mothsart PPAs : https://launchpad.net/~jerem-ferry
Hors ligne
#6 Le 28/01/2014, à 14:00
- pingouinux
Re : Numéro unique pour une facture
@moths-art :
Je ne connaissais pas cette utilisation de find (en donnant directement le nom du fichier).
Ton script, tel que tu le donnes en #5, ne fonctionne pas:
- il manque les EOF
- en cas de changement de jour, increment_file est bien remis à zéro, mais rien n'est affiché
En voici une version qui met en œuvre ton idée, et qui ne nécessite pas de créer le fichier d'incrément la première fois :
#!/bin/bash
fic_incr="/tmp/increment_file"
dat=$(date -u +"%d-%m-%Y")
dat_fic=$(find "$fic_incr" -printf "%Td-%Tm-%TY\n" 2>/dev/null)
[ $dat = "$dat_fic" ] && INC=$(cat "$fic_incr") || INC=0
((INC++))
echo $INC >"$fic_incr"
echo $dat'-'$INC;
Il faut juste initialiser le nom du fichier d'incrément, à la 3ème ligne du script (je l'ai testé dans /tmp).
Hors ligne
#7 Le 28/01/2014, à 14:12
- moths-art
Re : Numéro unique pour une facture
Je ne connaissais pas cette utilisation de find (en donnant directement le nom du fichier).
Le bash c'est pas toujours très rationnel, c'est bourré de snippet qu'on apprend et réutilise au fil de l'eau.
C'est étonnant que ça fonctionne pas... j'ai testé un minimum avant de publier.
Peux-être une subtilité de zsh? Je vais pas chercher à savoir...
Merci pour ton complément "pingouinux"
En général, lorsqu'un script shell dépasse les 10 lignes, je le converti en python... là, je me suis fait violence.
Dernière modification par moths-art (Le 28/01/2014, à 14:13)
Site : https://mothsart.github.io Dépôts Git : https://github.com/mothsart PPAs : https://launchpad.net/~jerem-ferry
Hors ligne
#8 Le 28/01/2014, à 15:06
- claudius01
Re : Numéro unique pour une facture
Bonjour,
Je me permets d'apporter une maigre contribution concernant une protection d'accès concurrent au fichier chrono '/tmp/increment_file' qui est une ressource non partageable en écriture et inspirée de How do I synchronize (lock/unlock) access to a file in bash from multiple scripts? qui s'appuie sur man lockfile(1).
#!/bin/bash
lockfile /tmp/increment_file.lock
fic_incr="/tmp/increment_file"
dat=$(date -u +"%d-%m-%Y")
dat_fic=$(find "$fic_incr" -printf "%Td-%Tm-%TY\n" 2>/dev/null)
[ $dat = "$dat_fic" ] && INC=$(cat "$fic_incr") || INC=0
((INC++))
echo $INC >"$fic_incr"
echo $dat'-'$INC;
rm -f /tmp/increment_file.lock
NB: Pour tester si c'est efficace, insérer un read juste avant le 'rm -f /tmp/increment_file.lock' et lancer une seconde fois le script depuis une autre console...
Edit: Ajout de "... ressource non partageable en écriture ..."
Cordialement, A+
--
Claudius
Dernière modification par claudius01 (Le 28/01/2014, à 17:26)
Hors ligne
#9 Le 28/01/2014, à 15:24
- moths-art
Re : Numéro unique pour une facture
maigre contribution plus que recevable!!!
Je ne savais même pas qu'on pouvait faire ça aussi simplement en shell.
excellent.
Dernière modification par moths-art (Le 28/01/2014, à 15:24)
Site : https://mothsart.github.io Dépôts Git : https://github.com/mothsart PPAs : https://launchpad.net/~jerem-ferry
Hors ligne
#10 Le 28/01/2014, à 17:29
- pingouinux
Re : Numéro unique pour une facture
Je viens de tester l'amélioration de claudius01, et c'est effectivement mieux.
Hors ligne