+++ /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 abs(total-total_pay) >= 0.01:
- 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()