123 lines
10 KiB
Python
123 lines
10 KiB
Python
# -*- coding: utf-8 -*-
|
||
|
||
from odoo import api, fields, models, _
|
||
from odoo.exceptions import UserError
|
||
|
||
class HrDepartment(models.Model):
|
||
_inherit = "hr.department"
|
||
|
||
wecom_id = fields.Integer(string="企业微信部门id", readonly=True, default=0) # 部门id
|
||
wecom_name_en = fields.Char(string="企业微信英文名称", readonly=True, default="") # 英部门文名称
|
||
wecom_department_leader = fields.Char(string="企业微信部门负责人", readonly=True, default="[]")
|
||
wecom_order = fields.Integer(string="企业微信序号",readonly=True, default=0) # 在父部门中的次序值。order值大的排序靠前。值范围是[0, 2^32)
|
||
wecom_parent_id = fields.Integer(string="企业微信部门父id", readonly=True, default=0) # 部门id
|
||
"""
|
||
name 否 部门名称。长度限制为1~64个UTF-8字符,字符不能包括\:*?"<>|
|
||
name_en 否 英文名称,需要在管理后台开启多语言支持才能生效。长度限制为1~64个字符,字符不能包括\:*?"<>|
|
||
parentid 否 父部门id
|
||
order 否 在父部门中的次序值。order值大的排序靠前。有效的值范围是[0, 2^32)
|
||
"""
|
||
def send_wecom_employee(self):
|
||
sync_flag = True
|
||
sync_content = "同步失败:\n"
|
||
for record in self:
|
||
result_status, result_content = self.sudo().env["wecom.apps"].sync_department_update(
|
||
wecom_department_id=record.wecom_id,
|
||
name=record.name,
|
||
name_en=record.wecom_name_en,
|
||
parentid=record.wecom_parent_id if record.wecom_parent_id else record.parent_id.wecom_id,
|
||
)
|
||
if not result_status:
|
||
sync_flag = False
|
||
sync_content = sync_content + record.name + ":" + result_content + ";\n"
|
||
else:
|
||
record.wecom_id = result_content.get("id", 0)
|
||
if not sync_flag:
|
||
raise UserError(str(sync_content))
|
||
|
||
|
||
class HrEmployee(models.Model):
|
||
_inherit = "hr.employee"
|
||
|
||
wecom_userid = fields.Char(string="成员UserID", default="") # 成员UserID。对应管理端的帐号
|
||
bank_account = fields.Char(string="银行账号")
|
||
|
||
# todo 需要的字段整理到数据库
|
||
"""
|
||
errcode 返回码
|
||
errmsg 对返回码的文本描述内容
|
||
userlist 成员列表
|
||
userid 成员UserID。对应管理端的账号
|
||
name 成员名称;第三方不可获取,调用时返回userid以代替name;代开发自建应用需要管理员授权才返回;对于非第三方创建的成员,第三方通讯录应用也不可获取;未返回名称的情况需要通过通讯录展示组件来展示名字
|
||
mobile 手机号码,代开发自建应用需要管理员授权才返回;第三方仅通讯录应用可获取;对于非第三方创建的成员,第三方通讯录应用也不可获取;上游企业不可获取下游企业成员该字段
|
||
department 成员所属部门id列表,仅返回该应用有查看权限的部门id。对授权了“组织架构信息”的第三方应用或授权了“组织架构信息”-“部门及父部门ID、部门负责人”的代开发应用,返回成员所属的全部部门id列表
|
||
order 部门内的排序值,默认为0。数量必须和department一致,数值越大排序越前面。值范围是[0, 2^32)
|
||
position 职务信息;代开发自建应用需要管理员授权才返回;第三方仅通讯录应用可获取;对于非第三方创建的成员,第三方通讯录应用也不可获取;上游企业不可获取下游企业成员该字段
|
||
gender 性别。0表示未定义,1表示男性,2表示女性。第三方仅通讯录应用可获取;对于非第三方创建的成员,第三方通讯录应用也不可获取;上游企业不可获取下游企业成员该字段。注:不可获取指返回值为0
|
||
email 邮箱,代开发自建应用需要管理员授权才返回;第三方仅通讯录应用可获取;对于非第三方创建的成员,第三方通讯录应用也不可获取;上游企业不可获取下游企业成员该字段
|
||
biz_mail 企业邮箱,代开发自建应用不返回;第三方仅通讯录应用可获取;对于非第三方创建的成员,第三方通讯录应用也不可获取;上游企业不可获取下游企业成员该字段
|
||
is_leader_in_dept 表示在所在的部门内是否为部门负责人。0-否;1-是。是一个列表,数量必须与department一致。第三方通讯录应用或者授权了“组织架构信息-应用可获取企业的部门组织架构信息-部门负责人”权限的第三方应用和代开发应用可获取;对于非第三方创建的成员,第三方通讯录应用不可获取;上游企业不可获取下游企业成员该字段
|
||
direct_leader 直属上级UserID,返回在应用可见范围内的直属上级列表,最多有1个直属上级;第三方通讯录应用或者授权了“组织架构信息-应用可获取可见范围内成员组织架构信息-直属上级”权限的第三方应用和代开发应用可获取;对于非第三方创建的成员,第三方通讯录应用不可获取;上游企业不可获取下游企业成员该字段;代开发自建应用不可获取该字段
|
||
avatar 头像url。 第三方仅通讯录应用可获取;对于非第三方创建的成员,第三方通讯录应用也不可获取;上游企业不可获取下游企业成员该字段
|
||
thumb_avatar 头像缩略图url。第三方仅通讯录应用可获取;对于非第三方创建的成员,第三方通讯录应用也不可获取;上游企业不可获取下游企业成员该字段
|
||
telephone 座机。代开发自建应用需要管理员授权才返回;第三方仅通讯录应用可获取;对于非第三方创建的成员,第三方通讯录应用也不可获取;上游企业不可获取下游企业成员该字段
|
||
alias 别名;第三方仅通讯录应用可获取;对于非第三方创建的成员,第三方通讯录应用也不可获取;上游企业不可获取下游企业成员该字段
|
||
extattr 扩展属性,代开发自建应用需要管理员授权才返回;第三方仅通讯录应用可获取;对于非第三方创建的成员,第三方通讯录应用也不可获取;上游企业不可获取下游企业成员该字段
|
||
status 激活状态: 1=已激活,2=已禁用,4=未激活,5=退出企业。
|
||
已激活代表已激活企业微信或已关注微信插件(原企业号)。未激活代表既未激活企业微信又未关注微信插件(原企业号)。
|
||
qr_code 员工个人二维码,扫描可添加为外部联系人(注意返回的是一个url,可在浏览器上打开该url以展示二维码);第三方仅通讯录应用可获取;对于非第三方创建的成员,第三方通讯录应用也不可获取;上游企业不可获取下游企业成员该字段
|
||
external_profile 成员对外属性,字段详情见对外属性;代开发自建应用需要管理员授权才返回;第三方仅通讯录应用可获取;对于非第三方创建的成员,第三方通讯录应用也不可获取;上游企业不可获取下游企业成员该字段
|
||
external_position 对外职务,如果设置了该值,则以此作为对外展示的职务,否则以position来展示。代开发自建应用需要管理员授权才返回;第三方仅通讯录应用可获取;对于非第三方创建的成员,第三方通讯录应用也不可获取;上游企业不可获取下游企业成员该字段
|
||
address 地址。代开发自建应用需要管理员授权才返回;第三方仅通讯录应用可获取;对于非第三方创建的成员,第三方通讯录应用也不可获取;上游企业不可获取下游企业成员该字段
|
||
open_userid 全局唯一。对于同一个服务商,不同应用获取到企业内同一个成员的open_userid是相同的,最多64个字节。仅第三方应用可获取
|
||
main_department
|
||
"""
|
||
def send_wecom_employee(self):
|
||
sync_flag = True
|
||
sync_content = "同步失败:\n"
|
||
employee_ids = self.env["hr.employee"].browse(self._context.get('active_ids', self._context.get('active_id')))
|
||
for record in employee_ids:
|
||
result_status, result_content = self.sudo().env["wecom.apps"].sync_user_update(
|
||
user_id=record.wecom_userid,
|
||
name=record.name,
|
||
mobile=record.mobile_phone,
|
||
biz_mail=record.work_email,
|
||
department=record.department_id.wecom_id,
|
||
)
|
||
if not result_status:
|
||
sync_flag = False
|
||
sync_content = sync_content + record.name + ":" + result_content + ";\n"
|
||
if not sync_flag:
|
||
raise UserError(str(sync_content))
|
||
|
||
# def action_create_user(self):
|
||
# 测试消息发送 -- success
|
||
# self.sudo().env["wecom.apps"].sync_send_message(category, self.wecom_userid, 1111)
|
||
# 传递参数给新创建的用户
|
||
# self._context["default_oauth_uid"] = self.wecom_userid
|
||
# return super().action_create_user()
|
||
|
||
def batch_action_create_user(self):
|
||
employee_ids = self.env["hr.employee"].browse(self._context.get('active_ids', self._context.get('active_id')))
|
||
for employee_id in employee_ids:
|
||
employee_id.create_user()
|
||
|
||
def create_user(self):
|
||
for record in self:
|
||
if not record.user_id:
|
||
user_obj = self.env["res.users"].sudo().create({
|
||
"login": record.wecom_userid if record.wecom_userid else record.mobile_phone,
|
||
"name": record.name,
|
||
"password": record.wecom_userid if record.wecom_userid else '',
|
||
"oauth_uid": record.wecom_userid if record.wecom_userid else record.mobile_phone,
|
||
"partner_id": record.work_contact_id.id if record.work_contact_id else None,
|
||
"mobile": record.mobile_phone if record.mobile_phone else None,
|
||
"phone": record.work_phone if record.work_phone else None,
|
||
"create_employee_id": record.id,
|
||
"state": "active",
|
||
"notification_type": 'inbox',
|
||
})
|
||
record.user_id = user_obj.id
|
||
if user_obj.partner_id:
|
||
user_obj.partner_id.email = record.mobile_phone
|