# -*- coding: utf-8 -*- from odoo import models, fields, api, _, SUPERUSER_ID from odoo.exceptions import ValidationError, UserError import xlrd import base64 import datetime from datetime import datetime import pandas as pd class YuthonContractWizard(models.Model): _name = 'yuthon.contract.wizard' excel_file = fields.Binary(string="上传Excel表") excel_name = fields.Char(string="文件名") def confirm(self): """ 导入excel文件,按行读取数据并处理 :return: 导入员工信息表并更新 """ 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(4, sh.nrows): row = sh.row(rx) self.employee_contract_data(row) def employee_contract_data(self,row): employee_id = self.env['hr.employee'].search([('name', '=', row[10].value)]) contract_id = self.env['hr.contract'].search([('employee_id', '=', employee_id.id)]) structure_type_id = self.env['hr.payroll.structure.type'].search([('name', '=', row[14].value), ('company_id', '=', employee_id.company_id.id)]) contract_type_id = self.env['hr.contract.type'].search([('name', '=', row[12].value)]) salary_group_id = self.env['yuthon.salary.group'].search([('name', '=', row[15].value)]) wage_id = self.env['hr.salary.rule'].search([('struct_id.name', '=', structure_type_id.name), ('struct_id.company_id', '=', employee_id.company_id.id), ('name', '=', '基本工资')], limit=1) job_id = self.env['hr.job'].search([('name', '=', row[13].value), ('company_id', '=', employee_id.company_id.id)],limit=1) department_id = self.env['hr.department'].search([('name', '=', row[11].value), ('company_id', '=', employee_id.company_id.id)],limit=1) wage = wage_id.amount_fix if not salary_group_id: salary_group_id = self.env['yuthon.salary.group'].create({ 'name': row[15].value, }) resource_calendar_id = self.env['resource.calendar'].search([('name', '=', '行政考勤')]) party_id = self.env['yuthon.party.setting'].search([('party', '=', row[2].value)]) effective_date = datetime.now().date() if row[8].value: if type(row[8].value)== float: effective_date = pd.to_datetime(row[8].value, unit='d', origin='1899-12-30') effective_date = effective_date.date() else: effective_date = datetime.strptime(row[8].value, '%Y-%m-%d') if row[9].value: if type(row[9].value)== float: expiration_date = pd.to_datetime(row[9].value, unit='d', origin='1899-12-30') expiration_date = expiration_date.date() else: expiration_date = datetime.strptime(row[9].value, '%Y-%m-%d') else: expiration_date = None if party_id: party_id.write({ 'representatives': row[3].value, 'address': row[4].value, 'economy_type': row[5].value, 'contact': row[6].value, 'phone': row[7].value, }) if contract_id and employee_id.name != '肖琼': contract_id.sudo().write({ 'party_id': party_id.id, 'job_id':job_id.id, 'department_id':department_id.id, # 'resource_calendar_id':resource_calendar_id.id, 'salary_group_id': salary_group_id.id, 'structure_type_id':structure_type_id.id, 'contract_type_id':contract_type_id.id, 'wage':wage, 'date_start':effective_date, 'date_end':expiration_date })