Merge pull request !638 from 李鹏宇/dev_zhou
This commit is contained in:
李鹏宇
2024-12-02 14:38:02 +00:00
committed by Gitee
12 changed files with 199 additions and 22 deletions
+15 -1
View File
@@ -8,9 +8,23 @@ class HrContract(models.Model):
_description = "员工合同拓展"
code = fields.Char(string="编号", default=lambda self: self.env['ir.sequence'].next_by_code('contract_code'))
name = fields.Char(string="合同名称", compute='_compute_name')
resource_calendar_id = fields.Many2one('resource.calendar', string='考勤时间表')
date_of_entry = fields.Date(string="入职时间", default=lambda self: self._default_date_of_entry())
work_entry_source = fields.Selection([
('calendar', '考勤安排'),
('attendance', 'Attendances'),
('planning', '特殊排版')])
('planning', '特殊排版')])
@api.model
def _default_date_of_entry(self):
return self.date_start or fields.Date.today()
@api.depends('contract_type_id')
def _compute_name(self):
for record in self:
if record.contract_type_id:
record.name = record.contract_type_id.name
else:
record.name = ' '
@@ -1,5 +1,21 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<record id="inherit_hr_contract_yuthon_tree" model="ir.ui.view">
<field name="name">inherit.hr.contract.yuthon.tree</field>
<field name="model">hr.contract</field>
<field name="inherit_id" ref="hr_contract.hr_contract_view_tree"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='date_end']" position="after">
<field name="date_of_entry"/>
</xpath>
<xpath expr="//field[@name='contract_type_id']" position="attributes">
<attribute name="column_invisible">1</attribute>
</xpath>
<xpath expr="//field[@name='name']" position="attributes">
<attribute name="string">合同名称</attribute>
</xpath>
</field>
</record>
<record id="inherit_hr_contract_yuthon_form" model="ir.ui.view">
<field name="name">inherit.hr.contract.yuthon.form</field>
<field name="model">hr.contract</field>
@@ -8,6 +24,9 @@
<xpath expr="//field[@name='employee_id']" position="after">
<field name="code"/>
</xpath>
<xpath expr="//field[@name='structure_type_id']" position="attributes">
<attribute name="string">职级</attribute>
</xpath>
<xpath expr="//page[@name='information']" position="replace">
<page name="information2" string="工资信息">
<group>
+1 -1
View File
@@ -17,7 +17,7 @@
'wizard/yuthon_fixes_wizard_views.xml',
],
'demo': [],
'depends': ['hr_holidays', 'planning', 'hr', 'yuthon_hr_employee', 'base', 'yuthon_issue', 'documents', 'mail'],
'depends': ['hr_holidays', 'planning', 'hr', 'yuthon_hr_employee', 'base', 'yuthon_issue', 'documents', 'mail', 'soong_workflow'],
'installable': True,
'application': True,
}
+11 -1
View File
@@ -27,7 +27,17 @@ class GoApprovals(models.Model):
if rec.go_approval_ids:
first_line = rec.go_approval_ids[0]
if first_line.date_start and first_line.date_end:
rec.duration = (first_line.date_end - first_line.date_start).total_seconds() / 3600
start_date = first_line.date_start
end_date = first_line.date_end
total_duration = end_date - start_date
current_date = start_date
while current_date < end_date:
if current_date.weekday() == 5:
total_duration -= timedelta(days=2)
current_date += timedelta(days=2)
else:
current_date += timedelta(days=1)
rec.duration = total_duration.total_seconds() / 3600
else:
rec.duration = 0.0
else:
@@ -139,7 +139,6 @@ class HrAttendance(models.Model):
'default_actual_punch': self.current_data,
'default_replacement_time': replacement_time,
'default_users_id': self.employee_id.user_id.id,
'default_replacement_time': replacement_time,
}
}
@@ -11,6 +11,39 @@ class YuthonRunPlanning(models.Model):
illustrate = fields.Char(string='排班说明', default='默认轮排到下个月')
engineering_run_ids = fields.One2many('yuthon.engineering.run.line', 'engineering_planning_id', string='关联运行班排班明细')
def confirm(self):
start_date = datetime.now().replace(day=1, hour=0, minute=0, second=0, microsecond=0) # 获取本月第一天零点
end_date = (start_date + timedelta(days=32)).replace(day=1) # 获取下个月第一天零点
role_a = self.env['planning.role'].search([('name', '=', '运行班白班')], limit=1)
role_b = self.env['planning.role'].search([('name', '=', '运行班中值夜班')], limit=1)
department_id = self.env['hr.department'].search([('name', '=', '运行班')])
if department_id:
employee_ids = self.env['hr.employee'].search([('department_id', '=', department_id.id)])
else:
employee_ids = self.env['hr.employee']
if not role_a:
resource_list = []
for employee in employee_ids:
resource_id = self.env['resource.resource'].search([('name', '=', employee.name)],
limit=1)
resource_list.append(resource_id.id)
role_a = self.env['planning.role'].create({
'resource_ids': resource_list,
'name': '运行班白班',
'department_id': department_id.id
})
if not role_b:
resource_list = []
for employee in employee_ids:
resource_ids = self.env['resource.resource'].search([('name', '=', employee.name)],
limit=1)
resource_list.append(resource_ids.id)
role_b = self.env['planning.role'].create({
'resource_ids': resource_list,
'name': '运行班中值夜班',
'department_id': department_id.id
})
class YuthonEngineeringRunLine(models.Model):
_name = 'yuthon.engineering.run.line'
@@ -19,4 +52,4 @@ class YuthonEngineeringRunLine(models.Model):
employee_id = fields.Many2one('hr.employee', string='人员',
domain=lambda self: [('department_id.name', '=', '运行班')])
sequence = fields.Integer(string='序号')
engineering_planning_id = fields.Many2one('yuthon.engineering.planning', string='关联运行班排班计划')
engineering_planning_id = fields.Many2one('yuthon.run.planning', string='关联运行班排班计划')
@@ -8,19 +8,108 @@ class YuthonShiftPlanning(models.Model):
name = fields.Char(string='排班名称', required=True)
illustrate = fields.Char(string='排班说明', default='默认按ABC三组轮排到下个月')
number_of_shifts = fields.Integer(string='轮班次数', default=0)
planning_a_ids = fields.One2many('yuthon.shift.planning.a.line', 'shift_planning_id', string='关联A组')
planning_b_ids = fields.One2many('yuthon.shift.planning.b.line', 'shift_planning_id', string='关联B组')
planning_c_ids = fields.One2many('yuthon.shift.planning.c.line', 'shift_planning_id', string='关联C组')
def confirm(self):
pass
start_date = datetime.now().replace(day=1, hour=0, minute=0, second=0, microsecond=0) # 获取本月第一天零点
end_date = (start_date + timedelta(days=32)).replace(day=1) # 获取下个月第一天零点
role_a = self.env['planning.role'].search([('name', '=', '保安部白班')], limit=1)
role_b = self.env['planning.role'].search([('name', '=', '保安部中班')], limit=1)
role_c = self.env['planning.role'].search([('name', '=', '保安部夜班')], limit=1)
department_id = self.env['hr.department'].search([('name', '=', '保安部')], limit=1)
department_ids = self.env['hr.department'].search([('name', 'in', ['保安部', '班组A', '班组B', '班组C'])])
if department_ids:
employee_ids = self.env['hr.employee'].search([('department_id', 'in', department_ids.ids)])
else:
employee_ids = self.env['hr.employee']
if not role_a:
resource_list = []
for employee in employee_ids:
resource_id = self.env['resource.resource'].search([('name', '=', employee.name)],
limit=1)
resource_list.append(resource_id.id)
role_a = self.env['planning.role'].create({
'resource_ids': resource_list,
'name':'保安部白班',
'department_id':department_id.id
})
if not role_b:
resource_list = []
for employee in employee_ids:
resource_ids = self.env['resource.resource'].search([('name', '=', employee.name)],
limit=1)
resource_list.append(resource_ids.id)
role_b = self.env['planning.role'].create({
'resource_ids': resource_list,
'name': '保安部中班',
'department_id': department_id.id
})
if not role_c:
resource_list = []
for employee in employee_ids:
resource_ids = self.env['resource.resource'].search([('name', '=', employee.name)],
limit=1)
resource_list.append(resource_ids.id)
role_c = self.env['planning.role'].create({
'resource_ids': resource_list,
'name': '保安部夜班',
'department_id': department_id.id
})
role = [role_a, role_b, role_c]
planning_groups = {
'planning_a_ids': range(len(role)), # 默认顺序: 早 -> 中 -> 夜
'planning_b_ids': [1, 2, 0], # 中 -> 夜 -> 早
'planning_c_ids': [2, 1, 0] # 夜 -> 中 -> 早
}
for planning_group, role_order in planning_groups.items():
for record in getattr(self, planning_group):
current_date = start_date
while current_date < end_date:
for role_index in role_order:
for _ in range(self.number_of_shifts):
role_template = self.env['planning.slot.template'].search(
[('role_id', '=', role[role_index].id)], limit=1)
self.create_planning_slot(record, role[role_index].id, role_template, current_date)
current_date += timedelta(days=1)
if current_date >= end_date: # 防止超出 end_date
break
if current_date >= end_date:
break
def create_planning_slot(self, record,role,role_template,current_date):
start_hour = int(role_template.start_time)
start_minute = int(round((role_template.start_time - start_hour) * 60))
end_hour = int(role_template.end_time)
end_minute = int(round((role_template.end_time - end_hour) * 60))
start_time = current_date.replace(hour=start_hour, minute=start_minute, second=0, microsecond=0)+ timedelta(hours=16)
if role_template.end_time < role_template.start_time:
end_time = (current_date + timedelta(days=1)).replace(hour=end_hour, minute=end_minute, second=0,
microsecond=0)+ timedelta(hours=16)
else:
end_time = current_date.replace(hour=end_hour, minute=end_minute, second=0, microsecond=0)+ timedelta(hours=16)
self.env['planning.slot'].create({
'resource_id': record.employee_id.resource_id.id,
'role_id':role,
'start_datetime': start_time,
'end_datetime': end_time,
'allocated_hours':8,
})
class YuthonShiftPlanningALine(models.Model):
_name = 'yuthon.shift.planning.a.line'
_description = '排班安排A组'
employee_id = fields.Many2one('hr.employee', string='人员',
domain=lambda self: [('department_id.name', '=', '保安部')])
domain=lambda self: [('department_id.name', 'in', ['保安部', '班组A', '班组B','班组C'])])
sequence = fields.Integer(string='序号')
shift_planning_id = fields.Many2one('yuthon.shift.planning', string='关联排班安排')
@@ -30,7 +119,7 @@ class YuthonShiftPlanningBLine(models.Model):
_description = '排班安排B组'
employee_id = fields.Many2one('hr.employee', string='人员',
domain=lambda self: [('department_id.name', '=', '保安部')])
domain=lambda self: [('department_id.name', 'in', ['保安部', '班组A', '班组B','班组C'])])
sequence = fields.Integer(string='序号')
shift_planning_id = fields.Many2one('yuthon.shift.planning', string='关联排班安排')
@@ -40,7 +129,7 @@ class YuthonShiftPlanningCLine(models.Model):
_description = '排班安排C组'
employee_id = fields.Many2one('hr.employee', string='人员',
domain=lambda self: [('department_id.name', '=', '保安部')])
domain=lambda self: [('department_id.name', 'in', ['保安部', '班组A', '班组B','班组C'])])
sequence = fields.Integer(string='序号')
shift_planning_id = fields.Many2one('yuthon.shift.planning', string='关联排班安排')
@@ -1,7 +1,17 @@
<odoo>
<record id="hr_planning_slot_inherit" model="ir.ui.view">
<record id="hr_planning_slot_template_tree_inherit" model="ir.ui.view">
<field name="name">planning.slot.template.tree.inherit</field>
<field name="model">planning.slot.template</field>
<field name="inherit_id" ref="planning.planning_slot_template_view_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='role_id']" position="after">
<field name="department_id" string="部门"/>
</xpath>
</field>
</record>
<record id="hr_planning_slot_template_inherit_form" model="ir.ui.view">
<field name="name">planning.slot.template.form.inherit</field>
<field name="model">planning.slot.template</field>
<field name="inherit_id" ref="planning.planning_slot_template_view_tree"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='role_id']" position="after">
@@ -12,25 +22,25 @@
<record id="action_planning_slot_template_form1" model="ir.actions.act_window">
<field name="name">班次模板</field>
<field name="res_model">planning.slot.template</field>
<field name="view_mode">tree</field>
<field name="domain">[('department_id.name', '=', '保安部')]</field>
<field name="view_mode">tree,form</field>
<field name="domain">[('department_id.name','in',['保安部', '班组A', '班组B','班组C'])]</field>
</record>
<record id="action_planning_slot_template_form2" model="ir.actions.act_window">
<field name="name">班次模板</field>
<field name="res_model">planning.slot.template</field>
<field name="view_mode">tree</field>
<field name="view_mode">tree,form</field>
<field name="domain">[('department_id.name', '=', '运行班')]</field>
</record>
<record id="action_planning_slot_template_form3" model="ir.actions.act_window">
<field name="name">班次模板</field>
<field name="res_model">planning.slot.template</field>
<field name="view_mode">tree</field>
<field name="view_mode">tree,form</field>
<field name="domain">[('department_id.name', '=', '高压班')]</field>
</record>
<record id="action_planning_slot_template_form4" model="ir.actions.act_window">
<field name="name">班次模板</field>
<field name="res_model">planning.slot.template</field>
<field name="view_mode">tree</field>
<field name="view_mode">tree,form</field>
<field name="domain">[('department_id.name', '=', '综合班')]</field>
</record>
</odoo>
@@ -14,7 +14,7 @@
<field name="res_model">planning.slot</field>
<field name="view_mode">gantt,calendar,tree,form,kanban,pivot,graph</field>
<field name="context">{'planning_expand_resource': 1, 'planning_expand_role': 1}</field>
<field name="domain">[('department_id.name','=','保安部')]</field>
<field name="domain">[('department_id.name','in',['保安部', '班组A', '班组B','班组C'])]</field>
</record>
<record id="action_planning_slot_form2" model="ir.actions.act_window">
<field name="name">排班计划</field>
@@ -7,6 +7,7 @@
<tree string="排班安排">
<field name="name"/>
<field name="illustrate"/>
<field name="number_of_shifts"/>
</tree>
</field>
</record>
@@ -22,11 +23,12 @@
<group>
<field name="name"/>
<field name="illustrate"/>
<field name="number_of_shifts"/>
</group>
<group string="排班安排A组(8:00-17:00)">
<field name="planning_a_ids" string=" ">
<tree editable="bottom">
<field name="sequence"/>
<field name="sequence" widget="handle" />
<field name="employee_id"/>
</tree>
</field>
@@ -34,15 +36,15 @@
<group string="排班安排B组(14:00-22:00)">
<field name="planning_b_ids" string=" ">
<tree editable="bottom">
<field name="sequence"/>
<field name="sequence" widget="handle" />
<field name="employee_id"/>
</tree>
</field>
</group>
<group string="排班安排C组(22:00-06=8:00)">
<group string="排班安排C组(22:00-8:00)">
<field name="planning_c_ids" string=" ">
<tree editable="bottom">
<field name="sequence"/>
<field name="sequence" widget="handle" />
<field name="employee_id"/>
</tree>
</field>
@@ -30,7 +30,8 @@ class YuthonHrEmployee(models.Model):
number = fields.Char(string="序号", store=True)
user_number = fields.Char(string="员工编号", default=lambda self: self.env['ir.sequence'].next_by_code('employee_code'))
use_user_type = fields.Selection([('formal', '正式合同'), ('labor', '劳务协议'),
use_user_type = fields.Selection([('formal_one', '正式合同(一签)'), ('labor', '劳务协议'), ('formal_two', '正式合同(二签)'),
('formal_none', '正式合同(无固定)'),
('part_time', '兼职协议'), ('employment', '用工协议'), ('internship', '实习协议')], string="用工形式")
contract_company = fields.Selection([('thtz', '天河投资集团'), ('thwg', '天河物管'),
@@ -21,7 +21,7 @@
<attribute name="column_invisible">1</attribute>
</xpath>
<xpath expr="//field[@name='department_id']" position="after">
<field name="job_type_id"/>
<field name="job_personnel"/>
<field name="yuthon_company"/>
<field name="establishment_quotas"/>
<field name="no_of_employee" string="在编人数"/>