91 lines
4.7 KiB
Python
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] |