1017 lines
40 KiB
Python
1017 lines
40 KiB
Python
# -*- 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 l’inscription à votre formation %s :</p>
|
||
<p>
|
||
<a href="%s">%s</a>
|
||
</p>
|
||
<p>
|
||
S’il 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,
|
||
}
|
||
|