diff --git a/mondumas/models/devis.py b/mondumas/models/devis.py index 12a3bd1..ce8de54 100644 --- a/mondumas/models/devis.py +++ b/mondumas/models/devis.py @@ -226,12 +226,3 @@ def move_devis_ligne(request, nodossier, nolig, move): query = """UPDATE devis_lignes SET nolig = :nolig WHERE societe = :societe and no_id=:no_id and nolig = :max_no;""" execute_query(request, query, {'societe': societe, 'no_id': no_id, 'nolig': nolig, 'max_no': max_no}) -def get_societes(request, societe): - - if societe == '0': - query = "SELECT * FROM p_societe;" - results = request.dbsession.execute(query, {'societe': societe, 'no_id': no_id}).fetchall() - else: - query = "SELECT * FROM p_societe WHERE societe = :societe;" - results = request.dbsession.execute(query, {'societe': societe}).first() - return results diff --git a/mondumas/models/parametres.py b/mondumas/models/parametres.py index 2a878db..6f30205 100644 --- a/mondumas/models/parametres.py +++ b/mondumas/models/parametres.py @@ -74,24 +74,6 @@ def get_rdf_causes_by_id(request, code): results = request.dbsession.execute(query, {'code': code}).first() return results -def get_emails_sent(request, societe, nolig): - d = datetime.now() - d = d - dateutil.relativedelta.relativedelta(months=1) - # début du mois M-3 - datedeb = d.strftime('%Y-%m-%d') - - if nolig == 0: - query = """SELECT CONCAT(l.societe,"-",l.no_id) as nodossier, l.datemaj, l.comment, l.nolig, l.usermaj, e.nomcli FROM dem_lig l - INNER JOIN dem_devis e ON l.societe=e.societe AND l.no_id=e.no_id - WHERE l.societe = :societe AND l.date >= :datedeb AND l.comment LIKE 'Envoi email -> %' ORDER BY l.datemaj LIMIT 250;""" - results = request.dbsession.execute(query, {'societe': societe, 'datedeb': datedeb}).fetchall() - else: - query = """SELECT * FROM dem_lig WHERE nolig=:nolig;""" - results = request.dbsession.execute(query, {'nolig': nolig}).first() - - return results - - def delete_rdf_cause(request, old_code): query = "DELETE FROM rdf_causes WHERE code = :old_code;" execute_query(request, query, {'old_code': old_code}) @@ -209,6 +191,3 @@ def delete_expert(request, code_cab, code_exp): query = "DELETE FROM p_experts WHERE code_cab = :code_cab AND code_exp = :code_exp;" execute_query(request, query, {'code_cab': code_cab, 'code_exp': code_exp}) -def update_rappels(request): - query = "CALL spUPD_RAPPELS();" - execute_query(request, query) diff --git a/mondumas/models/utils.py b/mondumas/models/utils.py new file mode 100644 index 0000000..17035ee --- /dev/null +++ b/mondumas/models/utils.py @@ -0,0 +1,71 @@ +# -*- coding: utf8 -*- +from sqlalchemy import text +from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.orm import ( + scoped_session, + sessionmaker, +) +from zope.sqlalchemy import ( + ZopeTransactionExtension, + mark_changed +) + +from datetime import * +import dateutil.relativedelta +import transaction + +def execute_query(request, query, params): + """Execute query and mark session as changed""" + request.dbsession.execute(query, params) + mark_changed(request.dbsession) + transaction.commit() + +def insert_log(request, proc, msg): + query = "INSERT t_log_nuit (proc,msg) VALUES (:proc,:msg);" + execute_query(request, query, {'proc': proc, 'msg' :msg}) + +def truncate_log(request): + query = "TRUNCATE t_log_nuit;" + execute_query(request, query, {}) + +def get_log(request): + # lire les rappels non envoyés + query = "SELECT * FROM t_log_nuit;" + results = request.dbsession.execute(query, {}).fetchall() + return results + +def get_email_rappels(request): + # lire les rappels non envoyés + query = """ SELECT r.*, e.c_qualite, e.c_nom, e.c_adr, e.c_adr2, e.c_ville, e.c_email, s.tel, s.nom as nom_societe + FROM email_rappels r + INNER JOIN dem_devis e ON r.societe = e.societe AND r.nochantier = e.no_id + INNER JOIN p_societe s ON r.societe = s.societe + WHERE ISNULL(envoye_le) ORDER BY no_id;""" + results = request.dbsession.execute(query, {}).fetchall() + return results + + +def delete_rdv(request, nodossier, nolig): + societe = nodossier[0:2] + no_id = nodossier[3:] + + query = "DELETE FROM dem_lig where societe = '%s' and no_id=%s and nolig=%s;" % (societe, no_id, nolig) + execute_query(request, query, {}) + +def update_rappels(request): + query = "CALL spUPD_RAPPELS();" + execute_query(request, query, {}) + +def update_email_rappels(request, no_id): + query = "UPDATE email_rappels SET envoye_le = NOW() WHERE no_id = :no_id;" + execute_query(request, query, {'no_id': no_id}) + +def get_societes(request, societe): + + if societe == '0': + query = "SELECT * FROM p_societe;" + results = request.dbsession.execute(query, {'societe': societe, 'no_id': no_id}).fetchall() + else: + query = "SELECT * FROM p_societe WHERE societe = :societe;" + results = request.dbsession.execute(query, {'societe': societe}).first() + return results diff --git a/mondumas/routes.py b/mondumas/routes.py index 9d10340..5e7dad8 100644 --- a/mondumas/routes.py +++ b/mondumas/routes.py @@ -56,7 +56,6 @@ def includeme(config): config.add_route('connecter_a', '/connecter_a/{login}') config.add_route('dashboard', '/dashboard') config.add_route('emails_msg', '/emails_msg/{nolig}') - config.add_route('emails_sent', '/emails_sent') config.add_route('expert_edit', '/expert_edit/{code_cab}/{code_exp}') config.add_route('infrastructure', '/infrastructure') config.add_route('orphans_de', '/orphans_de/{societe}') diff --git a/mondumas/templates/default/home.pt b/mondumas/templates/default/home.pt index f4335c1..0c20943 100644 --- a/mondumas/templates/default/home.pt +++ b/mondumas/templates/default/home.pt @@ -44,11 +44,6 @@

PDF DOSSIERS

-
- - -

EMAILS ENVOYES

-


diff --git a/mondumas/templates/parametres/emails_sent.pt b/mondumas/templates/parametres/emails_sent.pt deleted file mode 100644 index 6fedd9f..0000000 --- a/mondumas/templates/parametres/emails_sent.pt +++ /dev/null @@ -1,73 +0,0 @@ - -
- -
-
- -
- -
- -
-
- - Retour -
-
- -
- - - - - - - - - - - -
DateDossierClientObjetNoPar
-
- -
-
- - - -
-
- - diff --git a/mondumas/templates/parametres/parametres.pt b/mondumas/templates/parametres/parametres.pt index 3755e3d..f0cc6c3 100644 --- a/mondumas/templates/parametres/parametres.pt +++ b/mondumas/templates/parametres/parametres.pt @@ -33,6 +33,10 @@

TABLEAU de BORD

+
+ +

RAPPELS RDV

+

CONNEXIONS

diff --git a/mondumas/views/default.py b/mondumas/views/default.py index 34b4644..32b0540 100644 --- a/mondumas/views/default.py +++ b/mondumas/views/default.py @@ -14,8 +14,6 @@ from pyramid.httpexceptions import ( HTTPNotFound, HTTPForbidden, ) -from pyramid_mailer import get_mailer -from pyramid_mailer.message import Message, Attachment from datetime import * from sqlalchemy.exc import DBAPIError from ..security import groupfinder @@ -32,6 +30,8 @@ from ..models.dossier import ( get_clients_byName ) +from ..views.utils import * + def to_decimal(x): import decimal return decimal.Decimal(str(x)) @@ -100,14 +100,19 @@ def envoyer_mdp(request): Le lien suivant vous dirigera vers une page où vous pourrez ré-initialiser votre mot de passe d'accès à « gestion.entreprise-dumas.com » : - %s (Ce lien est valide pendant 168 heures.) +Cordialement, +gestion.entreprise-dumas.com + """ % (request.route_url('redefinir_mdp', lien=lien)) - envoyerMail(request, member.email, "Demande de ré-initialisation du mot de passe", body) + # envoyer l'email + expediteur = request.registry.settings['mondumas.admin_email'] + send_mail(request, expediteur, member.email, "Demande de ré-initialisation du mot de passe", body) + request.session.flash("Le lien permettant de redéfinir votre mot de passe vous a été envoyé à l'adresse : %s." % member.email, 'success') return HTTPFound(location=request.route_url('affiche_message', login=login)) else: @@ -237,26 +242,6 @@ def logout(request): headers=headers) - -def envoyerMail(request, destinataire, objet, corps): - body = """ - -%s - -Cordialement, -gestion.entreprise-dumas.com - -""" % (corps) - - message = Message(subject="[Ent. Dumas] %s" % objet, - sender=request.registry.settings['mondumas.admin_email'], - body=body) - message.add_recipient(destinataire) - mailer = get_mailer(request) - - mailer.send_immediately(message) - - @view_config(route_name='affiche_message', renderer='../templates/default/affiche_message.pt') def affiche_message(request): diff --git a/mondumas/views/devis.py b/mondumas/views/devis.py index 4893b23..2d0431d 100644 --- a/mondumas/views/devis.py +++ b/mondumas/views/devis.py @@ -137,8 +137,6 @@ def devis_web(request): return HTTPFound(request.route_url("devis_ligne", type_ligne=type_lig, nodevis=nodevis, nolig='0')) if 'form.generate' in request.params: - # lire la societe - soc = get_societes(request, societe) options = { 'page-size': 'A4', diff --git a/mondumas/views/parametres.py b/mondumas/views/parametres.py index 0944ea3..78d370b 100644 --- a/mondumas/views/parametres.py +++ b/mondumas/views/parametres.py @@ -105,8 +105,6 @@ def connecter_a(request): else: return HTTPFound(location="/") - - @view_config(route_name='user_edit', renderer='../templates/parametres/user_edit.pt', permission='manage') def user_edit(request): cd_uti = request.matchdict['cd_uti'] @@ -332,46 +330,6 @@ def rdf_cause_edit(request): 'message': message, } -@view_config(route_name='emails_sent', renderer='../templates/parametres/emails_sent.pt', permission='view') -def emails_sent(request): - - societes = ['PE','ME','PL','PO','CD'] - societe = 'PE' - # prendre en compte les paramètres de saisie - if 'societe' in request.params: - societe = request.params["societe"] - - # lire les messages envoyés - items = get_emails_sent(request, societe, 0) - - # construire la liste - liste=[] - for item in items: - - d = (item.datemaj.strftime('%d/%m/%Y - %H:%M'), item.nodossier, item.nomcli, item.comment, item.nolig, item.usermaj) - liste.append(d) - - return { - 'page_title': 'Liste des emails envoyés', - 'dt_data': json.dumps(liste), - 'societe': societe, - 'societes': societes, - } - -@view_config(route_name='emails_msg', renderer='../templates/parametres/emails_msg.pt', permission='view') -def emails_msg(request): - - nolig = request.matchdict['nolig'] - # lire le message - item = get_emails_sent(request, '', nolig) - if not item: - request.session.flash("Impossible de lire le message %s" % nolig, 'damger') - return HTTPFound(location=request.route_url('rdf_causes')) - - return { - 'page_title': item.COMMENT, - 'item': item, - } @view_config(route_name='text_list', renderer='../templates/parametres/text_list.pt', permission='manage') def text_list(request): diff --git a/mondumas/views/utils.py b/mondumas/views/utils.py index 0a09620..8cad553 100644 --- a/mondumas/views/utils.py +++ b/mondumas/views/utils.py @@ -4,6 +4,14 @@ from pyramid.view import ( view_config, ) +from pyramid_mailer import get_mailer +from pyramid_mailer.message import Message, Attachment + +from time import sleep +from datetime import * + +from ..models.utils import * + @view_config(route_name='batch_nuit') def batch_nuit(request): """ @@ -11,100 +19,114 @@ def batch_nuit(request): Par sécurité, ce view ne peut être appelé qu'avec un paramètre secret 'JonSn0w' """ - # import pdb;pdb.set_trace() # contrôle : paramètre correct ? non, terminer par = request.matchdict['param'] if par != 'JonSn0w': return Response('Erreur : paramètre incorrect') + # ----- effacer le log + truncate_log(request) + + # ----- PURGE des dosiers obsolètes + # todo + # ----- RAPPELS DES RENDEZ-VOUS + update_rappels(request) + # attendre 5 secondes + sleep(5) + + # ----- envoyer les rappels + notifier_rappels(request) + + # ----- ENVOI RAPPORTS di traitement + email_rapport(request) + return Response('Batch nuit terminé OK') def notifier_rappels(request): - szSQL = "insert t_log_nuit (proc,msg) values ('RAPPELS','- Début ENVOI emails');" - ExecQuery(ctDSN_AEM, szSQL) + # log : Début ENVOI emails + insert_log(request, 'RAPPELS','- Début ENVOI emails') - szSQL = "SELECT r.*, e.c_qualite, e.c_nom, e.c_adr, e.c_adr2, e.c_ville, e.c_email, s.tel, s.nom as nom_societe FROM email_rappels r " & _ - "INNER JOIN dem_devis e ON r.societe = e.societe AND r.nochantier = e.no_id " & _ - "INNER JOIN p_societe s ON r.societe = s.societe " & _ - "WHERE ISNULL(envoye_le) ORDER BY no_id;" - GetRecordset(ctDSN_AEM, szSQL, rsRappel) + # lire les rappels non encore envoyés + rappels = get_email_rappels(request) - Do While Not rsRappel.EOF + nbLus = 0 + nbEmailVide = 0 + nbEnvoyes = 0 + + for item in rappels: nbLus += 1 - If rsRappel.Fields("c_email").Value.ToString.Length = 0 Then + if len(item.c_email) == 0 : nbEmailVide += 1 - szSQL = "insert t_log_nuit (proc,msg) values ('RAPPELS', '--> email vide : " & rsRappel.Fields("societe").Value & "-" & nq(rsRappel.Fields("nochantier").Value) & _ - " - " & rsRappel.Fields("c_qualite").Value & " " & nq(rsRappel.Fields("c_nom").Value) & "');" - ExecQuery(ctDSN_AEM, szSQL) - Else - ' RDV ayant une heure - date_heure = Format(rsRappel.Fields("rdv_date").Value, "dd/MM/yyyy à HH:mm") - szBody = "

Bonjour " & nv(rsRappel.Fields("c_qualite").Value) & " " & rsRappel.Fields("c_nom").Value & ",

" & _ - "

L’entreprise " & rsRappel.Fields("nom_societe").Value & " vous rappelle votre prochain rendez-vous, pris d'un commun accord,

" & _ - "

le " & date_heure & "
" & _ - rsRappel.Fields("c_adr").Value & "
" & - IIf(rsRappel.Fields("c_adr2").Value.ToString.Length > 0, rsRappel.Fields("c_adr2").Value & "
", "") & _ - rsRappel.Fields("c_ville").Value & "
" & "

" & _ - "

En cas d'empêchement, veuillez nous contacter au " & rsRappel.Fields("tel").Value & "." & _ - "

Veuillez agréer nos sincères salutations.

" & _ - "

L'entreprise " & rsRappel.Fields("nom_societe").Value & "

" + insert_log(request, 'RAPPELS', '--> email vide : %s-%s - %s %s' % (item.societe, item.nochantier, item.c_qualite, item.c_nom)) + else: + # RDV ayant une heure + date_heure = item.rdv_date.strftime('%d/%m/%Y - %H:%M') + szBody = """ + +

Bonjour %s %s

+

L’entreprise %s vous rappelle votre prochain rendez-vous, pris d'un commun accord,

+

le %s
+%s
+%s
+%s

+

En cas d'empêchement, veuillez nous contacter au %s

+

Veuillez agréer nos sincères salutations.

+

L'entreprise %s

+""" % (item.c_qualite, item.c_nom, item.nom_societe, date_heure, item.c_adr, item.c_adr2, item.c_ville, item.tel, item.nom_societe) - SendNotification(ctDSN_AEM, "RAPPEL : rendez-vous le " & date_heure, szBody, rsRappel.Fields("c_email").Value, rsRappel.Fields("societe").Value) + # email_rappels(request, "RAPPEL : rendez-vous le " + date_heure, szBody, item.c_email, item.societe) nbEnvoyes += 1 - End If - ' marquer le rdv comme envoyé ou traité - szSQL = "UPDATE email_rappels SET envoye_le = NOW() WHERE no_id = " & rsRappel.Fields("no_id").Value - ExecQuery(ctDSN_AEM, szSQL) - ' Get the next record - rsRappel.MoveNext() - Loop - ' Close the recordset AND connection. - rsRappel.Close() + + # marquer le rdv comme envoyé ou traité + update_email_rappels(request, item.no_id) - szSQL = "insert t_log_nuit (proc,msg) values ('RAPPELS','- Fin ENVOI emails : " & nbLus & " rdv lus, " & nbEnvoyes & " rappels envoyés, soit " & - Math.Round(nbEnvoyes * 100 / nbLus, 0).ToString & " % envoyés.');" - ExecQuery(ctDSN_AEM, szSQL) + insert_log(request, 'RAPPELS', + "- Fin ENVOI emails : %s rdv lus, %s rappels envoyés, soit %s envoyés." + % (str(nbLus), str(nbEnvoyes), round(nbEnvoyes * 100 / nbLus, 0))) + return + +def email_rappels(request, objet, corps, destinataire, societe): + # lire la societe + soc = get_societes(request, societe) + if soc: + expediteur = soc.email_from + else: + expediteur = "peinture@entreprise-dumas.com" + + send_mail(request, expediteur, destinataire, objet, corps) + return + +def email_rapport(request): + NOW = datetime.now() + corps = "

=============================================

" + corps += "

Rapport du traitement de nuit du " + NOW.strftime('%d/%m/%Y - %H:%M') + "

" + corps += "

=============================================

" + + # Lire le fichier log + items = get_log(request) + for item in items: + corps += " - " + item.date.strftime('%d/%m/%Y - %H:%M') + " - " + item.proc + " : " + item.msg + "
" + + corps += "

=============================================

" + + expediteur = request.registry.settings['mondumas.admin_email'] + destinataire = ["phuoc@caotek.fr","peinture@entreprise-dumas.com"] + send_mail(request, expediteur, destinataire, "[DEV_NUIT] Rapport des traitements de nuit", corps) return -def email_rappels: -' Lire la societe -szSQL = "SELECT * FROM p_societe WHERE societe='" & societe & "';" -GetRecordset(ctDSN_AEM, szSQL, rs) -If rs.RecordCount > 0 Then - szFrom = rs.Fields("email_from").Value -Else - szFrom = "peinture@entreprise-dumas.com" -End If -rs.Close() -rs = Nothing -' Set the SMTP server -Dim Smtp_Server As New SmtpClient(My.Settings.SmtpHost, My.Settings.SmtpPort) -If My.Settings.SmtpSSL = "True" Then - ' envoyer la notification avec le compte de l'agence - Smtp_Server.Credentials = New Net.NetworkCredential(My.Settings.SmtpUsername, My.Settings.SmtpPassword) -End If -Smtp_Server.EnableSsl = My.Settings.SmtpSSL -If My.Settings.SmtpUsername = "cao.thien-phuoc@orange.fr" Then - szFrom = My.Settings.SmtpUsername - szEmail = "ctphuoc@gmail.com" - szCCI = "ctphuoc@gmail.com" -End If +def send_mail(request, expediteur, destinataires, objet, corps): + body = """ -' create the mail message -Dim mail As New MailMessage() -mail.From = New MailAddress(szFrom, "Entreprise DUMAS") -'set the content -mail.Subject = szSubjet -mail.IsBodyHtml = True -mail.Body = szBody +%s +""" % (corps) + + message = Message(subject="[Ent. Dumas] %s" % objet, + sender=expediteur, + recipients=destinataires, + html=body) + mailer = get_mailer(request) + mailer.send_immediately(message) -mail.To.Add(szEmail) -Try - Smtp_Server.Send(mail) -Catch error_t As Exception - MsgBox(error_t.ToString, MsgBoxStyle.Critical) - Exit Sub -End Try