Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 27/01/2014, à 22: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, à 22: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, à 22: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, à 07: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, à 11: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.

Hors ligne

#6 Le 28/01/2014, à 15: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, à 15:12

moths-art

Re : Numéro unique pour une facture

pingouinux a écrit :

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" wink
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, à 15:13)

Hors ligne

#8 Le 28/01/2014, à 16: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, à 18:26)

Hors ligne

#9 Le 28/01/2014, à 16: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. cool

excellent.

Dernière modification par moths-art (Le 28/01/2014, à 16:24)

Hors ligne

#10 Le 28/01/2014, à 18: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