!10957 !10956 Merge branch 'master' into dev_zhou

Merge pull request !10957 from 李鹏宇/dev
This commit is contained in:
李鹏宇
2026-04-18 16:01:57 +00:00
committed by Gitee
7 changed files with 42 additions and 141 deletions
@@ -17,14 +17,7 @@ class OvertimeCarryover(models.Model):
carry_result = fields.Selection(related='over_line_id.carry_result', string='结转结果', store=True)
over_line_id1 = fields.Many2one('vacation.over.line', string='加班记录(销假)')
carry_forward_date = fields.Date(string="结转日期")
# carry_forward_date1 = fields.Date(string="动态结转日期")
carry_forward_quantity = fields.Float(string="结转时长")
carry_forward_quantity1 = fields.Float(
string="动态结转时长",
compute="_compute_carry_forward_leave_total",
store=False,
)
duration1 = fields.Float(string='动态时长')
last_month = fields.Float(string="上期剩余")
this_month = fields.Float(string="本期结余")
is_void = fields.Boolean(string='作废')
@@ -33,43 +26,6 @@ class OvertimeCarryover(models.Model):
leave_id = fields.Many2one('hr.leave.batch', string='请假单')
text = fields.Text(string='备注')
@api.depends('over_line_id.carry_forward_quantity', 'over_line_id.carryover_ids.carry_forward_date',
'carry_forward_date')
def _compute_carry_forward_leave_total(self):
for record in self:
total = 0.0
record.carry_forward_quantity1 = 0.0
main_date = record.carry_forward_date
if not main_date or not record.over_line_id.carryover_ids:
continue
first_day = main_date.replace(day=1)
last_day = fields.Date.end_of(first_day, 'month')
for line in record.over_line_id.carryover_ids:
line_date = line.carry_forward_date
if not line_date:
continue
if first_day <= line_date <= last_day and not line.is_void:
total += line.carry_forward_quantity
if record.over_line_id.is_initial_number:
previous_month_date = first_day - timedelta(days=1)
last_month_first_day = previous_month_date.replace(day=1)
vacation_report = self.env['yuthon.vacation.reports'].search([
('vacation_date', '=', last_month_first_day),
('employee_id', '=', record.employee_id.id)
], limit=1)
if vacation_report:
dynamic_previous_year1 = vacation_report.dynamic_previous_year1 or 0.0
this_year1 = vacation_report.this_year1 or 0.0
sum_year = dynamic_previous_year1 + this_year1
if sum_year * 8 > 40:
prev_year_hours = dynamic_previous_year1 * 8
if prev_year_hours >= sum_year * 8 - 40:
total = sum_year * 8 - 40
else:
total = prev_year_hours
record.carry_forward_quantity1 = total
def open_record(self):
self.ensure_one()
return {
@@ -146,6 +146,7 @@ class VacationOvertimeActive(models.Model):
carryover_id = self.env['overtime.carryover'].search([
('carry_forward_date', '=', self.carry_forward_date),
('employee_id', '=', self.employee_id.id),
('is_void', '!=', False),
('carryover_type', '=', 'fee'),])
if carryover_id:
carryover_id.is_void = True
@@ -177,55 +178,34 @@ class VacationOvertimeActive(models.Model):
def open_record(self):
self.ensure_one()
import datetime
from datetime import timedelta
year = int(self.select_year)
month = int(self.select_month)
first_day_of_month = datetime.date(year, month, 1)
if month == 12:
last_day_of_month = datetime.date(year, 12, 31)
last_day_date = datetime.date(year, 12, 31)
else:
next_month_first = datetime.date(year, month + 1, 1)
last_day_of_month = next_month_first - timedelta(days=1)
last_day_date = next_month_first - datetime.timedelta(days=1)
last_day = last_day_date.strftime("%Y-%m-%d")
# 只显示 fee,不显示 leave
final_domain = [
('over_line_id.vacation_id.employee_id', '=', self.employee_id.id),
('is_void', '=', False),
('carry_forward_date', '>=', first_day_of_month + relativedelta(months=1)),
('carry_forward_date', '<=', last_day_of_month + relativedelta(months=1)),
('carryover_type', '=', 'fee'),
('carry_forward_date', '=', self.carry_forward_date),
]
all_records = self.env['overtime.carryover'].search(final_domain, order='start_time asc')
over_line_dict = {}
for record in all_records:
over_line_id = record.over_line_id.id
qty = record.carry_forward_quantity
if over_line_id not in over_line_dict:
over_line_dict[over_line_id] = record
else:
existing_qty = over_line_dict[over_line_id].carry_forward_quantity
if qty > existing_qty:
over_line_dict[over_line_id] = record
carryover_ids = self.env['overtime.carryover'].concat(*over_line_dict.values())
keep_ids = self.env['overtime.carryover'].browse()
current_remaining = self.vacation_sum
found_40 = False
carryover_ids = self.env['overtime.carryover'].search(final_domain, order='start_time asc')
if carryover_ids:
total_balance = self.vacation_sum
current_remaining = total_balance
for carry in carryover_ids:
new_remaining = round(current_remaining - carry.carry_forward_quantity1, 2)
if found_40:
continue
if new_remaining >= 40:
carry.sudo().write({
'last_month': current_remaining,
'this_month': new_remaining,
})
keep_ids += carry
current_remaining = new_remaining
if new_remaining == 40:
found_40 = True
else:
break
carryover_ids = keep_ids
carry.sudo().write({
'last_month': current_remaining,
'this_month': current_remaining - carry.carry_forward_quantity,
})
current_remaining = carry.this_month
view_id = self.env.ref('yuthon_hr_attendance.view_overtime_carryover_tree1').id
return {
'name': '加班明细',
@@ -233,6 +213,6 @@ class VacationOvertimeActive(models.Model):
'res_model': 'overtime.carryover',
'view_mode': 'tree',
'view_id': view_id,
'domain': [('id', 'in', carryover_ids.ids)],
'domain': final_domain,
'target': 'current',
}
@@ -23,41 +23,12 @@ class YuthonOvertimeLine(models.Model):
workday = fields.Float(string='工作日')
public_holidays = fields.Float(string='公休日')
remainder_year = fields.Float(string='本年剩余')
vacation_sum = fields.Float(string='合计数', compute='_compute_vacation_sum', store=True)
vacation_sum1 = fields.Float(string='合计数') # 动态合计数
vacation_sum = fields.Float(string='合计数') # 动态合计数
carry_forward_quantity = fields.Float(string="已结转")
carry_forward_date = fields.Date(string="结转日期")
archive_state = fields.Selection([('to_do', '待归档'), ('done', '已归档')], default='to_do', string='状态')
remaining_quantity = fields.Float(string="剩余数")
@api.depends('last_balance', 'remainder_year')
def _compute_vacation_sum(self):
for rec in self:
rec.vacation_sum = 0.0
current_year = int(rec.select_year)
current_month = int(rec.select_month)
next_month = current_month + 1 if current_month < 12 else 1
next_year = current_year if current_month < 12 else current_year + 1
cutoff_date_last = date(next_year, next_month, 1) - timedelta(days=1)
cutoff_dt = datetime.combine(cutoff_date_last, datetime.max.time())
dec_2025_end = datetime(2025, 12, 31, 23, 59, 59)
if rec.employee_id.company_id.name == '集团本部':
domain = [
('employee_id', '=', rec.employee_id.id),
('carry_forward_state', '!=', 'completed'),
'|',
('is_initial_number', '=', True),
'&', ('is_initial_number', '=', False),
'&', ('update_type', '=', 'add'),
'&', ('workflow_record_id', '!=', False),
'&', ('start_time', '>=', dec_2025_end),
'&', ('vacation_id', '!=', False),
('start_time', '<', cutoff_dt)
]
over_ids = rec.env['vacation.over.line'].search(domain)
for over_id in over_ids:
rec.vacation_sum += over_id.remaining_quantity
def open_record(self):
self.ensure_one()
current_year = int(self.select_year)
@@ -109,7 +80,7 @@ class YuthonOvertimeLine(models.Model):
@api.model
def carryover_details(self):
domain = [('vacation_sum1', '>', 40.1),
domain = [('vacation_sum', '>', 40.1),
('employee_id.company_id.name', '=', '集团本部'),
]
overtime_lines = self.env['yuthon.overtime.line'].search(domain)
@@ -2020,7 +2020,6 @@ class YuthonVacationReports(models.Model):
'&', ('start_time', '>=', dec_2025_end),
'&', ('vacation_id', '!=', False),
('start_time', '<=', current_date),
('carry_forward_state', '!=', 'completed'),
('employee_id.is_annual_salary', '!=', True)
]
all_records = self.env['vacation.over.line'].search(domain)
@@ -2040,7 +2039,7 @@ class YuthonVacationReports(models.Model):
],
limit=1 # 避免多条记录,只取第一条
)
vacation_sum1 = report_id.dynamic_previous_year1 * 8 + report_id.this_year1 * 8 if report_id else 0.0
vacation_sum = report_id.dynamic_previous_year1 * 8 + report_id.this_year1 * 8 if report_id else 0.0
active_id = self.env['vacation.overtime.active'].search(
[('employee_id', '=', emp_id),
('select_month', '=', str(last_month_first.month)),
@@ -2048,11 +2047,11 @@ class YuthonVacationReports(models.Model):
('select_revoke', '!=', 'done'),
])
if active_id:
vacation_sum1 -= active_id.carry_forward_quantity
vacation_sum -= active_id.carry_forward_quantity
employee_summary[emp_id] = {
'employee_id': emp_id,
'valid_date': line.valid_date,
'vacation_sum1': vacation_sum1,
'vacation_sum': vacation_sum,
'last_balance': report_id.dynamic_previous_year1 * 8 if report_id else 0.0,
'remainder_year': 0.0,
'carry_forward_quantity': 0.0,
@@ -2098,7 +2097,6 @@ class YuthonVacationReports(models.Model):
'&', ('start_time', '>=', dec_2025_end),
'&', ('vacation_id', '!=', False),
('start_time', '<=', current_date),
('carry_forward_state', '!=', 'completed'),
('employee_id.is_annual_salary', '!=', True)
]
all_records = self.env['vacation.over.line'].search(domain)
@@ -2118,7 +2116,7 @@ class YuthonVacationReports(models.Model):
],
limit=1 # 避免多条记录,只取第一条
)
vacation_sum1 = report_id.dynamic_previous_year1 * 8 + report_id.this_year1 * 8 if report_id else 0.0
vacation_sum = report_id.dynamic_previous_year1 * 8 + report_id.this_year1 * 8 if report_id else 0.0
active_id = self.env['vacation.overtime.active'].search(
[('employee_id', '=', emp_id),
('select_month', '=', str(last_month_first.month)),
@@ -2126,11 +2124,11 @@ class YuthonVacationReports(models.Model):
('select_revoke', '!=', 'done'),
])
if active_id:
vacation_sum1 -= active_id.carry_forward_quantity
vacation_sum -= active_id.carry_forward_quantity
employee_summary[emp_id] = {
'employee_id': emp_id,
'valid_date': line.valid_date,
'vacation_sum1': vacation_sum1,
'vacation_sum': vacation_sum,
'last_balance': report_id.dynamic_previous_year1 * 8 if report_id else 0.0,
'remainder_year': 0.0,
'carry_forward_quantity': 0.0,
@@ -2200,7 +2198,7 @@ class YuthonVacationReports(models.Model):
],
limit=1 # 避免多条记录,只取第一条
)
vacation_sum1 = report_id.dynamic_previous_year1 * 8 + report_id.this_year1 * 8 if report_id else 0.0
vacation_sum = report_id.dynamic_previous_year1 * 8 + report_id.this_year1 * 8 if report_id else 0.0
active_id = self.env['vacation.overtime.active'].search(
[('employee_id', '=', emp_id),
('select_month', '=', str(last_month_first.month)),
@@ -2208,11 +2206,11 @@ class YuthonVacationReports(models.Model):
('select_revoke', '!=', 'done'),
])
if active_id:
vacation_sum1 -= active_id.carry_forward_quantity
vacation_sum -= active_id.carry_forward_quantity
employee_summary[emp_id] = {
'employee_id': emp_id,
'valid_date': line.valid_date,
'vacation_sum1':vacation_sum1,
'vacation_sum':vacation_sum,
'last_balance': report_id.dynamic_previous_year1 * 8 if report_id else 0.0,
'remainder_year': 0.0,
'carry_forward_quantity': 0.0,
@@ -2517,10 +2515,10 @@ class VacationOverline(models.Model):
leave_id = fields.Many2one('hr.leave', string='假单')
is_visible = fields.Boolean(string='是否隐藏')
update_type= fields.Selection([('add', '增加'), ('reduce', '减少')], string='更新类型')
workday = fields.Float(string='工作日h', digits=(16, 1))
workday = fields.Float(string='工作日h', digits=(16, 3))
last_balance = fields.Float(string='上年结余', compute='_compute_last_balance', store=True)
legal_day = fields.Float(string='法定节假日h', digits=(16, 1))
public_holidays = fields.Float(string='公休日h', digits=(16, 1))
legal_day = fields.Float(string='法定节假日h', digits=(16, 3))
public_holidays = fields.Float(string='公休日h', digits=(16, 3))
meal_number = fields.Integer(string='误餐次数')
update_date = fields.Date(string='更新时间')
is_void = fields.Boolean(string='是否作废')
@@ -4,7 +4,7 @@
<field name="name">overtime.carryover.tree</field>
<field name="model">overtime.carryover</field>
<field name="arch" type="xml">
<tree string="结转明细" js_class="custom_overtime_export_button">
<tree string="结转明细">
<field name="over_line_id" column_invisible="1"/>
<field name="over_line_id1" column_invisible="1"/>
<field name="leave_id" column_invisible="1"/>
@@ -26,7 +26,7 @@
<field name="name">overtime.carryover.tree1</field>
<field name="model">overtime.carryover</field>
<field name="arch" type="xml">
<tree string="结转明细" default_order="this_month desc" editable="bottom" create="false" delete="false" js_class="custom_overtime_carryover_export_button">
<tree string="结转明细" default_order="this_month desc" editable="bottom" create="false" delete="false" js_class="custom_overtime_export_button">
<field name="over_line_id" column_invisible="1"/>
<field name="over_line_id1" column_invisible="1"/>
<field name="leave_id" column_invisible="1"/>
@@ -34,11 +34,10 @@
<field name="department_id"/>
<field name="start_time"/>
<field name="end_time"/>
<field name="duration" column_invisible="1"/>
<field name="carry_forward_date"/>
<field name="duration"/>
<field name="carry_forward_date"/>
<field name="last_month"/>
<field name="carry_forward_quantity1" sum = "Total"/>
<field name="carry_forward_quantity" sum = "Total" column_invisible="1"/>
<field name="carry_forward_quantity" sum = "Total" />
<field name="this_month"/>
<field name="carry_result"/>
<field name="carryover_type" column_invisible="1"/>
@@ -14,8 +14,7 @@
<field name="last_balance" column_invisible="1"/>
<field name="valid_date" column_invisible="1"/>
<field name="remainder_year" column_invisible="1"/>
<field name="vacation_sum" options='{ "fg_color": "red: vacation_sum > 40"}' column_invisible="1"/>
<field name="vacation_sum1" options='{ "fg_color": "red: vacation_sum1 > 40"}'/>
<field name="vacation_sum" options='{ "fg_color": "red: vacation_sum > 40"}'/>
<field name="carry_forward_quantity" column_invisible="1"/>
<field name="carry_forward_date" column_invisible="1"/>
<field name="remaining_quantity" column_invisible="1"/>
@@ -35,8 +34,7 @@
<field name="last_balance"/>
<field name="valid_date"/>
<field name="remainder_year"/>
<field name="vacation_sum" options='{ "fg_color": "red: vacation_sum > 40"}' column_invisible="1"/>
<field name="vacation_sum1" options='{ "fg_color": "red: vacation_sum1 > 40"}'/>
<field name="vacation_sum" options='{ "fg_color": "red: vacation_sum > 40"}'/>
<field name="carry_forward_quantity" column_invisible="1"/>
<field name="carry_forward_date" column_invisible="1"/>
<field name="remaining_quantity" column_invisible="1"/>
@@ -34,11 +34,10 @@ class VacationOvertimeActiveWizard(models.TransientModel):
'select_year': overtime_id.select_year,
'last_balance': overtime_id.last_balance,
'valid_date': overtime_id.valid_date,
'vacation_sum': round(overtime_id.vacation_sum1, 2),
'carry_forward_quantity': round(overtime_id.vacation_sum1, 2) - 40,
'vacation_sum': round(overtime_id.vacation_sum, 2),
'carry_forward_quantity': round(overtime_id.vacation_sum, 2) - 40,
'carry_forward_date': self.filing_date,
})
overtime_id._compute_vacation_sum()
remaining_to_allocate = round(overtime_id.vacation_sum, 2) - 40
current_year = int(overtime_id.select_year)
current_month = int(overtime_id.select_month)
@@ -76,7 +75,7 @@ class VacationOvertimeActiveWizard(models.TransientModel):
('overtime_methods', '=', 'fee'),
], limit=1)
if not existing_over_line:
workday_value = round(overtime_id.vacation_sum1, 2) - 40
workday_value = round(overtime_id.vacation_sum, 2) - 40
self.env['vacation.over.line'].create({
'vacation_id': report_id.id,
'employee_id': overtime_id.employee_id.id,