diff --git a/soong_workflow/models/soong_workflow_mixin.py b/soong_workflow/models/soong_workflow_mixin.py index 5f55c018d..a0b6396cb 100644 --- a/soong_workflow/models/soong_workflow_mixin.py +++ b/soong_workflow/models/soong_workflow_mixin.py @@ -179,9 +179,33 @@ class SoongWorkflowMixin(models.AbstractModel): state_list = ['拟办' if i.node_name == 'start' else i.node_name for i in btn_rec.workflow_id.node_ids] # 当前节点状态 self_state = state_list.index('拟办' if self.state == 'start' else self.state) + self.env['trans.link'].search([]).unlink() + if btn_rec.name == '退回': + for state in state_list[0:self_state]: + self.env['trans.link'].create({ + 'node_button_id': btn_rec.id, + 'name': state, + 'link_type': 'return', + 'record_id': self.id, + }) + return { + "name": _("评论"), + "type": "ir.actions.act_window", + "view_mode": "form", + "res_model": "soong.workflow.comment.wizard", + "views": [(wizard.id, "form")], + "view_id": wizard.id, + "target": "new", + "context": { + "default_res_id": self.id, + "default_res_model": self._name, + "default_log_ids": logs.ids, + "default_node_btn_id": btn_rec.id, + "default_node_link_len": '转交2' if len(btn_rec.node_id.out_link_ids) > 1 and btn_rec.name == '转交' else '', + }, + } # 下一个节点 next_state = btn_rec.workflow_id.node_ids[self_state + 1].button_ids[1] - self.env['trans.link'].search([]).unlink() if btn_rec.name == '转交' and len(btn_rec.node_id.out_link_ids) > 1: for state in btn_rec.node_id.out_link_ids: self.env['trans.link'].create({ @@ -190,14 +214,6 @@ class SoongWorkflowMixin(models.AbstractModel): 'link_type': 'trans', 'record_id': self.id, }) - elif btn_rec.name == '退回': - for state in state_list[0:self_state]: - self.env['trans.link'].create({ - 'node_button_id': btn_rec.id, - 'name': state, - 'link_type': 'return', - 'record_id': self.id, - }) # 不自动匹配 employee_user_role_ids = self.env['hr.employee'].search([('user_role_id', '=', next_state.users_role_id.id)]) # 自动匹配 @@ -272,14 +288,6 @@ class SoongWorkflowMixin(models.AbstractModel): "views": [(False, "diagram_plus")], } - # @api.model - # def _get_view(self, view_id=None, view_type='form', **options): - # """ Set the correct label for `unit_amount`, depending on company UoM """ - # arch, view = super()._get_view(view_id, view_type, **options) - # for node in arch.xpath("//header"): - # node.append(etree.XML("""booooooo""")) - # return arch, view - @api.model def get_view(self, view_id=None, view_type="form", **options): res = super().get_view(view_id, view_type, **options) @@ -302,6 +310,8 @@ class SoongWorkflowMixin(models.AbstractModel): # 收回 def action_withdraw(self): for record in self: + if self.state == 'start': + raise UserError('当前节点不允许收回') employee_id = self.env['hr.employee'] state_list = [] for state in record.workflow_id.node_ids: diff --git a/soong_workflow/wizard/soong_workflow_comment_wizard.py b/soong_workflow/wizard/soong_workflow_comment_wizard.py index ab6ef57de..3b550de2f 100644 --- a/soong_workflow/wizard/soong_workflow_comment_wizard.py +++ b/soong_workflow/wizard/soong_workflow_comment_wizard.py @@ -2,7 +2,7 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). from odoo import fields, models, api - +from odoo.exceptions import UserError, ValidationError class SoongWorkflowCommentWizard(models.TransientModel): _name = "soong.workflow.comment.wizard" @@ -66,6 +66,27 @@ class SoongWorkflowCommentWizard(models.TransientModel): record_id = self.env[self.res_model].search([('id', '=', self.res_id)]) self.record_id = record_id + @api.onchange('return_link_id') + def onchange_employee_ids(self): + record_id = self.env[self.res_model].search([('id', '=', self.res_id)]) + for ret in self.return_link_id: + if ret.name == '拟办': + self.employee_ids = record_id.user_id.employee_id + elif self.node_btn_name == '退回': + workflow_id = self.return_link_id.node_button_id.workflow_id + state_list = ['拟办' if i.node_name == 'start' else i.node_name for i in workflow_id.node_ids] + self_state = state_list.index(ret.name) + button_id = workflow_id.node_ids[self_state].button_ids[1] + if button_id.name != '转交': + raise UserError('配置错误,请配置当前{}的转交按钮'.format(self_state)) + if button_id.is_automatic: + employee_user_role_ids = self.env['hr.employee'].search([('user_role_id', '=', button_id.users_role_id.id)]) + employee_user_role_id = self.env['hr.employee'].search( + [('user_role_id', '=', button_id.users_role_id.id), + ('department_id', '=', record_id.department_id.id)]) + self.employee_ids = employee_user_role_ids if not button_id.is_automatic else employee_user_role_id + + def add_comment(self): self.ensure_one() cx = self.env.context.copy() or {} diff --git a/soong_workflow/wizard/soong_workflow_comment_wizard_view.xml b/soong_workflow/wizard/soong_workflow_comment_wizard_view.xml index eaf5da232..11b1db357 100644 --- a/soong_workflow/wizard/soong_workflow_comment_wizard_view.xml +++ b/soong_workflow/wizard/soong_workflow_comment_wizard_view.xml @@ -29,7 +29,7 @@ - + diff --git a/yuthon_holiday/views/inherit_hr_leave_allocation_views.xml b/yuthon_holiday/views/inherit_hr_leave_allocation_views.xml index 759edab85..9282d8a19 100644 --- a/yuthon_holiday/views/inherit_hr_leave_allocation_views.xml +++ b/yuthon_holiday/views/inherit_hr_leave_allocation_views.xml @@ -22,6 +22,23 @@ 结束时间 show + + bottom + + + 假期余额 + + + hide + + + 开始时间 + show + + + 结束时间 + show + diff --git a/yuthon_wechat/models/wecom_apps.py b/yuthon_wechat/models/wecom_apps.py index de56809f0..5d832a870 100644 --- a/yuthon_wechat/models/wecom_apps.py +++ b/yuthon_wechat/models/wecom_apps.py @@ -32,18 +32,18 @@ class WeComApps(models.Model): self.access_token = access_token return access_token - def sync_function_api(self, apps_type, api_function, data): - response = self.sync_function_api_base(apps_type, api_function, data) + def sync_function_api(self, apps_type, api_function, data, category="default"): + response = self.sync_function_api_base(apps_type, api_function, data, category) result_data = json.loads(response.content) return result_data - def sync_function_api_base(self, apps_type, api_function, data): - wecom_app = self.sudo().env["wecom.apps.config"].search([("wecom_apps_type", "=", apps_type)], limit=1).wecom_apps_id + def sync_function_api_base(self, apps_type, api_function, data, category="default"): + wecom_app = self.sudo().env["wecom.apps.config"].search([("wecom_apps_type", "=", apps_type), ("wecom_apps_category", "=", category)], limit=1).wecom_apps_id response = self.sudo().env['wecom.api'].function_http_request(api_function, data, wecom_app.access_token) result_data = json.loads(response.content) if result_data.get("errcode", 0) in [40014, 42001]: wecom_app.sync_access_token() - wecom_app = self.sudo().env["wecom.apps.config"].search([("wecom_apps_type", "=", apps_type)], + wecom_app = self.sudo().env["wecom.apps.config"].search([("wecom_apps_type", "=", apps_type), ("wecom_apps_category", "=", category)], limit=1).wecom_apps_id response = self.sudo().env['wecom.api'].function_http_request(api_function, data, wecom_app.access_token) return response @@ -91,7 +91,7 @@ class WeComApps(models.Model): 'content': message } } - result_data = self.sync_function_api("message_send", "MESSAGE_SEND", data) + result_data = self.sync_function_api("message_send", "MESSAGE_SEND", data, category) if result_data.get("errcode", None) == 0: return True, result_data return False, result_data @@ -146,7 +146,7 @@ class WeComApps(models.Model): "btntxt": btntxt }, } - result_data = self.sync_function_api("message_send", "MESSAGE_SEND", data) + result_data = self.sync_function_api("message_send", "MESSAGE_SEND", data, category) if result_data.get("errcode", None) == 0: return True, result_data return False, result_data diff --git a/yuthon_work_brand/views/session_board.xml b/yuthon_work_brand/views/session_board.xml deleted file mode 100644 index 5d8c7820f..000000000 --- a/yuthon_work_brand/views/session_board.xml +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 仪表板 - board.board - form - -
- - - - - - - - - - - - - - - - - -
-
-
- - - Session Dashboard - board.board - form - form - menu - - - - - - - - - -
-
\ No newline at end of file