#!/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.
-import sys
-import psycopg2,psycopg2.extras
+Usage : solde_date.py idbde date
+"""
-con = psycopg2.connect(database='note')
-cur = con.cursor(cursor_factory=psycopg2.extras.DictCursor)
+import sys
+import psycopg2
+import psycopg2.extras
-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)
+import base
-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 = base.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.