c'est un script que j'avais fais quand j'etais tresorier.
darcs-hash:20071105203238-7b604-860dadd32ce353857615c82fde1aadee4eefdd31.gz
This commit is contained in:
parent
4ab8ac23dc
commit
cc1577f42b
1 changed files with 278 additions and 0 deletions
278
admin/controle_tresorier2.py
Executable file
278
admin/controle_tresorier2.py
Executable file
|
@ -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 <jeremie@dimino.org>
|
||||||
|
#
|
||||||
|
# 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()
|
Loading…
Add table
Add a link
Reference in a new issue