From cc1577f42b2af2b398aefa0e51c9eb81899e7dcf Mon Sep 17 00:00:00 2001 From: dimino Date: Mon, 5 Nov 2007 21:32:38 +0100 Subject: [PATCH] c'est un script que j'avais fais quand j'etais tresorier. darcs-hash:20071105203238-7b604-860dadd32ce353857615c82fde1aadee4eefdd31.gz --- admin/controle_tresorier2.py | 278 +++++++++++++++++++++++++++++++++++ 1 file changed, 278 insertions(+) create mode 100755 admin/controle_tresorier2.py diff --git a/admin/controle_tresorier2.py b/admin/controle_tresorier2.py new file mode 100755 index 00000000..036adc5f --- /dev/null +++ b/admin/controle_tresorier2.py @@ -0,0 +1,278 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# +# $Id: controle_tresorier2.py,v 1.1 2007-11-05 20:32:38 dimino Exp $ +# +# tresorier.py +# ------------ +# +# Copyright (C) 2007 Jeremie Dimino +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This file is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + + +import os, sys +sys.path.append('/usr/scripts/gestion') + +from ldap_crans import crans_ldap +from config import ann_scol +import dialog, time, config, re + +db = crans_ldap() + +# Détermination de l'uid du câbleur +from user_tests import getuser +uid = getuser() +if not uid : + print "Impossible de determiner l'utilisateur !" + sys.exit(1) +cableur = db.search('uid=%s' % uid)['adherent'][0] + +# Vérification des droits +if u'Tresorier' not in cableur.droits(): + print "Il faut etre tresorier pour executer ce script !" + sys.exit(1) + + +dlg = dialog.Dialog() +dlg.setBackgroundTitle('Tresorerie') +encoding = sys.stdin.encoding or 'ISO-8859-15' + +######################################################################## +# Retrait des accents +# + +_unaccent_dict = {u'Æ': u'AE', u'æ': u'ae', u'Œ': u'OE', u'œ': u'oe', u'ß': 'ss'} +_re_latin_letter = re.compile(r"^(LATIN [A-Z]+ LETTER [A-Z]+) WITH") +def unaccent(string): + """Remove accents ``string``.""" + result = [] + for char in string: + if char in _unaccent_dict: + char = _unaccent_dict[char] + else: + try: + name = unicodedata.name(char) + match = _re_latin_letter.search(name) + if match: + char = unicodedata.lookup(match.group(1)) + except: + pass + result.append(char) + return "".join(result) + +######################################################################## +# Ajoute un cheque a la liste +# + +_civilite = [ "M", "MLLE", "MME" ] +_banque = [("CIC", u"CiC"), + ("BNP", u"BNP"), + ("BP", u"Banque Populaire"), + ("CA", u"Crédit Agricole"), + ("CE", u"Caisse d'Épargne"), + ("CL", u"Crédit Lyonnais"), + ("CM", u"Crédit Mutuel"), + ("CN", u"Crédit du Nord"), + ("HSBC", u"HSBC"), + ("LBP", u"La Banque Postale"), + ("LCL", u"Le Crédit Lyonnais"), + ("LP", u"La Poste"), + ("SG", u"Société Générale")] +_banque.sort() +_banque.insert(0, ("Autre", u"Éspèces")) +def add_cheque(adh): + annul, result = dlg.menu(u"Banque", choices = _banque) + if annul: return False + + banque = result + if banque == "Autre": + return True + + annul, result = dlg.menu(u"Civilité", + choices=[("1", u"Monsieur"), + ("2", u"Mademoiselle"), + ("3", u"Madame")]) + if annul: return False + + civilite = _civilite[int(result)-1] + + + line = '%s %s %s' % (civilite, unaccent(adh.Nom()).upper(), banque) + + annul, line = dlg.inputbox(u"Vérification de l'émetteur du chèque", init=line) + + f = open("%s/remise_cheques" % os.getenv("HOME"), 'a') + f.write('%s\n' % line) + f.close() + return True + +######################################################################## +# Menu de sélection des adhérents +# + +def main_menu(): + while True: + + annul, result = dlg.checklist(u"Choisissez les adhérents à inclure dans la liste", + choices=[("1", u'Nouveaux adhérents', 1), + ("2", u'Réadhésion', 0), + ("3", u'Clubs', 0)]) + + if annul: + return + + # Construction de la liste des adhérents à contrôler + search_result = db.search('paiement=%d&controle!=p' % ann_scol) + lst = search_result['adherent'] + if "3" in result: + for club in search_result['club']: + lst.append(club) + + # Filtre si on ne veut pas des réadhesion + if not "2" in result: + # Date de début de la nouvelle année + start_date = time.mktime((ann_scol, 8, 1, 0, 0, 0, 0, 0, 0)) + for adh in lst: + if adh.dateInscription() < start_date: + lst.remove(adh) + + + adherent_menu(lst) + + +######################################################################## +# Liste des adhérents +# + +def adherent_menu(lst): + + nom_adh = {} + adhs = [] + for adh in lst: + disp = ('%s %s' % (adh.nom(), adh.prenom())).encode(encoding) + adhs.append((disp, '')) + nom_adh[disp] = adh + + adhs.sort() + + while True: + annul, result = dlg.menu(u'Liste des adhérents', choices=adhs) + + if annul: + return + + adh = nom_adh[result] + + if admin_menu(adh): + adhs.remove((result, '')) + + +######################################################################## +# Controle d'un adhérent (repompé de gest_crans.py) +# + +def on_off(cond): + if cond: + return 1 + else: + return 0 + +def admin_menu(adh): + + # Le proprietaire a-t-il une section carte d'étudiant (pas les clubs) ? + has_card = adh.idn != 'cid' + + # Initialisation des différentes checkbox + carte = on_off(ann_scol in adh.carteEtudiant()) + paiement = on_off(ann_scol in adh.paiement()) + precab = on_off(ann_scol + 1 in adh.paiement()) + caution = on_off('k' in adh.controle()) + paiement_ok = on_off('p' in adh.controle()) + carte_ok = on_off('c' in adh.controle()) + + # Construction de la boîte de dialogue + texte = [] + checklist = [] + + if has_card: + checklist.append(("1", u"Carte d'étudiant %d/%d fournie" % (ann_scol, ann_scol+1), carte)) + + checklist.append(("2", u"Cotisation %d/%d réglée et charte signée" % (ann_scol, ann_scol+1), paiement)) + + # TODO: controle pour le précâblage + if config.precab: + checklist.append(("3", u"Adhésion %d/%d réglée et charte signée (précâblage)" % (ann_scol+1, ann_scol+2), precab)) + + if has_card: + checklist.append(("4", u"Carte d\'étudiant vérifiée", carte_ok)) + checklist.append(("5", u"Cotisation/charte/caution vérifées", paiement_ok)) + + annul, result = dlg.checklist(u"Etat administratif de %s" % adh.Nom(), + choices=checklist) + if annul: + return False + + modif = False + # On cherche s'il y a des modifs + for tag, item, state in checklist: + if (tag in result) ^ state: + modif = True + + if not modif: + return False + + adh = db.search('aid=%s' % adh.id(), 'w')['adherent'][0] + + # Traitement + if has_card: + if '1' in result: + adh.carteEtudiant(ann_scol) + elif carte_ok: + adh.carteEtudiant(-ann_scol) + if '4' in result: + adh.controle('+c') + else: + adh.controle('-c') + + if '2' in result and ann_scol not in adh.paiement(): + adh.paiement(ann_scol) + elif '2' not in result and paiement_ok: + adh.paiement(-ann_scol) + + if '3' in result: + adh.paiement(ann_scol+1) + elif paiement_ok: + adh.paiement(-ann_scol-1) + + if '5' in result: + adh.controle('+p') + else: + adh.controle('-p') + + if 'C' in result: + adh.controle('+k') + else: + adh.controle('-k') + + if not paiement_ok and "5" in result: + #if add_cheque(adh): + adh.save() + #else: + # return False + + return True + +main_menu()