From be4eac78f41b4e71da8efe4298046da4fc0a3cb8 Mon Sep 17 00:00:00 2001 From: zhou <123@> Date: Sun, 11 May 2025 22:07:19 +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 --- .../views/inherit_hr_contract_views.xml | 1 - yuthon_salary/__manifest__.py | 3 + yuthon_salary/models/yuthon_salary_year.py | 50 ++++++++- yuthon_salary/security/ir.model.access.csv | 3 +- .../static/others/salary_year_thlc.xlsx | Bin 0 -> 9369 bytes .../static/others/salary_year_thtz.xlsx | Bin 0 -> 9409 bytes .../static/others/salary_year_thwg.xlsx | Bin 0 -> 9499 bytes .../static/src/js/salary_year_button.js | 29 +++++ .../static/src/xml/salary_year_button.xml | 10 ++ .../views/yuthon_salary_year_views.xml | 4 +- yuthon_salary/wizard/__init__.py | 3 +- yuthon_salary/wizard/salary_year_wizard.py | 103 ++++++++++++++++++ yuthon_salary/wizard/salary_year_wizard.xml | 54 +++++++++ 13 files changed, 250 insertions(+), 10 deletions(-) create mode 100644 yuthon_salary/static/others/salary_year_thlc.xlsx create mode 100644 yuthon_salary/static/others/salary_year_thtz.xlsx create mode 100644 yuthon_salary/static/others/salary_year_thwg.xlsx create mode 100644 yuthon_salary/static/src/js/salary_year_button.js create mode 100644 yuthon_salary/static/src/xml/salary_year_button.xml create mode 100644 yuthon_salary/wizard/salary_year_wizard.py create mode 100644 yuthon_salary/wizard/salary_year_wizard.xml diff --git a/yuthon_contract/views/inherit_hr_contract_views.xml b/yuthon_contract/views/inherit_hr_contract_views.xml index 25830db43..08637cbd3 100644 --- a/yuthon_contract/views/inherit_hr_contract_views.xml +++ b/yuthon_contract/views/inherit_hr_contract_views.xml @@ -10,7 +10,6 @@ - 1 diff --git a/yuthon_salary/__manifest__.py b/yuthon_salary/__manifest__.py index bf992e3c9..577da7d14 100644 --- a/yuthon_salary/__manifest__.py +++ b/yuthon_salary/__manifest__.py @@ -29,6 +29,7 @@ 'wizard/yuthon_payroll_wizard_views.xml', 'wizard/payroll_labor_wizard_views.xml', 'wizard/payroll_retired_wizard_views.xml', + 'wizard/salary_year_wizard.xml', 'wizard/salary_compute_wizard_views.xml', 'wizard/salary_payslip_wizard_views.xml', 'wizard/select_delete_wizard_viwes.xml', @@ -45,6 +46,7 @@ 'yuthon_salary/static/src/js/salary_return_button.js', 'yuthon_salary/static/src/js/salary_retired_button.js', 'yuthon_salary/static/src/js/salary_validation_button.js', + 'yuthon_salary/static/src/js/salary_year_button.js', 'yuthon_salary/static/src/xml/salary_create_button.xml', 'yuthon_salary/static/src/xml/salary_labor_button.xml', 'yuthon_salary/static/src/xml/salary_retired_button.xml', @@ -52,6 +54,7 @@ 'yuthon_salary/static/src/xml/salary_documents_button.xml', 'yuthon_salary/static/src/xml/salary_validation_button.xml', 'yuthon_salary/static/src/xml/salary_return_button.xml', + 'yuthon_salary/static/src/xml/salary_year_button.xml', ], }, 'installable': True, diff --git a/yuthon_salary/models/yuthon_salary_year.py b/yuthon_salary/models/yuthon_salary_year.py index c8b3549f5..d94e2947c 100644 --- a/yuthon_salary/models/yuthon_salary_year.py +++ b/yuthon_salary/models/yuthon_salary_year.py @@ -22,13 +22,56 @@ class YuthonSalaryYear(models.Model): # 粮储 performance_salary = fields.Float(string="绩效奖金") # 综合 - sum_salary = fields.Float(string="应发合计") - buckle_salary = fields.Float(string="扣个税") - solid_salary = fields.Float(string="实发年终奖") + sum_salary = fields.Float("应发合计", compute='_compute_company_specific_sum', store=True) + buckle_salary = fields.Float(string="扣个税", compute='_compute_buckle_salary', store=True) + solid_salary = fields.Float(string="实发年终奖", compute='_compute_solid_salary', store=True) create_date = fields.Date(string="创建日期") company_id = fields.Many2one('res.company', related="employee_id.company_id", string="公司") personal_tax = fields.Many2one('yuthon.personal.rule', string="个人所得税规则") + # 计算字段 + @api.depends('company_id', 'on_year_balance', 'former_year_balance', 'on_year_liquidation', + 'former_year_liquidation', 'one_three_salary', 'job_salary', 'test_salary', + 'software_salary', 'safe_salary', 'outstanding_salary', 'leadership_salary', + 'performance_salary') + def _compute_company_specific_sum(self): + # 定义各公司的计算字段映射 + company_rules = { + '集团本部': [ + 'on_year_balance', 'former_year_balance', + 'on_year_liquidation', 'former_year_liquidation' + ], + '天河物管': [ + 'one_three_salary', 'job_salary', 'test_salary', + 'software_salary', 'safe_salary', 'outstanding_salary', + 'leadership_salary' + ], + '天河粮储': ['performance_salary'] + } + for record in self: + company_name = record.company_id.name + sum_value = 0.0 + 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 + + @api.depends('sum_salary') + def _compute_buckle_salary(self): + for record in self: + rule = self.env['yuthon.personal.rule'].search([ + ('start_number', '<', record.sum_salary), + ('end_number', '>', record.sum_salary), + ], limit=1) + if rule: + record.buckle_salary = record.sum_salary * rule.tax_rate + else: + record.buckle_salary = 0 + + @api.depends('sum_salary', 'buckle_salary') + def _compute_solid_salary(self): + for record in self: + record.solid_salary = record.sum_salary - record.buckle_salary class YuthonPersonalRule(models.Model): @@ -39,6 +82,5 @@ class YuthonPersonalRule(models.Model): end_number = fields.Float(string="结束范围") tax_rate = fields.Float(string="税率") compute_number = fields.Float(string="速算扣除数") - company_id = fields.Many2one('res.company', string="公司") start_date = fields.Date(string="生效日期") end_date = fields.Date(string="失效日期") \ No newline at end of file diff --git a/yuthon_salary/security/ir.model.access.csv b/yuthon_salary/security/ir.model.access.csv index 87a9771db..93281ce7c 100644 --- a/yuthon_salary/security/ir.model.access.csv +++ b/yuthon_salary/security/ir.model.access.csv @@ -24,4 +24,5 @@ access_yuthon_payroll_retired,access_yuthon_payroll_retired,model_yuthon_payroll access_payroll_labor_wizard,access_payroll_labor_wizard,model_payroll_labor_wizard,base.group_user,1,1,1,1 access_payroll_retired_wizard,access_payroll_retired_wizard,model_payroll_retired_wizard,base.group_user,1,1,1,1 access_yuthon_salary_documents,access_yuthon_salary_documents,model_yuthon_salary_documents,base.group_user,1,1,1,1 -access_salary_print_wizard, access_salary_print_wizard,model_salary_print_wizard,base.group_user,1,1,1,1 \ No newline at end of file +access_salary_print_wizard, access_salary_print_wizard,model_salary_print_wizard,base.group_user,1,1,1,1 +access_salary_year_wizard,access_salary_year_wizard,model_salary_year_wizard,base.group_user,1,1,1,1 \ No newline at end of file diff --git a/yuthon_salary/static/others/salary_year_thlc.xlsx b/yuthon_salary/static/others/salary_year_thlc.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..178258ee0ea81963d6f0063489142b0d42f9b02d GIT binary patch literal 9369 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 literal 0 HcmV?d00001 diff --git a/yuthon_salary/static/others/salary_year_thtz.xlsx b/yuthon_salary/static/others/salary_year_thtz.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..7ffcd0f49f60c048fdb8036f818873505d3a1bcb GIT binary patch literal 9409 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 U1N(EbVt{YOz=P%TNT2ln5BQ8SlK=n! literal 0 HcmV?d00001 diff --git a/yuthon_salary/static/others/salary_year_thwg.xlsx b/yuthon_salary/static/others/salary_year_thwg.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..244a5a861b5b4b08a26c2e2515891dd296dc822a GIT binary patch literal 9499 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 F{|7Q + + + + + + + diff --git a/yuthon_salary/views/yuthon_salary_year_views.xml b/yuthon_salary/views/yuthon_salary_year_views.xml index 8baf1e3fa..7f67d3e0e 100644 --- a/yuthon_salary/views/yuthon_salary_year_views.xml +++ b/yuthon_salary/views/yuthon_salary_year_views.xml @@ -4,7 +4,7 @@ yuthon.salary.year.tree yuthon.salary.year - + @@ -21,7 +21,6 @@ - @@ -47,7 +46,6 @@ - diff --git a/yuthon_salary/wizard/__init__.py b/yuthon_salary/wizard/__init__.py index 54bf093a8..6c7de40ca 100644 --- a/yuthon_salary/wizard/__init__.py +++ b/yuthon_salary/wizard/__init__.py @@ -7,4 +7,5 @@ from . import put_return_wizard from . import temporary_payslip_wizard from . import payroll_labor_wizard from . import payroll_retired_wizard -from . import salary_print_wizard \ No newline at end of file +from . import salary_print_wizard +from . import salary_year_wizard \ No newline at end of file diff --git a/yuthon_salary/wizard/salary_year_wizard.py b/yuthon_salary/wizard/salary_year_wizard.py new file mode 100644 index 000000000..07b06c3e3 --- /dev/null +++ b/yuthon_salary/wizard/salary_year_wizard.py @@ -0,0 +1,103 @@ +# -*- coding: utf-8 -*- +from odoo import models, fields, api, _, SUPERUSER_ID +from odoo.exceptions import ValidationError, UserError +from pypinyin import pinyin, Style +import xlrd +import base64 +import datetime +from datetime import datetime + + +class SalaryYearWizard(models.Model): + _name = 'salary.year.wizard' + _description = '年终奖导入弹窗' + + company_id = fields.Many2one('res.company', string='公司', default=lambda self: self.env.company, store=True) + company_name = fields.Char(string='公司名称', related='company_id.name', store=True) + + excel_file = fields.Binary(string="上传Excel表") + excel_name = fields.Char(string="文件名") + + def confirm(self): + if not self.excel_file: + raise ValidationError('请上传文件。') + book = xlrd.open_workbook(file_contents=base64.decodebytes(self.excel_file)) + sh = book.sheet_by_index(0) + for rx in range(1, sh.nrows): + row = sh.row(rx) + if self.company_id.name == '集团本部': + self.salary_year_ttjt_data(row) + elif self.company_id.name == '天河物管': + self.salary_year_thwg_data(row) + else: + self.salary_year_thlc_data(row) + + + def salary_year_ttjt_data(self,row): + employee_id = self.env['hr.employee'].search([('name', '=', row[0].value)], limit=1) + on_year_balance = row[1].value + former_year_balance = row[2].value + on_year_liquidation = row[3].value + former_year_liquidation = row[4].value + salary_year_id = self.env["yuthon.salary.year"].search([('employee_id', '=', employee_id.id)]) + if salary_year_id: + salary_year_id.write({ + 'on_year_balance': on_year_balance, + 'former_year_balance': former_year_balance, + 'on_year_liquidation': on_year_liquidation, + 'former_year_liquidation': former_year_liquidation, + }) + else: + self.env["yuthon.salary.year"].create({ + 'employee_id': employee_id.id, + 'on_year_balance': on_year_balance, + 'former_year_balance': former_year_balance, + 'on_year_liquidation': on_year_liquidation, + 'former_year_liquidation': former_year_liquidation, + }) + + def salary_year_thwg_data(self, row): + employee_id = self.env['hr.employee'].search([('name', '=', row[0].value)], limit=1) + one_three_salary = row[1].value + job_salary = row[2].value + test_salary = row[3].value + software_salary = row[4].value + safe_salary = row[5].value + outstanding_salary = row[6].value + leadership_salary = row[7].value + salary_year_id = self.env["yuthon.salary.year"].search([('employee_id', '=', employee_id.id)]) + if not salary_year_id: + self.env["yuthon.salary.year"].create({ + 'employee_id': employee_id.id, + 'one_three_salary': one_three_salary, + 'job_salary': job_salary, + 'test_salary': test_salary, + 'software_salary': software_salary, + 'safe_salary': safe_salary, + 'outstanding_salary': outstanding_salary, + 'leadership_salary': leadership_salary, + }) + else: + salary_year_id.write({ + 'one_three_salary': one_three_salary, + 'job_salary': job_salary, + 'test_salary': test_salary, + 'software_salary': software_salary, + 'safe_salary': safe_salary, + 'outstanding_salary': outstanding_salary, + 'leadership_salary': leadership_salary, + }) + + def salary_year_thlc_data(self, row): + employee_id = self.env['hr.employee'].search([('name', '=', row[0].value)], limit=1) + performance_salary = row[1].value + salary_year_id = self.env["yuthon.salary.year"].search([('employee_id', '=', employee_id.id)]) + if not salary_year_id: + salary_year_id = self.env["yuthon.salary.year"].create({ + 'employee_id': employee_id.id, + 'performance_salary': performance_salary, + }) + else: + salary_year_id.write({ + 'performance_salary': performance_salary, + }) \ No newline at end of file diff --git a/yuthon_salary/wizard/salary_year_wizard.xml b/yuthon_salary/wizard/salary_year_wizard.xml new file mode 100644 index 000000000..784fdf904 --- /dev/null +++ b/yuthon_salary/wizard/salary_year_wizard.xml @@ -0,0 +1,54 @@ + + + + + 天河投资模板下载 + self + /yuthon_salary/static/others/salary_year_thtz.xlsx + + + + 天河物管模板下载 + self + /yuthon_salary/static/others/salary_year_thwg.xlsx + + + + 天河粮储模板下载 + self + /yuthon_salary/static/others/salary_year_thlc.xlsx + + + + 弹窗 + salary.year.wizard + +
+ +
+
+ + + + + + + + + + +
+ +
+
+
+
\ No newline at end of file