Mike 3 years ago
parent
commit
5f2d1a2be3
1 changed files with 154 additions and 0 deletions
  1. 154 0
      execute_detail_notice.py

+ 154 - 0
execute_detail_notice.py

@@ -0,0 +1,154 @@
+'''
+E1:執行項目逾期15個工作日者,於逾期15個工作日的上午 9:00 發送逾期通知給CRM、執行單位
+以7/12為時間點,7/12起建立的執行表單,預定完成日逾期才會發送通知
+'''
+
+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() + timedelta(hours=8)).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')
+
+# 超過到期日(contract_time),尚未結案清單
+# statement = "SELECT * FROM `execute_form` WHERE (contract_time < now()) AND is_close='N' AND is_delete='N' AND creator IS NOT NULL AND creator != 'ivan@hhh.com.tw' ORDER BY contract_time"
+
+# 逾期日期起算日
+overdue_date = '2021-06-25'
+
+# 所有逾期合約
+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 + "' \
+    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 + "' \
+    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:15%;'>負責業務</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 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: # 無逾期執行表單資料
+    html += "<div><b>無逾期執行表單記錄,不須處理</b></div>"
+
+html += """
+</body>
+</html>
+"""
+
+# Email清單
+email_list = ['mike@choozmo.com']
+
+# 寄送逾期執行表單Email通知
+for email in email_list:
+    hhh_send_mail(email, html)