From 4a287aaa5f622583a898ccdebdb89e7394164244 Mon Sep 17 00:00:00 2001 From: ONION <2275333053@qq.com> Date: Fri, 16 Aug 2024 18:31:22 +0800 Subject: [PATCH 1/8] =?UTF-8?q?=E5=AD=97=E6=AE=B5=E4=BF=AE=E6=94=B9employe?= =?UTF-8?q?e?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- yuthon_hr_employee/models/yuthon_hr_employee.py | 10 +++++----- .../views/yuthon_hr_employee_views.xml | 17 +++++++++-------- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/yuthon_hr_employee/models/yuthon_hr_employee.py b/yuthon_hr_employee/models/yuthon_hr_employee.py index dd06dc58f..9d32371f8 100644 --- a/yuthon_hr_employee/models/yuthon_hr_employee.py +++ b/yuthon_hr_employee/models/yuthon_hr_employee.py @@ -22,15 +22,15 @@ class YuthonHrEmployee(models.Model): # odoo里是这样做的,一个用户可以多个公司绑定多个员工,每个员工都有自己的部门和岗位 number = fields.Char(string="编号") - use_user_type = fields.Selection([('formal', '正式工'), ('labor', '劳务派遣'), - ('part_time', '兼职人员'), ('practice', '正式工')], string="用工形式") + use_user_type = fields.Selection([('formal', '正式职工'), ('labor', '劳务协议'), + ('part_time', '兼职协议'), ('employment', '兼职用工')], string="用工形式") user_number = fields.Char(string="员工编号") job_lv_id = fields.Many2one('yuthon.job.lv', string="最新职级") # 个人信息 user_salary = fields.Float(string="基本工资") job_lv_salary = fields.Float(string="职级工资") - entry_time = fields.Datetime(string="入职时间") - confirmation_time = fields.Datetime(string="转正时间") + entry_date = fields.Date(string="入职时间") + confirmation_date = fields.Date(string="转正时间") company_old = fields.Integer(string="司龄") user_sex = fields.Selection([('girl', '女'), ('boy', '男')], string="性别") user_number_start_time = fields.Date(string="身份中有效开始时间") @@ -40,7 +40,7 @@ class YuthonHrEmployee(models.Model): user_type = fields.Char(string="人员类别") retire_data = fields.Date(string="退休日期") retire_years = fields.Integer(string="离退休年限") - political_aspects = fields.Selection([('dang', '党员'), ('people', '群众')], string="政治面貌") + political_aspects = fields.Selection([('cpc_dang', '中共党员'), ('nld', '民盟'), ('league_member', '共青团员'), ('people', '群众')], string="政治面貌") dang_data = fields.Date(string="入团(党)时间") user_origin = fields.Char(string="籍贯") user_location = fields.Char(string="户口所在地") diff --git a/yuthon_hr_employee/views/yuthon_hr_employee_views.xml b/yuthon_hr_employee/views/yuthon_hr_employee_views.xml index 67c656a3b..2cb51c890 100644 --- a/yuthon_hr_employee/views/yuthon_hr_employee_views.xml +++ b/yuthon_hr_employee/views/yuthon_hr_employee_views.xml @@ -49,8 +49,8 @@ - - + + @@ -86,12 +86,13 @@ - - - - - - + + + + + + + From 12650f8a5969b557ceaff02cba6f35947563ab8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A2=81=E5=81=A5=E6=98=8E?= Date: Sun, 18 Aug 2024 21:28:43 +0800 Subject: [PATCH 2/8] =?UTF-8?q?=E5=90=8C=E6=AD=A5=E4=BC=81=E4=B8=9A?= =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E4=BC=9A=E8=AE=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- room/__manifest__.py | 2 +- room/models/room_booking.py | 50 ++++++++++++++++++++++++++++++++++++- 2 files changed, 50 insertions(+), 2 deletions(-) diff --git a/room/__manifest__.py b/room/__manifest__.py index 25522f044..43b68f973 100644 --- a/room/__manifest__.py +++ b/room/__manifest__.py @@ -7,7 +7,7 @@ 'description': 'Experience the Ease of Booking Meeting Rooms with Real-Time Availability Display.', 'category': 'Services/Room', 'version': '1.0', - 'depends': ['mail', 'hr', 'documents'], + 'depends': ['mail', 'hr', 'documents', 'yuthon_wechat'], 'data': [ 'data/message_template_views.xml', 'views/room_booking_views.xml', diff --git a/room/models/room_booking.py b/room/models/room_booking.py index bf88722f3..d6feb6d38 100644 --- a/room/models/room_booking.py +++ b/room/models/room_booking.py @@ -4,7 +4,7 @@ import qrcode import base64 from io import BytesIO from odoo import api, fields, models, _ -from odoo.exceptions import ValidationError +from odoo.exceptions import ValidationError, UserError class RoomBooking(models.Model): @@ -34,6 +34,8 @@ class RoomBooking(models.Model): meeting_boss_document_ids = fields.One2many('boss.document', 'room_booking_id', string="董事会议文档") meeting_sing_ids = fields.One2many('room.meeting.sign', 'room_booking_id', string="签到详情") meeting_data = fields.Html(string="会议说明") + wechat_meetingid = fields.Char("企业微信会议室ID") + def meet_notice(self): if self.is_notice: @@ -111,13 +113,58 @@ class RoomBooking(models.Model): # Notify frontend views of new bookings for room, bookings in bookings.grouped("room_id").items(): room._notify_booking_view("create", bookings) + # wechat 创建会议 + for record in bookings: + record.sync_wechat_room() return bookings + @api.model + def sync_wechat_room(self): + for record in self: + admin_userid = record.organizer_id.oauth_uid + title = record.name + meeting_start = record.start_datetime.timestamp() + meeting_duration = record.stop_datetime.timestamp() - record.start_datetime.timestamp() + if not record.wechat_meetingid: + create_result, create_data = self.sudo().env["wecom.apps"].sync_meeting_create( + admin_userid=admin_userid, + title=title, + meeting_start=meeting_start, + meeting_duration=meeting_duration, + kwargs={ + "location": record.room_id.name, + "invitees": { + "userid": record.room_users_ids.oauth_uid + }, + } + ) + if create_result: + record.wechat_meetingid = create_data.get("meetingid", "") + if not create_result: + raise UserError("同步企业微信会议失败:{0}".format(str(create_data))) + if record.wechat_meetingid: + update_result, update_data = self.sudo().env["wecom.apps"].sync_meeting_update( + meetingid=record.wechat_meetingid, + kwargs={ + "title": title, + "meeting_start": meeting_start, + "meeting_duration" :meeting_duration, + "location": record.room_id.name, + "invitees": { + "userid": record.room_users_ids.oauth_uid + }, + } + ) + if not update_result: + raise UserError("更新企业微信会议失败:{0}".format(str(update_data))) + def unlink(self): # Notify frontend of deleted bookings bookings_by_room = self.grouped("room_id") for room, bookings in bookings_by_room.items(): room._notify_booking_view("delete", bookings) + if self.wechat_meetingid: + self.sudo().env["wecom.apps"].sync_meeting_cancel(meetingid=self.wechat_meetingid) return super(RoomBooking, self).unlink() def write(self, vals): @@ -132,6 +179,7 @@ class RoomBooking(models.Model): elif {"name", "start_datetime", "stop_datetime"} & vals.keys(): for room, bookings in bookings_by_room.items(): room._notify_booking_view("update", bookings) + self.sync_wechat_room() return res @api.model From f447d3cc4929d147a304dfce8e1242ec6d736edb Mon Sep 17 00:00:00 2001 From: soong Date: Mon, 19 Aug 2024 08:28:35 +0800 Subject: [PATCH 3/8] =?UTF-8?q?[ADD]=20=E5=A2=9E=E5=8A=A0=E4=BC=9A?= =?UTF-8?q?=E8=AE=AE=E8=A1=A8=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- website_form_room/__init__.py | 1 + website_form_room/__manifest__.py | 11 +++ website_form_room/controllers/__init__.py | 1 + website_form_room/controllers/main.py | 42 ++++++++++ website_form_room/static/description/icon.png | Bin 0 -> 2329 bytes .../views/webclient_templates.xml | 78 ++++++++++++++++++ 6 files changed, 133 insertions(+) create mode 100644 website_form_room/__init__.py create mode 100644 website_form_room/__manifest__.py create mode 100644 website_form_room/controllers/__init__.py create mode 100644 website_form_room/controllers/main.py create mode 100644 website_form_room/static/description/icon.png create mode 100644 website_form_room/views/webclient_templates.xml diff --git a/website_form_room/__init__.py b/website_form_room/__init__.py new file mode 100644 index 000000000..e046e49fb --- /dev/null +++ b/website_form_room/__init__.py @@ -0,0 +1 @@ +from . import controllers diff --git a/website_form_room/__manifest__.py b/website_form_room/__manifest__.py new file mode 100644 index 000000000..a62a8ec87 --- /dev/null +++ b/website_form_room/__manifest__.py @@ -0,0 +1,11 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +{ + 'name': '会议表单', + 'version': '17.0', + 'depends': ['web'], + 'data': [ + 'views/webclient_templates.xml', + ], +} diff --git a/website_form_room/controllers/__init__.py b/website_form_room/controllers/__init__.py new file mode 100644 index 000000000..12a7e529b --- /dev/null +++ b/website_form_room/controllers/__init__.py @@ -0,0 +1 @@ +from . import main diff --git a/website_form_room/controllers/main.py b/website_form_room/controllers/main.py new file mode 100644 index 000000000..240ecd61a --- /dev/null +++ b/website_form_room/controllers/main.py @@ -0,0 +1,42 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +import json +import logging + + +import odoo +import odoo.modules.registry +from odoo import http +from odoo.exceptions import AccessError +from odoo.http import request +from odoo.addons.web.controllers.utils import ensure_db + +_logger = logging.getLogger(__name__) + + +class Home(http.Controller): + @http.route('/web/room', type='http', auth="none") + def web_login(self, room_id=None, **kw): + ensure_db() + values = {k: v for k, v in request.params.items()} + + if not room_id: + values['error'] = "缺少会议号" + else: + values['room_id'] = int(room_id) + # record = request.env['room.booking'].sudo().browse(values['room_id']) + if request.httprequest.method == 'POST': + try: + # pass + values["message"] = "签到成功" + except odoo.exceptions.AccessDenied as e: + if e.args == odoo.exceptions.AccessDenied().args: + values['error'] = "重复签到" + else: + values['error'] = "签到失败" + + response = request.render('website_form_room.website_form_room', values) + response.headers['X-Frame-Options'] = 'SAMEORIGIN' + response.headers['Content-Security-Policy'] = "frame-ancestors 'self'" + return response diff --git a/website_form_room/static/description/icon.png b/website_form_room/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..b7aaac75c2d3f1b84c4d84c26abb29d310f54364 GIT binary patch literal 2329 zcmV+!3Fh{RP)FsL5N!$BqR``X(b+@4>SmncxfD7 z5N(x|2gDOi-~k~7DR-%D8VAHhqNoWe_e-4$A+;rG+$N13+v{PzO(N3J>~(f$9nVjS ztUBY?-T%(_pa0D407xVfi9{liNF)-8L?Vd}1SFRHFP+1e^>IUexu_aDzu#0l4gsQo z#1bY1VLu1iox4dh)Ds(y=66GYNI@*vaI6S~kS-=h%fed?K$IT#eisCUELkhic*HDK zJBXqlT%pNGK{eWWmoO>F6DD`@Aefx?OWP!%RbNI52sAK^A;mcQK$%1*` zC~D>POpJrzA78#w^*uySQ@jWbYmLGQ7rx;LN}%`TX6*?#pQ(C58jsB3HRvM>*$%1Ub-AUuB6$DM3mde|FjHujzlar48sVYm><>8O$5Dv6V zjn=QX)DBxUs=6M6CO!v=hLFWThyvtsyGAjnGV04EtO|QV7GoZwTyNK;s(Q#m67OQZ z5$KwR1-e~>suAS>=@~GTxu%dz+%r{Cve3lK^Cs?hTErI=VA!rrRS3d_K;IY=;v0X$ zg1hpHU87Ym2=fgTqlc9$9mF!O6pJ6(HCokzY#1!C`;y{NQ!m5?hJ$i>WZr5@|hF0_x{;cn%SyCBKlsbpe*F39O@YcPdJA^cJL?C5QE zqu>(mg5(UXkIifLC-&w-zbFf94!s~4RxkUUn)q_K3X<4=sf$q9YW{(gQ;B`E=|u08 z4k3VIFcVLMcrs)l*2k zZCWdEz*i43O&nY=_UNXs?3-=@A1pC(p<*yHYSGvUobW7&c|reT;*QbTKb`h7G>#ie zZv;%-Q~0yOQ^_(%O%8m+A^nM1p)=dr;CN(W?lc$g8nyARYOV zHsW+>+;}9{5eX9qc!9SVh-*O>MoK#HMW-l=&6ErJ22oVuNgQy}a5~-%0pLmyk0$O2 zg63>7<)Wu)GAbtSH~d-Q*hAvIQyW!w7egqJVTjG`SUNOr9Gp8ufNTY^P-@WjlegEr z4FTb(hhTkYVjP0dxO~cGK8Xt#!wi2xih(%lAvj5BUL*n3!&Lu2ny&5u!LU+&=&QCG zSBp(vu|t|;X83ynLc~@O_N@XLZ?A-U{tRe8TQ5bU zAm`sY3gvtO0wgomrgcKdIPnnI3-w+>6R-LDQ%7y{Kb?l(`v!vY6%2oyK>!YNh+(@Q zl^2U9?i4Ix6MctZ_T*2%5e$E!`o>ah1cD~_+_|;cI!+mWKTelXx5LWoJ!qL=8{^`1Y_GK{` zQQ(X+eV&ULNb%gHIW#Vwodger7XGYob;rl|&TLeH;GWs_zyUOIx4z+&wYN5#KMuj| zJI$heV=1nt--}Pzje?=HvTnj<*0**f9f%kRdJ0atI2amZ`0I{>7>H+2U~B3rrsp27 ze+Qa){PedFH0ruKxaz?>SMrtl@FyT|tb{L2|Gj4UuTC*Bu7e2SYa3ARsk#HCq%^bpEaUVuX7~$H3}l5V7h&Pg3NFLg#B({F zs>QoqLb+z}CQ%@uaOvgWh*%weuzXe{}+?lW(04`h>q zU$_T7ZU4osgqlZlU*;>k!k)&4PD`?^o5QC`!8N)~j z4}Vq!@{D2rncDGuyueZ!?ML5;gcv}l41;XW4(|wcIl(P~KNem8@ZnT!>g*n7HresH4*7FKv5DWf z%!9e$#KhoZH$a6D+H>mJ{+q|MuitxZIZ=xnl)29uUkU7$r4qRhDhMHUJ$e7TyOmtF zCtzQpr4nt<4(}2_qHuwblN_>d+;gBjed*c&eZ};RN)rPSdiad#D}{-H*tuVufFF?$ ze^v-R>%{bx*Y3u=g3}mWe5De?pA{-ZfZ0ULdm$-Nkp)vlxFf%7~FBMNBf99f{ zudwjfREc?GB_e;sANtDVT@N&~aB+oa!YecUSy54^k}mZX6ln6;uE=cP;YCFqf@%5+ zo1bDmBW)OKBDp3mkw_#Gi9{liNF)-8WHs>zQ`DPOOtls_00000NkvXXu0mjff?H3D literal 0 HcmV?d00001 diff --git a/website_form_room/views/webclient_templates.xml b/website_form_room/views/webclient_templates.xml new file mode 100644 index 000000000..135d9bbf3 --- /dev/null +++ b/website_form_room/views/webclient_templates.xml @@ -0,0 +1,78 @@ + + + + + + + + From 31ef7f47f6fc3bea1ff64f2086bc5b3096b3fcf2 Mon Sep 17 00:00:00 2001 From: ONION <2275333053@qq.com> Date: Mon, 19 Aug 2024 14:13:02 +0800 Subject: [PATCH 4/8] =?UTF-8?q?=E5=AD=97=E6=AE=B5=E4=BF=AE=E6=94=B9employe?= =?UTF-8?q?e=202.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- yuthon_hr_employee/models/hr_employee_page.py | 2 + .../models/yuthon_hr_employee.py | 80 +++++++++++-------- .../views/yuthon_hr_employee_views.xml | 23 +----- 3 files changed, 51 insertions(+), 54 deletions(-) diff --git a/yuthon_hr_employee/models/hr_employee_page.py b/yuthon_hr_employee/models/hr_employee_page.py index c7e2eb037..41b198132 100644 --- a/yuthon_hr_employee/models/hr_employee_page.py +++ b/yuthon_hr_employee/models/hr_employee_page.py @@ -36,6 +36,8 @@ class YuthonEducationExperienceLine(models.Model): start_date = fields.Date(string="入学时间") end_date = fields.Date(string="毕业时间") professional = fields.Char(string="专业") + Part_time_degree = fields.Char(string="非全日制学历学位") + full_time_degree = fields.Char(string="全日制学历学位") major_courses = fields.Char(string="主修课程") diff --git a/yuthon_hr_employee/models/yuthon_hr_employee.py b/yuthon_hr_employee/models/yuthon_hr_employee.py index 9d32371f8..73aa1bbc8 100644 --- a/yuthon_hr_employee/models/yuthon_hr_employee.py +++ b/yuthon_hr_employee/models/yuthon_hr_employee.py @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- from odoo import api, fields, models +from datetime import datetime nation_list = [('a', '汉族'), ('b', '壮族'), ('v', '满族'), ('d', '回族'), ('e', '苗族'), ('f', '维吾尔族'), ('g', '土家族'), ('h', '彝族'), ('i', '蒙古族'), ('j', '藏族'), ('k', '布依族'), ('l', '侗族'), @@ -31,15 +32,16 @@ class YuthonHrEmployee(models.Model): job_lv_salary = fields.Float(string="职级工资") entry_date = fields.Date(string="入职时间") confirmation_date = fields.Date(string="转正时间") - company_old = fields.Integer(string="司龄") + company_old = fields.Integer(string="司龄", compute='_compute_company_old') user_sex = fields.Selection([('girl', '女'), ('boy', '男')], string="性别") user_number_start_time = fields.Date(string="身份中有效开始时间") user_number_end_time = fields.Date(string="身份证有效到期时间") nation = fields.Selection(nation_list, string="民族") - old = fields.Integer(string="年龄") + old = fields.Integer(string="年龄", compute='_compute_birthday_old') + birthday_month = fields.Integer(string="生日月份", compute='_compute_birthday_old') user_type = fields.Char(string="人员类别") - retire_data = fields.Date(string="退休日期") - retire_years = fields.Integer(string="离退休年限") + retire_date = fields.Date(string="退休日期") + retire_years = fields.Integer(string="离退休年限", compute='_compute_retire_years') political_aspects = fields.Selection([('cpc_dang', '中共党员'), ('nld', '民盟'), ('league_member', '共青团员'), ('people', '群众')], string="政治面貌") dang_data = fields.Date(string="入团(党)时间") user_origin = fields.Char(string="籍贯") @@ -57,7 +59,6 @@ class YuthonHrEmployee(models.Model): cumulative_work_month = fields.Integer(string="累计工作月数") cumulative_work_years = fields.Integer(string="累计工作年限") # 教育 - full_degree = fields.Selection([('full', '全日制学历学位'), ('no_full', '非全日制学历学位')], string="学历学位") high_degree = fields.Char(string="最高学历") high_degree2 = fields.Char(string="最高学位") graduate_school = fields.Char(string="毕业院校") @@ -116,35 +117,44 @@ class YuthonHrEmployee(models.Model): else: social.social_insurance_time = False + @api.depends('entry_date') + def _compute_company_old(self): + """司龄计算""" + for record in self: + if record.entry_date: + today = datetime.now().date() + years_diff = today.year - record.entry_date.year + months_diff = today.month - record.entry_date.month + if today.month < record.entry_date.month: + years_diff -= 1 + months_diff += 12 + record.company_old = years_diff * 12 + months_diff + else: + record.company_old = 0 + @api.depends('birthday') + def _compute_birthday_old(self): + """生日月份 年龄 计算""" + for record in self: + if record.birthday: + today = datetime.now().date() + record.birthday_month = record.birthday.month + record.old = today.year - record.birthday.year + else: + record.birthday_month = 0 + record.old = 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @api.depends('retire_date') + def _compute_retire_years(self): + """离退休年限计算""" + for record in self: + if record.retire_date: + today = datetime.now().date() + years_diff = today.year - record.retire_date.year + compute = years_diff + if compute < 0: + record.retire_years = -1 * compute + else: + record.retire_years = 0 + else: + record.retire_years = 0 diff --git a/yuthon_hr_employee/views/yuthon_hr_employee_views.xml b/yuthon_hr_employee/views/yuthon_hr_employee_views.xml index 2cb51c890..820188aac 100644 --- a/yuthon_hr_employee/views/yuthon_hr_employee_views.xml +++ b/yuthon_hr_employee/views/yuthon_hr_employee_views.xml @@ -61,8 +61,9 @@ + - + @@ -72,27 +73,9 @@ - - - - - - - - - - - - - - - - - - @@ -197,6 +180,8 @@ + + From 9762cfe90b20433b4fe824b427a5d9fc9c6f7ba6 Mon Sep 17 00:00:00 2001 From: ONION <2275333053@qq.com> Date: Mon, 19 Aug 2024 14:22:07 +0800 Subject: [PATCH 5/8] =?UTF-8?q?=E6=89=B9=E9=87=8F=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E5=91=98=E5=B7=A5=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wizard/hr_employee_wizard.py | 110 +++++++++++------- 1 file changed, 71 insertions(+), 39 deletions(-) diff --git a/yuthon_hr_employee/wizard/hr_employee_wizard.py b/yuthon_hr_employee/wizard/hr_employee_wizard.py index 8d7efccfb..7675d7a69 100644 --- a/yuthon_hr_employee/wizard/hr_employee_wizard.py +++ b/yuthon_hr_employee/wizard/hr_employee_wizard.py @@ -22,9 +22,11 @@ class YuthonHrEmployeeWizard(models.Model): raise ValidationError('请上传文件。') book = xlrd.open_workbook(file_contents=base64.decodebytes(self.excel_file)) sh = book.sheet_by_index(0) + sh2 = book.sheet_by_index(1) + sh3 = book.sheet_by_index(2) for rx in range(1, sh.nrows): row = sh.row(rx) - self.employee_user_data(row) + self.employee_user_data(row, sh2, sh3) return { 'name': '批量更新员工', 'type': 'ir.actions.act_window', @@ -32,45 +34,75 @@ class YuthonHrEmployeeWizard(models.Model): 'res_model': 'hr.employee', } - def employee_user_data(self, row): - employee_name = self.env['hr.employee'].search([('name', '=', row[0].value)]) - department_id = self.env['hr.department'].search([('name', '=', row[1].value.split('\\')[-1])]) - role_main = self.env['soong.user.role'].search([('name', '=', row[4].value)]) - job = self.env['hr.job'].search([('name', '=', row[7].value)]) - job_lv = self.env['yuthon.job.lv'].search([('name', '=', row[8].value)]) - parent_id = self.env['hr.employee'].search([('name', '=', row[9].value)]) - if role_main: - role_list_id = role_main - else: - role_list_id = self.env['soong.user.role'].create({'name': row[4].value}) - if job: - job_id = job - else: - job_id = self.env['hr.job'].create({'name': row[7].value}) - if job_lv: - job_lv_id = job_lv - else: - job_lv_id = self.env['yuthon.job.lv'].create({'name': row[8].value}) - role_data = row[5].value - role_list_ids = [] - for user in role_data.split(','): - user_role = self.env['soong.user.role'].search([('name', '=', user)]) - if user_role: - role_list_ids.append(user_role.id) - else: - new_user_role = self.env['soong.user.role'].create({'name': user}) - role_list_ids.append(new_user_role.id) + def employee_user_data(self, row, sh2, sh3): + employee_name = self.env['hr.employee'].search([('name', '=', row[4].value)]) + use_user_type_dict = {'正式职工': 'formal', '劳务协议': 'labor', '兼职协议': 'part_time', '兼职用工': 'employment', '': ''} + use_user_type = use_user_type_dict[row[1].value] + job_lv_id = self.env['yuthon.job.lv'].search([('name', '=', row[9].value)]) + marital_dict = {'单身': 'single', '已婚': 'married', '合法同居者': 'cohabitant', '丧偶': 'widower', '离异': 'divorced', '': ''} + marital = marital_dict[row[19].value] + political_aspects_dict = {'中共党员': 'cpc_dang', '民盟': 'nld', '共青团员': 'league_member', '群众': 'people', '': ''} + political_aspects = political_aspects_dict[row[26].value] + employee_data = { - 'name': employee_name.name, - '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 len(row[3].value) != 0 else '', - 'user_role_id': role_list_id, - 'user_role_ids': role_list_ids, - 'work_phone': row[6].value, - 'job_id': job_id, - 'job_lv_id': job_lv_id, - 'parent_id': parent_id, + 'use_user_type': use_user_type if use_user_type else None, # 用工形式 + 'marital': marital if marital else None, # 婚姻 + 'user_type': row[23].value if row[23].value else None, # 人员类别 + 'high_degree': row[30].value if row[30].value else None, # 最高学历 + 'seniority_prize_pick_up_status': row[43].value if row[43].value else None, # 工龄相关年功奖领取情况 + 'high_degree2': row[31].value if row[31].value else None, # 最高学位 + 'new_start_contract_data': datetime.strptime(row[28].value, '%Y/%m/%d').date() if row[28].value else None, # 最新合同开始日期 + 'political_aspects': political_aspects if political_aspects else None, # 政治面貌 + 'birthday': datetime.strptime(row[20].value, '%Y/%m/%d').date() if row[20].value else None, # 出生年月 + 'dang_data': datetime.strptime(row[27].value, '%Y/%m/%d').date() if row[27].value else None, # 入党(团)时间 + 'retire_date': datetime.strptime(row[24].value, '%Y/%m/%d').date() if row[24].value else None, # 退休日期 + 'new_end_contract_data': datetime.strptime(row[29].value, '%Y/%m/%d').date() if row[29].value else None, # 最新合同终止日期 + 'job_lv_id': job_lv_id.id, # 最新职级 有几个没有 + 'user_sex': 'boy' if row[18].value == '男' else 'girl', # 性别 + 'nation': row[17].value if row[17].value else None, # 民族 + 'identification_id': row[14].value if row[14].value else None, # 身份证号 + 'entry_date': datetime.strptime(row[11].value, '%Y/%m/%d').date() if row[11].value else None, # 入职时间 + 'confirmation_date': datetime.strptime(row[12].value, '%Y/%m/%d').date() if row[12].value else None, # 转正时间 + 'user_number_start_time': datetime.strptime(row[15].value, '%Y/%m/%d').date() if row[15].value else None, # 身份证有效期开始时间 + 'user_number_end_time': datetime.strptime(row[16].value, '%Y/%m/%d').date() if row[16].value else None, # 身份证有效期结束时间 + 'mobile_phone': row[8].value if row[8].value else None, # 手机号码 + 'work_phone': row[7].value if row[7].value else None, # 办公电话 + 'user_number': row[3].value if row[3].value else None, # 员工编号 } if employee_name: employee_name.write(employee_data) + + # 处理教育经历 + for rx in range(1, sh2.nrows): + row2 = sh2.row(rx) + if row2[0].value == row[4].value: + existing_education = employee_name.education_experience_ids.filtered(lambda e: e.name_school == row2[1].value) + education_data = { + 'name_school': row2[1].value if row2[1].value else None, # 学校名称 + 'end_date': datetime.strptime(row2[2].value, '%Y/%m/%d').date() if row2[2].value else None, # 毕业时间 + 'professional': row2[3].value if row2[3].value else None, # 专业 + 'Part_time_degree': row2[4].value if row2[4].value else None, # 非全日制学历学位 + 'full_time_degree': row2[5].value if row2[5].value else None, # 全日制学历学位 + } + if existing_education: + existing_education.write(education_data) + else: + employee_name.write({ + 'education_experience_ids': [(0, 0, education_data)] + }) + + # 处理技能证书 + for rx in range(1, sh3.nrows): + row3 = sh3.row(rx) + if row3[0].value == row[4].value: + existing_certificate = employee_name.skills_certificates_ids.filtered(lambda s: s.rank_name == row3[1].value) + certificate_data = { + 'rank_name': row3[1].value if row3[1].value else None, # 职级名称 + 'rank_time': datetime.strptime(row3[2].value, '%Y/%m/%d').date() if row3[2].value else None, # 职级时间 + } + if existing_certificate: + existing_certificate.write(certificate_data) + else: + employee_name.write({ + 'skills_certificates_ids': [(0, 0, certificate_data)] + }) From 7f5fbbc05826be9f8af3c80fbb138d40c21bffac Mon Sep 17 00:00:00 2001 From: Onion-Jasper <13426750698@163.com> Date: Mon, 19 Aug 2024 14:54:19 +0800 Subject: [PATCH 6/8] =?UTF-8?q?8=E6=9C=8819=E6=97=A5=EF=BC=8C=E6=96=B0?= =?UTF-8?q?=E5=BB=BA=E5=AD=90=E9=83=A8=E9=97=A8=E8=AE=AE=E9=A2=98=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E8=8F=9C=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../views/issue_approval_boss_views.xml | 2 +- .../views/issue_approval_class_views.xml | 2 +- yuthon_issue/views/issue_library_views.xml | 148 ++++++++++++++++-- 3 files changed, 137 insertions(+), 15 deletions(-) diff --git a/yuthon_issue/views/issue_approval_boss_views.xml b/yuthon_issue/views/issue_approval_boss_views.xml index 8d37acbbe..be06b77ce 100644 --- a/yuthon_issue/views/issue_approval_boss_views.xml +++ b/yuthon_issue/views/issue_approval_boss_views.xml @@ -60,7 +60,7 @@ - 党总支议题审批 + 董事会议题审批 issue.approval.boss tree,form diff --git a/yuthon_issue/views/issue_approval_class_views.xml b/yuthon_issue/views/issue_approval_class_views.xml index bb78ca39d..5487e05c5 100644 --- a/yuthon_issue/views/issue_approval_class_views.xml +++ b/yuthon_issue/views/issue_approval_class_views.xml @@ -60,7 +60,7 @@ - 党总支议题审批 + 领导班子议题审批 issue.approval.class tree,form diff --git a/yuthon_issue/views/issue_library_views.xml b/yuthon_issue/views/issue_library_views.xml index 0b1112e04..cf0583fe1 100644 --- a/yuthon_issue/views/issue_library_views.xml +++ b/yuthon_issue/views/issue_library_views.xml @@ -75,18 +75,109 @@ - - - + + + - 议题库 + 待上会 + issue.library + tree,form + + + + + + issue.library.tree + issue.library + + + + + + + + + + + + + + + issue.library.tree + issue.library + +
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ + + + + + issue.library.search + issue.library + + + + + + + + + + + + + + + + 已上会 issue.library tree,form + + {'search_default_group_by_statu': 'on_meet'} @@ -111,10 +202,10 @@ + id="tianhe_issue_library_menu_root" + name="议题管理" + web_icon="yuthon_issue,static/description/icon.png" + sequence="1"/> + sequence="20"/> + + + + + + + + + + + + + + + + + + + + + + sequence="9"/> \ No newline at end of file From 82d0974539de483138e347bb427d17c03fd2889b Mon Sep 17 00:00:00 2001 From: ONION <2275333053@qq.com> Date: Mon, 19 Aug 2024 15:45:15 +0800 Subject: [PATCH 7/8] =?UTF-8?q?=E5=AD=97=E6=AE=B5=E5=8D=95=E4=BD=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- yuthon_hr_employee/models/yuthon_hr_employee.py | 6 +++--- .../views/yuthon_hr_employee_views.xml | 15 ++++++++++++--- yuthon_hr_employee/wizard/hr_employee_wizard.py | 4 ++-- 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/yuthon_hr_employee/models/yuthon_hr_employee.py b/yuthon_hr_employee/models/yuthon_hr_employee.py index 73aa1bbc8..75175eb8d 100644 --- a/yuthon_hr_employee/models/yuthon_hr_employee.py +++ b/yuthon_hr_employee/models/yuthon_hr_employee.py @@ -32,7 +32,7 @@ class YuthonHrEmployee(models.Model): job_lv_salary = fields.Float(string="职级工资") entry_date = fields.Date(string="入职时间") confirmation_date = fields.Date(string="转正时间") - company_old = fields.Integer(string="司龄", compute='_compute_company_old') + company_old = fields.Char(string="司龄", compute='_compute_company_old') user_sex = fields.Selection([('girl', '女'), ('boy', '男')], string="性别") user_number_start_time = fields.Date(string="身份中有效开始时间") user_number_end_time = fields.Date(string="身份证有效到期时间") @@ -128,9 +128,9 @@ class YuthonHrEmployee(models.Model): if today.month < record.entry_date.month: years_diff -= 1 months_diff += 12 - record.company_old = years_diff * 12 + months_diff + record.company_old = str(years_diff) + '年' + str(months_diff) + '月' else: - record.company_old = 0 + record.company_old = None @api.depends('birthday') def _compute_birthday_old(self): diff --git a/yuthon_hr_employee/views/yuthon_hr_employee_views.xml b/yuthon_hr_employee/views/yuthon_hr_employee_views.xml index 820188aac..186727826 100644 --- a/yuthon_hr_employee/views/yuthon_hr_employee_views.xml +++ b/yuthon_hr_employee/views/yuthon_hr_employee_views.xml @@ -60,11 +60,20 @@ - - +