From b8892ffbcc17882f2f045b37da798ebb21bdf7d6 Mon Sep 17 00:00:00 2001
From: rexwu <spplkk113@gmail.com>
Date: Tue, 8 Aug 2023 23:36:05 +0800
Subject: [PATCH] feat(project): project deadline notification

---
 extra-addons/kci-project/__manifest__.py      |   2 +
 ...on_project_deadline_notification_check.xml |  16 +++
 extra-addons/kci-project/models/project.py    | 113 ++++++++++++++----
 .../kci-project/views/project_group.xml       |  13 ++
 .../kci-project/views/project_views.xml       |   6 +
 extra-addons/sales/models/inquiry_model.py    |   2 +-
 6 files changed, 130 insertions(+), 22 deletions(-)
 create mode 100644 extra-addons/kci-project/data/cron_project_deadline_notification_check.xml
 create mode 100644 extra-addons/kci-project/views/project_group.xml

diff --git a/extra-addons/kci-project/__manifest__.py b/extra-addons/kci-project/__manifest__.py
index 26ab38139d3..ed84aa41fdf 100644
--- a/extra-addons/kci-project/__manifest__.py
+++ b/extra-addons/kci-project/__manifest__.py
@@ -14,8 +14,10 @@ This module contains all the common features of project.
         'security/security.xml',
         'security/ir.model.access.csv',
         'views/project_views.xml',
+        'views/project_group.xml',
         'data/cron_deadline_check.xml',
         'data/cron_deadline_notification_check.xml',
+        'data/cron_project_deadline_notification_check.xml',
         'data/cron_deadline_notification_email.xml',
     ],
     'application': True,
diff --git a/extra-addons/kci-project/data/cron_project_deadline_notification_check.xml b/extra-addons/kci-project/data/cron_project_deadline_notification_check.xml
new file mode 100644
index 00000000000..3ca7b0b0563
--- /dev/null
+++ b/extra-addons/kci-project/data/cron_project_deadline_notification_check.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<odoo>
+    <data noupdate="1">
+        <record id="project_deadline_notification_check_cron" model="ir.cron">
+            <field name="name">Project Deadline Notification Check Cron</field>
+            <field name="model_id" ref="model_project_project"/>
+            <field name="state">code</field>
+            <field name="code">model.cron_project_deadline_notification_check()</field>
+            <field name="user_id" ref="base.user_root"/>
+            <field name='interval_number'>1</field>
+            <field name='interval_type'>days</field>
+            <field name="numbercall">-1</field>
+            <field name="doall" eval="False"/>
+        </record>
+    </data>
+</odoo>
\ No newline at end of file
diff --git a/extra-addons/kci-project/models/project.py b/extra-addons/kci-project/models/project.py
index 5af7b90d3ad..f6cf03daa36 100644
--- a/extra-addons/kci-project/models/project.py
+++ b/extra-addons/kci-project/models/project.py
@@ -15,8 +15,8 @@ class TechTag(models.Model):
 class ProjectTask(models.Model):
     _inherit = 'project.task'
 
-    start_date = fields.Date('Start date')
-    finish_date = fields.Date('Finish date')
+    start_date = fields.Date('��见�𧢲𠯫���')
+    finish_date = fields.Date('蝯鞉��𠯫���')
     tech_tag_ids = fields.Many2many('project.tech.tag', 'task_tech_tag_rel', 'tech_tag_id', 'project_task_id', string='Tech. Type')
 
     resource_request = fields.Many2one('res.users', string='resource request', tracking=True)
@@ -57,31 +57,56 @@ class ProjectTask(models.Model):
 
     def cron_deadline_notification_check(self):
         today = datetime.date.today()
-        tasks = self.env['project.task'].search([])
-        for task in tasks:
-            if task.date_deadline:
-                if task.kanban_state != 'done':
-                    due_days = (task.date_deadline - today).days
-                    if due_days == 7:
-                        self.action_send_notification(task, due_days)
-                    elif due_days <= 3:
-                        self.action_send_notification(task, due_days)
-
-    def action_send_notification(self, task, due_days):
-        url = f"/web#id={task.id}&view_type=form&model=project.task"
-        if due_days == 0:
-            message = f"撠��� {task.project_id.name} 隞餃�� <a href='{self.env['ir.config_parameter'].sudo().get_param('web.base.url')}{url}'>{task.name}</a> 撠�䲰隞𦠜𠯫�����"
-        elif due_days < 0:
-            message = f"撠��� {task.project_id.name} 隞餃�� <a href='{self.env['ir.config_parameter'].sudo().get_param('web.base.url')}{url}'>{task.name}</a> 撌脤�擧�� {abs(due_days)} �𠯫"
-        else:
-            message = f"撠��� {task.project_id.name} 隞餃�� <a href='{self.env['ir.config_parameter'].sudo().get_param('web.base.url')}{url}'>{task.name}</a> ��擗� {due_days} �𠯫�����"
+        projects = self.env['project.project'].search([])
+        owner = []
+        lowest_due_day = 100
+        for project in projects:
+            message = ''
+            for task in project.task_ids:
+                url = f"/web#id={task.id}&view_type=form&model=project.task"
+                if task.date_deadline:
+                    if task.kanban_state != 'done':
+                        due_days = (task.date_deadline - today).days
+                        if due_days == 7 or 0 < due_days <= 3:
+                            message += f"隞餃�� <a href='{self.env['ir.config_parameter'].sudo().get_param('web.base.url')}{url}'>{task.name}</a> ��擗� {due_days} �𠯫����� </br>"
+                            lowest_due_day = due_days if lowest_due_day < due_days else lowest_due_day
+                            for user in task.user_ids:
+                                if user not in owner:
+                                    owner.append(user)
+                        elif due_days == 0:
+                            message += f"隞餃�� <a href='{self.env['ir.config_parameter'].sudo().get_param('web.base.url')}{url}'>{task.name}</a> 撠�䲰隞𦠜𠯫����� </br>"
+                            lowest_due_day = due_days if lowest_due_day < due_days else lowest_due_day
+                            for user in task.user_ids:
+                                if user not in owner:
+                                    owner.append(user)
+                        elif due_days < 0:
+                            message += f"隞餃�� <a href='{self.env['ir.config_parameter'].sudo().get_param('web.base.url')}{url}'>{task.name}</a> 撌脤�擧�� {abs(due_days)} �𠯫 </br>"
+                            lowest_due_day = due_days if lowest_due_day < due_days else lowest_due_day
+                            for user in task.user_ids:
+                                if user not in owner:
+                                    owner.append(user)
+            if message:
+                self.action_send_notification(project, owner, lowest_due_day, message)
+
+    def action_send_notification(self, project, owner, due_days, message):
+        mrp_managers = self.env['mail.channel'].search([('group_public_id', '=', self.env.ref('kci-mrp.kci_mrp_manager_group').id)])
         email_to = ''
-        for partner in task.user_ids:
+        for partner in owner:
             email_to += f'{partner.email}, '
+        email_cc = ''
+        for partner in mrp_managers.channel_partner_ids:
+            email_cc += f'{partner.email}, '
+        if due_days <= 0:
+            managers = self.env['mail.channel'].search([('group_public_id', '=', self.env.ref('kci-project.kci_manager_group').id)])
+            for partner in managers.channel_partner_ids:
+                email_cc += f'{partner.email}, '
+
         email_values = {
             'email_to': email_to,
+            'email_cc': email_cc,
             'email_from': "erp_system@kci-global.com.tw",
             'body_html': message,
+            'subject': f'[KCI ERP System]撠��� {project.name} �𡁶䰻'
         }
         mail_template = self.env.ref('kci-project.deadline_notification_email_template')
         mail_template.send_mail(self.id, force_send=True, email_values=email_values)
@@ -100,6 +125,9 @@ class Project(models.Model):
     # sales_data = fields.One2many('sale.order', 'sales_project', 'Sales Orders', copy=True, tracking=True)
     # bom_data = fields.One2many('mrp.bom', 'bom_project', 'Bom', copy=True, tracking=True)
 
+    shipping_day = fields.Date('鈭方疏�𠯫���', tracking=True)
+    accepting_day = fields.Date('撽埈𤣰�𠯫���', tracking=True)
+
     purchase_data = fields.Many2many('purchase.order')
     sales_data = fields.Many2many('sale.order')
     bom_data = fields.Many2many('mrp.bom')
@@ -120,6 +148,49 @@ class Project(models.Model):
                     })
                 break
 
+    def cron_project_deadline_notification_check(self):
+        today = datetime.date.today()
+        projects = self.env['project.project'].search([])
+        message = ''
+        for project in projects:
+            url = f"/web#id={project.id}&view_type=form&model=project.project"
+            if project.shipping_day:
+                shipping_due_days = (project.shipping_day - today).days
+                if shipping_due_days == 14:
+                    message += f"撠��� <a href='{self.env['ir.config_parameter'].sudo().get_param('web.base.url')}{url}'>{project.name}</a> 頝嗪𣪧�枂鞎冽𠯫��擗� {shipping_due_days} �𠯫 </br>"
+                elif shipping_due_days == 0:
+                    message += f"撠��� <a href='{self.env['ir.config_parameter'].sudo().get_param('web.base.url')}{url}'>{project.name}</a> �枂鞎冽𠯫隞𦠜𠯫����� </br>"
+                elif shipping_due_days < 0:
+                    message += f"撠��� <a href='{self.env['ir.config_parameter'].sudo().get_param('web.base.url')}{url}'>{project.name}</a> 撌脰��𤾸枂鞎冽𠯫 {abs(shipping_due_days)} �𠯫 </br>"
+            if project.accepting_day:
+                accepting_due_days = (project.accepting_day - today).days
+                if accepting_due_days == 14:
+                    message += f"撠��� <a href='{self.env['ir.config_parameter'].sudo().get_param('web.base.url')}{url}'>{project.name}</a> 頝嗪𣪧撽埈𤣰�𠯫��擗� {accepting_due_days} �𠯫 </br>"
+                elif accepting_due_days == 0:
+                    message += f"撠��� <a href='{self.env['ir.config_parameter'].sudo().get_param('web.base.url')}{url}'>{project.name}</a> 撽埈𤣰�𠯫隞𦠜𠯫����� </br>"
+                elif accepting_due_days < 0:
+                    message += f"撠��� <a href='{self.env['ir.config_parameter'].sudo().get_param('web.base.url')}{url}'>{project.name}</a> 撌脰��𡡞�埈𤣰�𠯫 {abs(accepting_due_days)} �𠯫 </br>"
+        if message:
+            self.action_send_notification(project, message)
+
+    def action_send_notification(self, project, message):
+        mrp_managers = self.env['mail.channel'].search([('group_public_id', '=', self.env.ref('kci-mrp.kci_mrp_manager_group').id)])
+        managers = self.env['mail.channel'].search([('group_public_id', '=', self.env.ref('kci-project.kci_manager_group').id)])
+        email_to = f'{project.user_id.email}'
+        for partner in mrp_managers.channel_partner_ids:
+            email_to += f'{partner.email}, '
+        for partner in managers.channel_partner_ids:
+            email_to += f'{partner.email}, '
+
+        email_values = {
+            'email_to': email_to,
+            'email_from': "erp_system@kci-global.com.tw",
+            'body_html': message,
+            'subject': f'[KCI ERP System]撠�������𠯫�𡁶䰻'
+        }
+        mail_template = self.env.ref('kci-project.deadline_notification_email_template')
+        mail_template.send_mail(self.id, force_send=True, email_values=email_values)
+
 
 # class PurchaseOrder(models.Model):
 #     _inherit = 'purchase.order'
diff --git a/extra-addons/kci-project/views/project_group.xml b/extra-addons/kci-project/views/project_group.xml
new file mode 100644
index 00000000000..1570011fb0b
--- /dev/null
+++ b/extra-addons/kci-project/views/project_group.xml
@@ -0,0 +1,13 @@
+<odoo>
+    <record id="kci_manager_group" model="res.groups">
+        <field name="name">�砍虬銝餌恣</field>
+    </record>
+
+    <record model="mail.channel" id="mrp_manager">
+        <field name="name">�砍虬銝餌恣</field>
+        <field name="description">�砍虬銝餌恣蝢斤�</field>
+        <field name="public">groups</field>
+        <field name="group_ids" eval="[Command.link(ref('kci_manager_group'))]"/>
+        <field name="group_public_id" ref="kci_manager_group"/>
+    </record>
+</odoo>
\ No newline at end of file
diff --git a/extra-addons/kci-project/views/project_views.xml b/extra-addons/kci-project/views/project_views.xml
index 7dccffedf47..1f7d2789093 100644
--- a/extra-addons/kci-project/views/project_views.xml
+++ b/extra-addons/kci-project/views/project_views.xml
@@ -36,6 +36,12 @@
                         <field name="bom_data"/>
                     </page>
                 </xpath>
+
+                <xpath expr="//form/sheet/group/group/div[@name='dates']" position="after">
+                    <field name="shipping_day"/>
+                    <field name="accepting_day"/>
+                </xpath>
+
             </field>
         </record>
     </data>
diff --git a/extra-addons/sales/models/inquiry_model.py b/extra-addons/sales/models/inquiry_model.py
index 078c9b3422c..59ec7bd0bc1 100644
--- a/extra-addons/sales/models/inquiry_model.py
+++ b/extra-addons/sales/models/inquiry_model.py
@@ -74,7 +74,7 @@ class Inquiry(models.Model):
         internal_order = self.env['purchase.internal.order'].create({'name': result.name, 'order_code': result.code, 'inquiry_id': result.id})
         result.internal_purchase = internal_order
         if result.type == 'project':
-            project = self.env['project.project'].create({'name': result.name})
+            project = self.env['project.project'].create({'name': result.name, 'partner_id': result.customer.id})
             result.project = project
             internal_order.update({
                 'project': project.id
-- 
GitLab