]> gitweb.pimeys.fr Git - scripts-20-100.git/blob - bde/virements.py
On fournit la date de fin
[scripts-20-100.git] / bde / virements.py
1 #!/usr/bin/python
2 # -*- encoding: utf-8 -*-
3
4
5 """ Pour faciliter les remboursements note en cas de commande prima/pizzas/hanako/yang/…
6
7 TO DO : Rajouter une option --same où on ne précise pas la part des participants,
8 tout le monde a la même (donc post-calculée)
9 """
10
11 import psycopg2, psycopg2.extras
12
13 def getcursor():
14 con = psycopg2.connect(database="bde")
15 cur = con.cursor(cursor_factory=psycopg2.extras.DictCursor)
16 return con,cur
17
18 def trouver(term):
19 term = str(term)
20 sterm = "%%%s%%" % term
21 req = "SELECT * FROM adherents WHERE pseudo ILIKE %s OR nom ILIKE %s OR prenom ILIKE %s OR CAST(numcbde AS varchar)=%s ORDER BY nom;"
22 con, cur = getcursor()
23 cur.execute(req, (sterm, sterm, sterm, term))
24 return cur.fetchall()
25
26 def pprint(l):
27 keys = ["numcbde", "prenom", "nom", "pseudo", "solde"]
28 l = [{"numcbde" : str(i["numcbde"]),
29 "prenom" : i["prenom"],
30 "nom" : i["nom"],
31 "pseudo" : i["pseudo"],
32 "solde" : str(i["solde"])} for i in l]
33 maxs = [ max([len(i[key]) for i in [{key:key}]+l]) for key in keys ]
34 pattern = u"| %%%ss | %%-%ss | %%-%ss | %%-%ss | %%%ss |" % tuple(maxs)
35 sep = (pattern % tuple([u"-"*i for i in maxs])).replace(u"|", u"+").replace(u" ", u"-")
36 print sep
37 print pattern % tuple(keys)
38 print sep
39 for i in l:
40 print pattern % tuple([i[key] for key in keys])
41 print sep
42
43 class EndLoop(Exception):
44 pass
45
46 class PasLesMemesTotaux(Exception):
47 pass
48
49 def ask_one():
50 term = raw_input("Search : ")
51 if term=="":
52 raise EndLoop
53 l = trouver(term)
54 if len(l) == 1:
55 return l[0]
56 elif len(l) > 1:
57 pprint(l)
58 print ""
59 ans = None
60 while ans!="0":
61 ans = raw_input("numcbde (ou 0)=")
62 res = [i for i in l if str(i["numcbde"]) == ans]
63 if len(res)==1:
64 return res[0]
65
66 def get_montant(ask="montant=", total=None):
67 montant = None
68 while montant==None:
69 smontant = raw_input(ask)
70 if smontant.lower() in ["all", "tout"] and total!=None:
71 return total
72 if smontant == "" and total=="coeff":
73 return 1
74 try:
75 return float(smontant)
76 except:
77 pass
78
79 def get_people(total=None):
80 liste = []
81 print "Ajoutez des notes : (vide pour finir)"
82 try:
83 while True:
84 res = ask_one()
85 if res:
86 montant = get_montant(total=total)
87 liste.append((montant, res))
88 except EndLoop:
89 return liste
90
91 def execute_virement(emetteur, destinataire, montant, motif):
92 if emetteur["numcbde"] != destinataire["numcbde"]:
93 print "INSERT INTO transactions (conso, emetteur, destinataire, montant, quantite, valide, remarque)\
94 VALUES (1, %s, %s, %s, 1, true, '%s');" % (emetteur["numcbde"], destinataire["numcbde"], montant, motif)
95
96 def execute_virements(emetteurs, destinataires, motif):
97 totalem = sum([i[0] for i in emetteurs])
98 totalde = sum([i[0] for i in destinataires])
99 if abs(totalem - totalde) >= 0.01:
100 raise PasLesMemesTotaux
101 if totalem == 0:
102 print "Je vais pas m'emmerder pour un montant nul."
103 exit(0)
104 # On commence par faire payer tous les participants au premier payeur
105 premier = destinataires[0][1]
106 for (montant, em) in emetteurs:
107 execute_virement(em, premier, montant, motif)
108 # Ensuite le premier payeur rembourse les autres
109 for (montant, de) in destinataires[1:]:
110 execute_virement(premier, de, montant, motif)
111
112
113 def virements():
114 motif = raw_input("Motif : ")
115 print "= Liste des participants ="
116 emetteurs = get_people()
117 total = sum([i[0] for i in emetteurs])
118 print "\nParticipants :\n" + " ".join(["%s (%s)" % (i[1]["pseudo"], i[0]) for i in emetteurs])
119 print "Total : %s" % total + "\n"
120 coeff = get_montant(ask="coefficient (réduction,…) =", total="coeff")
121 # Si le coeff n'est pas 1, il faut changer les valeurs
122 if coeff!=1:
123 emetteurs = [(em[0]*coeff, em[1]) for em in emetteurs]
124 total = total*coeff
125 print "= Payeurs ="
126 destinataires = get_people(total=total)
127 total_pay = sum([i[0] for i in destinataires])
128 print "\nParticipants :\n" + " ".join(["%s (%s)" % (i[1]["pseudo"], i[0]) for i in emetteurs])
129 print "Total : %s" % total
130 print "\nPayeurs :\n" + " ".join(["%s (%s)" % (i[1]["pseudo"], i[0]) for i in destinataires])
131 print "Total : %s" % total_pay + "\n"
132 if abs(total-total_pay) >= 0.01:
133 print "Les totaux des participations et des paiements ne concordent pas !\nAbort."
134 exit(1)
135
136 print "Transactions à effectuer :"
137 execute_virements(emetteurs, destinataires, motif)
138
139 if __name__ == "__main__":
140 virements()