]> gitweb.pimeys.fr Git - scripts-20-100.git/commitdiff
[bde] Script pour les remboursements note
authorVincent Le Gallic <legallic@crans.org>
Mon, 30 Sep 2013 07:04:44 +0000 (09:04 +0200)
committerVincent Le Gallic <legallic@crans.org>
Mon, 30 Sep 2013 07:04:44 +0000 (09:04 +0200)
bde/virements.py [new file with mode: 0755]

diff --git a/bde/virements.py b/bde/virements.py
new file mode 100755 (executable)
index 0000000..f14f08b
--- /dev/null
@@ -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()