@@ -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>
|
||||
|
||||
@@ -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,
|
||||
}
|
||||
|
||||
@@ -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="在编人数"/>
|
||||
|
||||
Reference in New Issue
Block a user