+++ /dev/null
-#!/bin/bash
-
-# Pour trouver les années d'adhésion d'un compte
-
-export LESS='-S'
-
-psql note -c "
- SELECT *
- FROM adhesions
- WHERE idbde = $1
- ORDER BY annee ASC;"
+++ /dev/null
-#!/usr/bin/env python
-# -*- encoding: utf-8 -*-
-
-""" Pour savoir combien de fois les gens sont passés en négatif """
-
-import psycopg2
-import psycopg2.extras
-
-def get_data(con):
- cur = con.cursor(cursor_factory = psycopg2.extras.DictCursor)
- cur.execute("SELECT * FROM transactions ORDER BY date ASC;")
- transactions = cur.fetchall()
- return transactions
-
-def combienneg(alltrans):
- nums = list(set([t["emetteur"] for t in alltrans] + [t["destinataire"] for t in alltrans]))
- soldes = dict([(n, 0) for n in nums])
- negs = dict([(n, []) for n in nums])
- for trans in [t for t in alltrans if t["valide"]]:
- for (num, signe) in [(trans["emetteur"], -1), (trans["destinataire"], 1)]:
- newsolde = soldes[num] + trans["montant"] * trans["quantite"] * signe
- if soldes[num] >= 0 and newsolde < 0:
- negs[num].append(t["date"])
- soldes[num] = newsolde
- return (negs, soldes)
-
-if __name__ == "__main__":
- con = psycopg2.connect(database="bde")
- transactions = get_data(con)
- (negs, soldes) = combienneg(transactions)
+++ /dev/null
-#!/bin/bash
-
-# Pour virer les droits invités en masse puisque plus personne ne devrait avoir ce droit.
-
-psql bde -c "SELECT * FROM (SELECT numcbde, pseudo, droits, surdroits, droits-(droits&128) AS apres FROM adherents WHERE NOT supreme AND numcbde>0) AS plouf WHERE NOT droits=apres;"
-echo -n "Delete ? [y/N] "
-read ans
-if [[ $ans = "y" ]]
-then
- psql bde -c "UPDATE adherents SET droits=droits-(droits&128) WHERE numcbde in (SELECT numcbde FROM (SELECT numcbde, pseudo, droits, surdroits, droits-(droits&128) AS apres FROM adherents WHERE NOT supreme AND numcbde>0) AS plouf WHERE NOT droits=apres);"
-fi
--- /dev/null
+#!/bin/bash
+
+# Pour trouver les années d'adhésion d'un compte
+
+export LESS='-S'
+
+psql note -c "
+ SELECT *
+ FROM adhesions
+ WHERE idbde = $1
+ ORDER BY annee ASC;"
--- /dev/null
+#!/usr/bin/env python
+# -*- encoding: utf-8 -*-
+
+""" Pour savoir combien de fois les gens sont passés en négatif """
+
+import psycopg2
+import psycopg2.extras
+
+def get_data(con):
+ cur = con.cursor(cursor_factory = psycopg2.extras.DictCursor)
+ cur.execute("SELECT * FROM transactions ORDER BY date ASC;")
+ transactions = cur.fetchall()
+ return transactions
+
+def combienneg(alltrans):
+ nums = list(set([t["emetteur"] for t in alltrans] + [t["destinataire"] for t in alltrans]))
+ soldes = dict([(n, 0) for n in nums])
+ negs = dict([(n, []) for n in nums])
+ for trans in [t for t in alltrans if t["valide"]]:
+ for (num, signe) in [(trans["emetteur"], -1), (trans["destinataire"], 1)]:
+ newsolde = soldes[num] + trans["montant"] * trans["quantite"] * signe
+ if soldes[num] >= 0 and newsolde < 0:
+ negs[num].append(t["date"])
+ soldes[num] = newsolde
+ return (negs, soldes)
+
+if __name__ == "__main__":
+ con = psycopg2.connect(database="bde")
+ transactions = get_data(con)
+ (negs, soldes) = combienneg(transactions)
--- /dev/null
+#!/bin/bash
+
+# Pour virer les droits invités en masse puisque plus personne ne devrait avoir ce droit.
+
+psql bde -c "SELECT * FROM (SELECT numcbde, pseudo, droits, surdroits, droits-(droits&128) AS apres FROM adherents WHERE NOT supreme AND numcbde>0) AS plouf WHERE NOT droits=apres;"
+echo -n "Delete ? [y/N] "
+read ans
+if [[ $ans = "y" ]]
+then
+ psql bde -c "UPDATE adherents SET droits=droits-(droits&128) WHERE numcbde in (SELECT numcbde FROM (SELECT numcbde, pseudo, droits, surdroits, droits-(droits&128) AS apres FROM adherents WHERE NOT supreme AND numcbde>0) AS plouf WHERE NOT droits=apres);"
+fi
--- /dev/null
+#!/usr/bin/python
+# -*- coding:utf8 -*-
+
+""" Codé par 20-100
+ pour "supprimer" quelqu'un dans la note, c'est-à-dire anonymiser le compte.
+"""
+
+from pretty_print import sql_pretty_print as spp
+import psycopg2, psycopg2.extras
+
+class NonZeroError(ValueError):
+ """Erreur levée en cas de tentative de suppression d'un compte de solde non nul."""
+ def __init__(self):
+ super(NonZeroError, self).__init__("Solde du compte non-nul")
+
+def liste_to_sql(l):
+ """Renvoie la liste d'entiers en chaîne sql utilisable"""
+ assert all([type(i) == int for i in l])
+ return "(" + ",".join([str(i) for i in l]) + ")"
+
+def getcursor():
+ """Ouvre une connexion à la base de données."""
+ con = psycopg2.connect(database="bde")
+ cur = con.cursor(cursor_factory=psycopg2.extras.DictCursor)
+ return con, cur
+
+def get_comptes(liste):
+ """Récupère les comptes entre début et fin.
+ Attention au contenu de liste, quand même."""
+ con, cur = getcursor()
+ cur.execute("SELECT * FROM adherents WHERE numcbde in %s ORDER BY numcbde;" % liste_to_sql(liste))
+ l = cur.fetchall()
+ return l
+
+def check_impossibles(l):
+ """On ne peut pas "supprimer" un compte dont le solde est non nul."""
+ paspossibles = [i for i in l if i["solde"]!=0]
+ if len(paspossibles) > 0:
+ print "\e[1;31mJe supprimerai pas quelqu'un dont le solde n'est pas nul : %s\e[0m" % (",".join([str(adh["numcbde"]) for adh in paspossibles]))
+ raise NonZeroError
+
+def supprime(liste):
+ """Supprime les comptes dont le numcbde est dans ``liste``."""
+ l = get_comptes(liste)
+ check_impossibles(l)
+ con, cur = getcursor()
+ cur.execute("""UPDATE adherents
+ SET prenom='Erreur', nom='Erreur', sexe='E', pseudo=numcbde,
+ passwd='!', section='', adresse='', email='nobody@crans.org',
+ droits=0, surdroits=0, supreme='f', bloque='t', fonction='',
+ mail_info=0, club='f', telephone='', theme='UNI', pbsante='',
+ normalien='t', numsecu='' WHERE numcbde in %s;
+ """ % (liste_to_sql(liste)))
+ cur.execute("COMMIT;")
+
+def interactive_begin():
+ """Détermine la liste des comptes à supprimer de manière interactive."""
+ print "\e[1;31mAttention, je ne supprime rien, je ne fais que transformer en Erreur,Erreur...\e[0m"
+
+ debut = raw_input("Premier id : ")
+ debut = int(debut)
+ fin = raw_input("Dernier id (vide pour 1 seul) : ")
+ if fin == "":
+ fin = debut
+ else:
+ fin = int(fin)
+
+ return range(debut, fin+1)
+
+def interactive_delete(liste):
+ """Supprime les comptes de manière interactive."""
+ l = get_comptes(liste)
+ print spp(l, ["numcbde", "nom", "prenom", "pseudo", "solde"])
+
+ ans=raw_input("""Êtes-vous sûr de vouloir les "supprimer" ? """)
+ if ans in ["oui","o","O","OUI","Y","y","YES","yes"]:
+ try:
+ supprime(liste)
+ except NonZeroError:
+ exit(1)
+ print "Et bim !"
+ else:
+ print "Nothing Done"
+
+if __name__ == "__main__":
+ interactive_delete(interactive_begin())
--- /dev/null
+#!/bin/bash
+
+
+#psql bde -c "INSERT INTO transactions (conso, emetteur, destinataire, montant, quantite, valide, remarque) VALUES (1, 2850, 0, 35, 1, true, 'sweat ENS Z');"
+#psql bde -c "INSERT INTO transactions (conso, emetteur, destinataire, montant, quantite, valide, remarque) VALUES (1, 3246, 3539, 94.72, 1, true, 'Pot A♡');"
+#psql bde -c "INSERT INTO transactions (date, conso, emetteur, destinataire, montant, quantite, valide, remarque) VALUES ('2013-01-17 00:14:56', 44, 2822, 0, 2.00, 6, true, 'Pinte');"
+
+#psql bde -c "ALTER TABLE transactions DISABLE TRIGGER ALL;"
+#psql bde -c "ALTER TABLE transactions ENABLE TRIGGER ALL;"
+connard=2187
+recepteur=2798
+quantite=1
+taxe=3.00
+randomreason='Sauce - Menu'
+
+psql bde -c "UPDATE adherents SET solde=solde + 500 WHERE numcbde = ${connard};"
+psql bde -c "INSERT INTO transactions (conso, emetteur, destinataire, montant, quantite, valide, remarque) VALUES (1, ${connard}, ${recepteur}, ${taxe}, ${quantite}, true, '${randomreason}');"
+psql bde -c "UPDATE adherents SET solde=solde - 500 WHERE numcbde = ${connard};"
+
+
--- /dev/null
+# écrit par 20-100 le 16/03/13 (ouais enfin surtout le 17)
+# Des requêtes SQL en vrac pour satisfaire Maylis, penser à porter ça sur la NK2015 avec une interface
+# pour les tréoriers
+
+# Avoir les soldes de tout le monde à une date particulière
+SELECT pseudo, numcbde, recu, emis, COALESCE(recu, 0)-COALESCE(emis, 0) AS solde FROM (SELECT adherents.pseudo, adherents.numcbde, (SELECT sum(montant*quantite) FROM transactions WHERE valide AND destinataire=adherents.numcbde AND date<'2012-02-22') AS recu, (SELECT sum(montant*quantite) FROM transactions WHERE valide AND emetteur=adherents.numcbde AND date<'2012-02-22') AS emis FROM adherents) AS calculs;
+
+# Avoir la somme de tous les soldes de tout le monde à cette date :
+SELECT sum(solde) FROM (SELECT pseudo, numcbde, recu, emis, COALESCE(recu, 0)-COALESCE(emis, 0) AS solde FROM (SELECT adherents.pseudo, adherents.numcbde, (SELECT sum(montant*quantite) FROM transactions WHERE valide AND destinataire=adherents.numcbde AND date<'2012-02-22') AS recu, (SELECT sum(montant*quantite) FROM transactions WHERE valide AND emetteur=adherents.numcbde AND date<'2012-02-22') AS emis FROM adherents) AS calculs) AS soldes;
+# Oh ! ça fait 0 ! cool hein ?
+# Eh ben ça a pas été si trivial que ça… -_-
+
+
+# Le résumé des transactions du BDE, regroupé par type.
+SELECT sum(montant*quantite*(CASE WHEN emetteur=destinataire THEN 0 WHEN destinataire=0 THEN 1 ELSE -1 END)) AS total, remarque FROM transactions WHERE valide AND 0 in (emetteur, destinataire) AND date<='2013-02-19' AND date>='2012-02-22' GROUP BY remarque ORDER BY total;
+# Attention : penser à changer les *deux* 0 pour le faire sur quelqu'un d'autre.
--- /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()
--- /dev/null
+#!/usr/bin/python
+# -*- coding:utf8 -*-
+
+""" Script pour afficher qui a quels droits.
+
+ Affiche les prénom, nom, pseudo, droits, surdroits des gens qui ont des droits!=par défaut.
+ droits et surdroits sont pretty-printés pour qu'on les comprenne.
+"""
+
+from pyPgSQL import PgSQL
+
+con=PgSQL.connect(database="bde")
+cur=con.cursor()
+
+cur.execute("SELECT prenom,nom,pseudo,droits,surdroits,supreme FROM adherents WHERE numcbde>-1"
+ +" AND NOT droits in (0,1) AND supreme='f' ORDER BY droits;")
+l=cur.fetchall()
+
+#: Correspondance binaire → droit
+dicodroits={
+ 1 : "Intranet",
+ 2 : "Note",
+ 4 : "Consos",
+ 8 : "Adhérents",
+ 16 : "Boutons",
+ 32 : "Inscriptions",
+ 64 : "Activités",
+ 128 : "Invités",
+ 256 : "Transactions",
+ 512 : "Forcé",
+ 1024 : "Chèques",
+ 2048 : "Webmaster",
+ 4096 : "Wei",
+ 8192 : "Sendmail",
+ 16384 : "Bureau",
+ 32768 : "Accès extérieur",
+ 65536 : "Préinscriptions"
+ }
+
+pow2=[2**i for i in range(17)]
+vrail=[]
+for ligne in l:
+ vrail.append([ligne["prenom"],ligne["nom"],ligne["pseudo"],
+ ",".join([dicodroits[i] for i in pow2 if ligne["droits"]&i]),
+ ",".join([dicodroits[i] for i in pow2 if ligne["surdroits"]&i])])
+
+
+lenprenom = max([len(unicode(ligne[0])) for ligne in vrail]+[len(u"prénom")])
+lennom = max([len(unicode(ligne[1])) for ligne in vrail]+[len(u"nom")])
+lenpseudo = max([len(unicode(ligne[2])) for ligne in vrail]+[len(u"pseudo")])
+lendroits = max([len(unicode(ligne[3])) for ligne in vrail]+[len(u"droits")])
+lensurdroits = max([len(unicode(ligne[4])) for ligne in vrail]+[len(u"surdroits")])
+
+template=" %%-%ds | %%-%ds | %%-%ds | %%-%ds | %%-%ds \n"%(lenprenom,lennom,lenpseudo,lendroits,lensurdroits)
+
+pretty=template%("prénom","nom","pseudo","droits","surdroits")
+pretty+="-"*(lenprenom+2)+"+"+"-"*(lennom+2)+"+"+"-"*(lenpseudo+2)+"+"+"-"*(lendroits+2)+"+"+"-"*(lensurdroits+2)+"\n"
+for i in vrail:
+ pretty+=template%(tuple([unicode(j) for j in i]))
+
+print pretty
+++ /dev/null
-#!/usr/bin/python
-# -*- coding:utf8 -*-
-
-""" Codé par 20-100
- pour "supprimer" quelqu'un dans la note, c'est-à-dire anonymiser le compte.
-"""
-
-from pretty_print import sql_pretty_print as spp
-import psycopg2, psycopg2.extras
-
-class NonZeroError(ValueError):
- """Erreur levée en cas de tentative de suppression d'un compte de solde non nul."""
- def __init__(self):
- super(NonZeroError, self).__init__("Solde du compte non-nul")
-
-def liste_to_sql(l):
- """Renvoie la liste d'entiers en chaîne sql utilisable"""
- assert all([type(i) == int for i in l])
- return "(" + ",".join([str(i) for i in l]) + ")"
-
-def getcursor():
- """Ouvre une connexion à la base de données."""
- con = psycopg2.connect(database="bde")
- cur = con.cursor(cursor_factory=psycopg2.extras.DictCursor)
- return con, cur
-
-def get_comptes(liste):
- """Récupère les comptes entre début et fin.
- Attention au contenu de liste, quand même."""
- con, cur = getcursor()
- cur.execute("SELECT * FROM adherents WHERE numcbde in %s ORDER BY numcbde;" % liste_to_sql(liste))
- l = cur.fetchall()
- return l
-
-def check_impossibles(l):
- """On ne peut pas "supprimer" un compte dont le solde est non nul."""
- paspossibles = [i for i in l if i["solde"]!=0]
- if len(paspossibles) > 0:
- print "\e[1;31mJe supprimerai pas quelqu'un dont le solde n'est pas nul : %s\e[0m" % (",".join([str(adh["numcbde"]) for adh in paspossibles]))
- raise NonZeroError
-
-def supprime(liste):
- """Supprime les comptes dont le numcbde est dans ``liste``."""
- l = get_comptes(liste)
- check_impossibles(l)
- con, cur = getcursor()
- cur.execute("""UPDATE adherents
- SET prenom='Erreur', nom='Erreur', sexe='E', pseudo=numcbde,
- passwd='!', section='', adresse='', email='nobody@crans.org',
- droits=0, surdroits=0, supreme='f', bloque='t', fonction='',
- mail_info=0, club='f', telephone='', theme='UNI', pbsante='',
- normalien='t', numsecu='' WHERE numcbde in %s;
- """ % (liste_to_sql(liste)))
- cur.execute("COMMIT;")
-
-def interactive_begin():
- """Détermine la liste des comptes à supprimer de manière interactive."""
- print "\e[1;31mAttention, je ne supprime rien, je ne fais que transformer en Erreur,Erreur...\e[0m"
-
- debut = raw_input("Premier id : ")
- debut = int(debut)
- fin = raw_input("Dernier id (vide pour 1 seul) : ")
- if fin == "":
- fin = debut
- else:
- fin = int(fin)
-
- return range(debut, fin+1)
-
-def interactive_delete(liste):
- """Supprime les comptes de manière interactive."""
- l = get_comptes(liste)
- print spp(l, ["numcbde", "nom", "prenom", "pseudo", "solde"])
-
- ans=raw_input("""Êtes-vous sûr de vouloir les "supprimer" ? """)
- if ans in ["oui","o","O","OUI","Y","y","YES","yes"]:
- try:
- supprime(liste)
- except NonZeroError:
- exit(1)
- print "Et bim !"
- else:
- print "Nothing Done"
-
-if __name__ == "__main__":
- interactive_delete(interactive_begin())
+++ /dev/null
-#!/bin/bash
-
-
-#psql bde -c "INSERT INTO transactions (conso, emetteur, destinataire, montant, quantite, valide, remarque) VALUES (1, 2850, 0, 35, 1, true, 'sweat ENS Z');"
-#psql bde -c "INSERT INTO transactions (conso, emetteur, destinataire, montant, quantite, valide, remarque) VALUES (1, 3246, 3539, 94.72, 1, true, 'Pot A♡');"
-#psql bde -c "INSERT INTO transactions (date, conso, emetteur, destinataire, montant, quantite, valide, remarque) VALUES ('2013-01-17 00:14:56', 44, 2822, 0, 2.00, 6, true, 'Pinte');"
-
-#psql bde -c "ALTER TABLE transactions DISABLE TRIGGER ALL;"
-#psql bde -c "ALTER TABLE transactions ENABLE TRIGGER ALL;"
-connard=2187
-recepteur=2798
-quantite=1
-taxe=3.00
-randomreason='Sauce - Menu'
-
-psql bde -c "UPDATE adherents SET solde=solde + 500 WHERE numcbde = ${connard};"
-psql bde -c "INSERT INTO transactions (conso, emetteur, destinataire, montant, quantite, valide, remarque) VALUES (1, ${connard}, ${recepteur}, ${taxe}, ${quantite}, true, '${randomreason}');"
-psql bde -c "UPDATE adherents SET solde=solde - 500 WHERE numcbde = ${connard};"
-
-
+++ /dev/null
-# écrit par 20-100 le 16/03/13 (ouais enfin surtout le 17)
-# Des requêtes SQL en vrac pour satisfaire Maylis, penser à porter ça sur la NK2015 avec une interface
-# pour les tréoriers
-
-# Avoir les soldes de tout le monde à une date particulière
-SELECT pseudo, numcbde, recu, emis, COALESCE(recu, 0)-COALESCE(emis, 0) AS solde FROM (SELECT adherents.pseudo, adherents.numcbde, (SELECT sum(montant*quantite) FROM transactions WHERE valide AND destinataire=adherents.numcbde AND date<'2012-02-22') AS recu, (SELECT sum(montant*quantite) FROM transactions WHERE valide AND emetteur=adherents.numcbde AND date<'2012-02-22') AS emis FROM adherents) AS calculs;
-
-# Avoir la somme de tous les soldes de tout le monde à cette date :
-SELECT sum(solde) FROM (SELECT pseudo, numcbde, recu, emis, COALESCE(recu, 0)-COALESCE(emis, 0) AS solde FROM (SELECT adherents.pseudo, adherents.numcbde, (SELECT sum(montant*quantite) FROM transactions WHERE valide AND destinataire=adherents.numcbde AND date<'2012-02-22') AS recu, (SELECT sum(montant*quantite) FROM transactions WHERE valide AND emetteur=adherents.numcbde AND date<'2012-02-22') AS emis FROM adherents) AS calculs) AS soldes;
-# Oh ! ça fait 0 ! cool hein ?
-# Eh ben ça a pas été si trivial que ça… -_-
-
-
-# Le résumé des transactions du BDE, regroupé par type.
-SELECT sum(montant*quantite*(CASE WHEN emetteur=destinataire THEN 0 WHEN destinataire=0 THEN 1 ELSE -1 END)) AS total, remarque FROM transactions WHERE valide AND 0 in (emetteur, destinataire) AND date<='2013-02-19' AND date>='2012-02-22' GROUP BY remarque ORDER BY total;
-# Attention : penser à changer les *deux* 0 pour le faire sur quelqu'un d'autre.
+++ /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()
+++ /dev/null
-#!/usr/bin/python
-# -*- coding:utf8 -*-
-
-""" Script pour afficher qui a quels droits.
-
- Affiche les prénom, nom, pseudo, droits, surdroits des gens qui ont des droits!=par défaut.
- droits et surdroits sont pretty-printés pour qu'on les comprenne.
-"""
-
-from pyPgSQL import PgSQL
-
-con=PgSQL.connect(database="bde")
-cur=con.cursor()
-
-cur.execute("SELECT prenom,nom,pseudo,droits,surdroits,supreme FROM adherents WHERE numcbde>-1"
- +" AND NOT droits in (0,1) AND supreme='f' ORDER BY droits;")
-l=cur.fetchall()
-
-#: Correspondance binaire → droit
-dicodroits={
- 1 : "Intranet",
- 2 : "Note",
- 4 : "Consos",
- 8 : "Adhérents",
- 16 : "Boutons",
- 32 : "Inscriptions",
- 64 : "Activités",
- 128 : "Invités",
- 256 : "Transactions",
- 512 : "Forcé",
- 1024 : "Chèques",
- 2048 : "Webmaster",
- 4096 : "Wei",
- 8192 : "Sendmail",
- 16384 : "Bureau",
- 32768 : "Accès extérieur",
- 65536 : "Préinscriptions"
- }
-
-pow2=[2**i for i in range(17)]
-vrail=[]
-for ligne in l:
- vrail.append([ligne["prenom"],ligne["nom"],ligne["pseudo"],
- ",".join([dicodroits[i] for i in pow2 if ligne["droits"]&i]),
- ",".join([dicodroits[i] for i in pow2 if ligne["surdroits"]&i])])
-
-
-lenprenom = max([len(unicode(ligne[0])) for ligne in vrail]+[len(u"prénom")])
-lennom = max([len(unicode(ligne[1])) for ligne in vrail]+[len(u"nom")])
-lenpseudo = max([len(unicode(ligne[2])) for ligne in vrail]+[len(u"pseudo")])
-lendroits = max([len(unicode(ligne[3])) for ligne in vrail]+[len(u"droits")])
-lensurdroits = max([len(unicode(ligne[4])) for ligne in vrail]+[len(u"surdroits")])
-
-template=" %%-%ds | %%-%ds | %%-%ds | %%-%ds | %%-%ds \n"%(lenprenom,lennom,lenpseudo,lendroits,lensurdroits)
-
-pretty=template%("prénom","nom","pseudo","droits","surdroits")
-pretty+="-"*(lenprenom+2)+"+"+"-"*(lennom+2)+"+"+"-"*(lenpseudo+2)+"+"+"-"*(lendroits+2)+"+"+"-"*(lensurdroits+2)+"\n"
-for i in vrail:
- pretty+=template%(tuple([unicode(j) for j in i]))
-
-print pretty