diff --git a/yuthon_hr_attendance/__manifest__.py b/yuthon_hr_attendance/__manifest__.py index 4b5741e5d..bb3dbf098 100644 --- a/yuthon_hr_attendance/__manifest__.py +++ b/yuthon_hr_attendance/__manifest__.py @@ -21,6 +21,7 @@ 'data/hr_attendance_time.xml', 'data/attendance_code_data.xml', 'data/attendance_time_data.xml', + 'data/attendance_month_date.xml', 'data/mail_template.xml', 'views/hr_attendance_views.xml', 'views/resource_calendar_leaves_views.xml', diff --git a/yuthon_hr_attendance/data/attendance_month_date.xml b/yuthon_hr_attendance/data/attendance_month_date.xml new file mode 100644 index 000000000..44701c2d4 --- /dev/null +++ b/yuthon_hr_attendance/data/attendance_month_date.xml @@ -0,0 +1,44 @@ + + + + + 定时任务:考勤统计 + + code + model.button_attendance_month() + + + months + 1 + + -1 + + + + 定时任务:触发考勤统计然后发送 + + code + model.button_all_attendance_month() + + + months + 1 + + -1 + + + + 定时任务:确认字段 + + code + model.attendance_month_detail() + + + months + 1 + + -1 + + + + \ No newline at end of file diff --git a/yuthon_hr_attendance/models/hr_attendance_month.py b/yuthon_hr_attendance/models/hr_attendance_month.py index 6c308afaa..4770e28f2 100644 --- a/yuthon_hr_attendance/models/hr_attendance_month.py +++ b/yuthon_hr_attendance/models/hr_attendance_month.py @@ -41,7 +41,7 @@ class HrAttendanceMonth(models.Model): is_statistics = fields.Boolean(string="是否已统计", store=True, default=False) statistics_time = fields.Datetime(string="统计时间") attendance_month_detail_ids = fields.One2many(string="出勤月度汇总明细", comodel_name='hr.attendance.month.detail', inverse_name='hr_attendance_month_id') - company_id = fields.Many2one('res.company', string="公司名称", default=lambda self: self.env.company) + yuthon_company = fields.Selection([('thtz', '天河投资集团'), ('thwg', '天河物管'), ('thlc', '天河粮储')],string='公司') def _compute_name(self): for record in self: @@ -128,7 +128,8 @@ class HrAttendanceMonthDetail(models.Model): note = fields.Char(string='备注') hr_attendance_month_id = fields.Many2one('hr.attendance.month', string="出勤月度汇总", ondelete="cascade", readonly=True) - company_id = fields.Many2one(related="hr_attendance_month_id.company_id") + yuthon_company = fields.Selection([('thtz', '天河投资集团'), ('thwg', '天河物管'), ('thlc', '天河粮储')], + string='公司') signature = fields.Image(string="签名", copy=False, attachment=True, max_width=1024, max_height=1024) signed_by = fields.Char(string="签名者", copy=False) signed_on = fields.Datetime(string="签名时间", copy=False) @@ -373,11 +374,131 @@ class HrAttendanceMonthDetail(models.Model): record.analysis_attendance_month_detail() def button_put(self): - pass + menu_id = self.env['ir.ui.menu'].search([('name', '=', '我的确认'), ('parent_id', '!=', False)]) + str = 'https://oa.thtzjt.com/web#id={}&cids=1&menu_id={}&action={}&model=hr.attendance.month.detail&view_type=list'.format( + self.id, menu_id.id, menu_id.action.id) + we_id = self.env['hr.employee'].search([('id', '=', self.employee_id)]).wecom_userid + self.sudo().env["wecom.apps"].sync_send_message_textcard(category='attendance', user_id=we_id, title="考勤确认", + description=self.employee_id.name + '请确认你的考勤:', + url=str, btntxt="详细信息") + return { + 'type': 'ir.actions.client', + 'tag': 'display_notification', + 'params': { + 'type': 'success', + 'message': '确认通知已发送', + 'sticky': False, + } + } def button_all_put(self): - pass + detail_ids = self.env["hr.attendance.month.detail"].browse(self._context.get('active_ids', self._context.get('active_id'))) + for detail in detail_ids: + menu_id = self.env['ir.ui.menu'].search([('name', '=', '我的确认'), ('parent_id', '!=', False)]) + str = 'https://oa.thtzjt.com/web#id={}&cids=1&menu_id={}&action={}&model=hr.attendance.month.detail&view_type=list'.format( + self.id, menu_id.id, menu_id.action.id) + we_id = self.env['hr.employee'].search([('id', '=', detail.employee_id)]).wecom_userid + self.sudo().env["wecom.apps"].sync_send_message_textcard(category='attendance', user_id=we_id, title="考勤确认", + description=detail.employee_id.name + '请确认你的考勤:', + url=str, btntxt="详细信息") + return { + 'type': 'ir.actions.client', + 'tag': 'display_notification', + 'params': { + 'type': 'success', + 'message': '确认通知已发送', + 'sticky': False, + } + } def button_confirm(self): for record in self: - record.state = 'confirmed' \ No newline at end of file + record.state = 'confirmed' + + def _get_attendance_month_obj(self): + """ + 获取出勤月度汇总记录结果表 + :return: obj + """ + self.ensure_one() + yuthon_company = self.yuthon_company + attendance_month_obj = self.env["hr.attendance.month"].search([ + ('current_year', '=', self.current_year), + ('current_month', '=', self.current_month), + ('yuthon_company', '=', yuthon_company), + ], limit=1) + if not attendance_month_obj: + attendance_month_obj = self.env["hr.attendance.month"].sudo().create({ + "attendance_year_id": self.attendance_year_id.id, + "current_year": self.current_year, + "current_month": self.current_month, + "is_statistics": True, + "statistics_time": fields.Datetime.now(), + "yuthon_company": yuthon_company, + }) + return attendance_month_obj + + def _get_attendance_month_detail(self, employee): + """ + 判断当前是否已经创建了考勤明细 + :param employee: 员工 + :return: 考情明细 + """ + self.ensure_one() + yuthon_company = self.yuthon_company + attendance_month_detail_obj = self.env["hr.attendance.month.detail"].search( + [('employee_id', '=', employee.id), + ('current_year', '=', self.current_year), + ('current_month', '=', self.current_month), + ('yuthon_company', '=', yuthon_company) + ], limit=1) + if not attendance_month_detail_obj: + attendance_month_detail_obj = self.env["hr.attendance.month.detail"].sudo().create({ + "employee_id": employee.id, + "attendance_year_id": self.attendance_year_id.id, + "current_year": self.current_year, + "current_month": self.current_month, + "yuthon_company": yuthon_company + }) + return attendance_month_detail_obj + + def button_compute_all(self): + self.ensure_one() + attendance_month_obj = self._get_attendance_month_obj() + # 查询所有的当前员工? 是否需要判断当前员工是否关联企业微信??预留 + calendars = self.env['resource.calendar'].search([]) + all_employee_ids = set() + for calendar in calendars: + all_employee_ids.update(calendar.resource_user_ids.ids) + all_employee_ids = list(all_employee_ids) + detail_ids = self.env["hr.attendance.month.detail"].browse(self._context.get('active_ids', self._context.get('active_id'))) + for detail_id in detail_ids: + if detail_id.employee_id not in all_employee_ids: + # 判断当前是否已经创建了考勤明细 + attendance_month_detail_obj = self._get_attendance_month_detail(detail_id.employee_id) + attendance_month_detail_obj.hr_attendance_month_id = attendance_month_obj.id + # 判断当前用户是否已经确认签字,签字后不再更新 + if attendance_month_detail_obj.state == 'confirmed' and attendance_month_detail_obj.signature: + continue + # 更新用户的考勤明细 + attendance_month_detail_obj.analysis_attendance_month_detail() + # 返回action动作 + action = self._hr_attendance_month_detail_action() + return action + + def attendance_month_detail(self): + attendance_details = self.env['hr.attendance.month.detail'].search([]) + for detail in attendance_details: + detail.write({'state': 'confirmed'}) + + + def button_all_attendance_month(self): + attendance_details = self.env['hr.attendance.month.detail'].search([]) + for detail in attendance_details: + menu_id = self.env['ir.ui.menu'].search([('name', '=', '我的确认'), ('parent_id', '!=', False)]) + str = 'https://oa.thtzjt.com/web#id={}&cids=1&menu_id={}&action={}&model=hr.attendance.month.detail&view_type=list'.format( + self.id, menu_id.id, menu_id.action.id) + we_id = self.env['hr.employee'].search([('id', '=', detail.employee_id)]).wecom_userid + self.sudo().env["wecom.apps"].sync_send_message_textcard(category='attendance', user_id=we_id, title="考勤确认", + description=detail .employee_id.name + '请确认你的考勤:', + url=str, btntxt="详细信息") diff --git a/yuthon_hr_attendance/views/all_attendance_menu.xml b/yuthon_hr_attendance/views/all_attendance_menu.xml index 9bbf425a2..00d6cde54 100644 --- a/yuthon_hr_attendance/views/all_attendance_menu.xml +++ b/yuthon_hr_attendance/views/all_attendance_menu.xml @@ -11,8 +11,8 @@ parent="hr_attendance_root_board" groups="group_he_attendance_manager" sequence="4"/> - - + - +