diff --git a/yuthon_base/__manifest__.py b/yuthon_base/__manifest__.py
index d1a2a484a..00b5706a4 100644
--- a/yuthon_base/__manifest__.py
+++ b/yuthon_base/__manifest__.py
@@ -8,6 +8,7 @@
'license': 'LGPL-3',
'data': [
'security/ir.model.access.csv',
+ 'data/res_users_data.xml',
'views/system_version_views.xml',
'views/system_logs_views.xml',
'views/ir_cron_act_views.xml',
@@ -25,7 +26,7 @@
]
},
'demo': [],
- 'depends': ['hr', 'mail', 'base', 'survey'],
+ 'depends': ['hr', 'mail', 'base', 'survey', 'account'],
'installable': True,
'application': True,
}
diff --git a/yuthon_base/data/res_users_data.xml b/yuthon_base/data/res_users_data.xml
new file mode 100644
index 000000000..aba4c936f
--- /dev/null
+++ b/yuthon_base/data/res_users_data.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
diff --git a/yuthon_base/models/__init__.py b/yuthon_base/models/__init__.py
index 190142723..19457e29a 100644
--- a/yuthon_base/models/__init__.py
+++ b/yuthon_base/models/__init__.py
@@ -7,4 +7,6 @@ from . import yuthon_timed_tasks
from . import yuthon_phone_lottery
from . import res_partner
from . import base_month_year
-from . import system_logs
\ No newline at end of file
+from . import system_logs
+from . import res_users
+from . import mail_thread
\ No newline at end of file
diff --git a/yuthon_base/models/mail_thread.py b/yuthon_base/models/mail_thread.py
new file mode 100644
index 000000000..d3cbfd757
--- /dev/null
+++ b/yuthon_base/models/mail_thread.py
@@ -0,0 +1,43 @@
+# -*- coding: utf-8 -*-
+# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html).
+
+# from odoo import models
+# import json
+#
+#
+# class MailThread(models.AbstractModel):
+# _inherit = "mail.thread"
+#
+# def _notify_by_web_push(self, message, recipients_data, msg_vals=False):
+# """
+# 重写 Web Push 通知方法,强制使用异步发送方式,
+# 避免同步发送导致的请求阻塞问题(如加班审批转交按钮反应慢)。
+# """
+# msg_vals = dict(msg_vals or {})
+# partner_ids = self._extract_partner_ids_for_notifications(message, msg_vals, recipients_data)
+# if not partner_ids:
+# return
+#
+# partner_devices_sudo = self.env['mail.partner.device'].sudo()
+# devices = partner_devices_sudo.search([
+# ('partner_id', 'in', partner_ids)
+# ])
+# if not devices:
+# return
+#
+# ir_parameter_sudo = self.env['ir.config_parameter'].sudo()
+# vapid_private_key = ir_parameter_sudo.get_param('mail.web_push_vapid_private_key')
+# vapid_public_key = ir_parameter_sudo.get_param('mail.web_push_vapid_public_key')
+# if not vapid_private_key or not vapid_public_key:
+# return
+#
+# payload = self._notify_by_web_push_prepare_payload(message, msg_vals=msg_vals)
+# payload = self._truncate_payload(payload)
+#
+# # 强制使用异步发送方式
+# # 不再同步调用 push_to_end_point,避免阻塞请求
+# self.env['mail.notification.web.push'].sudo().create([{
+# 'user_device': device.id,
+# 'payload': json.dumps(payload),
+# } for device in devices])
+# self.env.ref('mail.ir_cron_web_push_notification')._trigger()
diff --git a/yuthon_base/models/res_users.py b/yuthon_base/models/res_users.py
new file mode 100644
index 000000000..1b6258354
--- /dev/null
+++ b/yuthon_base/models/res_users.py
@@ -0,0 +1,33 @@
+# -*- coding: utf-8 -*-
+import logging
+from odoo import api, models
+
+_logger = logging.getLogger(__name__)
+
+
+class ResUsers(models.Model):
+ _inherit = 'res.users'
+
+ @api.model_create_multi
+ def create(self, vals_list):
+ _logger.info("====== [yuthon_base] res.users.create 被调用,准备创建 %d 个用户 ======", len(vals_list))
+ users = super().create(vals_list)
+ # 新建用户后确保移除财务和薪资管理员权限组
+ groups_to_remove = []
+ group_refs = [
+ 'account.group_account_manager',
+ 'account.group_account_invoice',
+ 'hr_payroll.group_hr_payroll_manager',
+ ]
+ for ref in group_refs:
+ group = self.env.ref(ref, raise_if_not_found=False)
+ if group:
+ groups_to_remove.append((3, group.id))
+ _logger.info("====== [yuthon_base] 找到组 %s (id=%d),将移除 ======", ref, group.id)
+ else:
+ _logger.warning("====== [yuthon_base] 未找到组 %s ======", ref)
+ if groups_to_remove:
+ _logger.info("====== [yuthon_base] 对用户 %s 移除 %d 个组 ======", users.mapped('login'), len(groups_to_remove))
+ users.sudo().write({'groups_id': groups_to_remove})
+ _logger.info("====== [yuthon_base] res.users.create 完成 ======")
+ return users
diff --git a/yuthon_catering/models/yuthon_catering_conf.py b/yuthon_catering/models/yuthon_catering_conf.py
index 03c06d6a6..2ccbed8f3 100644
--- a/yuthon_catering/models/yuthon_catering_conf.py
+++ b/yuthon_catering/models/yuthon_catering_conf.py
@@ -12,6 +12,7 @@ class YuthonCateringConf(models.Model):
effective_date = fields.Date(string='生效日期')
expiry_date = fields.Date(string='失效日期')
is_active = fields.Integer(string='是否生效', compute='_compute_is_active', store=True)
+ note = fields.Text(string='备注')
@api.depends('employee_ids')
def _compute_employee_count(self):
diff --git a/yuthon_catering/views/yuthon_catering_conf.xml b/yuthon_catering/views/yuthon_catering_conf.xml
index c5d514e67..2a4e32a53 100644
--- a/yuthon_catering/views/yuthon_catering_conf.xml
+++ b/yuthon_catering/views/yuthon_catering_conf.xml
@@ -12,6 +12,7 @@
+
diff --git a/yuthon_catering/wizard/catering_conf_change_wizard.py b/yuthon_catering/wizard/catering_conf_change_wizard.py
index 6ae169bf2..525adb1af 100644
--- a/yuthon_catering/wizard/catering_conf_change_wizard.py
+++ b/yuthon_catering/wizard/catering_conf_change_wizard.py
@@ -22,10 +22,25 @@ class CateringConfChangeWizard(models.TransientModel):
res['employee_ids'] = [(6, 0, conf.employee_ids.ids)]
return res
+ def _compute_change_note(self):
+ """计算增减员备注"""
+ old_ids = set(self.conf_id.employee_ids.ids)
+ new_ids = set(self.employee_ids.ids)
+ added_ids = new_ids - old_ids
+ removed_ids = old_ids - new_ids
+ parts = []
+ if added_ids:
+ added_names = self.env['hr.employee'].browse(list(added_ids)).mapped('name')
+ parts.append('增员:' + '、'.join(added_names))
+ if removed_ids:
+ removed_names = self.env['hr.employee'].browse(list(removed_ids)).mapped('name')
+ parts.append('减员:' + '、'.join(removed_names))
+ return '\n'.join(parts) if parts else ''
+
def action_confirm(self):
"""确认:旧记录加失效日期,生成新记录"""
today = fields.Date.today()
- # 旧记录加失效日期(跳过write覆写,直接用super)
+ note = self._compute_change_note()
from odoo.models import Model
Model.write(self.conf_id, {'expiry_date': today})
# 生成新记录
@@ -33,6 +48,7 @@ class CateringConfChangeWizard(models.TransientModel):
'company_id': self.conf_id.company_id.id,
'employee_ids': [(6, 0, self.employee_ids.ids)],
'effective_date': today,
+ 'note': note,
})
return {'type': 'ir.actions.act_window_close'}
@@ -42,6 +58,10 @@ class CateringConfChangeWizard(models.TransientModel):
def action_modify(self):
"""仅修改当前记录员工,不生成新记录,不更新日期"""
+ note = self._compute_change_note()
from odoo.models import Model
- Model.write(self.conf_id, {'employee_ids': [(6, 0, self.employee_ids.ids)]})
+ Model.write(self.conf_id, {
+ 'employee_ids': [(6, 0, self.employee_ids.ids)],
+ 'note': note,
+ })
return {'type': 'ir.actions.act_window_close'}
diff --git a/yuthon_holiday/models/inherit_hr_leave.py b/yuthon_holiday/models/inherit_hr_leave.py
index ede280a05..8a5d868a7 100644
--- a/yuthon_holiday/models/inherit_hr_leave.py
+++ b/yuthon_holiday/models/inherit_hr_leave.py
@@ -1217,19 +1217,19 @@ class HolidaysRequestBatch(models.Model):
if leave_type_name not in leave_type_mapping or leave_days <= 0:
continue
type_config = leave_type_mapping[leave_type_name]
- remaining_hours = leave_days * 8
+ remaining_hours = leave_days * 8
if type_config['prev']:
- prev_balance = leave_balance[type_config['prev']]
+ prev_balance = leave_balance[type_config['prev']] * 8
if prev_balance > 0:
deduct = round(min(remaining_hours, prev_balance), 1)
- leave_balance[type_config['prev']] = round(leave_balance[type_config['prev']] - deduct, 1)
+ leave_balance[type_config['prev']] = round((prev_balance - deduct) / 8, 1)
remaining_hours = round(remaining_hours - deduct, 1)
if remaining_hours > 0 and type_config['curr']:
- curr_balance = leave_balance[type_config['curr']]
+ curr_balance = leave_balance[type_config['curr']] * 8
deduct = round(min(remaining_hours, curr_balance), 1)
- leave_balance[type_config['curr']] = round(leave_balance[type_config['curr']] - deduct, 1)
+ leave_balance[type_config['curr']] = round((curr_balance - deduct) / 8, 1)
remaining_hours = round(remaining_hours - deduct, 1)
if type_config['prev']:
diff --git a/yuthon_hr_attendance/models/hr_attendance.py b/yuthon_hr_attendance/models/hr_attendance.py
index bdcdc56bb..be3afd8ca 100644
--- a/yuthon_hr_attendance/models/hr_attendance.py
+++ b/yuthon_hr_attendance/models/hr_attendance.py
@@ -1181,8 +1181,8 @@ class HrAttendance(models.Model):
# 检查是否为节假日
for leave in leave_records:
if leave.date_from and leave.date_to:
- from_date = fields.Date.to_date(leave.date_from)
- to_date = fields.Date.to_date(leave.date_to)
+ from_date = fields.Date.to_date(leave.date_from + timedelta(hours=8))
+ to_date = fields.Date.to_date(leave.date_to + timedelta(hours=8))
if from_date <= record.current_data <= to_date:
is_holiday = True # 标记为节假日
diff --git a/yuthon_hr_attendance/models/hr_attendance_detail_wechat.py b/yuthon_hr_attendance/models/hr_attendance_detail_wechat.py
index d159d6658..91e2a7f54 100644
--- a/yuthon_hr_attendance/models/hr_attendance_detail_wechat.py
+++ b/yuthon_hr_attendance/models/hr_attendance_detail_wechat.py
@@ -130,11 +130,11 @@ class HrAttendanceDetail(models.Model):
category='att', user_id=employee_id.wecom_userid,
message=message,
)
- if record.employee_id.name == '蒋彬':
- self.sudo().env["wecom.apps"].sync_send_message(
- category='att', user_id='18562027762',
- message=message + f'管理员测试管理员测试{vals}',
- )
+ # if record.employee_id.name == '蒋彬':
+ # self.sudo().env["wecom.apps"].sync_send_message(
+ # category='att', user_id='18562027762',
+ # message=message + f'管理员测试管理员测试{vals}',
+ # )
self.write({'remark': message})
_logger.info(message)
else:
@@ -208,16 +208,16 @@ class HrAttendanceDetail(models.Model):
if checkin_datetime > sch_check_out_time:
message = f"打卡成功!今日下班时间:{record.checkin_time + timedelta(hours=8)}: {employee_id.name},祝您归途平安!"
- if record.employee_id.name not in ['蒋彬', '麦丽娜']:
- self.sudo().env["wecom.apps"].sync_send_message(
- category='att', user_id=employee_id.wecom_userid,
- message=message,
- )
- if record.employee_id.name in ['蒋彬', '麦丽娜']:
- self.sudo().env["wecom.apps"].sync_send_message(
- category='att', user_id='18562027762',
- message=message + f'管理员测试管理员测试{vals}',
- )
+ # if record.employee_id.name not in ['蒋彬', '麦丽娜']:
+ self.sudo().env["wecom.apps"].sync_send_message(
+ category='att', user_id=employee_id.wecom_userid,
+ message=message,
+ )
+ # if record.employee_id.name in ['蒋彬', '麦丽娜']:
+ # self.sudo().env["wecom.apps"].sync_send_message(
+ # category='att', user_id='18562027762',
+ # message=message + f'管理员测试管理员测试{vals}',
+ # )
self.write({'remark': message})
_logger.info(message)
diff --git a/yuthon_hr_attendance/views/hr_attendance_views.xml b/yuthon_hr_attendance/views/hr_attendance_views.xml
index ea5bf3d0d..3a3c20a9c 100644
--- a/yuthon_hr_attendance/views/hr_attendance_views.xml
+++ b/yuthon_hr_attendance/views/hr_attendance_views.xml
@@ -29,27 +29,27 @@
groups="yuthon_hr_attendance.group_he_attendance_sign_manager"
confirm="确定要删除选中的记录吗?" />
-
+
-
-
+
+
-
-
+
-
-
-
-
-
+
+
+
+
+
@@ -69,7 +69,7 @@
-
@@ -87,21 +87,21 @@
-
-
+
+
-
+
-
+
-
-
-
-
-
+
+
+
+
+
@@ -111,6 +111,9 @@
+
+
+
+
diff --git a/yuthon_hr_employee/models/__init__.py b/yuthon_hr_employee/models/__init__.py
index 917aaf1a5..7fb0850f7 100644
--- a/yuthon_hr_employee/models/__init__.py
+++ b/yuthon_hr_employee/models/__init__.py
@@ -13,4 +13,5 @@ from . import inherit_res_groups
from . import soong_user_role
from . import yuthon_medical_manage
from . import yuthon_medical_rule
+from . import res_users
diff --git a/yuthon_hr_employee/models/inherit_res_groups.py b/yuthon_hr_employee/models/inherit_res_groups.py
index 589927d2d..a377f73f8 100644
--- a/yuthon_hr_employee/models/inherit_res_groups.py
+++ b/yuthon_hr_employee/models/inherit_res_groups.py
@@ -46,7 +46,9 @@ class ResGroups(models.Model):
if not department:
return valid_user_ids
- dept_id = department.id if isinstance(department, models.Model) else int(department)
+ # 处理虚拟记录(onchange时可能出现)
+ dept_id = department.id.origin if hasattr(department.id, 'origin') else department.id
+ dept_id = int(dept_id) if isinstance(dept_id, str) else dept_id
# 当前部门员工
employees = self.env['hr.employee'].search([('department_id', '=', dept_id)])
diff --git a/yuthon_hr_employee/models/res_users.py b/yuthon_hr_employee/models/res_users.py
new file mode 100644
index 000000000..229e82acd
--- /dev/null
+++ b/yuthon_hr_employee/models/res_users.py
@@ -0,0 +1,29 @@
+# -*- coding: utf-8 -*-
+
+import werkzeug.urls
+from urllib.parse import urlparse
+import urllib.request
+import requests
+import json
+from odoo import api, fields, models
+class ResUsers(models.Model):
+ _inherit = 'res.users'
+
+ @api.model
+ def create(self, vals):
+ user = super().create(vals)
+ # 2. 定义要强制移除的 Payroll 权限组 ID
+ remove_group_ids = [
+ 184, # 工资 / 管理员(人事专员)
+ 728, # 管理员(本部财务) (会计)
+ 609, # 管理员(财务)
+ ]
+ user.write({
+ 'groups_id': [(3, gid) for gid in remove_group_ids]
+ })
+ user.write({
+ 'sel_groups_732_760': False, # 库存 选择框
+ 'sel_groups_678_679': False, # 采购 选择框
+ })
+ return user
+
diff --git a/yuthon_hr_employee_approval/views/yuthon_regularization_approval_views.xml b/yuthon_hr_employee_approval/views/yuthon_regularization_approval_views.xml
index f740097ca..1b04e0989 100644
--- a/yuthon_hr_employee_approval/views/yuthon_regularization_approval_views.xml
+++ b/yuthon_hr_employee_approval/views/yuthon_regularization_approval_views.xml
@@ -51,13 +51,19 @@
+
+
+
+
+
+
-
-
-
-
-
-
+
+
+
+
+
+
diff --git a/yuthon_official/views/yuthon_official_views.xml b/yuthon_official/views/yuthon_official_views.xml
index a68be7e28..94231aa41 100644
--- a/yuthon_official/views/yuthon_official_views.xml
+++ b/yuthon_official/views/yuthon_official_views.xml
@@ -77,7 +77,7 @@
-
+
diff --git a/yuthon_property_approval/models/property_lease_contract.py b/yuthon_property_approval/models/property_lease_contract.py
index 8a37c3cdd..73d06834e 100644
--- a/yuthon_property_approval/models/property_lease_contract.py
+++ b/yuthon_property_approval/models/property_lease_contract.py
@@ -2603,12 +2603,24 @@ class PropertyManagementBreakdownLine(models.Model):
management_monthly_amount = fields.Float(string="金额", digits=(16, 2))
start_data = fields.Date(string="开始日期")
end_data = fields.Date(string="结束日期")
- management_month_number = fields.Integer(string="期间月数")
+ management_month_number = fields.Float(string="期间月数", digits=(16, 2))
management_period_rent = fields.Float(string="期间费用", digits=(16, 2))
- @api.onchange('management_monthly_amount', 'month_number')
+ @api.onchange('start_data', 'end_data')
+ def _onchange_management_month_number(self):
+ if self.start_data and self.end_data:
+ if self.end_data >= self.start_data:
+ total_days = (self.end_data - self.start_data).days + 1
+ start_month_days = calendar.monthrange(self.start_data.year, self.start_data.month)[1]
+ self.management_month_number = round(total_days / start_month_days, 2)
+ else:
+ self.management_month_number = 0
+ else:
+ self.management_month_number = 0
+
+ @api.onchange('management_monthly_amount', 'management_month_number')
def _onchange_management_amount(self):
- self.management_period_rent = self.management_monthly_amount * self.management_month_number
+ self.management_period_rent = round(self.management_monthly_amount * self.management_month_number, 2)
class PropertyWaterFeeLine(models.Model):
diff --git a/yuthon_property_approval/views/property_lease_contract.xml b/yuthon_property_approval/views/property_lease_contract.xml
index a5893849e..f822a4b56 100644
--- a/yuthon_property_approval/views/property_lease_contract.xml
+++ b/yuthon_property_approval/views/property_lease_contract.xml
@@ -94,7 +94,7 @@
-
+
diff --git a/yuthon_salary/__manifest__.py b/yuthon_salary/__manifest__.py
index 94eda76d7..2f271d7fa 100644
--- a/yuthon_salary/__manifest__.py
+++ b/yuthon_salary/__manifest__.py
@@ -14,6 +14,7 @@
'data': [
'security/ir.model.access.csv',
'security/salary_security_rule.xml',
+ 'data/res_users_data.xml',
'data/rank_log_time.xml',
'data/meal_cron.xml',
diff --git a/yuthon_salary/data/res_users_data.xml b/yuthon_salary/data/res_users_data.xml
new file mode 100644
index 000000000..639e6473d
--- /dev/null
+++ b/yuthon_salary/data/res_users_data.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/yuthon_salary/models/yuthon_meal_expenses.py b/yuthon_salary/models/yuthon_meal_expenses.py
index 76b4f004a..c88de870e 100644
--- a/yuthon_salary/models/yuthon_meal_expenses.py
+++ b/yuthon_salary/models/yuthon_meal_expenses.py
@@ -1,5 +1,5 @@
from odoo import api, fields, models
-from datetime import datetime
+from datetime import datetime, timedelta
import calendar
@@ -90,6 +90,54 @@ class YuthonMealExpenses(models.Model):
current_month = datetime.now().month
return str(current_month)
+ def _remove_leading_zero(self, date_str):
+ """去掉日期字符串的前导零,如 '01月01日' -> '1月1日'"""
+ month, day = date_str.split('月')
+ day = day.replace('日', '')
+ return f"{int(month)}月{int(day)}日"
+
+ def _is_chinese_workday(self, check_date=None):
+ """判断给定日期是否为中国工作日(考虑法定节假日和调休)"""
+ if check_date is None:
+ check_date = datetime.now()
+
+ # 获取当年行政考勤工作日的节假日数据
+ current_year = check_date.year
+ query_start = datetime(current_year, 1, 1, 0, 0, 0) - timedelta(hours=8)
+ query_end = datetime(current_year, 12, 31, 23, 59, 59) - timedelta(hours=8)
+
+ calendar_leaves = self.env['resource.calendar.leaves'].sudo().search([
+ ("calendar_id.name", "=", "行政考勤工作日"),
+ ("date_from", ">=", query_start),
+ ("date_from", "<=", query_end)
+ ])
+
+ holidays_list = []
+ shift_days_list = []
+
+ for leave in calendar_leaves:
+ if leave.holidays:
+ holidays_list.extend(leave.holidays.split(','))
+ if leave.alternate_rest_day:
+ holidays_list.extend(leave.alternate_rest_day.split(','))
+ if leave.shift_replacement_day:
+ shift_days_list.extend(leave.shift_replacement_day.split(','))
+
+ holidays_list = [self._remove_leading_zero(d) for d in holidays_list]
+ shift_days_list = [self._remove_leading_zero(d) for d in shift_days_list]
+
+ date_str = self._remove_leading_zero(check_date.strftime('%m月%d日'))
+
+ if date_str in shift_days_list:
+ # 调休补班日,强制算工作日
+ return True
+ if date_str in holidays_list:
+ # 法定节假日或调休休息日,算非工作日
+ return False
+
+ # 没有特殊安排的,按周末判断
+ return check_date.weekday() < 5
+
def send_meal(self):
return {
'type': 'ir.actions.act_window',
@@ -112,6 +160,18 @@ class YuthonMealExpenses(models.Model):
def cron_send_meal_reminder(self):
"""定时任务:给状态为已发送且缴费状态为待缴的记录发送缴费提醒"""
+ # 节假日不发送
+ if not self._is_chinese_workday():
+ self.env['ir.logging'].sudo().create({
+ 'name': '餐费缴费提醒',
+ 'type': 'server',
+ 'message': f'今天{datetime.now().strftime("%Y-%m-%d")}是节假日或周末,跳过发送餐费缴费提醒',
+ 'path': __name__,
+ 'func': 'cron_send_meal_reminder',
+ 'line': 0,
+ })
+ return True
+
# 找出所有 已发送 且 仍然 待缴 的餐费记录
meals = self.sudo().search([
('meal_state', '=', 'done'),
@@ -253,15 +313,15 @@ class YuthonMealExpenses(models.Model):
"""定时任务:每月第一个工作日发送餐费缴费提醒"""
from datetime import datetime, timedelta
import calendar
-
- # 检查是否是工作日
+
+ # 检查是否是中国工作日(含法定节假日和调休判断)
today = datetime.now()
- if today.weekday() >= 5: # 0-4是工作日,5-6是周末
+ if not self._is_chinese_workday(today):
# 记录日志
self.env['ir.logging'].sudo().create({
'name': '餐费缴费提醒',
'type': 'server',
- 'message': f'今天{today.strftime("%Y-%m-%d")}是周末,跳过发送餐费缴费提醒',
+ 'message': f'今天{today.strftime("%Y-%m-%d")}是节假日或周末,跳过发送餐费缴费提醒',
'path': __name__,
'func': 'cron_send_monthly_meal_reminder',
'line': 0,
diff --git a/yuthon_wechat/models/res_users.py b/yuthon_wechat/models/res_users.py
index 905a068c7..5a9a1b403 100644
--- a/yuthon_wechat/models/res_users.py
+++ b/yuthon_wechat/models/res_users.py
@@ -179,6 +179,16 @@ class ResUsers(models.Model):
try:
with self.env.cr.savepoint():
user_id = template_user.sudo().with_context(no_reset_password=True).copy(values)
+ # 移除财务管理员权限组
+ groups_to_remove = []
+ group_manager = self.env.ref('account.group_account_manager', raise_if_not_found=False)
+ group_invoice = self.env.ref('account.group_account_invoice', raise_if_not_found=False)
+ if group_manager:
+ groups_to_remove.append((3, group_manager.id))
+ if group_invoice:
+ groups_to_remove.append((3, group_invoice.id))
+ if groups_to_remove:
+ user_id.sudo().write({'groups_id': groups_to_remove})
return user_id
except Exception as e:
_logger.exception("OAuth Wechat: 微信访问用户【UserId:%s】自动创建失败【Odoo错误:%s】!" % (userid, ustr(e)))
diff --git a/yuthon_work_brand/views/hr_menus.xml b/yuthon_work_brand/views/hr_menus.xml
index 7695d3efa..31c4daa07 100644
--- a/yuthon_work_brand/views/hr_menus.xml
+++ b/yuthon_work_brand/views/hr_menus.xml
@@ -777,25 +777,25 @@