X-Git-Url: http://gitweb.pimeys.fr/?a=blobdiff_plain;ds=sidebyside;f=bde%2Fcompta%2Fsum_transacs_by_categorie.py;fp=bde%2Fcompta%2Fsum_transacs_by_categorie.py;h=5359a62e1d659ce1bda77a87318e31e8f18f3571;hb=0af61e04c1a2575f983ed8e5efa07efbf04eaa0a;hp=0000000000000000000000000000000000000000;hpb=107f4fc174c14437a7c42bbfa6ebcf5f8ccb01d0;p=scripts-20-100.git diff --git a/bde/compta/sum_transacs_by_categorie.py b/bde/compta/sum_transacs_by_categorie.py new file mode 100755 index 0000000..5359a62 --- /dev/null +++ b/bde/compta/sum_transacs_by_categorie.py @@ -0,0 +1,93 @@ +#!/usr/bin/python +# -*- coding:utf8 -*- + +""" +Affiche les gains BDE par mois et par catégorie. + +Une catégorie est définie par une liste de descriptions. +Le script mange donc une liste de fichiers contenant une description par ligne. +""" + +import sys + +import base + +def get_sum(descriptions, debut, fin): + """ + Récupère le montant total des transactions reçue par le BDE dans ayant + leur descrption dans ``descriptions`` + """ + req = """ + SELECT COALESCE(sum(quantite*montant), 0) AS s + FROM transactions + WHERE valide + AND date >= %(debut)s + AND date < %(fin)s + AND destinataire = 0 + AND montant != 0 + AND description = ANY (%(descriptions)s); + """ + con, cur = base.getcursor() + cur.execute(req, {"debut" : debut + ' 00:00:00', "fin" : fin + ' 00:00:00', "descriptions" : descriptions}) + s = cur.fetchone()["s"] or 0 + return s + +def get_dates(y, m, d, yf, mf, df): + """ + Donne les dates de découpage de ``d``/``m``/``y`` à ``d-1``/``m``/``y+1``. + """ + dates = ["%d-%02d-%02d" % (y, m, d)] + m += 1 + if m == 13: + m = 1 + y += 1 + while (y, m) <= (yf, mf): + dates.append("%d-%02d-01" % (y, m)) + m += 1 + if m == 13: + m = 1 + y += 1 + # On a atteint le dernier mois + dates.append("%d-%02d-%02d" % (yf, mf, df)) + return dates + +def get_year_sums(dates, filename): + """ + Récupère les données sur l'année pour une catégorie. + """ + descriptions = open(filename).readlines() + descriptions = [d.rstrip('\n') for d in descriptions] + sums = [] + for id in range(len(dates) - 1): + ddebut, dfin = dates[id], dates[id + 1] + sums.append(get_sum(descriptions, ddebut, dfin)) + return sums + + +def main(filenames): + """Fait le boulot.""" + print filenames + y, m, d = 2015, 2, 16 + yf, mf, df = 2016, 2, 19 + dates = get_dates(y, m, d, yf, mf, df) + ys = {} + for fn in filenames: + ys[fn] = get_year_sums(dates, fn) + print "debut\tfin\t" + "\t".join(filenames) + for id in range(len(dates) - 1): + ddebut, dfin = dates[id], dates[id + 1] + print "%s\t%s\t%s" % ( + ddebut, + dfin, + "\t".join([str(ys[fn][id]) for fn in filenames]) + ) + + print "totaux" + print "%s-%s-%s\t %s-%s-%s\t %s" % (y, m, d, yf, mf, df, + "\t".join([str(sum(ys[fn])) for fn in filenames]),) + print "total" + print str(sum([sum(ys[fn]) for fn in filenames])) + +if __name__ == "__main__": + filenames = sys.argv[1:] + main(filenames)