|
@@ -0,0 +1,277 @@
|
|
|
+'''
|
|
|
+E2:預定完成日期為0000-00-00者,每個月的第1個工作日上午 9:00 發送逾期通知給CRM
|
|
|
+'''
|
|
|
+
|
|
|
+import dataset
|
|
|
+from datetime import datetime, timedelta
|
|
|
+
|
|
|
+from email.mime.text import MIMEText
|
|
|
+from email.mime.image import MIMEImage
|
|
|
+from email.mime.multipart import MIMEMultipart
|
|
|
+from email.mime.base import MIMEBase
|
|
|
+from email.mime.application import MIMEApplication
|
|
|
+import os
|
|
|
+import boto3
|
|
|
+from botocore.exceptions import ClientError
|
|
|
+
|
|
|
+# 寄送逾期執行表單Email通知
|
|
|
+def hhh_send_mail(email, html):
|
|
|
+ SENDER = "Gorgeous Space <noreply@hhh.com.tw>"
|
|
|
+ RECIPIENT = email
|
|
|
+ AWS_REGION = "us-east-1"
|
|
|
+ CHARSET = "UTF-8"
|
|
|
+ client = boto3.client('ses',region_name=AWS_REGION)
|
|
|
+
|
|
|
+ try:
|
|
|
+ msg = MIMEMultipart()
|
|
|
+ # msg["Subject"] = "執行項目通知(無預定完成日期)_" + str(datetime.date.today())
|
|
|
+ msg["Subject"] = "執行項目通知(無預定完成日期)_" + datetime.now().strftime("%Y-%m-%d %H:%M")
|
|
|
+ msg["From"] = "noreply@hhh.com.tw"
|
|
|
+ msg["To"] = email
|
|
|
+
|
|
|
+ # Set message body
|
|
|
+ body = MIMEText(html, "html")
|
|
|
+
|
|
|
+ msg.attach(body)
|
|
|
+
|
|
|
+ response = client.send_raw_email(
|
|
|
+ Source=msg["From"],
|
|
|
+ Destinations=[msg["To"]],
|
|
|
+ RawMessage={"Data": msg.as_string()}
|
|
|
+ )
|
|
|
+ print(response)
|
|
|
+
|
|
|
+ # Display an error if something goes wrong.
|
|
|
+ except ClientError as e:
|
|
|
+ print(e.response['Error']['Message'])
|
|
|
+ else:
|
|
|
+ print("Email sent! Message ID:"),
|
|
|
+ print(response['MessageId'])
|
|
|
+
|
|
|
+# Choozmo DB
|
|
|
+# db = dataset.connect("mysql://choozmo:pAssw0rd@db.ptt.cx:3306/hhh?charset=utf8mb4")
|
|
|
+
|
|
|
+# 測試機 DB
|
|
|
+# db = dataset.connect('mysql://hhh7796hhh:lYmWsu^ujcA1@hhh-v57-cluster.cluster-cmab1ctkglka.ap-northeast-2.rds.amazonaws.com:3306/stage?charset=utf8mb4')
|
|
|
+
|
|
|
+# 正式機 DB
|
|
|
+db = dataset.connect('mysql://hhh7796hhh:lYmWsu^ujcA1@hhh-v57-cluster.cluster-cmab1ctkglka.ap-northeast-2.rds.amazonaws.com:3306/xoops?charset=utf8mb4')
|
|
|
+
|
|
|
+print ('發送執行項目通知(無預定完成日期) start...')
|
|
|
+
|
|
|
+# 所有合約(無預定完成日期) (CRM)
|
|
|
+q1 = "SELECT DISTINCT(ef.exf_id) \
|
|
|
+ FROM execute_detail ed \
|
|
|
+ left JOIN execute_form ef ON ed.exf_id=ef.exf_id \
|
|
|
+ AND ef.is_close='N' AND ef.is_delete='N' \
|
|
|
+ AND ed.is_delete = 'N' AND ed.is_complete='N' \
|
|
|
+ AND ed.set_date = '0000-00-00' \
|
|
|
+ ORDER BY ef.contract_time, ed.set_date"
|
|
|
+
|
|
|
+# 所有執行項(無預定完成日期) (CRM)
|
|
|
+q2 = "SELECT * \
|
|
|
+ FROM execute_detail ed \
|
|
|
+ left JOIN execute_form ef ON ed.exf_id=ef.exf_id \
|
|
|
+ AND ef.is_close='N' AND ef.is_delete='N' \
|
|
|
+ AND ed.is_delete = 'N' AND ed.is_complete='N' \
|
|
|
+ AND ed.set_date = '0000-00-00' \
|
|
|
+ ORDER BY ef.contract_time, ed.set_date"
|
|
|
+
|
|
|
+html = """
|
|
|
+<!DOCTYPE html>
|
|
|
+<head>
|
|
|
+ <meta charset="UTF-8">
|
|
|
+</head>
|
|
|
+<body>
|
|
|
+"""
|
|
|
+
|
|
|
+# q1_result_count = len(list(db.query(q1)))
|
|
|
+q2_result_count = len(list(db.query(q2)))
|
|
|
+
|
|
|
+# if q1_result_count > 0: # 有合約(無預定完成日期)
|
|
|
+# html += "<div style='color:blue;'><b>逾期合約: 共" + str(q1_result_count) + "筆</b></div>"
|
|
|
+
|
|
|
+if q2_result_count > 0: # 有執行項目(無預定完成日期)
|
|
|
+ html += "<div style='color:blue;'><b>無預定完成日期的執行項目: 共" + str(q2_result_count) + "筆</b><br><br></div>"
|
|
|
+
|
|
|
+ html += "<table style='width:100%;border-collapse: collapse;' border='1'> \
|
|
|
+ <tr style='text-align:left;'> \
|
|
|
+ <th style='width:5%;'>#</th> \
|
|
|
+ <th>合約</th> \
|
|
|
+ <th style='width:20%;'>設計公司</th> \
|
|
|
+ <th style='width:15%;'>合約到期日</th> \
|
|
|
+ <th style='width:5%;'>負責業務</th> \
|
|
|
+ <th style='width:20%;'>執行項</th> \
|
|
|
+ <th style='width:15%;'>預定到期日</th> \
|
|
|
+ </tr>";
|
|
|
+
|
|
|
+ count = 1
|
|
|
+
|
|
|
+ for r1 in db.query(q1):
|
|
|
+ # 特定合約的所有執行項(無預定完成日期)
|
|
|
+ q3 = "SELECT * \
|
|
|
+ FROM execute_detail ed \
|
|
|
+ left JOIN execute_form ef ON ed.exf_id=ef.exf_id \
|
|
|
+ AND ef.is_close='N' AND ef.is_delete='N' \
|
|
|
+ AND ed.is_delete = 'N' AND ed.is_complete='N' \
|
|
|
+ AND ed.set_date = '0000-00-00' \
|
|
|
+ AND ef.exf_id = '" + str(r1['exf_id']) + "' \
|
|
|
+ ORDER BY ef.contract_time, ed.set_date"
|
|
|
+
|
|
|
+ q3_result_count = str(len(list(db.query(q3)))+1)
|
|
|
+
|
|
|
+ idx = 0
|
|
|
+
|
|
|
+ for r3 in db.query(q3):
|
|
|
+ url = 'https://backstage.hhh.com.tw/admin/home/execute?exf_id=' + str(r3['exf_id'])
|
|
|
+
|
|
|
+ if r3['set_date'] is None:
|
|
|
+ r3['set_date'] = '無'
|
|
|
+
|
|
|
+ if idx < 1:
|
|
|
+ html += "<tr><td rowspan='" + q3_result_count + "'>" + str(count) + "</td><td rowspan='" + q3_result_count + "'><a href='" + url + "' target='_blank'>" + r3['num'] + "</a></td><td rowspan='" + q3_result_count + "'>" + r3['company'] + "</td><td rowspan='" + q3_result_count + "'>" + str(r3['contract_time']) + "</td><td rowspan='" + q3_result_count + "'>" + r3['sales_man'] + "</td><td>" + r3['lv1'] + "_" + r3['lv2'] + "</td><td>" + str(r3['set_date']) + "</td><tr>"
|
|
|
+
|
|
|
+ idx += 1
|
|
|
+ else:
|
|
|
+ html += "<tr><td>" + r3['lv1'] + "_" + r3['lv2'] + "</td><td>" + str(r3['set_date']) + "</td></tr>"
|
|
|
+
|
|
|
+ count += 1
|
|
|
+
|
|
|
+ html += "</table>";
|
|
|
+else: # 沒有未預定完成日期的執行表單資料
|
|
|
+ print ("所有執行項目皆有【預定完成日期】,不須處理")
|
|
|
+ html += "所有執行項目皆有【預定完成日期】,不須處理"
|
|
|
+
|
|
|
+html += """
|
|
|
+</body>
|
|
|
+</html>
|
|
|
+"""
|
|
|
+
|
|
|
+# Email清單
|
|
|
+crm_list = ['mike@choozmo.com', 'shopbook2016@gmail.com', 'oluckyo.mike@gmail.com']
|
|
|
+# crm_list = ['miko@hhh.com.tw', 'mollie@hhh.com.tw', 'lynn@hhh.com.tw', 'zoe_lo@hhh.com.tw']
|
|
|
+
|
|
|
+# 寄送逾期執行表單Email通知
|
|
|
+for email in crm_list:
|
|
|
+ print ("發送Email: " + email)
|
|
|
+ hhh_send_mail(email, html)
|
|
|
+
|
|
|
+print ('發送執行項目通知(無預定完成日期) end...')
|
|
|
+
|
|
|
+'''
|
|
|
+print ('\n發送逾期執行項目通知 (執行單位) start...')
|
|
|
+
|
|
|
+# 執行單位Email
|
|
|
+# hhh_edit@hhh.com.tw: 編輯採訪部
|
|
|
+# hhh_mk@hhh.com.tw: 行銷企劃部
|
|
|
+# hhh_web@hhh.com.tw: 網站工程部
|
|
|
+# hhh_video@hhh.com.tw: 影音企劃部
|
|
|
+# agent@hhh.com.tw: 幸福經紀人
|
|
|
+# hhh_admin@hhh.com.tw: 行政部
|
|
|
+# hhh_sales@hhh.com.tw: 業務部
|
|
|
+
|
|
|
+execute_man_list = ['hhh_edit@hhh.com.tw','hhh_mk@hhh.com.tw','hhh_web@hhh.com.tw','hhh_video@hhh.com.tw','agent@hhh.com.tw','hhh_admin@hhh.com.tw','hhh_sales@hhh.com.tw']
|
|
|
+
|
|
|
+for execute_man in execute_man_list:
|
|
|
+ # 所有逾期合約 (執行單位)
|
|
|
+ q1 = "SELECT DISTINCT(ef.exf_id) \
|
|
|
+ FROM execute_detail ed \
|
|
|
+ left JOIN execute_form ef ON ed.exf_id=ef.exf_id \
|
|
|
+ WHERE TIMESTAMPDIFF(DAY, set_date, NOW()) > 15 \
|
|
|
+ AND ef.is_close='N' AND ef.is_delete='N' \
|
|
|
+ AND ed.is_delete = 'N' AND ed.is_complete='N' \
|
|
|
+ AND ed.set_date > '" + overdue_date + "' \
|
|
|
+ AND ed.execute_man = '" + execute_man + "' \
|
|
|
+ ORDER BY ef.contract_time, ed.set_date"
|
|
|
+
|
|
|
+ # 所有逾期執行項 (執行單位)
|
|
|
+ q2 = "SELECT * \
|
|
|
+ FROM execute_detail ed \
|
|
|
+ left JOIN execute_form ef ON ed.exf_id=ef.exf_id \
|
|
|
+ WHERE TIMESTAMPDIFF(DAY, set_date, NOW()) > 15 \
|
|
|
+ AND ef.is_close='N' AND ef.is_delete='N' \
|
|
|
+ AND ed.is_delete = 'N' AND ed.is_complete='N' \
|
|
|
+ AND ed.set_date > '" + overdue_date + "' \
|
|
|
+ AND ed.execute_man = '" + execute_man + "' \
|
|
|
+ ORDER BY ef.contract_time, ed.set_date"
|
|
|
+
|
|
|
+ html = """
|
|
|
+ <!DOCTYPE html>
|
|
|
+ <head>
|
|
|
+ <meta charset="UTF-8">
|
|
|
+ </head>
|
|
|
+ <body>
|
|
|
+ """
|
|
|
+
|
|
|
+ # q1_result_count = len(list(db.query(q1)))
|
|
|
+ q2_result_count = len(list(db.query(q2)))
|
|
|
+
|
|
|
+ # if q1_result_count > 0: # 有逾期合約
|
|
|
+ # html += "<div style='color:blue;'><b>逾期合約: 共" + str(q1_result_count) + "筆</b></div>"
|
|
|
+
|
|
|
+ if q2_result_count > 0: # 有逾期執行項目
|
|
|
+ # html += "<div style='color:blue;'><b>逾期執行項目: 共" + str(q2_result_count) + "筆</b><br><br></div>"
|
|
|
+ html += "<div style='color:blue;'><b>" + execute_man + " 逾期執行項目: 共" + str(q2_result_count) + "筆 (由" + overdue_date + "起算)</b><br><br></div>"
|
|
|
+
|
|
|
+ html += "<table style='width:100%;border-collapse: collapse;' border='1'> \
|
|
|
+ <tr style='text-align:left;'> \
|
|
|
+ <th style='width:5%;'>#</th> \
|
|
|
+ <th>合約</th> \
|
|
|
+ <th style='width:20%;'>設計公司</th> \
|
|
|
+ <th style='width:15%;'>合約到期日</th> \
|
|
|
+ <th style='width:5%;'>負責業務</th> \
|
|
|
+ <th style='width:20%;'>執行項</th> \
|
|
|
+ <th style='width:15%;'>預定到期日</th> \
|
|
|
+ </tr>";
|
|
|
+
|
|
|
+ count = 1
|
|
|
+
|
|
|
+ for r1 in db.query(q1):
|
|
|
+ # 特定合約的所有逾期執行項
|
|
|
+ q3 = "SELECT * \
|
|
|
+ FROM execute_detail ed \
|
|
|
+ left JOIN execute_form ef ON ed.exf_id=ef.exf_id \
|
|
|
+ WHERE TIMESTAMPDIFF(DAY, set_date, NOW()) > 15 \
|
|
|
+ AND ef.is_close='N' AND ef.is_delete='N' \
|
|
|
+ AND ed.is_delete = 'N' AND ed.is_complete='N' \
|
|
|
+ AND ed.set_date > '" + overdue_date + "' \
|
|
|
+ AND ed.execute_man = '" + execute_man + "' \
|
|
|
+ AND ef.exf_id = '" + str(r1['exf_id']) + "' \
|
|
|
+ ORDER BY ef.contract_time, ed.set_date"
|
|
|
+
|
|
|
+ q3_result_count = str(len(list(db.query(q3)))+1)
|
|
|
+
|
|
|
+ idx = 0
|
|
|
+
|
|
|
+ for r3 in db.query(q3):
|
|
|
+ url = 'https://backstage.hhh.com.tw/admin/home/execute?exf_id=' + str(r3['exf_id'])
|
|
|
+
|
|
|
+ if r3['set_date'] is None:
|
|
|
+ r3['set_date'] = '無'
|
|
|
+
|
|
|
+ if idx < 1:
|
|
|
+ html += "<tr><td rowspan='" + q3_result_count + "'>" + str(count) + "</td><td rowspan='" + q3_result_count + "'><a href='" + url + "' target='_blank'>" + r3['num'] + "</a></td><td rowspan='" + q3_result_count + "'>" + r3['company'] + "</td><td rowspan='" + q3_result_count + "'>" + str(r3['contract_time']) + "</td><td rowspan='" + q3_result_count + "'>" + r3['sales_man'] + "</td><td>" + r3['lv1'] + "_" + r3['lv2'] + "</td><td>" + str(r3['set_date']) + "</td><tr>"
|
|
|
+
|
|
|
+ idx += 1
|
|
|
+ else:
|
|
|
+ html += "<tr><td>" + r3['lv1'] + "_" + r3['lv2'] + "</td><td>" + str(r3['set_date']) + "</td></tr>"
|
|
|
+
|
|
|
+ count += 1
|
|
|
+
|
|
|
+ html += "</table>";
|
|
|
+ else: # 無逾期執行表單資料
|
|
|
+ print (execute_man + " 無逾期執行項目記錄,不須處理 (由" + overdue_date + "起算)")
|
|
|
+ html += "<div>" + execute_man + " 無逾期執行項目記錄,不須處理 (由" + overdue_date + "起算)</div>"
|
|
|
+
|
|
|
+ html += """
|
|
|
+ </body>
|
|
|
+ </html>
|
|
|
+ """
|
|
|
+
|
|
|
+ # 寄送逾期執行表單Email通知
|
|
|
+ email = 'mike@choozmo.com'
|
|
|
+ print ("發送Email: " + email)
|
|
|
+ hhh_send_mail(email, html)
|
|
|
+
|
|
|
+print ('發送逾期執行項目通知 (執行單位) end...')
|
|
|
+'''
|