Files
2023-06-22 10:34:18 +02:00

1017 lines
40 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# -*- coding: utf8 -*-
from pyramid.view import (
view_config,
)
from pyramid.httpexceptions import (
HTTPFound,
)
from datetime import date, datetime
from dateutil.relativedelta import *
from urllib.request import urlopen
from pyramid_mailer import get_mailer
from pyramid_mailer.message import Message
import json
from ..models.crm import *
from ..models.default import (
get_user_access,
get_users_by_code,
get_agences,
get_types_devis,
update_user_agency,
)
from ..views.default import (
to_date,
to_euro,
to_euroz,
to_time,
to_int,
to_percent,
)
@view_config(route_name='contacts_list', renderer='../templates/crm/contacts_list.pt', permission='view')
def contacts_list(request):
logged_in = request.authenticated_userid
member = get_users_by_code(request, logged_in)
if not member:
request.session.flash(u"Utilisateur %s introuvable" % (logged_in), 'danger')
return HTTPFound(location=request.route_url("home"))
# lire l'agence
agence = member.agence
# lire les contacts
items = get_contacts(request, agence)
# construire la liste
liste=[]
for item in items:
if item.prochain_rdv_le:
prochain_rdv_le = item.prochain_rdv_le.strftime('%d/%m/%Y')
else:
prochain_rdv_le = ""
d = (item.cree_le.strftime('%d/%m/%Y'), "%s - %s %s" % (item.cd_prospect, item.civilite, item.nomprenom), item.permis_demande,
item.a_relancer_le, item.tel_portable, item.date_relance1, item.date_relance2, item.date_relance3, prochain_rdv_le, item.statut)
liste.append(d)
return {
'page_title': 'Liste des contacts - Agence %s' % agence,
'dt_data': json.dumps(liste),
}
@view_config(route_name='agenda', renderer='../templates/crm/agenda.pt', permission='view')
def agenda(request):
def generer_planning(agence, datedeb, datefin):
rows = get_prospects_rdv_byDate(request, agence, datedeb, datefin)
# construire la liste des events
events = []
for row in rows:
# déterminer la couleur de l'event
if row.statut == "ABSENT":
color = 'LightPink' # rdv absent
elif row.statut == "PRESENT":
color = 'LightGreen' # rdv présent
else:
# statut = 'NR'
if row.cd_prospect < 100000:
color = 'LightBlue' # activité
else:
# rdv avec prospect
if row.type_code == "E" :
color = 'LightYellow' # rdv Elève
else:
color = 'Gold' # rdv Prospect
json_event = {
'title': row.objet_rdv,
'start': row.debut_rdv.strftime('%Y-%m-%d %H:%M:00'),
'end': row.fin_rdv.strftime('%Y-%m-%d %H:%M:00'),
'description': row.p_statut,
'allDay': False,
'color': color,
'textColor': '#000000',
'url': '/agenda_edit/%s' % (row.no_ligne),
}
events.append(json_event)
# construire la liste des contacts à relancer
rows = get_prospects_rdv_byRelance(request, agence, datedeb, datefin)
for row in rows:
json_event = {
'title': '%s %s - %s' % (row.civilite, row.nomprenom, row.permis_demande),
'start': datetime.strptime(row.a_relancer_le, '%d/%m/%Y').strftime('%Y-%m-%d 08:00:00'),
'end': datetime.strptime(row.a_relancer_le, '%d/%m/%Y').strftime('%Y-%m-%d 08:00:00'),
'description': row.statut,
'allDay': True,
'color': 'White',
'textColor': 'Black',
'url': '/contact_edit/%s' % (row.cd_prospect),
}
events.append(json_event)
return json.dumps(events)
# récupérer les paramètres de l'appel de la view
datePlan = request.matchdict['date']
logged_in = request.authenticated_userid
if datePlan == 'today':
datePlan = date.today().strftime('%Y-%m-%d')
url = request.route_url('agenda', date=datePlan)
member = get_users_by_code(request, logged_in)
if not member:
request.session.flash(u"Utilisateur %s introuvable" % (logged_in), 'danger')
return HTTPFound(location=request.route_url("home"))
message = ''
agence = member.agence
current_agence = agence
a = request.GET
# si agence a changé
if 'agenceid' in request.GET:
current_agence = request.GET['agenceid']
# -- CREER un rendez-vous
if 'form.submitted' in request.params:
type = request.params['type_rech']
name = request.params['name'].split(' | ')
current_agence = request.params['current_agence']
code = name[1]
datetimeRDV = request.params['datetimeRDV']
# par défaut : durée du RDV est de 15mn
finRDV = datetime.strptime(datetimeRDV, '%Y-%m-%d %H:%M') + relativedelta(minutes = 60)
query = {'agenceid':str(current_agence)}
# Controler que le prospect n'a pas déjà un RDV programmé
if int(code) > 100000:
rdvs = get_prospects_rdv_byContact(request, type, code, 1)
if rdvs :
request.session.flash("Ce contact a déjà un rendez-vous programmé le %s à l'agence %s." % (rdvs[0].debut_rdv.strftime('%d/%m/%Y'), rdvs[0].agence), 'danger')
return HTTPFound(location=request.route_url("agenda", date=finRDV.strftime("%Y-%m-%d"),_query=query))
update_contacts_rdv(request, 0, type, code, datetimeRDV, finRDV.strftime('%Y-%m-%d %H:%M'), '', 'NR', name[0], '', logged_in, 0, current_agence, logged_in)
request.session.flash(u"Le rendez-vous a été CREE avec succès.", 'success')
return HTTPFound(location=request.route_url("agenda", date=finRDV.strftime("%Y-%m-%d"),_query=query))
TODAY = date.today()
# début = aujourd'hui - 3 semaines
d = TODAY + relativedelta(weeks=-3)
datedeb = d.strftime('%Y-%m-%d')
# fin = aujourd'hui + 6 mois
d = TODAY + relativedelta(months=+6)
datefin = d.strftime('%Y-%m-%d')
# generer le planning
calendar_events = generer_planning(current_agence, datedeb, datefin)
return {
'page_title': "Agenda - Agence %s" % (current_agence),
'url': url,
'datePlan': datePlan,
'message': message,
'calendar_events': calendar_events,
'current_agence': current_agence
}
@view_config(route_name='agenda_edit', renderer='../templates/crm/agenda_edit.pt', permission='view')
def agenda_edit(request):
logged_in = request.authenticated_userid
no_ligne = request.matchdict['no_ligne']
url = request.route_url('agenda_edit', no_ligne=no_ligne)
message = ''
item = get_prospects_rdv_by_noligne(request, no_ligne)
# type de rendez-vous
type = item.type_code
code = item.cd_prospect
if type == 'P':
url_fiche = request.route_url('contact_edit', cd_prospect=code)
else:
if code > 100000:
url_fiche = request.route_url('fiche_eleve', cd_cli=code)
else:
url_fiche = ''
if 'form.submitted' in request.params:
# Controler la cohérence des heures début et fin
debut = datetime.strptime(request.params['debut_rdv'], '%d-%m-%Y %H:%M')
fin = datetime.strptime(request.params['fin_rdv'], '%d-%m-%Y %H:%M')
if debut > fin :
message = 'Dates et heures de début et fin incohérentes'
else:
notes = request.params['notes']
statut = request.params['statut']
resultat = request.params['resultat']
contact= request.params['contact']
if len(contact) == 0:
contact = logged_in
update_contacts_rdv(request, no_ligne, type, item.cd_prospect, debut.strftime("%Y-%m-%d %H:%M"), fin.strftime("%Y-%m-%d %H:%M"),
resultat, statut, item.objet_rdv, notes, contact, 0, item.agence, logged_in)
request.session.flash(u"Le rendez-vous a été mis à jour avec succès.", 'success')
return HTTPFound(location=request.route_url("agenda", date=debut.strftime("%Y-%m-%d")))
if 'form.deleted' in request.params:
# user autorisé ?
userAcces = get_user_access(request, logged_in)
if userAcces < 4:
message = "Vous n'êtes pas autorisé à effectuer cette opération !"
else:
# journée déjà comptabilisée ?
if item.debut_rdv.date() < date.today() :
message = "Ce rendez-vous est déjà passé. Suppression non autorisée."
else:
# mise à jour de la ligne comme annulée
delete_contacts_rdv(request, no_ligne)
request.session.flash(u"Le rendez-vous a été supprimer avec succès.", 'success')
return HTTPFound(location=request.route_url("agenda", date=item.debut_rdv.strftime("%Y-%m-%d")))
return {
'page_title': 'Rendez-vous du %s' % (item.debut_rdv.strftime('%d/%m/%Y')),
'message': message,
'url': url,
'url_fiche': url_fiche,
'item': item,
'cd_prospect': "%s%06d" % (type, code),
}
@view_config(route_name='contact_lookup', renderer='../templates/crm/contact_lookup.pt', permission='view')
def contact_lookup(request):
logged_in = request.authenticated_userid
member = get_users_by_code(request, logged_in)
if not member:
request.session.flash(u"Utilisateur %s introuvable" % (logged_in), 'danger')
return HTTPFound(location=request.route_url("home"))
agence = member.agence
url = request.route_url('contact_lookup')
message = ''
liste=[]
name = ''
cb_tous = "non"
if 'form.submitted' in request.params:
name = request.params['name']
# si afficher tous les fiches ?
if 'cb_tous' in request.params:
cb_tous = "oui"
contacts = get_prospects_by_name(request, name, True)
else:
cb_tous = "non"
contacts = get_prospects_by_name(request, name, False)
# si afficher tous les fiches ?
if len(contacts) == 0:
message = "Contact non trouvé : %s" % name
# construire la liste
for item in contacts:
if item.prochain_rdv_le:
prochain_rdv_le = item.prochain_rdv_le.strftime('%d/%m/%Y')
else:
prochain_rdv_le = ""
d = (str(item.cd_prospect), item.nomprenom, item.permis_demande, item.cree_le.strftime('%d/%m/%Y'),
item.tel_portable, item.cp, item.statut)
liste.append(d)
return {
'page_title': "Rechercher un contact",
'url': url,
'message': message,
'name': name,
'cb_tous': cb_tous,
'dt_data': json.dumps(liste),
'nb': len(liste),
}
@view_config(route_name='contact_edit', renderer='../templates/crm/contact_edit.pt', permission='view')
def contact_edit(request):
def ctl_dates(a_relancer_le, date_relance1, date_relance2, date_relance3, resultat1, resultat2, resultat3) :
if len(a_relancer_le) > 0 :
if to_date(a_relancer_le) == False:
return 'Date à relancer invalide'
if len(date_relance1) > 0 :
if to_date(date_relance1) == False:
return 'Date de relance 1 invalide'
if len(resultat1) == 0:
return 'Veuillez renseigner aussi le résultat 1'
if len(date_relance2) > 0 :
if to_date(date_relance2) == False:
return 'Date de relance 2 invalide'
if len(resultat2) == 0:
return 'Veuillez renseigner aussi le résultat 2'
if len(date_relance3) > 0 :
if to_date(date_relance3) == False:
return 'Date de relance 3 invalide'
if len(resultat3) == 0:
return 'Veuillez renseigner aussi le résultat 3'
return ''
def get_page_dispo(formation):
if formation == 'B96':
page = 'b96_dispo2'
elif formation == 'PAP':
page = 'pap_dispo2'
elif formation == 'PAS A2':
page = 'pasa2_dispo2'
elif formation == 'PEM':
page = 'pem_dispo2'
else:
page = ''
return page
logged_in = request.authenticated_userid.upper()
member = get_users_by_code(request, logged_in)
agence = member.agence
cd_prospect = request.matchdict['cd_prospect']
url = request.route_url('contact_edit', cd_prospect=cd_prospect)
message = ''
pour_quis = ['Lui-même','Enfant','Conjoint','Petits-enfants','Ami','Frère-sœur','Salarié']
echeances = ['1 mois','3 mois','6 mois','1 an']
permis = get_permis(request)
origines = get_origines(request)
decideurs = get_decideurs(request)
financeurs = get_financeurs(request)
prof_financeurs = get_prof_financeurs(request)
types_contact = get_types_contact(request)
types_raison = get_types_raison(request)
types_formation = get_types_formation(request)
agences = get_agences(request, 0)
formations = ['B96','PAP','PAS A2','PEM']
formation = 'PEM'
# suivi prospect
suivis = get_prospect_suivi(request, cd_prospect, 0)
# rdv du prospect
rdvs = get_prospects_rdv_byCode(request, 'P', cd_prospect)
if cd_prospect == '0':
# nouveau
individu = {}
individu['cd_prospect'] = 0
individu['type_contact'] = 'NR'
individu['pour_qui'] = 'Lui-même'
individu['permis_demande'] = 'NR'
individu['age'] = ''
individu['permis_obtenu'] = 'Non'
individu['client_marietton'] = 'Non'
individu['origine'] = '- -'
individu['origine_compl'] = ''
individu['qui_choisit'] = 'NR'
individu['qui_paye'] = 'NR'
individu['profession_payeur'] = 'NR'
individu['inscrit_autre_AE'] = 'Non'
individu['effectue_autre_AE'] = ''
individu['raison_formation'] = 'NR'
individu['budget_formation'] = '0'
individu['echeance_formation'] = '1 an'
individu['type_formation'] = 'NR'
individu['disponibilites'] = ''
individu['observation'] = ''
individu['attentes'] = ''
individu['stress'] = ''
individu['date_relance1'] = ''
individu['resultat1'] = ''
individu['date_relance2'] = ''
individu['resultat2'] = ''
individu['date_relance3'] = ''
individu['resultat3'] = ''
individu['a_relancer_le'] = ''
individu['civilite'] = ''
individu['nom'] = ''
individu['prenom'] = ''
individu['adresse'] = ''
individu['adresse2'] = ''
individu['email'] = ''
individu['tel_fixe'] = ''
individu['tel_mobile'] = ''
individu['tel_pere'] = ''
individu['tel_mere'] = ''
individu['cloture_le'] = None
individu['prochain_rdv_le'] = None
individu['tel_portable'] = ''
individu['cd_cli'] = ''
individu['statut'] = ''
individu['cd_uti'] = logged_in
individu['modif_le'] = date.today()
individu['agence'] = agence
code_postal = ''
page_title= 'Nouveau contact'
devis = []
devis_cpf = []
else:
# lire la fiche de l'individu
individu = get_prospects_by_code(request, cd_prospect)
if not individu:
request.session.flash(u"Contact non trouvé : %s" % cd_prospect, 'warning')
return HTTPFound(location=request.route_url('contacts_list'))
page_title= "Contact : %s %s" % (individu.nom, individu.prenom)
devis = get_devis_by_prospect(request, cd_prospect)
devis_cpf = get_devis_cpf_by_prospect(request, cd_prospect)
code_postal = '%s | %s' % (individu.cp, individu.ville)
if 'form.submitted' in request.params or 'form.a_relancer' in request.params or 'form.rdv_relance' in request.params:
a_relancer_le = request.params['a_relancer_le']
date_relance1 = request.params['date_relance1']
date_relance2 = request.params['date_relance2']
date_relance3 = request.params['date_relance3']
resultat1 = request.params['resultat1']
resultat2 = request.params['resultat2']
resultat3 = request.params['resultat3']
code_postal = request.params['code_postal']
# contrôles sur les dates
message = ctl_dates(a_relancer_le, date_relance1, date_relance2, date_relance3, resultat1, resultat2, resultat3)
if message == '':
new_values = {}
for param, db_value in individu.items():
if param in request.params and request.params[param] != db_value:
new_values[param] = request.params[param]
cp = code_postal.split(' | ')
if len(cp) < 2:
new_values['cp'] = ''
new_values['ville'] = ''
else:
new_values['cp'] = cp[0]
new_values['ville'] = cp[1]
if 'form.a_relancer' in request.params or 'form.rdv_relance' in request.params:
# date à relancer = aujourd'hui + 1 semaine
d = date.today() + relativedelta(weeks=+1)
new_values['a_relancer_le'] = d.strftime('%d/%m/%Y')
new_values['cd_uti'] = logged_in
update_prospect(request, cd_prospect, agence, new_values)
if 'form.rdv_relance' in request.params:
return HTTPFound(location=request.route_url('agenda', date=date.today().strftime("%Y-%m-%d")))
if 'form.a_relancer' in request.params:
return HTTPFound(location=request.route_url('contacts_list'))
if new_values:
new_values['cd_uti'] = logged_in
update_prospect(request, cd_prospect, agence, new_values)
request.session.flash(u"Le contact a été mis à jour avec succès.", 'success')
if 'form.submitted' in request.params :
return HTTPFound(location=request.route_url('contacts_list'))
if 'form.sms' in request.params:
tel_portable = individu.tel_portable
if len(tel_portable) == 0 :
message = 'Numéro de téléphone portable non renseigné'
elif tel_portable[:2] != '06' and tel_portable[:2] != '07':
message = 'Numéro de téléphone portable non valide'
else:
# mise en forme du numéro : 00336XXXXXX (pas de + ni de 06 ou 07)
tel_to = '0033' + tel_portable[1:]
formation = request.params['formation']
# lire url selon la formation demandé
page = get_page_dispo(formation)
try:
sms_url = "https://www.suivi-eleve.marietton.com/SMS/index.php?to=%s&type=VEL&url=%s&cdp=%s" % (tel_to, page, individu.cd_prospect)
html = urlopen(sms_url,timeout=30)
retour = html.read()
if retour == b'OK':
insert_prospect_suivi(request, cd_prospect, "LIEN SMS ENVOYÉ => " + formation, logged_in)
request.session.flash("Le SMS permettant de s'inscrire a été envoyé au numéro : %s." % tel_to, 'success')
else:
request.session.flash("Echec de l'envoi du SMS au numéro : %s." % tel_to, 'danger')
except:
pass
return HTTPFound(location=url)
if 'form.email' in request.params:
page = get_page_dispo(request.params['formation'])
formation = request.params['formation']
# lire le user qui a créé le prospect
user = get_users_by_code(request, individu.cd_uti)
# lire l'adresse email de l'agence
agence = get_agences(request, individu.agence)
expediteur = agence.email
# Fabrication du corps du Message
lien = 'https://monespace.marietton.com/%s/%s' % (page, individu.cd_prospect)
# ajouter entête et pied au corps du message
html_body = """
<p>Bonjour %s %s %s,</p>
<p>Comme convenu, voici ci-après le lien qui va vous permettre de finaliser linscription à votre formation %s :</p>
<p>
<a href="%s">%s</a>
</p>
<p>
Sil y a le moindre soucis, je reste disponible par email, téléphone ou chat.
<br />
Cordialement,<br />
<br />
%s
</p>
<p>
<b>MARIETTON - %s</b><br/>
%s<br />
%s
</p>
""" % (individu.civilite, individu.prenom, individu.nom, formation, lien, lien, user.nom, agence.LIBELLE, agence.TELEPHONE, agence.email)
message = Message(subject="[MARIETTON] Votre formation %s" % formation,
sender=expediteur,
recipients=[individu.email],
html=html_body)
mailer = get_mailer(request)
mailer.send_immediately(message, fail_silently=True)
insert_prospect_suivi(request, cd_prospect, "LIEN EMAIL ENVOYÉ => " + formation, logged_in)
request.session.flash("Le lien permettant de s'inscrire a été envoyé à : %s." % individu.email, 'success')
return HTTPFound(location=url)
return {
'page_title': page_title,
'url': url,
'individu': individu,
'code_postal': code_postal,
'message': message,
'pour_quis': pour_quis,
'permis': permis,
'origines': origines,
'decideurs': decideurs,
'financeurs': financeurs,
'prof_financeurs': prof_financeurs,
'types_contact': types_contact,
'types_raison': types_raison,
'types_formation': types_formation,
'echeances': echeances,
'devis': devis,
'devis_cpf': devis_cpf,
'suivis': suivis,
'rdvs': rdvs,
'agences': agences,
'formations': formations,
'formation': formation,
}
@view_config(route_name='confirm', renderer='../templates/crm/confirm.pt', permission='view')
def confirm(request):
logged_in = request.authenticated_userid.upper()
cd_prospect = request.matchdict['cd_prospect']
action = request.matchdict['action']
url = request.route_url('confirm', cd_prospect=cd_prospect, action=action)
message = ''
if action in ['leave', 'cancel', 'error']:
# lire le CPF
item = get_devis_cpf(request, cd_prospect)
if not item:
request.session.flash(u"CPF non trouvé : %s" % cd_prospect, 'warning')
return HTTPFound(location=request.route_url('contacts_list'))
page_title = 'CPF : %s - %s' % (item.no_devis, item.nomprenom)
# contact ou eleve ?
if item.cd_prospect > 0:
url_retour = request.route_url('contact_edit', cd_prospect=cd_prospect) + '#cpf'
else:
url_retour = request.route_url('fiche_eleve', cd_cli=cd_prospect) + '#cpf'
else:
# lire la fiche du prospect
item = get_prospects_by_code(request, cd_prospect)
if not item:
request.session.flash(u"Contact non trouvé : %s" % cd_prospect, 'warning')
return HTTPFound(location=request.route_url('contacts_list'))
page_title = 'Confirmation fiche : %s %s' % (item.civilite, item.nom)
url_retour = request.route_url('contact_edit', cd_prospect=cd_prospect)
# lire la fiche du user
member = get_users_by_code(request, logged_in)
agence = member.agence
motifs_abandon = get_motifs_abandon(request)
if 'form.submitted' in request.params:
if action == 'won':
# prospect gagné
update_prospect_won(request, cd_prospect, logged_in.upper(), agence)
return HTTPFound(location=request.route_url('contacts_list'))
elif action == 'lost':
# prospect perdu
motif_abandon = request.params['motif_abandon']
update_prospect_lost(request, cd_prospect, motif_abandon, logged_in.upper())
return HTTPFound(location=request.route_url('contacts_list'))
else:
# CPF abandonné
if action == 'leave':
statut = 23
elif action == 'cancel':
statut = 80
else:
statut = 11
update_devis_cpf_status(request, cd_prospect, statut)
request.session.flash("'%s' a été modifié avec succès." % cd_prospect, 'success')
return HTTPFound(location=url_retour)
return {
'page_title': page_title,
'url': url,
'url_retour': url_retour,
'cd_prospect': cd_prospect,
'message': message,
'action': action,
'motifs_abandon': motifs_abandon,
}
@view_config(route_name='devis_frm', renderer='../templates/crm/devis_frm.pt', permission='view')
def devis_frm(request):
logged_in = request.authenticated_userid.upper()
no_devis = request.matchdict['no_devis']
code = request.matchdict['code']
url = request.route_url('devis_frm', no_devis=no_devis, code=code)
# contact ou eleve ?
if code[:1] == 'P':
url_retour = request.route_url('contact_edit', cd_prospect=code[1:]) + '#devis'
else:
url_retour = request.route_url('fiche_eleve', cd_cli=code[1:]) + '#devis'
# lire le code accès de l'utilisateur connecté
user = get_users_by_code(request, logged_in)
access = user.secu
message = ""
if no_devis == '0':
# nouveau
titre = "Nouveau DEVIS"
devis = {}
if code[:1] == 'P':
devis['cd_prospect'] = code[1:]
devis['cd_cli'] = 0
else:
devis['cd_prospect'] = 0
devis['cd_cli'] = code[1:]
devis['organisme'] = ''
devis['entreprise'] = ''
devis['adr_org'] = ''
devis['adr2_org'] = ''
devis['cp_org'] = ''
devis['ville_org'] = ''
devis['type_devis'] = ''
devis['taux_tva'] = 20.0
devis['date_edition'] = None
devis['no_pec'] = ''
devis['date_pec'] = None
devis['date_debut_pec'] = None
devis['date_fin_pec'] = None
devis['montant_pec'] = 0.00
devis['nb_heures_pec'] = 0
devis['no_facture1'] = ''
devis['date_facture1'] = None
devis['mt_facture1'] = 0.00
devis['no_facture2'] = ''
devis['date_facture2'] = None
devis['mt_facture2'] = 0.00
devis['no_facture3'] = ''
devis['date_facture3'] = None
devis['mt_facture3'] = 0.00
devis['no_facture4'] = ''
devis['date_facture4'] = None
devis['mt_facture4'] = 0.00
devis['reste_a_facturer'] = 0.00
devis['cloture_le'] = None
devis['cree_le'] = datetime.now()
devis['modif_le'] = datetime.now()
devis['cd_uti'] = ''
else:
devis = get_devis(request, no_devis)
titre = "Devis no %s - %s" % (no_devis, devis.nomprenom)
# lire la table des types de devis
types_devis = get_types_devis(request, 'ALL')
# lire la table des codes TVA
codes_tva = get_p_tva(request)
if 'form.submitted' in request.params:
new_values = {}
for param, db_value in devis.items():
if param in request.params and request.params[param] != db_value:
new_values[param] = request.params[param]
if new_values:
if code[:1] == 'P':
new_values['cd_prospect'] = code[1:]
new_values['cd_uti'] = logged_in
update_devis(request, no_devis, code, new_values)
request.session.flash("Le devis a été mis à jour avec succès.", 'success')
return HTTPFound(location=url_retour)
if 'form.abandoned' in request.params:
if no_devis != '0':
update_devis_status(request, no_devis, 23)
request.session.flash("'%s' a été modifié avec succès." % no_devis, 'success')
return HTTPFound(location=url_retour)
return {
'page_title': titre,
'url': url,
'url_retour': url_retour,
'message': message,
'devis': devis,
'no_devis': no_devis,
'code': code,
'codes_tva': codes_tva,
'types_devis': types_devis,
'access': access,
}
@view_config(route_name='devis_pec', renderer='../templates/crm/devis_pec.pt', permission='view')
def devis_pec(request):
logged_in = request.authenticated_userid.upper()
no_devis = request.matchdict['no_devis']
code = request.matchdict['code']
url = request.route_url('devis_pec', no_devis=no_devis, code=code)
message = ""
devis = get_devis(request, no_devis)
codes_tva = get_p_tva(request)
statuts = get_statuts(request)
if devis.date_pec:
date_pec = devis.date_pec.strftime('%d/%m/%Y')
else:
date_pec = date.today().strftime('%d/%m/%Y')
if devis.date_debut_pec:
date_debut_pec = devis.date_debut_pec.strftime('%d/%m/%Y')
else:
date_debut_pec = ''
if devis.date_fin_pec:
date_fin_pec = devis.date_fin_pec.strftime('%d/%m/%Y')
else:
date_fin_pec = ''
if 'form.submitted' in request.params:
new_values = {}
for param, db_value in devis.items():
if param in request.params and request.params[param] != db_value:
new_values[param] = request.params[param]
date_pec = request.params['date_pec']
date_debut_pec = request.params['date_debut_pec']
date_fin_pec = request.params['date_fin_pec']
# formater date
ddate = datetime.strptime(new_values['date_pec'], '%d-%m-%Y')
new_values['date_pec'] = ddate.strftime("%Y-%m-%d")
ddebut = datetime.strptime(new_values['date_debut_pec'], '%d-%m-%Y')
new_values['date_debut_pec'] = ddebut.strftime("%Y-%m-%d")
ddate = datetime.strptime(new_values['date_fin_pec'], '%d-%m-%Y')
new_values['date_fin_pec'] = ddate.strftime("%Y-%m-%d")
if ddebut > ddate:
message = 'Dates de debut et de fin de PEC incorrectes'
else:
new_values['cd_uti'] = logged_in
update_devis(request, no_devis, code, new_values)
request.session.flash("Le devis a été mis à jour avec succès.", 'success')
return HTTPFound(location=request.route_url('devis_frm', no_devis=no_devis, code=code))
if 'form.canceled' in request.params:
cancel_devis(request, no_devis)
request.session.flash("La prise en charge a été annulée avec succès.")
return HTTPFound(location=request.route_url('devis_frm', no_devis=no_devis, code=code))
return {
'page_title': "Devis no %s - %s" % (no_devis, devis.nomprenom),
'url': url,
'message': message,
'devis': devis,
'no_devis': no_devis,
'code': code,
'codes_tva': codes_tva,
'statuts': statuts,
'date_pec': date_pec,
'date_debut_pec': date_debut_pec,
'date_fin_pec': date_fin_pec,
}
@view_config(route_name='contact_suivi', renderer='../templates/crm/contact_suivi.pt', permission='view')
def contact_suivi(request):
cd_prospect = request.matchdict['cd_prospect']
no_ligne = request.matchdict['no_ligne']
url = request.route_url('contact_suivi', cd_prospect=cd_prospect, no_ligne=no_ligne)
message = ''
logged_in = request.authenticated_userid.upper()
# lire le code accès de l'utilisateur connecté
user = get_users_by_code(request, logged_in)
access = user.secu
readonly = False
if no_ligne == '0':
# nouveau
item = {}
item['cd_prospect'] = cd_prospect
item['no_ligne'] = no_ligne
item['infos'] = ''
page_title= 'Nouvelle ligne de suivi'
else:
# lire la fiche de l'item
item = get_prospect_suivi(request, cd_prospect, no_ligne)
if not item:
request.session.flash(u"Suivi non trouvé : %s" % no_ligne, 'warning')
return HTTPFound(location=request.route_url('fiche_eleve'))
page_title= "Suivi no : %s" %(item.no_ligne)
# admibistrateur ou auteur du suivi ?
if access != 9 and item.cd_uti != logged_in:
readonly = True
if 'form.submitted' in request.params:
new_values = {}
for param, db_value in item.items():
if param in request.params and request.params[param] != db_value:
new_values[param] = request.params[param]
new_values['cd_prospect'] = cd_prospect
new_values['cd_uti'] = logged_in
if new_values:
update_prospect_suivi(request, no_ligne, new_values)
request.session.flash(u"Le suivi a été mis à jour avec succès.", 'success')
return HTTPFound(location=request.route_url('contact_edit', cd_prospect=cd_prospect) + '#suivi')
if 'form.deleted' in request.params:
delete_prospect_suivi(request, no_ligne)
request.session.flash(u"Le suivi a été supprimé avec succès.", 'success')
return HTTPFound(location=request.route_url('contact_edit', cd_prospect=cd_prospect) + '#suivi')
return {
'page_title': page_title,
'url': url,
'item': item,
'no_ligne': no_ligne,
'message': message,
'readonly': readonly,
}
@view_config(route_name='devis_cpf_frm', renderer='../templates/crm/devis_cpf_frm.pt', permission='view')
def devis_cpf_frm(request):
logged_in = request.authenticated_userid.upper()
no_devis = request.matchdict['no_devis']
code = request.matchdict['code']
url = request.route_url('devis_cpf_frm', no_devis=no_devis, code=code)
# contact ou eleve ?
if code[:1] == 'P':
url_retour = request.route_url('contact_edit', cd_prospect=code[1:]) + '#cpf'
else:
url_retour = request.route_url('fiche_eleve', cd_cli=code[1:]) + '#cpf'
# lire le code accès de l'utilisateur connecté
user = get_users_by_code(request, logged_in)
access = user.secu
# lire la table des types de devis
types_devis = get_types_devis(request, 'CPF')
message = ""
etape = 1
if no_devis == '0':
# nouveau
titre = "Nouveau CPF"
devis = {}
if code[:1] == 'P':
devis['cd_prospect'] = code[1:]
devis['cd_cli'] = 0
else:
devis['cd_prospect'] = 0
devis['cd_cli'] = code[1:]
devis['type_devis'] = types_devis[0].type_devis
devis['montant_pec'] = types_devis[0].montantTTC
devis['montant_ht'] = types_devis[0].montantHT
devis['nb_heures_pec'] = types_devis[0].nb_heures
devis['no_dossier'] = ''
devis['demande_le'] = None
devis['accepte_le'] = None
devis['demande_log'] = ''
devis['cree_le'] = datetime.now()
devis['modif_le'] = datetime.now()
devis['cloture_le'] = None
devis['formation_debut_le'] = None
devis['cd_uti'] = ''
else:
devis = get_devis_cpf(request, no_devis)
titre = "CPF no %s - %s" % (no_devis, devis.nomprenom)
if devis.demande_le :
etape = 2 # formation
if devis.debut_renseigne_le:
etape = 3 # facturation
if 'form.submitted' in request.params or 'form.formation' in request.params or 'form.facturation' in request.params:
# ENREGISTRER, construire les valeurs saisies
new_values = {}
new_values['cd_uti'] = logged_in
if code[:1] == 'P':
new_values['cd_prospect'] = code[1:]
else:
new_values['cd_cli'] = code[1:]
# Enregistrer la DEMANDE
if 'form.submitted' in request.params:
new_values['type_devis'] = request.params['type_devis']
new_values['montant_pec'] = request.params['montant_pec']
new_values['montant_ht'] = request.params['montant_ht']
new_values['nb_heures_pec'] = request.params['nb_heures_pec']
new_values['no_dossier'] = request.params['no_dossier']
new_values['demande_log'] = request.params['demande_log']
if request.params['demande_le'] == '':
new_values['demande_le'] = None
else:
ddate = datetime.strptime(request.params['demande_le'], '%d-%m-%Y')
new_values['demande_le'] = ddate.strftime("%Y-%m-%d")
# controler que le no de dossier est unique
if 'no_dossier' in new_values:
no_dossier = new_values['no_dossier']
if no_dossier != '':
devis_cpf = get_devis_cpf_by_nodossier(request, no_dossier, no_devis)
if devis_cpf:
request.session.flash("Modification impossible. Ce numéro de dossier existe déjà : %s" % no_dossier, 'danger')
return HTTPFound(location=url)
update_devis_cpf(request, no_devis, code, new_values)
request.session.flash("Le CPF a été mis à jour avec succès.", 'success')
return HTTPFound(location=url_retour)
# CONTROLES étape : FORMATION
if 'form.formation' in request.params:
new_values['validation_log'] = request.params['validation_log']
new_values['accepte_log'] = request.params['accepte_log']
new_values['debut_renseigne_log'] = request.params['debut_renseigne_log']
if request.params['formation_debut_le'] == '':
new_values['formation_debut_le'] = None
else:
ddate = datetime.strptime(request.params['formation_debut_le'], '%d-%m-%Y')
new_values['formation_debut_le'] = ddate.strftime("%Y-%m-%d")
if request.params['formation_fin_le'] == '':
new_values['formation_fin_le'] = None
else:
ddate = datetime.strptime(request.params['formation_fin_le'], '%d-%m-%Y')
new_values['formation_fin_le'] = ddate.strftime("%Y-%m-%d")
if request.params['fin_pec_le'] == '':
new_values['fin_pec_le'] = None
else:
ddate = datetime.strptime(request.params['fin_pec_le'], '%d-%m-%Y')
new_values['fin_pec_le'] = ddate.strftime("%Y-%m-%d")
if request.params['accepte_le'] == '':
new_values['accepte_le'] = None
else:
ddate = datetime.strptime(request.params['accepte_le'], '%d-%m-%Y')
new_values['accepte_le'] = ddate.strftime("%Y-%m-%d")
if request.params['debut_renseigne_le'] == '':
new_values['debut_renseigne_le'] = None
else:
ddate = datetime.strptime(request.params['debut_renseigne_le'], '%d-%m-%Y')
new_values['debut_renseigne_le'] = ddate.strftime("%Y-%m-%d")
update_devis_cpf(request, no_devis, code, new_values)
request.session.flash("Le CPF a été mis à jour avec succès.", 'success')
return HTTPFound(location=url_retour)
# CONTROLES étape : FACTURATION
if 'form.facturation' in request.params:
new_values['nb_heures_effectue'] = request.params['nb_heures_effectue']
new_values['facture_mt'] = request.params['facture_mt']
new_values['fin_renseigne_log'] = request.params['fin_renseigne_log']
new_values['facture_log'] = request.params['facture_log']
if request.params['fin_renseigne_le'] == '':
new_values['fin_renseigne_le'] = None
else:
ddate = datetime.strptime(request.params['fin_renseigne_le'], '%d-%m-%Y')
new_values['fin_renseigne_le'] = ddate.strftime("%Y-%m-%d")
update_devis_cpf(request, no_devis, code, new_values)
request.session.flash("Le CPF a été mis à jour avec succès.", 'success')
return HTTPFound(location=url_retour)
return {
'page_title': titre,
'url': url,
'url_retour': url_retour,
'message': message,
'devis': devis,
'no_devis': no_devis,
'code': code,
'types_devis': types_devis,
'access': access,
'etape': etape,
}