From 4e48ec9bcac39a7294bbfec47615ef1f64a23204 Mon Sep 17 00:00:00 2001 From: Vincent Le Gallic Date: Thu, 18 Feb 2016 10:16:45 +0100 Subject: [PATCH] Gitted is better --- sum_transacs_by_categorie.py | 84 ++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100755 sum_transacs_by_categorie.py diff --git a/sum_transacs_by_categorie.py b/sum_transacs_by_categorie.py new file mode 100755 index 0000000..5c2448c --- /dev/null +++ b/sum_transacs_by_categorie.py @@ -0,0 +1,84 @@ +#!/usr/bin/python +# -*- coding:utf8 -*- + +""" +Récupère 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 psycopg2 +import psycopg2.extras + +def getcursor(): + con = psycopg2.connect(database='note') + cur = con.cursor(cursor_factory=psycopg2.extras.DictCursor) + return con, cur + +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 description = ANY (%(descriptions)s); + """ + con, cur = 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): + """ + Donne les dates de découpage de ``d``/``m``/``y`` à ``d-1``/``m``/``y+1``. + """ + dates = ["%s-%s-%s" % (y, m, d)] + for i in range(m + 1, 13): + dates.append("%s-%s-01" % (y, i)) + for i in range(1, m): + dates.append("%s-%s-01" % (y + 1, i)) + dates.append("%s-%s-%s" % (y + 1, m, d - 1)) + 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() 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 + +if __name__ == "__main__": + filenames = sys.argv[1:] + print filenames + y, m, d = 2015, 2, 16 + dates = get_dates(y, m, d) + 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, y+1, m, d-1, + "\t".join([str(sum(ys[fn])) for fn in filenames]),) + print "total" + print str(sum([sum(ys[fn]) for fn in filenames])) -- 2.39.2