Merge pull request !5213 from 李鹏宇/dev
This commit is contained in:
李鹏宇
2025-09-18 06:35:04 +00:00
committed by Gitee
2 changed files with 84 additions and 66 deletions
@@ -328,9 +328,12 @@ class PropertyReconciliationWizard(models.Model):
'user': information.name,
'name': rec.bank_id.name,
})
remaining_amount = 0
for line in rec.reconciliation_line_ids:
remaining_amount += line.amount
if rec.actual_total > rec.receivable_total:
rec.bank_id.registered = rec.actual_total - rec.receivable_total
if rec.actual_total > rec.remaining_amount:
rec.bank_id.registered = rec.actual_total - rec.remaining_amount
rec.bank_id.bank_state = 'registered'
else:
rec.bank_id.registered = 0
+79 -64
View File
@@ -1,4 +1,6 @@
# -*- coding: utf-8 -*-
from dateutil.relativedelta import relativedelta
from odoo import models, fields, api, _, SUPERUSER_ID
from odoo.exceptions import ValidationError, UserError
from odoo.exceptions import ValidationError
@@ -37,7 +39,7 @@ class SalaryComputeWizard(models.Model):
# 计算当月第一天和最后一天
first_day = datetime(year, month, 1).strftime('%Y-%m-%d')
last_day = datetime(year, month, calendar.monthrange(year, month)[1]).strftime('%Y-%m-%d')
last_day = datetime(year, month, 15).strftime('%Y-%m-%d')
if self.company_id:
employees = self.env['hr.employee'].search([
@@ -57,8 +59,8 @@ class SalaryComputeWizard(models.Model):
])
self.employee_ids = [(6, 0, employees.ids)]
self.employee_number = len(employees)
# for employee in employees:
# print(f"员工姓名: {employee.name}")
for employee in employees:
print(f"员工姓名: {employee.name}")
@api.onchange('employee_ids')
def onchange_employee_ids(self):
@@ -97,7 +99,7 @@ class SalaryComputeWizard(models.Model):
'state': 'draft',
'payslip_count': 0
})
query_date = datetime(year, month, 1).date()
query_date = datetime(year, month, 1).date() - relativedelta(months=1)
vacation_report = self.env['yuthon.vacation.reports'].search([
('employee_id', '=', employee.id),
('vacation_date', '=', query_date)
@@ -202,7 +204,7 @@ class SalaryComputeWizard(models.Model):
original_end_date = internship_id.date_to
if is_turnover or is_probation:
days = 21.75 # 总工作日
days = 21 # 总工作日
if is_turnover:
# 离职日期前的工作日
@@ -222,86 +224,99 @@ class SalaryComputeWizard(models.Model):
internship_start = max(original_start_date, contract_start_date)
internship_end = min(original_end_date, contract_end_date)
# 判断该员工是否需补发上月工资
if contract_start_date.year == internship_start.year and contract_start_date.month == (internship_start - relativedelta(months=1)).month and contract_start_date.day > 15:
last_internship_days = self._process_shift_days(contract_start_date, internship_start - relativedelta(days=1))
else:
last_internship_days = 0
if internship_start <= internship_end:
# 判断是否整月都是实习期(无转正后工作日)
if contract_end_date >= original_end_date:
# 整月都是实习期,实习和转正工作日均为21.75
internship_days = 21.75
work_days = 21.75
# 整月都是实习期,实习和转正工作日均为21.75 # todo 21.75 待定
internship_days = 21
work_days = 21
else:
# 部分时间是实习期,计算实际工作日
internship_days = self._process_shift_days(internship_start, internship_end)
work_days = 21.75 - internship_days
work_days = 21 - internship_days
if internship_id.line_ids:
if is_probation and not internship_id.employee_id.is_annual_salary:
target_names = {
'基本工资': 'base_salary',
'职级工资': 'rank_salary',
'基本工资': 'base_salary', # 0.8
'职级工资': 'rank_salary', # 0.8
'岗位工资': 'position_salary',
'预发绩效奖金': 'performance_bonuses',
'全勤奖': 'full_attendance_award',
'预发绩效奖金': 'performance_bonuses', # 0.8
'通讯补贴': 'commuting_allowance',
'工龄工资': 'seniority_salary',
'工会会费': 'union_dues',
'住房公积金': 'housing_provident_fund',
'企业(职业)年金': 'b_year', # 企业年金
}
# 定义比例常量,便于统一维护
RATIO_80 = 0.8
for line in internship_id.line_ids:
if line.name in target_names:
field_name = target_names[line.name]
# 初始化result为默认值,避免未赋值的情况
result = 0
if line.name not in target_names:
continue
field_name = target_names[line.name]
result = 0.0 # 初始化浮点型结果
if field_name == 'performance_bonuses':
if work_days != days:
result = round(line.total * work_days / days)
else:
result = 0
elif field_name in ['commuting_allowance', 'seniority_salary']:
if work_days != days:
result = line.total * internship_days / days + line.total * work_days / days
else:
result = line.total * internship_days / days
elif field_name in ['rank_salary', 'base_salary']:
if work_days != days:
result = round(math.ceil(
line.total * 0.8) * internship_days / days + line.total * work_days / days)
else:
result = line.total * 0.8 * internship_days / days
elif field_name == 'union_dues': # 单独处理工会会费
base_salary = getattr(internship_id, 'base_salary', 0)
result = base_salary * 0.005
elif field_name == 'housing_provident_fund': # 单独处理住房公积金
# 获取合同入职日期的年份和月份
contract_year = str(contract_start_date.year)
contract_month = str(contract_start_date.month)
# 判断是否为入职当月
if contract_year == self.select_year and contract_month == self.select_time:
result = 0 # 入职当月住房公积金为0
# 新增:非入职当月时的默认值(根据业务需求调整)
else:
result = abs(line.total)*-1 # 或其他合理默认值
elif field_name == 'b_year':
# 获取合同转正日期的年份和月份
if contract_end_date: # 确保转正日期存在
contract_end_year = str(contract_end_date.year)
contract_end_month = str(contract_end_date.month)
# 判断是否为转正当月
if contract_end_year == self.select_year and contract_end_month == self.select_time:
last_year_salary = internship_id.employee_id.last_year_salary or 0
result = last_year_salary * 0.002
else:
result = 0 # 非转正当月默认值
else:
result = 0 # 无转正日期时的默认值
# 计算80%比例的基础值(提前处理ceil逻辑)向上取整
base_80 = math.ceil(line.total * RATIO_80) if field_name in ['rank_salary', 'base_salary', 'performance_bonuses'] else (line.total * RATIO_80)
if field_name == 'performance_bonuses':
if work_days == days:
result = (base_80 * work_days + line.total * last_internship_days * RATIO_80) / days
elif field_name == 'full_attendance_award':
result = line.total * last_internship_days / days
elif field_name in ['commuting_allowance', 'seniority_salary']:
if work_days != days:
result = (line.total * internship_days + line.total * work_days + line.total * last_internship_days * RATIO_80) / days
else:
if work_days != days:
result = line.total * 0.8 * internship_days / days + line.total * work_days / days
else:
result = line.total * 0.8 * internship_days / days
result = line.total * (internship_days + last_internship_days) / days
elif field_name in ['rank_salary', 'base_salary']:
if work_days != days:
result = ( base_80 * internship_days + base_80 * work_days + line.total * last_internship_days * RATIO_80) / days
else:
result = base_80 * (internship_days + last_internship_days) / days
setattr(internship_id, field_name, result)
line.write({'total': result})
result = round(result, 2)
elif field_name == 'union_dues': # 单独处理工会会费
base_salary = getattr(internship_id, 'base_salary', 0)
result = base_salary * 0.005
elif field_name == 'housing_provident_fund': # 单独处理住房公积金
# 获取合同入职日期的年份和月份
contract_year = str(contract_start_date.year)
contract_month = str(contract_start_date.month)
# 判断是否为入职当月
if contract_year == self.select_year and contract_month == self.select_time:
result = 0 # 入职当月住房公积金为0
# 新增:非入职当月时的默认值(根据业务需求调整)
else:
result = abs(line.total)*-1 # 或其他合理默认值
elif field_name == 'b_year':
# 获取合同转正日期的年份和月份
if contract_end_date: # 确保转正日期存在
contract_end_year = str(contract_end_date.year)
contract_end_month = str(contract_end_date.month)
# 判断是否为转正当月
if contract_end_year == self.select_year and contract_end_month == self.select_time:
last_year_salary = internship_id.employee_id.last_year_salary or 0
result = last_year_salary * 0.002
else:
result = 0 # 非转正当月默认值
else:
result = 0 # 无转正日期时的默认值
else:
if work_days != days:
result = line.total * 0.8 * internship_days / days + line.total * work_days / days
else:
result = line.total * 0.8 * internship_days / days
setattr(internship_id, field_name, result)
line.write({'total': result})
if is_turnover:
target_names = {