74 lines
2.8 KiB
Python
74 lines
2.8 KiB
Python
from odoo import models, fields, api, _, SUPERUSER_ID
|
|
from odoo.exceptions import ValidationError, UserError
|
|
import re
|
|
import xlrd
|
|
import base64
|
|
import datetime
|
|
from datetime import datetime, timedelta
|
|
import pandas as pd
|
|
|
|
|
|
class YuthonLeaveWizard(models.Model):
|
|
_name = 'yuthon.leave.wizard'
|
|
_description = '请假单导入'
|
|
|
|
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(1, sh.nrows):
|
|
row = sh.row(rx)
|
|
self.leave_import(row)
|
|
|
|
def leave_import(self, row):
|
|
employee_id = self.env['hr.employee'].search([('name', '=', row[4].value)], limit=1)
|
|
holiday_status_id = self.env['hr.leave.type'].search([('name', '=', row[2].value)])
|
|
base_date = datetime(1900, 1, 1)
|
|
if type(row[5].value) == float:
|
|
dt_from = base_date + timedelta(days=row[5].value - 2) if row[5].value > 0 else base_date
|
|
dt_to = base_date + timedelta(days=row[6].value - 2) if row[6].value > 0 else base_date
|
|
else:
|
|
dt_from = datetime.strptime(row[5].value, '%Y-%m-%d %H:%M')
|
|
dt_to = datetime.strptime(row[6].value, '%Y-%m-%d %H:%M')
|
|
|
|
def get_key_from_datetime(dt):
|
|
hour = dt.hour
|
|
minute = dt.minute
|
|
if minute == 0:
|
|
key = str(hour)
|
|
elif minute == 30:
|
|
key = str(hour + 0.5)
|
|
else:
|
|
return None
|
|
return key
|
|
key_from = get_key_from_datetime(dt_from)
|
|
key_to = get_key_from_datetime(dt_to)
|
|
hr_leave_model = self.env['hr.leave']
|
|
selection_options = hr_leave_model._fields['request_hour_from'].selection
|
|
|
|
def get_display_value(key):
|
|
for option in selection_options:
|
|
if option[0] == key:
|
|
return option[1]
|
|
return None
|
|
|
|
request_hour_from = get_display_value(key_from)
|
|
request_hour_to = get_display_value(key_to)
|
|
leave = self.env['hr.leave'].sudo().create({
|
|
'employee_id': employee_id.id,
|
|
'holiday_status_id': holiday_status_id.id,
|
|
'request_date_from': dt_from,
|
|
'request_date_to': dt_to,
|
|
'request_hour_from': request_hour_from[:2].lstrip('0'),
|
|
'request_hour_to': request_hour_to[:2].lstrip('0'),
|
|
'request_unit_hours':True,})
|
|
leave.action_approve()
|
|
# leave.action_approve() |