diff --git a/yuthon_hr_attendance/models/yuthon_run_planning.py b/yuthon_hr_attendance/models/yuthon_run_planning.py
index ef834e56c..3a54f55ba 100644
--- a/yuthon_hr_attendance/models/yuthon_run_planning.py
+++ b/yuthon_hr_attendance/models/yuthon_run_planning.py
@@ -1,3 +1,5 @@
+from dateutils import years
+
from odoo import api, fields, models, tools, _
from datetime import datetime, time, timedelta
from odoo.exceptions import UserError
@@ -8,62 +10,110 @@ class YuthonRunPlanning(models.Model):
_description = '运行班排班计划'
name = fields.Char(string='排班计划名称', required=True)
- number_of_shifts = fields.Integer(string='轮班次数', default=0)
illustrate = fields.Char(string='排班说明', default='默认轮排到下个月')
- engineering_run_ids = fields.One2many('yuthon.engineering.run.line', 'engineering_planning_id', string='关联运行班排班明细')
+ 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)
-
- end_date = start_date + timedelta(days=30)
- employees = self.engineering_run_ids
- num_employees = len(employees)
- for employee in employees:
- current_date = start_date
- # 计算下个月的第一天
- if current_date.month == 12:
- next_month_start = datetime(current_date.year + 1, 1, 1, 0, 0, 0)
- else:
- next_month_start = datetime(current_date.year, current_date.month + 1, 1, 0, 0, 0)
-
- while current_date < next_month_start and current_date <= end_date:
- self.create_planning_slot(employee, role_a.id, self.get_role_template(role_a), current_date)
- current_date += timedelta(days=1)
-
- current_date = start_date
- while current_date <= end_date:
- current_employee = employees[(current_date - start_date).days % num_employees]
- self.create_planning_slot(current_employee, role_b.id, self.get_role_template(role_b), current_date)
- current_date += timedelta(days=1)
-
- 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)
+ today = datetime.today().date()
+ first_day_of_month = today.replace(day=1)
+ if today.month < 12:
+ last_day_of_month = (today.replace(month=today.month + 1, day=1) - timedelta(days=1))
else:
- end_time = current_date.replace(hour=end_hour, minute=end_minute, second=0,
- microsecond=0) + timedelta(hours=16)
+ last_day_of_month = (today.replace(year=today.year + 1, month=1, day=1) - timedelta(days=1))
+ role_a = self.env['planning.role'].search([('name', '=', '工程部白班')], limit=1)
+ start_time = int(self.env['planning.slot.template'].search([('role_id', '=', role_a.id)]).start_time)
+ end_time = int(self.env['planning.slot.template'].search([('role_id', '=', role_a.id)]).end_time)
+ for employee in self.engineering_run_ids:
+ current_date = first_day_of_month
+ while current_date <= last_day_of_month:
+ resource_id = employee.employee_id.resource_id
+ self.env['planning.slot'].create({
+ 'resource_id': resource_id.id,
+ 'start_datetime': datetime(current_date.year, current_date.month, current_date.day, start_time) + timedelta(hours=16),
+ 'end_datetime': datetime(current_date.year, current_date.month, current_date.day, end_time) + timedelta(hours=16),
+ 'role_id': role_a.id,
+ 'allocated_hours': 8,
+ })
+ current_date += timedelta(days=1)
+ if current_date > last_day_of_month:
+ break
+ role_b = self.env['planning.role'].search([('name', '=', '工程部中值夜班')], limit=1)
+ start_time2 = int(self.env['planning.slot.template'].search([('role_id', '=', role_b.id)]).start_time)
+ end_time2 = int(self.env['planning.slot.template'].search([('role_id', '=', role_b.id)]).end_time)
+ all_slot = self.env['planning.slot'].search([('department_id.name', '=', '运行班')])
+ current_date = first_day_of_month
+ i = -1
+ while current_date <= last_day_of_month:
+ for employee in range(0, len(self.engineering_run_ids)):
+ i = i + 1
+ slot_id = all_slot.search([('resource_id', '=', self.engineering_run_ids[employee].employee_id.resource_id.id)]).sorted('start_datetime')[i]
+ slot_id.sudo().write({
+ 'template_id': self.env['planning.slot.template'].search([('role_id', '=', role_b.id)]).id,
+ 'start_datetime': datetime(current_date.year, current_date.month, current_date.day,
+ start_time2) + timedelta(hours=16),
+ 'end_datetime': datetime(current_date.year, current_date.month, current_date.day,
+ end_time2) + timedelta(days=1, hours=16),
+ 'role_id': role_b.id,
+ 'allocated_hours': 8,
+ })
+ current_date += timedelta(days=1)
+ if current_date > last_day_of_month:
+ break
+ return {
+ 'type': 'ir.actions.client',
+ 'tag': 'display_notification',
+ 'params': {
+ 'type': 'success',
+ 'message': '运行班已排完',
+ 'sticky': False,
+ }
+ }
+ # employees = self.engineering_run_ids
+ # num_employees = len(employees)
+ # for employee in employees:
+ # current_date = start_date
+ # # 计算下个月的第一天
+ # if current_date.month == 12:
+ # next_month_start = datetime(current_date.year + 1, 1, 1, 0, 0, 0)
+ # else:
+ # next_month_start = datetime(current_date.year, current_date.month + 1, 1, 0, 0, 0)
+ #
+ # while current_date < next_month_start and current_date <= end_date:
+ # self.create_planning_slot(employee, role_a.id, self.get_role_template(role_a), current_date)
+ # current_date += timedelta(days=1)
+ #
+ # current_date = start_date
+ # while current_date <= end_date:
+ # current_employee = employees[(current_date - start_date).days % num_employees]
+ # self.create_planning_slot(current_employee, role_b.id, self.get_role_template(role_b), current_date)
+ # current_date += timedelta(days=1)
- 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,
- })
-
- def get_role_template(self, role):
- return self.env['planning.slot.template'].search([('role_id', '=', role.id)], limit=1)
+ # 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,
+ # })
+ #
+ # def get_role_template(self, role):
+ # return self.env['planning.slot.template'].search([('role_id', '=', role.id)], limit=1)
class YuthonEngineeringRunLine(models.Model):
diff --git a/yuthon_hr_attendance/views/yuthon_hv_planning_views.xml b/yuthon_hr_attendance/views/yuthon_hv_planning_views.xml
index 9a52a2458..f17b1ac9f 100644
--- a/yuthon_hr_attendance/views/yuthon_hv_planning_views.xml
+++ b/yuthon_hr_attendance/views/yuthon_hv_planning_views.xml
@@ -24,7 +24,7 @@
-
+
diff --git a/yuthon_hr_attendance/views/yuthon_overall_planning_views.xml b/yuthon_hr_attendance/views/yuthon_overall_planning_views.xml
index f22e7d022..c0d2b9cd7 100644
--- a/yuthon_hr_attendance/views/yuthon_overall_planning_views.xml
+++ b/yuthon_hr_attendance/views/yuthon_overall_planning_views.xml
@@ -24,7 +24,7 @@
-
+
diff --git a/yuthon_hr_attendance/views/yuthon_run_planning_views.xml b/yuthon_hr_attendance/views/yuthon_run_planning_views.xml
index df07e8f76..5988119ad 100644
--- a/yuthon_hr_attendance/views/yuthon_run_planning_views.xml
+++ b/yuthon_hr_attendance/views/yuthon_run_planning_views.xml
@@ -22,13 +22,12 @@
-
-
+