]> gitweb.pimeys.fr Git - scripts-20-100.git/blob - sum_transacs_by_categorie.py
900ed808b989030c3a0e730e8f02aeb1085f2a3e
[scripts-20-100.git] / sum_transacs_by_categorie.py
1 #!/usr/bin/python
2 # -*- coding:utf8 -*-
3
4 """
5 Récupère les gains BDE par mois et par catégorie.
6
7 Une catégorie est définie par une liste de descriptions.
8 Le script mange donc une liste de fichiers contenant une description par ligne.
9 """
10
11 import sys
12 import psycopg2
13 import psycopg2.extras
14
15 def getcursor():
16 con = psycopg2.connect(database='note')
17 cur = con.cursor(cursor_factory=psycopg2.extras.DictCursor)
18 return con, cur
19
20 def get_sum(descriptions, debut, fin):
21 """
22 Récupère le montant total des transactions reçue par le BDE dans ayant
23 leur descrption dans ``descriptions``
24 """
25 req = """
26 SELECT COALESCE(sum(quantite*montant), 0) AS s
27 FROM transactions
28 WHERE valide
29 AND date >= %(debut)s
30 AND date < %(fin)s
31 AND destinataire = 0
32 AND montant != 0
33 AND description = ANY (%(descriptions)s);
34 """
35 con, cur = getcursor()
36 cur.execute(req, {"debut" : debut + ' 00:00:00', "fin" : fin + ' 00:00:00', "descriptions" : descriptions})
37 s = cur.fetchone()["s"] or 0
38 return s
39
40 def get_dates(y, m, d):
41 """
42 Donne les dates de découpage de ``d``/``m``/``y`` à ``d-1``/``m``/``y+1``.
43 """
44 dates = ["%s-%s-%s" % (y, m, d)]
45 for i in range(m + 1, 13):
46 dates.append("%s-%s-01" % (y, i))
47 for i in range(1, m):
48 dates.append("%s-%s-01" % (y + 1, i))
49 dates.append("%s-%s-%s" % (y + 1, m, d - 1))
50 return dates
51
52 def get_year_sums(dates, filename):
53 """
54 Récupère les données sur l'année pour une catégorie.
55 """
56 descriptions = open(filename).readlines()
57 descriptions = [d.rstrip('\n') for d in descriptions]
58 sums = []
59 for id in range(len(dates) - 1):
60 ddebut, dfin = dates[id], dates[id + 1]
61 sums.append(get_sum(descriptions, ddebut, dfin))
62 return sums
63
64 if __name__ == "__main__":
65 filenames = sys.argv[1:]
66 print filenames
67 y, m, d = 2015, 2, 16
68 dates = get_dates(y, m, d)
69 ys = {}
70 for fn in filenames:
71 ys[fn] = get_year_sums(dates, fn)
72 print "debut\tfin\t" + "\t".join(filenames)
73 for id in range(len(dates) - 1):
74 ddebut, dfin = dates[id], dates[id + 1]
75 print "%s\t%s\t%s" % (
76 ddebut,
77 dfin,
78 "\t".join([str(ys[fn][id]) for fn in filenames])
79 )
80
81 print "totaux"
82 print "%s-%s-%s\t %s-%s-%s\t %s" % (y, m, d, y+1, m, d-1,
83 "\t".join([str(sum(ys[fn])) for fn in filenames]),)
84 print "total"
85 print str(sum([sum(ys[fn]) for fn in filenames]))