# -*- 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 = """
Bonjour %s %s %s,
Comme convenu, voici ci-après le lien qui va vous permettre de finaliser l’inscription à votre formation %s :
S’il y a le moindre soucis, je reste disponible par email, téléphone ou chat.
Cordialement,
%s
MARIETTON - %s
%s
%s