Files
gzth/yuthon_salary/wizard/basic_pension_wizard.py
2025-07-31 15:53:25 +08:00

91 lines
4.7 KiB
Python

# -*- 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 BasicPensionWizard(models.Model):
_name = 'basic.pension.wizard'
_description = '缴纳基数弹窗'
excel_file = fields.Binary(string="上传Excel表")
excel_name = fields.Char(string="文件名")
company_id = fields.Many2one('res.company', string="公司", default=lambda self: self.env.company)
select_year = fields.Selection(selection=[(str(i), str(i)) for i in range(2024, 2060)], string='年份',
default=lambda self: str(datetime.now().year))
select_time = fields.Selection([('1', '一月'), ('2', '二月'), ('3', '三月'), ('4', '四月'),
('5', '五月'), ('6', '六月'), ('7', '七月'), ('8', '八月'),
('9', '九月'), ('10', '十月'), ('11', '十一月'),
('12', '十二月')], string='月份',
default=lambda self: self._get_default_month())
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(8, sh.nrows):
row = sh.row(rx)
self.basic_pension_data(row)
def basic_pension_data(self, row):
basic_pension_base = row[7].value
basic_pension_payable = row[8].value
one_basic_pension_base = row[9].value
one_basic_pension_payable = row[10].value
employment_insurance = row[11].value
employment_insurance_payable = row[12].value
one_employment_insurance = row[13].value
one_employment_insurance_payable = row[14].value
medical_insurance_base = row[15].value
medical_insurance_payable = row[16].value
one_medical_insurance_base = row[17].value
one_medical_insurance_payable = row[18].value
injury_insurance = row[19].value
injury_insurance_payable = row[20].value
total_unit_part = row[21].value
total_personal_part = row[22].value
total_payable = row[23].value
year = int(self.select_year)
month = int(self.select_time)
payslip_run_name = f"{year}年-{self._get_chinese_month(month)}"
payslip_run_id = self.env['hr.payslip.run'].search(
[('name', '=', payslip_run_name), ('company_id', '=', self.company_id.id)], limit=1)
existing_payslip = self.env['hr.payslip'].search([
('employee_id.name', '=', row[1].value),
('payslip_run_id', '=', payslip_run_id.id),
], limit=1)
if existing_payslip:
existing_payslip.write({
'basic_pension_base': float(basic_pension_base),
'basic_pension_payable': float(basic_pension_payable),
'one_basic_pension_base': float(one_basic_pension_base),
'one_basic_pension_payable': float(one_basic_pension_payable),
'employment_insurance': float(employment_insurance),
'employment_insurance_payable': float(employment_insurance_payable),
'one_employment_insurance': float(one_employment_insurance),
'one_employment_insurance_payable': float(one_employment_insurance_payable),
'medical_insurance_base': float(medical_insurance_base),
'medical_insurance_payable': float(medical_insurance_payable),
'one_medical_insurance_base': float(one_medical_insurance_base),
'one_medical_insurance_payable': float(one_medical_insurance_payable),
'injury_insurance': float(injury_insurance),
'injury_insurance_payable': float(injury_insurance_payable),
'total_unit_part': float(total_unit_part),
'total_personal_part': float(total_personal_part),
'total_payable': float(total_payable),
})
existing_payslip.three_one = (existing_payslip.one_basic_pension_payable + existing_payslip.one_employment_insurance_payable + existing_payslip.one_medical_insurance_payable + existing_payslip.social_security + existing_payslip.housing_provident_fund)
def _get_default_month(self):
current_month = datetime.now().month
return str(current_month)
def _get_chinese_month(self, month):
chinese_months = ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月']
return chinese_months[month - 1]