95 lines
3.7 KiB
Python
95 lines
3.7 KiB
Python
# -*- coding: utf-8 -*-
|
|
from odoo import api, fields, models
|
|
from datetime import datetime, timedelta
|
|
|
|
|
|
class YuthonCatering(models.Model):
|
|
_name = 'yuthon.catering'
|
|
|
|
date = fields.Date(string='日期', required=True)
|
|
dept_id = fields.Many2one(string='部门', comodel_name='hr.department', related='employee_id.department_id', store=True)
|
|
employee_id = fields.Many2one(string='员工', comodel_name='hr.employee', required=True)
|
|
breakfast = fields.Boolean(string='早餐', default=False)
|
|
lunch = fields.Boolean(string='午餐', default=False)
|
|
menu_day_id = fields.Many2one('yuthon.menu.setting', string='菜单')
|
|
amount = fields.Float(string='结算费用')
|
|
note = fields.Text(string='备注')
|
|
|
|
def catering_task(self):
|
|
conf_records = self.env['yuthon.catering.conf'].search([])
|
|
employee_ids = conf_records.mapped('employee_ids')
|
|
|
|
today = fields.Date.today()
|
|
date_list = [today + timedelta(days=i) for i in range(7)]
|
|
|
|
create_vals = []
|
|
for employee in employee_ids:
|
|
for target_date in date_list:
|
|
if not self._process_shift_days(target_date):
|
|
continue
|
|
existing = self.search([
|
|
('employee_id', '=', employee.id),
|
|
('date', '=', target_date)
|
|
], limit=1)
|
|
|
|
menu_record = self.env['yuthon.menu.setting'].search([
|
|
('menu_date', '=', target_date)
|
|
], limit=1)
|
|
|
|
if not existing:
|
|
create_vals.append({
|
|
'menu_record': menu_record.id if menu_record else False,
|
|
'date': target_date,
|
|
'employee_id': employee.id,
|
|
})
|
|
|
|
if create_vals:
|
|
self.create(create_vals)
|
|
|
|
def _process_shift_days(self, current_data):
|
|
"""
|
|
判断是否是工作日 调休日 双休
|
|
"""
|
|
current_year = (fields.Date.today() + timedelta(hours=8)).year
|
|
query_start = datetime(current_year, 1, 1, 0, 0, 0) - timedelta(hours=8)
|
|
query_end = datetime(current_year, 12, 31, 23, 59, 59) - timedelta(hours=8)
|
|
calendar_leaves = self.env['resource.calendar.leaves'].sudo().search([
|
|
("calendar_id.name", "=", "行政考勤工作日"),
|
|
("date_from", ">=", query_start),
|
|
("date_from", "<=", query_end)
|
|
])
|
|
holidays_list = []
|
|
shift_days_list = []
|
|
# 提取节假日和调休日
|
|
for leave in calendar_leaves:
|
|
if leave.holidays:
|
|
holidays_list.extend(leave.holidays.split(','))
|
|
if leave.alternate_rest_day:
|
|
holidays_list.extend(leave.alternate_rest_day.split(','))
|
|
if leave.shift_replacement_day:
|
|
shift_days_list.extend(leave.shift_replacement_day.split(','))
|
|
|
|
holidays_list = [self.remove_leading_zero(date) for date in holidays_list]
|
|
shift_days_list = [self.remove_leading_zero(date) for date in shift_days_list]
|
|
result = f"{current_data.month}月{current_data.day}日"
|
|
if result in shift_days_list:
|
|
return True
|
|
elif (result in holidays_list) or (current_data.weekday() in [5, 6]):
|
|
return False
|
|
else:
|
|
return True
|
|
|
|
def remove_leading_zero(self, date_str):
|
|
month, day = date_str.split('月')
|
|
month = month.lstrip('0')
|
|
day = day.rstrip('日')
|
|
day = day.lstrip('0')
|
|
return f'{month}月{day}日'
|
|
|
|
def cron_send_message(self):
|
|
# 登记页面
|
|
url = f'/catering/registration/<int:employee_id>'
|
|
# 统计页面
|
|
url = f'/catering/statistics/<int:employee_id>'
|
|
|