From 368d88bc41a970ff2b721f3a6b113aef4adb9ed5 Mon Sep 17 00:00:00 2001 From: zhouzhou <123@qq.com> Date: Fri, 6 Dec 2024 16:13:03 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- yuthon_hr_employee/__manifest__.py | 1 + .../controllers/employee_banner_route.py | 2 +- .../models/yuthon_hr_employee.py | 9 ++++ .../security/ir.model.access.csv | 1 + .../views/yuthon_hr_employee_views.xml | 19 +++++++ yuthon_hr_employee/wizard/__init__.py | 3 +- .../wizard/hr_employee_time_wizard.py | 39 ++++++++++++++ .../wizard/hr_employee_time_wizard_views.xml | 22 ++++++++ .../wizard/hr_employee_wizard.py | 51 +++++++++++-------- yuthon_notice/views/yuthon_notice_views.xml | 4 +- 10 files changed, 125 insertions(+), 26 deletions(-) create mode 100644 yuthon_hr_employee/wizard/hr_employee_time_wizard.py create mode 100644 yuthon_hr_employee/wizard/hr_employee_time_wizard_views.xml diff --git a/yuthon_hr_employee/__manifest__.py b/yuthon_hr_employee/__manifest__.py index 68854a8c1..3570d4382 100644 --- a/yuthon_hr_employee/__manifest__.py +++ b/yuthon_hr_employee/__manifest__.py @@ -27,6 +27,7 @@ 'views/hr_job_type_views.xml', 'views/inherit_hr_job_views.xml', 'wizard/hr_employee_wizard_views.xml', + 'wizard/hr_employee_time_wizard_views.xml', 'views/inherit_hr_applicant_views.xml', 'views/publish_applicant_setting_views.xml', 'views/yuthon_job_postings_views.xml', diff --git a/yuthon_hr_employee/controllers/employee_banner_route.py b/yuthon_hr_employee/controllers/employee_banner_route.py index 3d0bebf92..1432770db 100644 --- a/yuthon_hr_employee/controllers/employee_banner_route.py +++ b/yuthon_hr_employee/controllers/employee_banner_route.py @@ -6,7 +6,7 @@ class EmployeeBannerRoute(Controller): @route('/employee/banner/route', type='json', auth='user') def employee_banner_route(self): employees = request.env['hr.employee'].sudo() - hired_count = employees.search_count([('use_user_type', '=', 'formal')]) # 正式 + hired_count = employees.search_count([('use_user_type', '=', 'formal_one')]) # 正式 in_hired_count = employees.search_count([]) # 在职 all_hired_count = employees.search_count([]) # 全职 return { diff --git a/yuthon_hr_employee/models/yuthon_hr_employee.py b/yuthon_hr_employee/models/yuthon_hr_employee.py index 9283c674d..390fde949 100644 --- a/yuthon_hr_employee/models/yuthon_hr_employee.py +++ b/yuthon_hr_employee/models/yuthon_hr_employee.py @@ -159,6 +159,15 @@ class YuthonHrEmployee(models.Model): "target": "new", } + def action_hr_time_form(self): + return { + "type": "ir.actions.act_window", + "name": "批量更新时间表", + "res_model": "yuthon.hr.employee.time.wizard", + "view_mode": "form", + "target": "new", + } + @api.depends('entry_date') def _compute_company_old(self): """司龄计算""" diff --git a/yuthon_hr_employee/security/ir.model.access.csv b/yuthon_hr_employee/security/ir.model.access.csv index e007b8165..1b197583d 100644 --- a/yuthon_hr_employee/security/ir.model.access.csv +++ b/yuthon_hr_employee/security/ir.model.access.csv @@ -13,3 +13,4 @@ access_publish_applicant_setting,publish_applicant_setting,model_publish_applica access_applicant_tage_setting,applicant_tage_setting,model_applicant_tage_setting,base.group_user,1,1,1,1 access_yuthon_job_postings,yuthon_job_postings,model_yuthon_job_postings,base.group_user,1,1,1,1 access_interview_message_line,interview_message_line,model_interview_message_line,base.group_user,1,1,1,1 +access_yuthon_hr_employee_time_wizard,yuthon_hr_employee_time_wizard,model_yuthon_hr_employee_time_wizard,base.group_user,1,1,1,1 \ No newline at end of file diff --git a/yuthon_hr_employee/views/yuthon_hr_employee_views.xml b/yuthon_hr_employee/views/yuthon_hr_employee_views.xml index 013a942eb..5e4c827b5 100644 --- a/yuthon_hr_employee/views/yuthon_hr_employee_views.xml +++ b/yuthon_hr_employee/views/yuthon_hr_employee_views.xml @@ -257,6 +257,17 @@ + + hr.employee.inherit.search + hr.employee + + + + + + + + 批量更新员工 @@ -268,6 +279,14 @@ tree,kanban,form,activity,graph,pivot,hierarchy + + 批量更新时间表 + + + code + action = model.action_hr_time_form() + + hr.employee.attendance.form hr.employee diff --git a/yuthon_hr_employee/wizard/__init__.py b/yuthon_hr_employee/wizard/__init__.py index 2581ba60e..e4373911c 100644 --- a/yuthon_hr_employee/wizard/__init__.py +++ b/yuthon_hr_employee/wizard/__init__.py @@ -1 +1,2 @@ -from . import hr_employee_wizard \ No newline at end of file +from . import hr_employee_wizard +from . import hr_employee_time_wizard \ No newline at end of file diff --git a/yuthon_hr_employee/wizard/hr_employee_time_wizard.py b/yuthon_hr_employee/wizard/hr_employee_time_wizard.py new file mode 100644 index 000000000..f9f9a95ab --- /dev/null +++ b/yuthon_hr_employee/wizard/hr_employee_time_wizard.py @@ -0,0 +1,39 @@ +# -*- 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 + + +class YuthonHrEmployeeTimeWizard(models.Model): + _name = 'yuthon.hr.employee.time.wizard' + + department_id = fields.Many2one('hr.department', string='部门') + employee_ids = fields.Many2many('hr.employee', compute='_compute_all_employees', string='所有员工' ,store=True, ) + attendance_id = fields.Many2one('resource.calendar', string='考勤时间表') + + @api.depends('department_id') + def _compute_all_employees(self): + for record in self: + if record.department_id: + record.employee_ids = self.get_all_employees(record.department_id) + else: + record.employee_ids = False + + def get_all_employees(self, department): + employees = self.env['hr.employee'].search([('department_id', '=', department.id)]) + child_departments = self.env['hr.department'].search([('parent_id', '=', department.id)]) + for child_department in child_departments: + employees += self.get_all_employees(child_department) + + return employees + + def confirm(self): + for employee_id in self.employee_ids: + if employee_id.resource_calendar_id: + employee_id.write({ + 'resource_calendar_id': self.attendance_id.id}) + else: + pass \ No newline at end of file diff --git a/yuthon_hr_employee/wizard/hr_employee_time_wizard_views.xml b/yuthon_hr_employee/wizard/hr_employee_time_wizard_views.xml new file mode 100644 index 000000000..1bc684c8b --- /dev/null +++ b/yuthon_hr_employee/wizard/hr_employee_time_wizard_views.xml @@ -0,0 +1,22 @@ + + + + 考勤时间表 + yuthon.hr.employee.time.wizard + +
+ + + + + + + +
+
+
+
+
+
\ No newline at end of file diff --git a/yuthon_hr_employee/wizard/hr_employee_wizard.py b/yuthon_hr_employee/wizard/hr_employee_wizard.py index d451b7038..d44010811 100644 --- a/yuthon_hr_employee/wizard/hr_employee_wizard.py +++ b/yuthon_hr_employee/wizard/hr_employee_wizard.py @@ -35,14 +35,14 @@ class YuthonHrEmployeeWizard(models.Model): } def employee_user_data(self,row): - employee_name = self.env['hr.employee'].search([('name', '=', row[0].value)]) - text = row[1].value - text = text.replace('\\', '') - department_ids = self.env['hr.department'].search([('name', '=', text)]) - if department_ids: - department_id = department_ids[0] - else: - raise UserError(f'{text}不存在,请检查。') + employee_name = self.env['hr.employee'].search([('name', '=', row[1].value)]) + department_id = self.env['hr.department'].search([('id', '=', employee_name.department_id.id)]) + # text = row[1].value + # text = text.replace('\\', '') + # if department_ids: + # department_id = department_ids[0] + # else: + # raise UserError(f'{text}不存在,请检查。') # = self.env['hr.job'].search([('name', '=', row[2].value)]) # use_user_type_dict = {'正式职工': 'formal', '劳务协议': 'labor', '兼职协议': 'part_time', '兼职用工': 'employment', '': ''} # use_user_type = use_user_type_dict[row[1].value] @@ -51,21 +51,28 @@ class YuthonHrEmployeeWizard(models.Model): # marital = marital_dict[row[19].value] # political_aspects_dict = {'中共党员': 'cpc_dang', '民盟': 'nld', '共青团员': 'league_member', '群众': 'people', '': ''} # political_aspects = political_aspects_dict[row[26].value] - role = row[4].value.split(',') - role_list =[] - user_role_id = self.env['soong.user.role'] - for i in role: - role_id = user_role_id.search([('name', '=', i)]) - if not role_id: - role_id = user_role_id.create({'name': i}) - role_list.append(role_id.id) + # role = row[4].value.split(',') + # role_list =[] + # user_role_id = self.env['soong.user.role'] + # for i in role: + # role_id = user_role_id.search([('name', '=', i)]) + # if not role_id: + # role_id = user_role_id.create({'name': i}) + # role_list.append(role_id.id) + use_user_type_dict = {'正式合同': 'formal_one', '劳务协议': 'labor', '正式合同(二签)': 'formal_two', '正式合同(无固定)': 'formal_none', + '兼职协议':'part_time','用工协议': 'employment','实习协议': 'internship'} + + user_role_id = self.env['soong.user.role'].search([('name', '=', row[3].value)], limit=1) + job_id = self.env['hr.job'].search([('name', '=', row[4].value),('department_id', '=',department_id.id)],limit=1) + parent_id = self.env['hr.employee'].search([('name', '=', row[6].value)]) employee_date = { - 'name': row[0].value, # 姓名 - 'department_id': department_id.id, # 部门 - 'user_sex': 'boy' if row[2].value == '男' else 'girl', - 'birthday': datetime.strptime(row[3].value, '%Y-%m-%d').date() if row[3].value else None, - 'work_phone': row[5].value if row[5].value else None, - 'user_role_ids': [(6, 0, role_list)] + 'number':row[0].value, # 序号 + 'name': row[1].value, # 姓名 + 'work_phone': row[2].value if row[2].value else None, + 'user_role_id': user_role_id.id if user_role_id else None, + 'job_id': job_id.id if job_id else None, + 'use_user_type': use_user_type_dict.get(row[5].value) if row[5].value else None, # 用工形式 + 'parent_id': parent_id.id if parent_id else None, } # employee_data = { diff --git a/yuthon_notice/views/yuthon_notice_views.xml b/yuthon_notice/views/yuthon_notice_views.xml index 0b6c7139c..506dbac46 100644 --- a/yuthon_notice/views/yuthon_notice_views.xml +++ b/yuthon_notice/views/yuthon_notice_views.xml @@ -55,13 +55,13 @@ - + /> - +