From 04cf92464cd196cdf852aa2218fff0a907bbf0b4 Mon Sep 17 00:00:00 2001 From: zhou <123@> Date: Fri, 16 May 2025 15:13:09 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- yuthon_salary/models/yuthon_salary_year.py | 31 +++++++++++++++++----- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/yuthon_salary/models/yuthon_salary_year.py b/yuthon_salary/models/yuthon_salary_year.py index fc031bb29..c8a9bc03e 100644 --- a/yuthon_salary/models/yuthon_salary_year.py +++ b/yuthon_salary/models/yuthon_salary_year.py @@ -1,4 +1,5 @@ from odoo import api, fields, models +from decimal import ROUND_HALF_UP, Decimal class YuthonSalaryYear(models.Model): @@ -49,25 +50,41 @@ class YuthonSalaryYear(models.Model): '天河粮储': ['performance_salary'] } + TWOPLACES = Decimal('0.01') for record in self: company_name = record.company_id.name - sum_value = 0.0 + sum_value = Decimal('0.00') # 使用 Decimal 类型 fields_to_sum = company_rules.get(company_name, []) for field_name in fields_to_sum: - sum_value += getattr(record, field_name, 0.0) - record.sum_salary = sum_value + # 获取字段值并转换为 Decimal + field_value = getattr(record, field_name, 0.0) + if not field_value: + field_value = 0.0 + # 转换为 Decimal 并舍入到两位小数 + decimal_value = Decimal(str(field_value)).quantize(TWOPLACES, rounding=ROUND_HALF_UP) + sum_value += decimal_value + # 将结果转换为浮点数并赋值 + record.sum_salary = float(sum_value) @api.depends('sum_salary') def _compute_buckle_salary(self): + TWOPLACES = Decimal('0.01') for record in self: + # 将 sum_salary 转换为 Decimal 并舍入到两位小数 + sum_salary = Decimal(str(record.sum_salary)).quantize(TWOPLACES, rounding=ROUND_HALF_UP) rule = self.env['yuthon.personal.rule'].search([ - ('start_number', '<', record.sum_salary), - ('end_number', '>=', record.sum_salary), + ('start_number', '<', float(sum_salary)), # 转回浮点数用于查询 + ('end_number', '>=', float(sum_salary)), # 转回浮点数用于查询 ], limit=1) if rule: - record.buckle_salary = record.sum_salary * rule.tax_rate - rule.compute_number + tax_rate = Decimal(str(rule.tax_rate)) + compute_number = Decimal(str(rule.compute_number)) + # 精确计算扣税金额 + buckle_salary = (sum_salary * tax_rate - compute_number).quantize(TWOPLACES, rounding=ROUND_HALF_UP) + # 转回浮点数赋值 + record.buckle_salary = float(buckle_salary) else: - record.buckle_salary = 0 + record.buckle_salary = 0.0 @api.depends('sum_salary', 'buckle_salary') def _compute_solid_salary(self):