From b8264a67e554b40a7083ab16545fa4ab0e936a9d Mon Sep 17 00:00:00 2001 From: Vincent Le Gallic Date: Thu, 10 Mar 2016 03:38:55 +0100 Subject: [PATCH] [solde_date] proprification, importable --- bde/solde_date.py | 63 ++++++++++++++++++++++++++++++----------------- 1 file changed, 40 insertions(+), 23 deletions(-) diff --git a/bde/solde_date.py b/bde/solde_date.py index 7fb0960..193822a 100755 --- a/bde/solde_date.py +++ b/bde/solde_date.py @@ -1,33 +1,50 @@ #!/usr/bin/python # -*- coding:utf8 -*- -""" Codé par 20-100 le 21/04/12 +""" +Codé par 20-100 le 21/04/12 - sert à connaître le solde d'un compte à une date t donnée.""" +Sert à connaître le solde d'un compte à une date t donnée. + +Usage : solde_date.py idbde date +""" import sys import psycopg2,psycopg2.extras -con = psycopg2.connect(database='note') -cur = con.cursor(cursor_factory=psycopg2.extras.DictCursor) - -try: - idbde = int(sys.argv[1]) - date = " ".join(sys.argv[2:]) - # On checke que ça se comprend comme une date - if date in ["now","maintenant","today"]: - date = "now()" - else: - cur.execute("SELECT CAST(%s AS timestamp);",(date,)) -except Exception, exc: - print "Usage : solde_date numcbde date\nDonne le solde de l'adhérent idbde à la date donnée." - exit(1) +def getcursor(): + """Obtenir une connexion à la base de données.""" + con = psycopg2.connect(database='note') + cur = con.cursor(cursor_factory=psycopg2.extras.DictCursor) + return con, cur -cur.execute("SELECT sum(montant*quantite) FROM transactions WHERE valide AND destinataire = %s AND date < CAST(%s AS timestamp)" - ,(idbde,date)) -received = cur.fetchone()[0] -cur.execute("SELECT sum(montant*quantite) FROM transactions WHERE valide AND emetteur = %s AND date < CAST(%s AS timestamp)" - ,(idbde,date)) -given = cur.fetchone()[0] +def get_solde_date(idbde, date="now"): + """Calcule le solde du compte ``idbde`` à la ``date`` donnée.""" + con, cur = getcursor() + cur.execute( + """ + SELECT COALESCE(sum(montant*quantite), 0) + FROM transactions + WHERE valide + AND destinataire = %s + AND date <= CAST(%s AS timestamp) + """, + (idbde, date)) + received = cur.fetchone()[0] + cur.execute( + """ + SELECT COALESCE(sum(montant*quantite), 0) + FROM transactions + WHERE valide + AND emetteur = %s + AND date <= CAST(%s AS timestamp) + """, + (idbde, date)) + given = cur.fetchone()[0] + return received - given -print (received-given)/100. +if __name__ == "__main__": + idbde = int(sys.argv[1]) + date = " ".join(sys.argv[2:]) + solde = get_solde_date(idbde, date) + print solde/100. -- 2.39.2