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