--- /dev/null
+#!/usr/bin/env python
+# -*- encoding: utf-8 -*-
+
+"""
+Pour récupérer les soldes de tous les comptes à une date donnée
+et éventuellement les sommer.
+"""
+
+import sys
+import psycopg2
+import psycopg2.extras
+import argparse
+
+import solde_date
+import base
+
+
+def get_idbdes(include_bde=False, with_personnes=True, with_clubs=True):
+ """Récupère les idbdes de tous les comptes."""
+ req_template = "SELECT idbde FROM comptes WHERE idbde %s 0 AND type = ANY (%%s);"
+ if include_bde:
+ req = req_template % ">="
+ else:
+ req = req_template % ">"
+ types = []
+ if with_clubs:
+ types.append("club")
+ if with_personnes:
+ types.append("personne")
+ con, cur = base.getcursor()
+ cur.execute(req, (types,))
+ l = cur.fetchall()
+ l = [i[0] for i in l]
+ return l
+
+def main(args):
+ """Calcule les solde de tous les comptes à ``date``"""
+ idbdes = get_idbdes(args.bde, args.personnes, args.clubs)
+ nb = len(idbdes)
+ nbchiffres = len(str(nb))
+ template = "\r%%%ss/%%s" % nbchiffres
+ soldes = {}
+ for (i, idbde) in enumerate(idbdes):
+ soldes[idbde] = solde_date.get_solde_date(idbde, args.date)
+ if (i + 1) % 10 == 0 and not args.quiet:
+ sys.stdout.write(template % (i + 1, nb))
+ sys.stdout.flush()
+ if not args.quiet:
+ sys.stdout.write(template % (i + 1, nb))
+ sys.stdout.flush()
+ print ""
+ return soldes
+
+
+parser = argparse.ArgumentParser(description=__doc__)
+
+parser.add_argument('-c', '--clubs', help="Inclure les clubs dans le calcul", action="store_true")
+parser.add_argument('-p', '--personnes', help="Inclure les personnes dans le calcul", action="store_true")
+parser.add_argument('-b', '--bde', help="Inclure le compte BDE dans le calcul", action="store_true")
+parser.add_argument('-s', '--sum', help="Afficher les sommes", action="store_true")
+parser.add_argument('-v', '--verbose', help="Afficher les soldes de tous les comptes", action="store_true")
+parser.add_argument('-q', '--quiet', help="Ne pas afficher la progression", action="store_true")
+
+parser.add_argument("date", type=str, help="La date à laquelle on veut faire le calcul")
+
+if __name__ == "__main__":
+ args = parser.parse_args()
+ soldes = main(args)
+ if args.verbose:
+ import pprint
+ pprint.pprint(soldes)
+ if args.sum:
+ pos = sum([s for (i, s) in soldes.iteritems() if s > 0])
+ print "Total des soldes positifs : %s" % pos
+ neg = sum([s for (i, s) in soldes.iteritems() if s < 0])
+ print "Total des soldes négatifs : %s" % neg