@@ -8,6 +8,7 @@ class YuthonHrEmployee(models.Model):
|
||||
user_role_id = fields.Many2one('soong.user.role', string="主角色")
|
||||
user_role_ids = fields.Many2many('soong.user.role', string="辅助角色")
|
||||
department_ids = fields.Many2many('hr.department', string="辅助部门")
|
||||
bank_account = fields.Char()
|
||||
|
||||
@api.onchange('user_role_id')
|
||||
def _onchange_user_role_id(self):
|
||||
|
||||
@@ -41,8 +41,15 @@ class YuthonUserRole(models.Model):
|
||||
def _name_search(self, name, domain=None, operator='ilike', limit=None, order=None):
|
||||
domain = domain or []
|
||||
if name:
|
||||
input_pinyin = ''.join(lazy_pinyin(name))
|
||||
search_domain = ['|', ('pinyin_name', operator, input_pinyin), ('name', operator, name)]
|
||||
has_chinese = any('\u4e00' <= char <= '\u9fff' for char in name)
|
||||
if has_chinese:
|
||||
# 包含中文:使用模糊匹配
|
||||
search_domain = [('name', operator, name)]
|
||||
else:
|
||||
# 纯字母/数字:使用精确匹配
|
||||
search_domain = ['|',
|
||||
('pinyin_name', operator, name),
|
||||
('name', '=', name)]
|
||||
domain = expression.AND([search_domain, domain])
|
||||
return self._search(domain, limit=limit, order=order)
|
||||
|
||||
|
||||
@@ -22,7 +22,6 @@ class SoongWorkflowRecord(models.Model):
|
||||
re.name = res_name
|
||||
return super(SoongWorkflowRecord, self).read(fields=fields, load=load)
|
||||
|
||||
|
||||
name = fields.Char(string="名称")
|
||||
code = fields.Char(string="流水号")
|
||||
write_date2 = fields.Datetime(string="最后更新日期", readoly="1")
|
||||
@@ -37,8 +36,37 @@ class SoongWorkflowRecord(models.Model):
|
||||
approvals_group_id = fields.Many2one(related='workflow_id.approvals_group_id', string="审批分组", store=True)
|
||||
department_id = fields.Many2one("hr.department", string="部门", required=True)
|
||||
done_by = fields.Many2one(comodel_name="res.users", string="发起人")
|
||||
# is_department_record = fields.Boolean(string="是否是本部门数据", index=True)
|
||||
active = fields.Boolean(string="归档", default=True)
|
||||
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):
|
||||
user_employee = self._get_valid_employee_for_user()
|
||||
active_department = user_employee.department_id
|
||||
for employee in self:
|
||||
employee.member_of_department = employee.department_id == active_department
|
||||
|
||||
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):
|
||||
if operator not in ('=', '!=') or not isinstance(value, bool):
|
||||
raise UserError(_('Operation not supported'))
|
||||
user_employee = self._get_valid_employee_for_user()
|
||||
# Double negation
|
||||
if not value:
|
||||
operator = '!=' if operator == '=' else '='
|
||||
if not user_employee.department_id:
|
||||
return [('id', operator, user_employee.id)]
|
||||
return (['!'] if operator == '!=' else []) + [('department_id', '=', user_employee.department_id.id)]
|
||||
|
||||
# def get_department_employees(self, department_id):
|
||||
# valid_user_ids = set()
|
||||
|
||||
@@ -15,26 +15,26 @@
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="view_employee_inherit_tree_soong" model="ir.ui.view">
|
||||
<field name="name">view.employee.inherit.tree.soong</field>
|
||||
<field name="model">hr.employee</field>
|
||||
<field name="inherit_id" ref="hr.view_employee_tree"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//field[@name='work_email']" position="after">
|
||||
<field name="user_role_id" optional="hide"/>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
<!-- <record id="view_employee_inherit_tree_soong" model="ir.ui.view">-->
|
||||
<!-- <field name="name">view.employee.inherit.tree.soong</field>-->
|
||||
<!-- <field name="model">hr.employee</field>-->
|
||||
<!-- <field name="inherit_id" ref="hr.view_employee_tree"/>-->
|
||||
<!-- <field name="arch" type="xml">-->
|
||||
<!-- <xpath expr="//field[@name='work_email']" position="after">-->
|
||||
<!-- <field name="user_role_id" optional="hide"/>-->
|
||||
<!-- </xpath>-->
|
||||
<!-- </field>-->
|
||||
<!-- </record>-->
|
||||
|
||||
<record id="inherit_view_employee_filter_work" model="ir.ui.view">
|
||||
<field name="name">inherit.view.employee.filter</field>
|
||||
<field name="model">hr.employee</field>
|
||||
<field name="inherit_id" ref="hr.view_employee_filter"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//field[@name='department_id']" position="attributes">
|
||||
<attribute name="groupby">parent_id</attribute>
|
||||
<attribute name="select">multi</attribute>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
<!-- <record id="inherit_view_employee_filter_work" model="ir.ui.view">-->
|
||||
<!-- <field name="name">inherit.view.employee.filter</field>-->
|
||||
<!-- <field name="model">hr.employee</field>-->
|
||||
<!-- <field name="inherit_id" ref="hr.view_employee_filter"/>-->
|
||||
<!-- <field name="arch" type="xml">-->
|
||||
<!-- <xpath expr="//field[@name='department_id']" position="attributes">-->
|
||||
<!-- <attribute name="groupby">parent_id</attribute>-->
|
||||
<!-- <attribute name="select">multi</attribute>-->
|
||||
<!-- </xpath>-->
|
||||
<!-- </field>-->
|
||||
<!-- </record>-->
|
||||
</odoo>
|
||||
@@ -8,6 +8,7 @@
|
||||
<search string="流程查询">
|
||||
<field name="name"/>
|
||||
<field name="workflow_id" string="审批类型"/>
|
||||
<filter name="my_department_shifts" string="本部门" domain="[('member_of_department', '=', True)]"/>
|
||||
<group expand="0" string="审批分组">
|
||||
<filter string="审批类型分组" name='group_by_approvals_group_id' context="{'group_by':'approvals_group_id'}"/>
|
||||
</group>
|
||||
@@ -34,7 +35,7 @@
|
||||
<field name="create_uid"/>
|
||||
<field name="write_date2"/>
|
||||
<field name="reclaim_state" column_invisible="1"/>
|
||||
<!-- <field name="is_department_record" optional="hide"/>-->
|
||||
<field name="member_of_department" optional="hide"/>
|
||||
<button name="delete_record" type="object" string="删除" class="btn-primary" confirm="你确定要删除吗?"/>
|
||||
<button name="reminders_record" type="object" string="催办" class="btn-primary"
|
||||
groups="soong_workflow.group_soong_workflow_manager"/>
|
||||
|
||||
@@ -24,12 +24,12 @@ class AttendanceCorrectWizard(models.TransientModel):
|
||||
min_hour_from = record.attendance_id.employee_id.resource_id.calendar_id.attendance_ids[0].hour_from
|
||||
min_hour = int(min_hour_from)
|
||||
min_minute = int(min_hour_from * 10 % min_hour_from)
|
||||
will_datetime_start = current_date.replace(year=year, month=month, day=day, hour=min_hour, minute=min_minute) - timedelta(hours=8)
|
||||
will_datetime_start = current_date.replace(year=year, month=month, day=day, hour=min_hour, minute=min_minute) - timedelta(hours=7)
|
||||
record.attendance_id.write({'check_in': will_datetime_start, 'is_approval': True, 'is_abnormal':False, 'is_no_card':False, 'is_early_card':False, 'is_late_card':False})
|
||||
max_hour_to = record.attendance_id.employee_id.resource_id.calendar_id.attendance_ids[-1].hour_to
|
||||
max_hour = int(max_hour_to)
|
||||
max_minute = int(max_hour_to * 10 % max_hour_to)
|
||||
will_datetime_end = current_date.replace(year=year, month=month, day=day, hour=max_hour, minute=max_minute) - timedelta(hours=8)
|
||||
will_datetime_end = current_date.replace(year=year, month=month, day=day, hour=max_hour, minute=max_minute) - timedelta(hours=7)
|
||||
record.attendance_id.write({'check_out': will_datetime_end, 'is_approval': True, 'is_abnormal':False, 'is_no_card':False, 'is_early_card':False, 'is_late_card':False, 'absenteeism_card':False})
|
||||
else:
|
||||
check_in_start = record.attendance_id.shift_id.template_id.check_in_start
|
||||
|
||||
@@ -58,13 +58,19 @@ class YuthonHrDepartment(models.Model):
|
||||
for employee in self:
|
||||
employee.pinyin_name = ''.join(lazy_pinyin(employee.name))
|
||||
|
||||
|
||||
@api.model
|
||||
def _name_search(self, name, domain=None, operator='ilike', limit=None, order=None):
|
||||
domain = domain or []
|
||||
if name:
|
||||
input_pinyin = ''.join(lazy_pinyin(name))
|
||||
search_domain = ['|', ('pinyin_name', operator, input_pinyin), ('name', operator, name)]
|
||||
has_chinese = any('\u4e00' <= char <= '\u9fff' for char in name)
|
||||
if has_chinese:
|
||||
# 包含中文:使用模糊匹配
|
||||
search_domain = [('name', operator, name)]
|
||||
else:
|
||||
# 纯字母/数字:使用精确匹配
|
||||
search_domain = ['|',
|
||||
('pinyin_name', operator, name),
|
||||
('name', '=', name)]
|
||||
domain = expression.AND([search_domain, domain])
|
||||
return self._search(domain, limit=limit, order=order)
|
||||
|
||||
|
||||
@@ -447,8 +447,15 @@ class YuthonHrEmployee(models.Model):
|
||||
def _name_search(self, name, domain=None, operator='ilike', limit=None, order=None):
|
||||
domain = domain or []
|
||||
if name:
|
||||
input_pinyin = ''.join(lazy_pinyin(name))
|
||||
search_domain = ['|', '|', ('pinyin_name', operator, input_pinyin), ('name', operator, name), ('pinyin_min', operator, input_pinyin)]
|
||||
has_chinese = any('\u4e00' <= char <= '\u9fff' for char in name)
|
||||
if has_chinese:
|
||||
# 包含中文:使用模糊匹配
|
||||
search_domain = [('name', operator, name)]
|
||||
else:
|
||||
# 纯字母/数字:使用精确匹配
|
||||
search_domain = ['|',
|
||||
('pinyin_name', operator, name),
|
||||
('name', '=', name)]
|
||||
domain = expression.AND([search_domain, domain])
|
||||
return self._search(domain, limit=limit, order=order)
|
||||
|
||||
|
||||
@@ -16,6 +16,7 @@ class YuthonWillTask(models.Model):
|
||||
priority = fields.Selection([('general', '不紧急不重要'), ('important', '重要不紧急'),
|
||||
('urgent', '紧急不重要'), ('very_urgent', '重要且紧急')], string='优先级')
|
||||
user_id = fields.Many2one('res.users', string="创建人", default=lambda self: self.env.user)
|
||||
company_id = fields.Many2one('res.company', string="公司", default=lambda self: self.env.company)
|
||||
task_content = fields.Text(string='任务内容')
|
||||
remarks = fields.Text(string='备注')
|
||||
creation_time = fields.Date(string='创建时间', default=fields.Date.today())
|
||||
|
||||
@@ -136,6 +136,7 @@
|
||||
</group>
|
||||
<group>
|
||||
<field name="user_id" domain="[('company_id', '=', company_id)]"/>
|
||||
<field name="company_id" invisible="1"/>
|
||||
<field name="employee_ids" widget="many2many_tags" options="{'no_create': True}"/>
|
||||
<field name='employee_ids2' widget="many2many_tags" domain="[('user_role_ids.name', 'in', ['司机'])]"/>
|
||||
<field name='users_ids' widget="many2many_tags" invisible="1"/>
|
||||
|
||||
Reference in New Issue
Block a user