# -*- 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]