]> gitweb.pimeys.fr Git - scripts-20-100.git/blobdiff - bde/integrite/fix_integrity.py
[bde/integrite] Des vieux scripts de vérification et de rétablissement de cohérence...
[scripts-20-100.git] / bde / integrite / fix_integrity.py
diff --git a/bde/integrite/fix_integrity.py b/bde/integrite/fix_integrity.py
new file mode 100755 (executable)
index 0000000..9324600
--- /dev/null
@@ -0,0 +1,51 @@
+#!/usr/bin/python
+# -*- coding:utf8 -*-
+
+""" Codé pour rétablir l'intégrité de la BDD.
+    
+    Pour générer des transactions dans le passé
+    pour les gens qui n'avaient pas commencé avec un solde nul.
+"""
+
+import psycopg2, psycopg2.extras
+
+con = psycopg2.connect(database="bde", connection_factory=psycopg2.extras.DictConnection)
+cur = con.cursor()
+
+from commands import getstatusoutput as ex
+import os
+import sys
+
+req="""SELECT numcbde,pseudo,gagne-perdu as calcul,effectif,effectif-(gagne-perdu) as a_enlever 
+FROM
+  (SELECT numcbde,pseudo,
+    (SELECT COALESCE(sum(montant*quantite), 0)
+     FROM transactions
+     WHERE destinataire=main.numcbde AND valide='t') as gagne,
+    (SELECT COALESCE(sum(montant*quantite), 0)
+     FROM transactions
+     WHERE emetteur=main.numcbde AND valide='t') as perdu,
+    (SELECT solde
+     FROM adherents WHERE numcbde=main.numcbde) as effectif
+   FROM adherents as main)
+AS calculs
+WHERE gagne-perdu!=effectif AND numcbde>0 ORDER BY numcbde;"""
+
+cur.execute(req)
+
+l = cur.fetchall()
+
+f=open("request_fixing.sql", "w")
+f.write("ALTER TABLE transactions DISABLE TRIGGER ALL;\n")
+for bug in l:
+    to_credit = bug["effectif"] - bug["calcul"]
+    if to_credit > 0:
+        emet, dest = 0, bug["numcbde"]
+    elif to_credit < 0:
+        emet, dest = bug["numcbde"], 0
+    f.write("INSERT INTO transactions (conso, emetteur, destinataire, montant, quantite, remarque) VALUES (1, %s, %s, %s, 1, 'Solde initial');\n" % (emet, dest, abs(to_credit)))
+    # En fait à cause des solde négatifs, il faut DISABLE les triggers, donc on n'a pas besoin d'update après
+    #f.write("UPDATE adherents SET solde=solde - (%s) WHERE numcbde=%s;\n" % (to_credit, bug["numcbde"]))
+
+f.write("ALTER TABLE transactions ENABLE TRIGGER ALL;\n")
+f.close()