Files
gzth/yuthon_catering/models/yuthon_catering.py
T
2025-12-30 17:42:37 +08:00

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>'