--- /dev/null
+#!/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]))