Conto
Da Slacky.eu.
Descrizione
Conto.sh e' un scrip di shell per tenere una semplice contabilità entrate ed uscite (versamenti e prelevamenti). L'elaborazione consente di ottenere i saldi mensili. E' possibile plottare i grafici degli ultimi 240 movimenti e dei saldi degli ultimi 24 mesi.
Download
http://www.slacky.eu/misto/concorso/mimmoforlug/conto.sh
Script
#!/bin/sh
######################################################################
# #
# conto.sh (13/09/2007) #
# #
# conto.sh e' un scrip di shell per tenere una semplice #
# contabilita' entrate ed uscite (versamenti e prelevamenti). #
# L'elaborazione consente di ottenere i saldi mensili. #
# E' possibile plottare i grafici degli ultimi 240 movimenti #
# e dei saldi degli ultimi 24 mesi. #
# #
# Dipendenze: bash, sed, awk, gnuplot #
# #
# Per la portabilita' e' necessario verificare le impostazioni di #
# awk riguardo all'uso del saparatore decimale (virgola o punto) #
# ed eventualmente modificare le righe dalla 209 alla 226. #
# #
# Testato su sistema GNU/Linux Slackware 12 #
# e su familiar linux per PocketPC. #
# #
# Autore: Domenico Suppa #
# #
######################################################################
intestazioni_conto="OP DATA PRELIEVI VERSAMENTI DISPONIBILE"
dati=Conto.txt
saldi_mensili="mesi_"$dati
############ Se il file di dati non esiste viene creato ##############
if [ ! -e $dati ]; then
d=`date +%d/%m/%Y`
echo $intestazioni_conto > $dati
echo "CON $d 0.00 0.00 0.00" >> $dati
fi
############ I comandi awk necessari per l'elaborazione ##############
echo "" > elaboraconto-awk.awk
echo ' BEGIN {' >> elaboraconto-awk.awk
echo ' FS="\t+";' >> elaboraconto-awk.awk
echo ' OFS="\t";' >> elaboraconto-awk.awk
echo ' CONVFMT="%10.2f";' >> elaboraconto-awk.awk
echo ' OFMT="%10.2f";' >> elaboraconto-awk.awk
echo ' saldo=0;' >> elaboraconto-awk.awk
echo ' sm=0;' >> elaboraconto-awk.awk
echo ' da="";' >> elaboraconto-awk.awk
echo ' de="";' >> elaboraconto-awk.awk
echo ' spm=0;' >> elaboraconto-awk.awk
echo ' svm=0;' >> elaboraconto-awk.awk
echo ' i=0;' >> elaboraconto-awk.awk
echo ' j=0;' >> elaboraconto-awk.awk
echo ' }' >> elaboraconto-awk.awk
echo ' {' >> elaboraconto-awk.awk
echo ' if(j==0){' >> elaboraconto-awk.awk
echo ' j++;' >> elaboraconto-awk.awk
echo ' print $0;' >> elaboraconto-awk.awk
echo ' }' >> elaboraconto-awk.awk
echo ' else{' >> elaboraconto-awk.awk
echo ' sp += $3;' >> elaboraconto-awk.awk
echo ' sv += $4;' >> elaboraconto-awk.awk
echo ' de=substr($2, length($2)-6);' >> elaboraconto-awk.awk
echo ' if(da==de){' >> elaboraconto-awk.awk
echo ' spm += $3;' >> elaboraconto-awk.awk
echo ' svm += $4;' >> elaboraconto-awk.awk
echo ' sm=svm-spm;' >> elaboraconto-awk.awk
echo ' i++;' >> elaboraconto-awk.awk
echo ' ' >> elaboraconto-awk.awk
echo ' }' >> elaboraconto-awk.awk
echo ' else{' >> elaboraconto-awk.awk
echo ' if(j>1)printf("%s\t00/%s\t%8.2f\t%8.2f\t%10.2f\t%10.2f\t%i\n", "SLM", da, spm, svm, sm, saldo, i);' >> elaboraconto-awk.awk
echo ' spm = $3;' >> elaboraconto-awk.awk
echo ' svm = $4;' >> elaboraconto-awk.awk
echo ' sm = svm-spm;' >> elaboraconto-awk.awk
echo ' i=1;' >> elaboraconto-awk.awk
echo ' da=de;' >> elaboraconto-awk.awk
echo ' }' >> elaboraconto-awk.awk
echo ' saldo=sv-sp;' >> elaboraconto-awk.awk
echo ' sp1 = $3; sv1 = $4;' >> elaboraconto-awk.awk
echo ' printf("%s\t%s\t%8.2f\t%8.2f\t%10.2f\n", $1, $2, sp1, sv1, saldo);' >> elaboraconto-awk.awk
echo ' j++;' >> elaboraconto-awk.awk
echo ' }' >> elaboraconto-awk.awk
echo ' }' >> elaboraconto-awk.awk
echo ' END {' >> elaboraconto-awk.awk
echo ' printf("%s\t00/%s\t%8.2f\t%8.2f\t%10.2f\t%10.2f\t%i\n", "SLM", da, spm, svm, sm, saldo, i);' >> elaboraconto-awk.awk
echo ' }' >> elaboraconto-awk.awk
################## ripuliamo il terminale ############################
clear
echo
########## loop principale per l'immissione dei comandi ##############
while :
do
########################## menu principale ###########################
echo " n) nuovo movimento"
echo " l) lista ultimi 20 movimenti"
echo " e) elaborazione saldi"
echo " d) elimina ultimo movimento"
echo " m) lista saldi mensili"
echo " g) grafici"
echo " q) uscita"
echo
echo "Scegliere una opzione"
read a > /dev/null
d=`date +%d/%m/%Y`
t="CON"
case "$a" in
N|n)
################# loop per l'immissione dei dati ####################
while :
do
########################## menu immissione dati #####################
echo "c) CONTANTI"
echo "o) ONLINE"
echo "a) CARTA"
echo "s) ASSEGNO"
echo "x) ACCREDITO-ADDEBBITO"
echo "q) ESCI"
read s > /dev/null
case "$s" in
C|c)
t="CON"
;;
O|o)
t="ONL"
;;
A|a)
t="CAR"
;;
S|s)
t="ASS"
;;
X|x)
t="ACS"
;;
Q|q)
break
;;
*)
continue
;;
esac
echo
echo "La data corrente : "$d
echo "immettere la data oppure invio"
read s > /dev/null
if [ "$s" != "" ]
then
d=$s
fi
echo
echo "V) Versamento"
echo "P) Prelevamento"
echo
echo "Scegliere una opzione"
read s
case "$s" in
V|v)
p=" 0.00"
echo
echo "Immettere importo"
read v
;;
P|p)
v=" 0.00"
echo
echo "Immettere importo"
read p
;;
esac
echo
echo "Tipo : "$t
echo "Data : "$d
echo "Prelevamento : "$p
echo "Versamento : "$v
echo
echo "Salvare i dati?[Si,No]"
read s > /dev/null
if [ "$s" != "s" ]
then
continue
fi
echo "$t $d $p $v 0.00" | awk '{ print $1"\t"$2"\t"$3"\t"$4"\t"$5}' >> $dati
done
;;
L|l) clear; head -1 $dati; tail +2 $dati | tail -20;;
M|m) cat $saldi_mensili;;
E|e)
echo "elaborazione in corso ... attendere"
echo "copio $dati in $dati.bk"
cp $dati $dati".bk"
#nel caso awk riconosca il punto come separatore decimale decommentare
#cp $dati Conto.vir
#e commentare il comando seguente
sed -e 's/\./,/g' $dati > Conto.vir
echo "awk su Conto.vir --> Conto2.vir"
awk -f elaboraconto-awk.awk Conto.vir > Conto2.vir
echo "fine awk"
# nel caso awk riconosca il punto come separatore decimale commentare
sed -e 's/,/\./g' Conto2.vir > Conto.pun;
# e decommentare la seguente riga
#mv Conto2.vir Conto.pun
echo 'OP DATA PRELEVAM VERSAMENTI SALDO_MESE SALDO NOP' > $saldi_mensili
sed -n /SLM/p Conto.pun >> $saldi_mensili
sed /SLM/d Conto.pun > $dati
rm Conto.pun Conto.vir Conto2.vir
echo;echo "elaborazione terminata"
;;
D|d)
echo
echo `tail -1 $dati`
echo "Cancellare la riga?[Si,No]"
read s > /dev/null
if [ "$s" != "s" ]
then
continue
fi
echo "cancellazione del'ultima riga in corso ..."
s=`wc -l $dati | sed -e 's/^\ *//' | sed -e 's/\ .*$//'`
sed ${s}d $dati > $dati".bk"
cp $dati".bk" $dati
;;
G|g)
# comandi per il tracciamento dei grafici
cut -f5 $dati | sed /[A-z].*/d | tail -240 > gcbp
cut -f6 $saldi_mensili | sed /[A-z].*/d | tail -24 > mcbp
echo "Saldi degli ultimi 240 movimenti e saldi mensili"
echo "Fare click sul grafico per continuare"
echo 'plot "gcbp" title "Conto" with linesp lt 0 lw 2 pt 3' > plot
echo 'pause mouse' >> plot
echo 'plot "mcbp" title "saldo mensile" with impulses lt 2 lw 5' >> plot
echo 'pause mouse' >> plot
gnuplot plot
rm mcbp gcbp plot
;;
Q|q)
rm elaboraconto-awk.awk;
exit;;
*) continue;;
esac
echo "Premere invio per continuare"
read a > /dev/null
done
############################## Fine ##################################
- Dipendenze: bash, sed, awk, gnuplot
- Data: 21/10/2007
- Autore: Mimmoforlug