# -*- 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

S’il y a le moindre soucis, je reste disponible par email, téléphone ou chat.
Cordialement,

%s

MARIETTON - %s
%s
%s

""" % (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, }