From: Vincent Le Gallic Date: Mon, 30 Sep 2013 07:04:44 +0000 (+0200) Subject: [bde] Script pour les remboursements note X-Git-Url: http://gitweb.pimeys.fr/?a=commitdiff_plain;h=e4fb95afeccfef0cc2e5d90e367ad9856dc8e9c6;p=scripts-20-100.git [bde] Script pour les remboursements note --- diff --git a/bde/virements.py b/bde/virements.py new file mode 100755 index 0000000..f14f08b --- /dev/null +++ b/bde/virements.py @@ -0,0 +1,140 @@ +#!/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()