From: Vincent Le Gallic Date: Thu, 10 Mar 2016 03:03:21 +0000 (+0100) Subject: [bde] Gros ménage : archivage de tous les scripts NK2012 X-Git-Url: http://gitweb.pimeys.fr/?p=scripts-20-100.git;a=commitdiff_plain;h=62bd5a01bbcc7b96c4b1dd098415253d14492517 [bde] Gros ménage : archivage de tous les scripts NK2012 --- diff --git a/bde/adhesions.sh b/bde/adhesions.sh deleted file mode 100755 index b3e141d..0000000 --- a/bde/adhesions.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/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;" diff --git a/bde/combiennegs.py b/bde/combiennegs.py deleted file mode 100755 index 1e62cd1..0000000 --- a/bde/combiennegs.py +++ /dev/null @@ -1,30 +0,0 @@ -#!/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) diff --git a/bde/enlever_droits_invites.sh b/bde/enlever_droits_invites.sh deleted file mode 100755 index d2e4751..0000000 --- a/bde/enlever_droits_invites.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/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 diff --git a/bde/old/adhesions.sh b/bde/old/adhesions.sh new file mode 100755 index 0000000..b3e141d --- /dev/null +++ b/bde/old/adhesions.sh @@ -0,0 +1,11 @@ +#!/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;" diff --git a/bde/old/combiennegs.py b/bde/old/combiennegs.py new file mode 100755 index 0000000..1e62cd1 --- /dev/null +++ b/bde/old/combiennegs.py @@ -0,0 +1,30 @@ +#!/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) diff --git a/bde/old/enlever_droits_invites.sh b/bde/old/enlever_droits_invites.sh new file mode 100755 index 0000000..d2e4751 --- /dev/null +++ b/bde/old/enlever_droits_invites.sh @@ -0,0 +1,11 @@ +#!/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 diff --git a/bde/old/supprimer_quelquun.py b/bde/old/supprimer_quelquun.py new file mode 100755 index 0000000..b28d711 --- /dev/null +++ b/bde/old/supprimer_quelquun.py @@ -0,0 +1,86 @@ +#!/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 "Je supprimerai pas quelqu'un dont le solde n'est pas nul : %s" % (",".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 "Attention, je ne supprime rien, je ne fais que transformer en Erreur,Erreur..." + + 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()) diff --git a/bde/old/this_is_dirty.sh b/bde/old/this_is_dirty.sh new file mode 100755 index 0000000..cb72f58 --- /dev/null +++ b/bde/old/this_is_dirty.sh @@ -0,0 +1,20 @@ +#!/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};" + + diff --git a/bde/old/tresorerie.sql b/bde/old/tresorerie.sql new file mode 100644 index 0000000..35a5106 --- /dev/null +++ b/bde/old/tresorerie.sql @@ -0,0 +1,16 @@ +# é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. diff --git a/bde/old/virements.py b/bde/old/virements.py new file mode 100755 index 0000000..030fca6 --- /dev/null +++ b/bde/old/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 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() diff --git a/bde/old/voir_droits.py b/bde/old/voir_droits.py new file mode 100755 index 0000000..9a94fd6 --- /dev/null +++ b/bde/old/voir_droits.py @@ -0,0 +1,61 @@ +#!/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 diff --git a/bde/supprimer_quelquun.py b/bde/supprimer_quelquun.py deleted file mode 100755 index b28d711..0000000 --- a/bde/supprimer_quelquun.py +++ /dev/null @@ -1,86 +0,0 @@ -#!/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 "Je supprimerai pas quelqu'un dont le solde n'est pas nul : %s" % (",".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 "Attention, je ne supprime rien, je ne fais que transformer en Erreur,Erreur..." - - 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()) diff --git a/bde/this_is_dirty.sh b/bde/this_is_dirty.sh deleted file mode 100755 index cb72f58..0000000 --- a/bde/this_is_dirty.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/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};" - - diff --git a/bde/tresorerie.sql b/bde/tresorerie.sql deleted file mode 100644 index 35a5106..0000000 --- a/bde/tresorerie.sql +++ /dev/null @@ -1,16 +0,0 @@ -# é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. diff --git a/bde/virements.py b/bde/virements.py deleted file mode 100755 index 030fca6..0000000 --- a/bde/virements.py +++ /dev/null @@ -1,140 +0,0 @@ -#!/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() diff --git a/bde/voir_droits.py b/bde/voir_droits.py deleted file mode 100755 index 9a94fd6..0000000 --- a/bde/voir_droits.py +++ /dev/null @@ -1,61 +0,0 @@ -#!/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