[dialog/adherent] Possibilité de prolonger une connexion

This commit is contained in:
Valentin Samir 2014-12-02 01:55:39 +01:00
parent fb3086c434
commit cb71139d02

View file

@ -9,6 +9,7 @@ Licence : GPLv3
import sys import sys
import time import time
import datetime import datetime
import dateutil.relativedelta
if '/usr/scripts' not in sys.path: if '/usr/scripts' not in sys.path:
sys.path.append('/usr/scripts') sys.path.append('/usr/scripts')
@ -159,7 +160,48 @@ class Dialog(proprio.Dialog):
codes_todo=[([self.dialog.DIALOG_OK], todo, [tag, menu, adherent, self_cont])] codes_todo=[([self.dialog.DIALOG_OK], todo, [tag, menu, adherent, self_cont])]
) )
def adherent_adhesion(self, cont, adherent, tag_paiment=None, comment_paiement=None): def adherent_adhesion_connexion_crediter(self, facture, adherent):
adhesion = False
connexion = False
if [a for a in facture["article"] if a["code"] == "ADH"]:
adhesion = True
if [a for a in facture["article"] if a["code"].startswith("CAI")]:
connexion = True
# Appeler créditer va créditer ou débiter le solde, sauver le proprio et créer la facture
if facture.mode == 'rw':
facture.crediter()
else:
with self.conn.search(dn=facture.dn, scope=0, mode='rw')[0] as facture:
facture.crediter()
with self.conn.search(dn=adherent.dn, scope=0, mode='rw')[0] as adherent:
if facture["finAdhesion"]:
adherent["finAdhesion"].append(facture["finAdhesion"][0])
if facture["debutAdhesion"]:
adherent["debutAdhesion"].append(facture["debutAdhesion"][0])
if facture["debutConnexion"]:
adherent["debutConnexion"].append(facture["debutConnexion"][0])
if facture["finConnexion"]:
adherent["finConnexion"].append(facture["finConnexion"][0])
adherent.validate_changes()
adherent.history_gen()
adherent.save()
try:
if adhesion and not connexion:
self.dialog.msgbox(text=u"Adhésion effectué avec success", title=u"Adhésion terminé", width=0, height=0, timeout=self.timeout)
elif not adhesion and connexion:
self.dialog.msgbox(text=u"Connexion prolongée avec success", title=u"Connexion prolongée", width=0, height=0, timeout=self.timeout)
elif adhesion and connexion:
self.dialog.msgbox(text=u"Adhésion effectué et connexion prolongée avec success", title=u"Connexion & Adhésion", width=0, height=0, timeout=self.timeout)
except KeyboardInterrupt:
pass
if facture['modePaiement'][0] == "solde":
try:
self.dialog.msgbox(text=u"Le solde de l'adhérent à bien été débité", title="Solde débité", width=0, height=0, timeout=self.timeout)
except KeyboardInterrupt:
pass
return adherent
def adherent_adhesion(self, cont, adherent, cancel_cont=None, tag_paiment=None, comment_paiement=None, crediter=True, facture=None):
# Boite si on ne peux pas réahdérer # Boite si on ne peux pas réahdérer
def box_already(end): def box_already(end):
@ -179,6 +221,12 @@ class Dialog(proprio.Dialog):
adherer=self.confirm(text="Adhésion pour un an, continuer ?", title="Adhésion de %s %s" % (adherent.get("prenom", [''])[0], adherent["nom"][0])) adherer=self.confirm(text="Adhésion pour un an, continuer ?", title="Adhésion de %s %s" % (adherent.get("prenom", [''])[0], adherent["nom"][0]))
return adherer return adherer
def delete_facture(facture, cont):
if facture:
with self.conn.search(dn=facture.dn, scope=0, mode='rw')[0] as facture:
facture.delete()
raise Continue(cont)
# Génération de la facture pour adhésion # Génération de la facture pour adhésion
def paiement(tag_paiement, adherent, finadhesion, comment, cancel_cont, cont): def paiement(tag_paiement, adherent, finadhesion, comment, cancel_cont, cont):
now = time.time() now = time.time()
@ -191,55 +239,182 @@ class Dialog(proprio.Dialog):
facture['info']=unicode(comment, 'utf-8') facture['info']=unicode(comment, 'utf-8')
facture["finAdhesion"]=unicode(new_finadhesion) facture["finAdhesion"]=unicode(new_finadhesion)
facture["debutAdhesion"]=unicode(new_debutadhesion) facture["debutAdhesion"]=unicode(new_debutadhesion)
if self.confirm_item(item=facture, if crediter:
text=u"Le paiement de %sEUR a-t-il bien été reçu (mode : %s) ?\n" % (facture.total(), tag_paiement), if self.confirm_item(item=facture,
title=u"Validation du paiement", text=u"Le paiement de %sEUR a-t-il bien été reçu (mode : %s) ?\n" % (facture.total(), tag_paiement),
timeout=self.timeout): title=u"Validation du paiement",
# Appeler créditer va créditer ou débiter le solde, sauver le proprio et créer la facture timeout=self.timeout):
facture.crediter() # Appeler créditer va créditer ou débiter le solde, sauver le proprio et créer la facture
with self.conn.search(dn=adherent.dn, scope=0, mode='rw')[0] as adherent: adherent = self.adherent_adhesion_connexion_crediter(facture, adherent)
adherent["finAdhesion"].append(unicode(new_finadhesion)) else:
adherent["debutAdhesion"].append(unicode(new_debutadhesion)) if not self.confirm(text=u"Le paiement n'a pas été reçue.\n Annuler ?", title="Annulation de l'adhésion", defaultno=True):
adherent.validate_changes() raise Continue(cancel_cont)
adherent.history_gen()
adherent.save()
self.dialog.msgbox(
text=u"Adhésion effectué avec success",
title=u"Adhésion terminé",
width=0, height=0, timeout=self.timeout)
if tag_paiement == "solde":
self.dialog.msgbox(text=u"Le solde de l'adhérent à bien été débité", title="Solde débité", width=0, height=0, timeout=self.timeout)
else: else:
if not self.confirm(text=u"Le paiement n'a pas été reçue.\n Annuler ?", title="Annulation de l'adhésion", defaultno=True): facture.create()
raise Continue(cancel_cont) raise Continue(cont(facture=facture))
raise Continue(cont(adherent=adherent)) raise Continue(cont(adherent=adherent))
finadhesion = adherent.fin_adhesion() finadhesion = adherent.fin_adhesion()
# Si fin de l'adhésion trop loin dans le futur, rien a faire # Si fin de l'adhésion trop loin dans le futur, rien a faire
if finadhesion and finadhesion - config.cotisation.delai_readh > time.time(): if finadhesion and finadhesion - config.cotisation.delai_readh > time.time():
self.handle_dialog(cont, box_already, finadhesion) self.handle_dialog(cont, box_already, finadhesion)
return cont raise Continue(cancel_cont if cancel_cont else cont)
# Sinon, si on accepte l'adhésion # Sinon, si on accepte l'adhésion
elif tag_paiment or self.handle_dialog(cont, box_adherer, finadhesion): elif tag_paiment or self.handle_dialog(cont, box_adherer, finadhesion):
self_cont = TailCall(self.adherent_adhesion, cont=cont, adherent=adherent, tag_paiment=tag_paiment, comment_paiement=comment_paiement) self_cont = TailCall(self.adherent_adhesion, cont=cont, adherent=adherent, cancel_cont=cancel_cont, tag_paiment=tag_paiment, comment_paiement=comment_paiement, crediter=crediter, facture=facture)
# On choisi un mode de paiement # On choisi un mode de paiement
if not tag_paiment or not comment_paiement: if not tag_paiment or not comment_paiement:
return self.proprio_choose_paiement(proprio=adherent, cont=self_cont, cancel_cont=cont) return self.proprio_choose_paiement(proprio=adherent, cont=self_cont, cancel_cont=TailCall(delete_facture, facture, cancel_cont if cancel_cont else cont))
else: else:
cancel_cont = self_cont.copy() lcont = self_cont.copy()
cancel_cont(comment_paiement=None) lcont(comment_paiement=None)
return self.handle_dialog_result( return self.handle_dialog_result(
code=self.dialog.DIALOG_OK, code=self.dialog.DIALOG_OK,
output=[], output=[],
cancel_cont=cancel_cont, cancel_cont=lcont,
error_cont=cancel_cont, error_cont=lcont,
codes_todo=[([self.dialog.DIALOG_OK], paiement, [tag_paiment, adherent, finadhesion, comment_paiement, cancel_cont, cont])] codes_todo=[([self.dialog.DIALOG_OK], paiement, [tag_paiment, adherent, finadhesion, comment_paiement, lcont, cont])]
) )
else: else:
return cont return self.handle_dialog_result(
def adherent_connexion(self, cont, adherent, cancel_cont=None): code=self.dialog.DIALOG_OK,
self.dialog.msgbox("todo", width=0, height=0) output=[],
cancel_cont=None,
error_cont=cancel_cont if cancel_cont else cont,
codes_todo=[([self.dialog.DIALOG_OK], delete_facture, [facture, cancel_cont if cancel_cont else cont])]
)
def adherent_connexion(self, cont, adherent, cancel_cont=None, facture=None, mois=None, default_item=None, tag_paiment=None, comment_paiement=None):
menu = {
"An": {'text':"Prolonger d'un an (pour %s€)" % config.cotisation.plafond_contribution, 'callback':TailCall(self.adherent_connexion, cont, adherent, cancel_cont, facture, 12, default_item, tag_paiment, comment_paiement)},
"NC": {'text':"Pas de connexion", 'callback':TailCall(self.adherent_connexion, cont, adherent, cancel_cont, facture, 12, default_item, tag_paiment, comment_paiement)}
}
menu_order = ["An"]
for i in range(1, config.cotisation.duree_conn_plafond):
if config.cotisation.contribution * i < config.cotisation.plafond_contribution:
menu["%s mois" % i] = {'text':"Prolonger de %s mois (pour %s€)" % (i, config.cotisation.contribution * i), 'callback':TailCall(self.adherent_connexion, cont, adherent, cancel_cont, facture, i, default_item, tag_paiment, comment_paiement)}
menu_order.append("%s mois" % i)
if facture:
menu_order.append("NC")
def box(finconnexion, default_item=None):
t_end = time.strftime('%d/%m/%Y %H:%M:%S', time.localtime(finconnexion))
return self.dialog.menu(
"Connexion jusqu'au %s" % t_end if finconnexion else "N'a jamais été connecté",
width=0,
height=0,
menu_height=0,
timeout=self.timeout,
item_help=0,
default_item=str(default_item),
title="Connexion de %s %s" % (adherent['prenom'][0], adherent["nom"][0]),
scrollbar=True,
cancel_label="Retour",
backtitle=u"Vous êtes connecté en tant que %s" % self.conn.current_login,
choices=[(k, menu[k]['text']) for k in menu_order])
def todo(adherent, mois, finconnexion, cancel_cont, cont, facture=None, tag_paiment=None, comment=None):
now = time.time()
new_finconnexion = datetime.datetime.fromtimestamp(max(finconnexion, now))
# On ajoute 3600 secondes sur suggestion de Raphaël Bonaque (<bonaque@crans.org>), pour tenir compte des malheureux qui
# pourraient subir le changement d'heure.
new_finconnexion = time.mktime((new_finconnexion + dateutil.relativedelta.relativedelta(months=mois)).timetuple()) + 3600
new_debutconnexion = max(now, finconnexion)
if facture:
with self.conn.search(dn=facture.dn, scope=0, mode='rw')[0] as facture:
if mois:
facture["finConnexion"]=unicode(new_finconnexion)
facture["debutConnexion"]=unicode(new_debutconnexion)
facture["article"].append(config.cotisation.dico_cotis(mois))
if self.confirm_item(item=facture,
text=u"Le paiement de %sEUR a-t-il bien été reçu (mode : %s) ?\n" % (facture.total(), facture['modePaiement'][0]),
title=u"Validation du paiement",
timeout=self.timeout):
# Appeler créditer va créditer ou débiter le solde, sauver le proprio et crée
adherent = self.adherent_adhesion_connexion_crediter(facture, adherent)
else:
if not self.confirm(text=u"Le paiement n'a pas été reçue.\n Annuler ?", title="Annulation de l'adhésion", defaultno=True):
raise Continue(cancel_cont)
else:
facture.delete()
else:
if tag_paiment is None or comment is None:
raise ValueError("Il faut définir une méthode de paiement avec un commentaire")
if not mois:
raise ValueError("Il faut prolonger la connexion d'un nombre de mois strictement positif")
with self.conn.newFacture(adherent.dn, {}) as facture:
facture['modePaiement']=unicode(tag_paiment, 'utf-8')
facture['article'].append(config.cotisation.dico_cotis(mois))
facture['info']=unicode(comment, 'utf-8')
facture["finConnexion"]=unicode(new_finconnexion)
facture["debutConnexion"]=unicode(new_debutconnexion)
if self.confirm_item(item=facture,
text=u"Le paiement de %sEUR a-t-il bien été reçu (mode : %s) ?\n" % (facture.total(), tag_paiment),
title=u"Validation du paiement",
timeout=self.timeout):
# Appeler créditer va créditer ou débiter le solde, sauver le proprio et crée
adherent = self.adherent_adhesion_connexion_crediter(facture, adherent)
else:
if not self.confirm(text=u"Le paiement n'a pas été reçue.\n Annuler ?", title="Annulation de l'adhésion", defaultno=True):
raise Continue(cancel_cont)
raise Continue(cont(adherent=adherent))
def todo_mois(tag, self_cont):
if tag == 'An':
mois = 12
else:
mois = int(tag.split(' ',1)[0])
raise Continue(self_cont(mois=mois, default_item=tag))
self_cont = TailCall(self.adherent_connexion, cont=cont, adherent=adherent, cancel_cont=cancel_cont, facture=facture, mois=mois, default_item=default_item, tag_paiment=tag_paiment, comment_paiement=comment_paiement)
finadhesion = adherent.fin_adhesion()
if facture:
finadhesion = max(finadhesion, facture["finAdhesion"][0] if facture["finAdhesion"] else 0)
finconnexion = adherent.fin_connexion()
# Si l'adhésion fini avant la connexion
if finadhesion <= time.time() or finadhesion < finconnexion:
if finadhesion:
if finadhesion <= time.time():
self.dialog.msgbox(text=u"L'adhésion a expiré, il va falloir réadhérer d'abord", title="Réadhésion nécessaire", width=0, height=0, timeout=self.timeout)
elif finadhesion < finconnexion:
self.dialog.msgbox(text=u"L'adhésion de termine avant la fin de la connexion, il va falloir réadhérer d'abord", title="Réadhésion nécessaire", width=0, height=0, timeout=self.timeout)
# Échouera si on essaie de prolonger la connexion au dela de l'adhésion et que l'adhésion est encore valable plus de quinze jours
return self.adherent_adhesion(cont=self_cont, cancel_cont=cont, adherent=adherent, crediter=False)
if facture:
cancel_cont = TailCall(self.adherent_adhesion, cont=self_cont, adherent=adherent, cancel_cont=cont, tag_paiment=str(facture['modePaiement'][0]), comment_paiement=None, crediter=False, facture=facture)
self_cont(cancel_cont=cancel_cont)
if mois is None:
(code, tag) = self.handle_dialog(cont, box, finconnexion, default_item)
return self.handle_dialog_result(
code=code,
output=[],
cancel_cont=cancel_cont if cancel_cont else cont,
error_cont=self_cont,
codes_todo=[([self.dialog.DIALOG_OK], todo_mois, [tag, self_cont])]
)
elif tag_paiment or facture:
lcont=self_cont.copy()
if facture:
lcont(mois=None)
else:
lcont(tag_paiment=None)
return self.handle_dialog_result(
code=self.dialog.DIALOG_OK,
output=[],
cancel_cont=lcont,
error_cont=lcont,
codes_todo=[([self.dialog.DIALOG_OK], todo, [adherent, mois, finconnexion, lcont, cont, facture, tag_paiment, comment_paiement])]
)
else:
lcont=self_cont.copy()
lcont(mois=None)
return self.proprio_choose_paiement(proprio=adherent, cont=self_cont, cancel_cont=lcont)
return cont return cont
def adherent_carte_etudiant(self, cont, adherent, values={}, cancel_cont=None): def adherent_carte_etudiant(self, cont, adherent, values={}, cancel_cont=None):
# Dictionnaire décrivant quelle est la valeur booléenne à donner à l'absence de l'attribut # Dictionnaire décrivant quelle est la valeur booléenne à donner à l'absence de l'attribut
a = attributs a = attributs
@ -419,7 +594,7 @@ class Dialog(proprio.Dialog):
# On traite les valeurs reçues # On traite les valeurs reçues
for ((a,l),values) in zip(to_display, tags): for ((a,l),values) in zip(to_display, tags):
if not values and a in non_empty: if not values and a in non_empty:
raise ValueError("%s ne devrait pas être vide" % a.legend) raise ValueError(u"%s ne devrait pas être vide" % a.legend)
values = unicode(values, 'utf-8') values = unicode(values, 'utf-8')
# Si le champs n'est pas single value, on utilise separateur pour découper # Si le champs n'est pas single value, on utilise separateur pour découper
# et on ne garde que les valeurs non vides # et on ne garde que les valeurs non vides
@ -674,13 +849,14 @@ class Dialog(proprio.Dialog):
def mycont(adherent=None, **kwargs): def mycont(adherent=None, **kwargs):
if adherent: if adherent:
# Une fois l'adhérent créé, on vois s'il donne sa carte étudiant et s'il adhére/prend la connexion internet # Une fois l'adhérent créé, on vois s'il donne sa carte étudiant et s'il adhére/prend la connexion internet
adh_cont = TailCall(self.modif_adherent, cont=cont, adherent=adherent) #adh_cont = TailCall(self.modif_adherent, cont=cont, adherent=adherent)
conn_cont = TailCall(self.adherent_connexion, cont=adh_cont, adherent=adherent) conn_cont = TailCall(self.adherent_connexion, cont=cont(proprio=adherent), adherent=adherent)
carte_cont = TailCall(self.adherent_carte_etudiant, cont=conn_cont, adherent=adherent) carte_cont = TailCall(self.adherent_carte_etudiant, cont=conn_cont, adherent=adherent)
etude_cont = TailCall(self.adherent_etudes, cont=carte_cont, adherent=adherent) etude_cont = TailCall(self.adherent_etudes, cont=carte_cont, adherent=adherent)
etude_cont(cancel_cont=etude_cont) etude_cont(cancel_cont=etude_cont)
carte_cont(cancel_cont=etude_cont) carte_cont(cancel_cont=etude_cont)
conn_cont(cancel_cont=carte_cont) # Comme on crée une facture, pas de retour possible
conn_cont(cancel_cont=conn_cont)
raise Continue(etude_cont) raise Continue(etude_cont)
else: else:
raise Continue(cont) raise Continue(cont)
@ -703,8 +879,8 @@ class Dialog(proprio.Dialog):
return self.handle_dialog_result( return self.handle_dialog_result(
code=self.dialog.DIALOG_OK, code=self.dialog.DIALOG_OK,
output="", output="",
cancel_cont=cont(proprio=adherent), cancel_cont=cont(adherent=adherent),
error_cont=cont(proprio=adherent), error_cont=cont(adherent=adherent),
codes_todo=[([self.dialog.DIALOG_OK], todo, [adherent])] codes_todo=[([self.dialog.DIALOG_OK], todo, [adherent])]
) )
@ -740,7 +916,7 @@ class Dialog(proprio.Dialog):
) )
def adherent_etudes(self, adherent, cont, default_item=None, etablissement=None, annee=None, section=None): def adherent_etudes(self, adherent, cont, cancel_cont=None, default_item=None, etablissement=None, annee=None, section=None):
"""Gestion des études de l'adhérent. etudes est un triplet (établissement, année, section)""" """Gestion des études de l'adhérent. etudes est un triplet (établissement, année, section)"""
choices_etablissement = [ choices_etablissement = [
('Autre', ''), ('Autre', ''),
@ -910,11 +1086,11 @@ class Dialog(proprio.Dialog):
backtitle=u"Vous êtes connecté en tant que %s" % self.conn.current_login, backtitle=u"Vous êtes connecté en tant que %s" % self.conn.current_login,
choices=section_ENS) choices=section_ENS)
self_cont = TailCall(self.adherent_etudes, adherent=adherent, cont=cont, default_item=default_item, etablissement=etablissement, annee=annee, section=section) self_cont = TailCall(self.adherent_etudes, adherent=adherent, cont=cont, cancel_cont=cancel_cont, default_item=default_item, etablissement=etablissement, annee=annee, section=section)
if etablissement is None or etablissement == 'Autre': if etablissement is None or etablissement == 'Autre':
if not default_item and adherent["etudes"]: if not default_item and adherent["etudes"]:
default_item = str(adherent["etudes"][0]) default_item = str(adherent["etudes"][0])
cancel_cont = cont lcont = cancel_cont if cancel_cont else cont
(code, etablissement) = self.handle_dialog(cancel_cont, box_etablissement, default_item) (code, etablissement) = self.handle_dialog(cancel_cont, box_etablissement, default_item)
output = etablissement output = etablissement
self_cont(default_item=etablissement) self_cont(default_item=etablissement)
@ -922,20 +1098,20 @@ class Dialog(proprio.Dialog):
if not default_item and adherent["etudes"]: if not default_item and adherent["etudes"]:
default_item = str(adherent["etudes"][1]) default_item = str(adherent["etudes"][1])
print default_item print default_item
cancel_cont = TailCall(self.adherent_etudes, adherent=adherent, cont=cont, default_item=etablissement, etablissement=None, annee=None, section=None) lcont = TailCall(self.adherent_etudes, adherent=adherent, cont=cont, cancel_cont=cancel_cont, default_item=etablissement, etablissement=None, annee=None, section=None)
(code , annee) = self.handle_dialog(cancel_cont, box_annee, default_item) (code , annee) = self.handle_dialog(lcont, box_annee, default_item)
output = annee output = annee
self_cont(default_item=annee) self_cont(default_item=annee)
elif section is None or section == 'Autre': elif section is None or section == 'Autre':
if not default_item and adherent["etudes"]: if not default_item and adherent["etudes"]:
default_item = str(adherent["etudes"][2]) default_item = str(adherent["etudes"][2])
cancel_cont = TailCall(self.adherent_etudes, adherent=adherent, cont=cont, default_item=annee, etablissement=etablissement, annee=None, section=None) lcont = TailCall(self.adherent_etudes, adherent=adherent, cont=cont, cancel_cont=cancel_cont, default_item=annee, etablissement=etablissement, annee=None, section=None)
(code, section) = self.handle_dialog(cancel_cont, box_section, default_item) (code, section) = self.handle_dialog(lcont, box_section, default_item)
output = section output = section
self_cont(default_item=section) self_cont(default_item=section)
else: else:
output = "" output = ""
cancel_cont = TailCall(self.adherent_etudes, adherent=adherent, cont=cont, default_item=section, etablissement=etablissement, annee=annee, section=None) lcont = TailCall(self.adherent_etudes, adherent=adherent, cont=cont, cancel_cont=cancel_cont, default_item=section, etablissement=etablissement, annee=annee, section=None)
def todo(etablissement, annee, section, adherent, self_cont, cont): def todo(etablissement, annee, section, adherent, self_cont, cont):
if etablissement is None or etablissement == 'Autre': if etablissement is None or etablissement == 'Autre':
@ -955,7 +1131,7 @@ class Dialog(proprio.Dialog):
return self.handle_dialog_result( return self.handle_dialog_result(
code=code, code=code,
output=output, output=output,
cancel_cont=cancel_cont, cancel_cont=lcont,
error_cont=self_cont, error_cont=self_cont,
codes_todo=[([self.dialog.DIALOG_OK], todo, [etablissement, annee, section, adherent, self_cont, cont])] codes_todo=[([self.dialog.DIALOG_OK], todo, [etablissement, annee, section, adherent, self_cont, cont])]
) )