Slink/sos_brm/models/sos_brm_action.py

226 lines
8.9 KiB
Python
Executable File

from odoo import models, fields, api
class sos_brm_action(models.Model):
_name = 'sos_brm_action'
_description = 'Business Review'
todo_id = fields.Char(string="To-Do ID", readonly= True)
name = fields.Char(string="Action Point")
priority = fields.Selection([
('0', '🟢 Low'),
('1', '🟡 Medium'),
('2', '🔴 High'),
('3', '🚨 Urgent')
], string='Priority', default='0')
start_date = fields.Date(string="Start Date",default=fields.Date.today)
target_date = fields.Date(string="Target Date")
end_date = fields.Date(string="Actual end Date")
status = fields.Selection([ ('open', 'Open'),('close', 'Closed'),('hold', 'Hold')], default='open' , string="Status")
line_ids = fields.One2many('sos_brm_action_lines', 'ref_id', string="Action Details",copy=True)
target_date_line_ids = fields.One2many('sos_brm_action_revised_targets', 'ref_id', string="Revised Target Details",copy=True)
result = fields.Html(string="Remarks")
cross_dept_action = fields.Selection(
selection=[
('cross_dept', 'Cross-Dept'),
('inter_dept', 'Intra-Dept')
],
string='Type',
default='inter_dept',
required=True
)
department = fields.Many2one('sos_departments', string='Self Department',required=True, default=lambda self: self._default_department())
responsible_person = fields.Many2one(
'res.users',
string='Assigned To',required=True,
domain="[('id', 'in', allowed_user_ids)]"
)
assigned_by = fields.Many2one(
'res.users',
string='Assigned By',
default=lambda self: self.env.user
)
assigned_from_dept = fields.Many2one('sos_departments', string='Assigned By Dept', default=lambda self: self._default_department())
assigned_to_dept = fields.Many2one('sos_departments', string='Assigned To Dept')
latest_target_date = fields.Date(
string="Latest Revised Target",
compute='_compute_latest_target',
store=True, compute_sudo=True, readonly=True,
)
latest_target_line_id = fields.Many2one(
'sos_brm_action_lines',
string="Latest Target Line",
compute='_compute_latest_target',
store=True, compute_sudo=True, readonly=True,
)
is_sales_user_created = fields.Boolean(
compute='_compute_is_sales_user_created',
store=True,
string='Created by Sales User'
)
allowed_user_ids = fields.Many2many('res.users', compute='_compute_allowed_users')
reporting_to = fields.Many2one('res.users',related="responsible_person.reporting_to", string='Reporting To')
@api.model
def _default_department(self):
dept = self.env['sos_departments'].search(
[('users_line_ids.users', '=', self.env.user.id)],
limit=1
)
if dept:
return dept.id
return False
@api.onchange('department')
def _onchange_department(self):
if self.department:
if self.cross_dept_action == "cross_dept":
self.assigned_from_dept = self.department.id
@api.depends('department','cross_dept_action','assigned_to_dept')
def _compute_allowed_users(self):
for rec in self:
if rec.cross_dept_action == "inter_dept":
rec.allowed_user_ids = rec.department.users_line_ids.mapped('users')
else:
rec.allowed_user_ids = rec.assigned_to_dept.users_line_ids.mapped('users')
@api.depends('create_uid')
def _compute_is_sales_user_created(self):
sales_groups = [
self.env.ref('sos_inventory.sos_sales_user').id,
self.env.ref('sos_inventory.sos_inside_sales_user').id
]
for record in self:
record.is_sales_user_created = any(
gid in record.create_uid.groups_id.ids for gid in sales_groups
)
def _generate_id(self):
sequence_util = self.env['sos_common_scripts']
scope = 'Cross' if self.cross_dept_action == 'cross_dept' else 'Intra'
dept_label = (
getattr(self.department, 'short_form', False)
or getattr(self.department, 'name', 'NoDept')
)
type_id = f"{scope}/{dept_label}"
return sequence_util.generate_sequence('sos_brm_action', type_id, 'todo_id')
@api.depends('line_ids.target_date', 'line_ids.create_date')
def _compute_latest_target(self):
Line = self.env['sos_brm_action_lines']
for rec in self:
latest = Line.search([
('ref_id', '=', rec.id),
('target_date', '!=', False),
], order='target_date desc, id desc', limit=1)
if not latest:
latest = Line.search([('ref_id', '=', rec.id)],
order='create_date desc, id desc', limit=1)
rec.latest_target_line_id = latest.id or False
rec.latest_target_date = latest.target_date or False
def action_revise_target(self):
print("bye")
@api.model
def create(self, vals):
record = super().create(vals)
if record.priority == 0 :
priority_emo='🟢 Low'
elif record.priority == 1 :
priority_emo='🟡 Medium'
elif record.priority == 2 :
priority_emo='🔴 High'
else:
priority_emo='🚨 Urgent'
# Set assigned_by
record.assigned_by = self.env.user.id
# Send email if responsible person exists and is different
responsible_id = record.responsible_person
process_incharge = record.reporting_to
if record.cross_dept_action == "cross_dept":
if process_incharge.id != self.env.user.id:
cc_mail_id = process_incharge.login
else:
cc_mail_id = ""
if responsible_id and responsible_id.id != self.env.user.id:
body_html = f"""
<p>Below <b>Action Plan</b> is assigned to your Department</p>
<p><b>Action Plan : </b> {record.name}</p>
<p><b>Priority : </b> {priority_emo}</p>
<p><b>Assigned By Dept : </b> {record.assigned_from_dept.name}</p>
<p><b>Assigned By : </b> {self.env.user.name}</p>
"""
subject = "Action Plan - Notification"
self.env['sos_common_scripts'].send_direct_email(
self.env,
"sos_brm_action",
record.id,
responsible_id.login,
subject,
body_html,
cc_mail_id
)
else:
if responsible_id and responsible_id.id != self.env.user.id:
body_html = f"""
<p>Below <b>Action Plan</b> is assigned to you</p>
<p><b>Action Plan : </b> {record.name}</p>
<p><b>Priority : </b> {priority_emo}</p>
<p><b>Assigned By : </b> {self.env.user.name}</p>
"""
subject = "Action Plan - Notification"
self.env['sos_common_scripts'].send_direct_email(
self.env,
"sos_brm_action",
record.id,
responsible_id.login,
subject,
body_html
)
# Now department is guaranteed → Generate ID
dept_label = record.department.short_form or record.department.name or 'NoDept'
scope = 'Cross' if record.cross_dept_action == 'cross_dept' else 'Intra'
type_id = f"{scope}/{dept_label}"
record.todo_id = self.env['sos_common_scripts'].generate_sequence('sos_brm_action', type_id, 'todo_id')
return record
def action_assign_action_btn(self):
return {
'name': "Assign Action to Other Department",
'type': 'ir.actions.act_window',
'res_model': 'sos_brm_action',
'view_mode': 'form',
'view_id': self.env.ref('sos_brm.view_form_sos_brm_action_cross_dept').id,
'target': 'new',
'context': {
'from_wizard': True,
'default_cross_dept_action': 'cross_dept'
}
}
class sos_brm_action_lines(models.Model):
_name = 'sos_brm_action_lines'
_description = 'Business Review'
ref_id = fields.Many2one('sos_brm_action', string="BRM action lines", ondelete="cascade")
name = fields.Char(string="Action Plan")
start_date = fields.Date(string="Entry Date")
target_date = fields.Date(string="Revised Target Date")
result = fields.Text(string="Result")
status = fields.Selection([ ('open', 'Open'),('close', 'Closed'),('hold', 'Hold')], default='open' , string="Status")
class sos_revised_targets(models.Model):
_name = 'sos_brm_action_revised_targets'
_description = 'Business Review'
ref_id = fields.Many2one('sos_brm_action', string="BRM action lines", ondelete="cascade")
revised_date = fields.Date(string="Revised Date")