--- /dev/null
+#!/usr/bin/python
+# -*- encoding: utf-8 -*-
+
+
+""" Pour faciliter les remboursements note en cas de commande prima/pizzas/hanako/yang/…
+
+ TO DO : Rajouter une option --same où on ne précise pas la part des participants,
+ tout le monde a la même (donc post-calculée)
+"""
+
+import psycopg2, psycopg2.extras
+
+def getcursor():
+ con = psycopg2.connect(database="bde")
+ cur = con.cursor(cursor_factory=psycopg2.extras.DictCursor)
+ return con,cur
+
+def trouver(term):
+ term = str(term)
+ sterm = "%%%s%%" % term
+ 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;"
+ con, cur = getcursor()
+ cur.execute(req, (sterm, sterm, sterm, term))
+ return cur.fetchall()
+
+def pprint(l):
+ keys = ["numcbde", "prenom", "nom", "pseudo", "solde"]
+ l = [{"numcbde" : str(i["numcbde"]),
+ "prenom" : i["prenom"],
+ "nom" : i["nom"],
+ "pseudo" : i["pseudo"],
+ "solde" : str(i["solde"])} for i in l]
+ maxs = [ max([len(i[key]) for i in [{key:key}]+l]) for key in keys ]
+ pattern = u"| %%%ss | %%-%ss | %%-%ss | %%-%ss | %%%ss |" % tuple(maxs)
+ sep = (pattern % tuple([u"-"*i for i in maxs])).replace(u"|", u"+").replace(u" ", u"-")
+ print sep
+ print pattern % tuple(keys)
+ print sep
+ for i in l:
+ print pattern % tuple([i[key] for key in keys])
+ print sep
+
+class EndLoop(Exception):
+ pass
+
+class PasLesMemesTotaux(Exception):
+ pass
+
+def ask_one():
+ term = raw_input("Search : ")
+ if term=="":
+ raise EndLoop
+ l = trouver(term)
+ if len(l) == 1:
+ return l[0]
+ elif len(l) > 1:
+ pprint(l)
+ print ""
+ ans = None
+ while ans!="0":
+ ans = raw_input("numcbde (ou 0)=")
+ res = [i for i in l if str(i["numcbde"]) == ans]
+ if len(res)==1:
+ return res[0]
+
+def get_montant(ask="montant=", total=None):
+ montant = None
+ while montant==None:
+ smontant = raw_input(ask)
+ if smontant.lower() in ["all", "tout"] and total!=None:
+ return total
+ if smontant == "" and total=="coeff":
+ return 1
+ try:
+ return float(smontant)
+ except:
+ pass
+
+def get_people(total=None):
+ liste = []
+ print "Ajoutez des notes : (vide pour finir)"
+ try:
+ while True:
+ res = ask_one()
+ if res:
+ montant = get_montant(total=total)
+ liste.append((montant, res))
+ except EndLoop:
+ return liste
+
+def execute_virement(emetteur, destinataire, montant, motif):
+ if emetteur["numcbde"] != destinataire["numcbde"]:
+ print "INSERT INTO transactions (conso, emetteur, destinataire, montant, quantite, valide, remarque)\
+ VALUES (1, %s, %s, %s, 1, true, '%s');" % (emetteur["numcbde"], destinataire["numcbde"], montant, motif)
+
+def execute_virements(emetteurs, destinataires, motif):
+ totalem = sum([i[0] for i in emetteurs])
+ totalde = sum([i[0] for i in destinataires])
+ if abs(totalem - totalde) >= 0.01:
+ raise PasLesMemesTotaux
+ if totalem == 0:
+ print "Je vais pas m'emmerder pour un montant nul."
+ exit(0)
+ # On commence par faire payer tous les participants au premier payeur
+ premier = destinataires[0][1]
+ for (montant, em) in emetteurs:
+ execute_virement(em, premier, montant, motif)
+ # Ensuite le premier payeur rembourse les autres
+ for (montant, de) in destinataires[1:]:
+ execute_virement(premier, de, montant, motif)
+
+
+def virements():
+ motif = raw_input("Motif : ")
+ print "= Liste des participants ="
+ emetteurs = get_people()
+ total = sum([i[0] for i in emetteurs])
+ print "\nParticipants :\n" + " ".join(["%s (%s)" % (i[1]["pseudo"], i[0]) for i in emetteurs])
+ print "Total : %s" % total + "\n"
+ coeff = get_montant(ask="coefficient (réduction,…) =", total="coeff")
+ # Si le coeff n'est pas 1, il faut changer les valeurs
+ if coeff!=1:
+ emetteurs = [(em[0]*coeff, em[1]) for em in emetteurs]
+ total = total*coeff
+ print "= Payeurs ="
+ destinataires = get_people(total=total)
+ total_pay = sum([i[0] for i in destinataires])
+ print "\nParticipants :\n" + " ".join(["%s (%s)" % (i[1]["pseudo"], i[0]) for i in emetteurs])
+ print "Total : %s" % total
+ print "\nPayeurs :\n" + " ".join(["%s (%s)" % (i[1]["pseudo"], i[0]) for i in destinataires])
+ print "Total : %s" % total_pay + "\n"
+ if total != total_pay:
+ print "Les totaux des participations et des paiements ne concordent pas !\nAbort."
+ exit(1)
+
+ print "Transactions à effectuer :"
+ execute_virements(emetteurs, destinataires, motif)
+
+if __name__ == "__main__":
+ virements()