219 lines
10 KiB
Python
219 lines
10 KiB
Python
# -*- coding: utf-8 -*-
|
|
from odoo import api, fields, models
|
|
from datetime import datetime, timedelta, date
|
|
|
|
|
|
class IssueApproval(models.Model):
|
|
_name = "issue.approval"
|
|
_description = '议题申报'
|
|
_inherit = ['soong.workflow.mixin', 'mail.thread.main.attachment', 'mail.activity.mixin']
|
|
_order = 'create_time desc'
|
|
_rec_name = 'name'
|
|
|
|
name = fields.Char(string='标题', required=True)
|
|
code = fields.Char(string='编号', required=True, copy=False,
|
|
default=lambda self: self.env['ir.sequence'].next_by_code('issue_approval_code'))
|
|
create_time = fields.Date(string='创建日期', default=lambda self: fields.Date.today())
|
|
employee_id = fields.Many2one('hr.employee', string="经办人", default=lambda self: self.env.user.employee_id)
|
|
department_id = fields.Many2one(related='employee_id.department_id', string="部门")
|
|
company_id = fields.Many2one(related='employee_id.company_id', string="公司")
|
|
user_id = fields.Many2one('res.users', string="经办人", default=lambda self: self.env.user)
|
|
meeting_details = fields.Char(string="会议详情")
|
|
job_id = fields.Many2one(related='employee_id.job_id', string="岗位")
|
|
is_attend = fields.Boolean(string="是否上会", default=True)
|
|
work_end = fields.Boolean(string="结束")
|
|
issues_result = fields.Html(string="会议结果")
|
|
issue_text = fields.Text(string="正文")
|
|
documents_ids = fields.Many2many('ir.attachment', string='议题附件')
|
|
issue_approval_ids = fields.One2many('issue.approval.line', 'issue_approval_id', string="关联议题", store=True)
|
|
issue_display = fields.Text(string="议题事项")
|
|
decision_display = fields.Text(string="决策清单")
|
|
is_parent_unit = fields.Boolean(string="上级单位")
|
|
active = fields.Boolean('Active', default=True, tracking=True)
|
|
urgency_level = fields.Selection([('normal', '普件'), ('urgent', '急件'), ('emergency', '特急件')], string='紧急度',
|
|
default='normal')
|
|
employee_ids = fields.Many2many('hr.employee', string="当前经办人", compute='_compute_workflow')
|
|
users_ids = fields.Many2many('res.users', string="当前用户", compute='_compute_workflow_users')
|
|
approve_state = fields.Selection([("start", "草稿"), ("pending", "审批中"), ("end", "结束")], string="审批状态", compute='_compute_workflow')
|
|
member_of_department = fields.Boolean("是否是本部门数据", compute='_compute_part_of_department',
|
|
search='_search_part_of_department')
|
|
|
|
@api.depends_context('uid', 'company')
|
|
@api.depends('department_id')
|
|
def _compute_part_of_department(self):
|
|
# 检查当前用户是否属于管理员群组
|
|
is_manager = self.env.user.has_group('soong_workflow.group_soong_workflow_manager')
|
|
if is_manager:
|
|
# 管理员可以看到所有数据,全部标记为 True
|
|
for record in self:
|
|
record.member_of_department = True
|
|
return
|
|
user_employee = self._get_valid_employee_for_user()
|
|
active_department = user_employee.department_id
|
|
if active_department:
|
|
department_ids = self.env['hr.department'].search([
|
|
('id', 'child_of', active_department.id)
|
|
]).ids
|
|
else:
|
|
department_ids = []
|
|
for record in self:
|
|
record.member_of_department = record.department_id.id in department_ids
|
|
|
|
def _get_default_name_title(self):
|
|
return self._description if self._description else self._name
|
|
|
|
name_title = fields.Char(default=_get_default_name_title)
|
|
is_company = fields.Boolean(string="本公司", default=True, compute='_compute_is_company',search='_search_part_of_company')
|
|
|
|
@api.depends_context('uid', 'company')
|
|
@api.depends('company_id')
|
|
def _compute_is_company(self):
|
|
active_company_ids = self.env.companies
|
|
for employee in self:
|
|
employee.is_company = employee.company_id in active_company_ids
|
|
|
|
def _search_part_of_company(self, operator, value):
|
|
company_ids = self.env.companies.ids
|
|
if not value:
|
|
operator = '!=' if operator == '=' else '='
|
|
if operator == '=':
|
|
return [('company_id', 'in', company_ids)]
|
|
else:
|
|
return [('company_id', 'not in', company_ids)]
|
|
|
|
def _get_valid_employee_for_user(self):
|
|
user = self.env.user
|
|
employee = user.employee_ids
|
|
if not employee:
|
|
user_employees = user.employee_id.sudo().search([
|
|
('user_id', '=', user.id)
|
|
])
|
|
employee = user_employees.filtered(lambda r: r.company_id == user.company_id) or user_employees[:1]
|
|
return employee
|
|
|
|
def _search_part_of_department(self, operator, value):
|
|
# 检查当前用户是否属于管理员群组
|
|
is_manager = self.env.user.has_group('soong_workflow.group_soong_workflow_manager')
|
|
if is_manager:
|
|
# 管理员搜索时返回所有数据(domain 为空)
|
|
if (operator == '=' and value) or (operator == '!=' and not value):
|
|
return []
|
|
# 如果搜索条件是 False,则返回空数据
|
|
elif (operator == '=' and not value) or (operator == '!=' and value):
|
|
return [('id', '=', False)]
|
|
user_employee = self._get_valid_employee_for_user()
|
|
active_department = user_employee.department_id
|
|
if active_department:
|
|
base_domain = [('department_id', 'child_of', active_department.id)]
|
|
else:
|
|
base_domain = [('department_id', '=', False)]
|
|
|
|
return (['!'] if operator == '!=' else []) + base_domain
|
|
|
|
@api.depends('code')
|
|
def _compute_workflow(self):
|
|
for record in self:
|
|
record.employee_ids = False
|
|
record.approve_state = False
|
|
workflow = self.env['soong.workflow.record'].search(
|
|
[('code', '=', record.code)],
|
|
limit=1
|
|
)
|
|
if workflow:
|
|
record.employee_ids = workflow.employee_ids
|
|
record.approve_state = workflow.approve_state
|
|
|
|
@api.depends('employee_ids')
|
|
def _compute_workflow_users(self):
|
|
for record in self:
|
|
if record.employee_ids:
|
|
user_ids = record.employee_ids.mapped('user_id')
|
|
record.users_ids = user_ids
|
|
else:
|
|
record.users_ids = False
|
|
|
|
@api.constrains("issue_approval_ids")
|
|
def _check_issue_approval_ids(self):
|
|
for rec in self:
|
|
if rec.issue_approval_ids:
|
|
issue_names = []
|
|
for issue_library in rec.issue_approval_ids:
|
|
name_val = issue_library.issue_library_id.name or ""
|
|
issue_names.append(str(name_val))
|
|
decision_sequences = []
|
|
for issue_library in rec.issue_approval_ids:
|
|
seq_val = issue_library.approval_decision_sequence
|
|
if isinstance(seq_val, bool):
|
|
decision_sequences.append("是" if seq_val else "否")
|
|
else:
|
|
decision_sequences.append(str(seq_val or ""))
|
|
|
|
rec.issue_display = "\n".join(issue_names)
|
|
rec.decision_display = "\n".join(decision_sequences)
|
|
else:
|
|
rec.issue_display = ""
|
|
|
|
def end_approval(self):
|
|
for rec in self:
|
|
if rec.issue_approval_ids:
|
|
for issue_library in rec.issue_approval_ids:
|
|
issue_library.issue_library_id.write({'issue_state': 'to_approval',
|
|
})
|
|
if not issue_library.issue_library_id.issue_approval_id:
|
|
issue_library.issue_library_id.issue_approval_id = rec.id
|
|
if rec.code:
|
|
exist_line = self.env['issue.library.approval.line'].search_count([
|
|
('issue_library_id', '=', issue_library.issue_library_id.id),
|
|
('code', '=', rec.code),
|
|
])
|
|
if not exist_line:
|
|
self.env['issue.library.approval.line'].create({
|
|
'issue_library_id': issue_library.issue_library_id.id,
|
|
'code': rec.code,
|
|
'approval_date': fields.Datetime.now() + timedelta(hours=8),
|
|
})
|
|
|
|
class IssueApprovalLine(models.Model):
|
|
_name = 'issue.approval.line'
|
|
_description = '关联议题明细'
|
|
|
|
issue_approval_id = fields.Many2one('issue.approval', string='议题审批')
|
|
issue_library_id = fields.Many2one('issue.library', string='议题事项')
|
|
employee_id = fields.Many2one(related='issue_library_id.employee_id', string='创建人')
|
|
approval_decision_sequence = fields.Char(string='决策清单')
|
|
is_party = fields.Boolean(related='issue_library_id.is_party', string="党支部会")
|
|
is_class = fields.Boolean(related='issue_library_id.is_class', string="班子会")
|
|
is_boss = fields.Boolean(related='issue_library_id.is_boss', string="董事会")
|
|
is_note = fields.Boolean(related='issue_library_id.is_note', string="上级单位")
|
|
|
|
def unlink(self):
|
|
delete_lines = self.filtered(lambda l: l.issue_library_id.exists())
|
|
issue_library_records = self.env['issue.library']
|
|
for line in delete_lines:
|
|
issue_library_records |= line.issue_library_id
|
|
if issue_library_records:
|
|
issue_library_records.write({'issue_state': 'draft'})
|
|
issue_library_records.issue_approval_id = False
|
|
return super(IssueApprovalLine, self).unlink()
|
|
|
|
def open_record(self):
|
|
self.ensure_one()
|
|
is_modify = False
|
|
if self.issue_approval_id and self.issue_approval_id.state == '申请人':
|
|
if self.employee_id and self.issue_library_id and self.employee_id == self.issue_library_id.employee_id:
|
|
is_modify = True
|
|
|
|
if self.issue_library_id:
|
|
self.issue_library_id.write({'is_modify': is_modify})
|
|
|
|
return {
|
|
'type': 'ir.actions.act_window',
|
|
'res_model': 'issue.library',
|
|
'res_id': self.issue_library_id.id,
|
|
'view_mode': 'form',
|
|
'target': 'current',
|
|
}
|
|
|
|
class IssueRoomApproval(models.Model):
|
|
_name = 'issue.room.approval'
|