]> gitweb.pimeys.fr Git - scripts-20-100.git/blob - sum_transacs_by_categorie.py
[bde] Gros ménage : archivage de tous les scripts NK2012
[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, yf, mf, df):
41 """
42 Donne les dates de découpage de ``d``/``m``/``y`` à ``d-1``/``m``/``y+1``.
43 """
44 dates = ["%d-%02d-%02d" % (y, m, d)]
45 m += 1
46 if m == 13:
47 m = 1
48 y += 1
49 while (y, m) <= (yf, mf):
50 dates.append("%d-%02d-01" % (y, m))
51 m += 1
52 if m == 13:
53 m = 1
54 y += 1
55 # On a atteint le dernier mois
56 dates.append("%d-%02d-%02d" % (yf, mf, df))
57 return dates
58
59 def get_year_sums(dates, filename):
60 """
61 Récupère les données sur l'année pour une catégorie.
62 """
63 descriptions = open(filename).readlines()
64 descriptions = [d.rstrip('\n') for d in descriptions]
65 sums = []
66 for id in range(len(dates) - 1):
67 ddebut, dfin = dates[id], dates[id + 1]
68 sums.append(get_sum(descriptions, ddebut, dfin))
69 return sums
70
71 if __name__ == "__main__":
72 filenames = sys.argv[1:]
73 print filenames
74 y, m, d = 2015, 2, 16
75 yf, mf, df = 2016, 2, 18
76 dates = get_dates(y, m, d, yf, mf, df)
77 ys = {}
78 for fn in filenames:
79 ys[fn] = get_year_sums(dates, fn)
80 print "debut\tfin\t" + "\t".join(filenames)
81 for id in range(len(dates) - 1):
82 ddebut, dfin = dates[id], dates[id + 1]
83 print "%s\t%s\t%s" % (
84 ddebut,
85 dfin,
86 "\t".join([str(ys[fn][id]) for fn in filenames])
87 )
88
89 print "totaux"
90 print "%s-%s-%s\t %s-%s-%s\t %s" % (y, m, d, yf, mf, df,
91 "\t".join([str(sum(ys[fn])) for fn in filenames]),)
92 print "total"
93 print str(sum([sum(ys[fn]) for fn in filenames]))