#!/usr/bin/python # -*- coding: utf-8 -*- # # $Id: controle_tresorier2.py,v 1.2 2007-11-05 21:14:57 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_p = db.search('paiement=%d&controle!=*p*' % ann_scol) search_result_c = db.search('paiement=%d&controle!=*c*' % ann_scol) lst_p = search_result_p['adherent'] lst_c = search_result_c['adherent'] if "3" in result: for club in search_result_p['club']: lst_p.append(club) for club in search_result_c['club']: lst_c.append(club) lst = {} for adh in lst_p: lst[adh.id()] = adh for adh in lst_c: lst[adh.id()] = adh lst = lst.values() # 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()