diff --git a/yuthon_hr_attendance/models/hr_attendance_month.py b/yuthon_hr_attendance/models/hr_attendance_month.py
index b0c354a72..3beba21c9 100644
--- a/yuthon_hr_attendance/models/hr_attendance_month.py
+++ b/yuthon_hr_attendance/models/hr_attendance_month.py
@@ -25,6 +25,7 @@ class HrAttendanceMonth(models.Model):
name = fields.Char(compute='_compute_name')
attendance_year_id = fields.Many2one('hr.attendance.year', string="统计年份")
+ company_id = fields.Many2one('res.company', string="公司", default=lambda self: self.env.user.company_id)
current_year = fields.Char(string='统计年份', related="attendance_year_id.year")
current_month = fields.Selection([
('1', '1月份'),
@@ -43,6 +44,12 @@ class HrAttendanceMonth(models.Model):
is_statistics = fields.Boolean(string="是否已统计", store=True, default=False)
statistics_time = fields.Datetime(string="统计时间")
attendance_month_detail_ids = fields.One2many(string="出勤月度汇总明细", comodel_name='hr.attendance.month.detail', inverse_name='hr_attendance_month_id')
+ is_state = fields.Boolean(string='是否已全部确认', compute='_compute_is_state', store=True)
+
+ @api.depends('attendance_month_detail_ids.state')
+ def _compute_is_state(self):
+ for record in self:
+ record.is_state = all(detail.state == 'confirmed' for detail in record.attendance_month_detail_ids)
def _compute_name(self):
for record in self:
@@ -75,7 +82,6 @@ class HrAttendanceMonthDetail(models.Model):
employee_id = fields.Many2one('hr.employee', string="员工", readonly=True)
department_id = fields.Many2one('hr.department', string="部门", related="employee_id.department_id", readonly=True)
# userid = fields.Char(string='userid')
-
attendance_year_id = fields.Many2one('hr.attendance.year', string="统计年份")
current_year = fields.Char(string='统计年份', related="attendance_year_id.year")
current_month = fields.Selection([
diff --git a/yuthon_hr_attendance/security/planning_group.xml b/yuthon_hr_attendance/security/planning_group.xml
index 3513e086a..c8dfc398e 100644
--- a/yuthon_hr_attendance/security/planning_group.xml
+++ b/yuthon_hr_attendance/security/planning_group.xml
@@ -102,6 +102,10 @@
(4, ref('group_he_attendance_security_manager'))]"/>
-
+
+ 出勤统计多公司
+
+ [('company_id', 'in', company_ids)]
+
diff --git a/yuthon_hr_attendance/views/hr_attendance_month_views.xml b/yuthon_hr_attendance/views/hr_attendance_month_views.xml
index 9c17ec965..737f43e06 100644
--- a/yuthon_hr_attendance/views/hr_attendance_month_views.xml
+++ b/yuthon_hr_attendance/views/hr_attendance_month_views.xml
@@ -25,6 +25,8 @@
+
+
diff --git a/yuthon_hr_attendance/wizard/hr_attendance_month_wizard.py b/yuthon_hr_attendance/wizard/hr_attendance_month_wizard.py
index aabdfbd8f..aef33b348 100644
--- a/yuthon_hr_attendance/wizard/hr_attendance_month_wizard.py
+++ b/yuthon_hr_attendance/wizard/hr_attendance_month_wizard.py
@@ -3,6 +3,7 @@ import datetime
import calendar
from odoo import models, api, fields, _
from odoo.tools.float_utils import float_round
+from odoo.exceptions import ValidationError, UserError
from datetime import date
@@ -11,6 +12,7 @@ class HrAttendanceMonthWizard(models.TransientModel):
_description = "考勤统计向导"
attendance_year_id = fields.Many2one('hr.attendance.year', string="统计年份")
+ company_id = fields.Many2one('res.company', string="公司", default=lambda self: self.env.user.company_id)
current_year = fields.Char(string='统计年份', related="attendance_year_id.year")
current_month = fields.Selection([
('1', '1月份'),
@@ -99,6 +101,16 @@ class HrAttendanceMonthWizard(models.TransientModel):
# 1 生成出勤生成记录
# 2 生成出勤月度明细
# 获取出勤月度汇总记录结果表
+ for record in self:
+ year = record.current_year
+ month = record.current_month
+ existing_records = self.env["hr.attendance.month"].search([
+ ('current_year', '=', year),
+ ('current_month', '=', month),
+ ('company_id', '=', record.company_id.id)
+ ])
+ if existing_records:
+ raise ValidationError(f"{year}年{month}月分的记录已经存在,不能重复操作.")
self.ensure_one()
attendance_month_obj = self._get_attendance_month_obj()
# 查询所有的当前员工? 是否需要判断当前员工是否关联企业微信??预留
diff --git a/yuthon_hr_attendance/wizard/hr_attendance_month_wizard_views.xml b/yuthon_hr_attendance/wizard/hr_attendance_month_wizard_views.xml
index 85e17b065..270be32f0 100644
--- a/yuthon_hr_attendance/wizard/hr_attendance_month_wizard_views.xml
+++ b/yuthon_hr_attendance/wizard/hr_attendance_month_wizard_views.xml
@@ -6,6 +6,7 @@
diff --git a/yuthon_salary/wizard/salary_compute_wizard.py b/yuthon_salary/wizard/salary_compute_wizard.py
index c69d7904a..a69a69716 100644
--- a/yuthon_salary/wizard/salary_compute_wizard.py
+++ b/yuthon_salary/wizard/salary_compute_wizard.py
@@ -40,6 +40,16 @@ class SalaryComputeWizard(models.Model):
self.employee_number = len(self.employee_ids)
def confirm(self):
+ attendance_records = self.env['hr.attendance.month'].search([
+ ('current_year', '=', self.select_year),
+ ('current_month', '=', self.select_time),
+ ])
+ if not attendance_records:
+ raise ValidationError(
+ f"在 {self.select_year} 年 {self.select_time} 月没有出勤月度汇总记录,请先完成考勤统计。")
+ if not all(record.is_state for record in attendance_records):
+ raise ValidationError(
+ f"在 {self.select_year} 年 {self.select_time} 月的出勤月度汇总记录未全部确认,请先确认考勤。")
for employee in self.employee_ids:
contract_id = self.env['hr.contract'].search([('employee_id', '=', employee.id)], limit=1)
year = int(self.select_year)