diff --git a/yuthon_hr_attendance/models/overtime_approval.py b/yuthon_hr_attendance/models/overtime_approval.py index 3538345a4..c6f4a5c30 100644 --- a/yuthon_hr_attendance/models/overtime_approval.py +++ b/yuthon_hr_attendance/models/overtime_approval.py @@ -42,7 +42,7 @@ class OvertimeApprovals(models.Model): rest_start_time = fields.Datetime(string="休息开始时间") rest_end_time = fields.Datetime(string="休息结束时间") end_week = fields.Char(string="星期", compute='_compute_weekday') - type_overtime = fields.Selection([('work', '工作日加班'), ('weekend', '周末加班'), ('holiday', '节假日加班')], + type_overtime = fields.Selection([('work', '工作日加班'), ('weekend', '公休日加班'), ('holiday', '法定日加班')], string="加班类型", compute="_compute_overtime_type", store=True) urgency_level = fields.Selection([('normal', '普件'), ('urgent', '急件'), ('emergency', '特急件')], string='紧急度', default='normal') @@ -169,21 +169,36 @@ class OvertimeApprovals(models.Model): @api.depends('users_id', 'duration') def _compute_overtime_hours(self): for rec in self: - employee = rec.users_id.employee_ids - # 一个月加班时长不能超过36小时 - first_day = fields.Date.today().replace(day=1) - vacation_report = self.env['yuthon.vacation.reports'].search([ - ('employee_id', '=', employee.id), - ('vacation_date', '=', first_day), - ], limit=1) - - cop_leave = vacation_report.done_working_overtime * 8 if vacation_report else 0.0 - if cop_leave + rec.duration > 36 and not rec.is_thwg: - rec.overtime_hours = 0.0 - message = f'本月已加班时长已超过 36 小时' - raise ValidationError(message) + rec.overtime_hours = 0.0 + if not rec.users_id: + continue + now = datetime.now() # 获取当前时间(datetime类型) + first_datetime = datetime(now.year, now.month, 1, 0, 0, 0) + if now.month == 12: + next_month_datetime = datetime(now.year + 1, 1, 1, 0, 0, 0) else: - rec.overtime_hours = cop_leave + next_month_datetime = datetime(now.year, now.month + 1, 1, 0, 0, 0) + last_datetime = next_month_datetime - timedelta(seconds=1) + workflow_records = self.env['soong.workflow.record'].search([ + ('workflow_id.name', '=', '加班'), + ('create_uid', '=', rec.users_id.id), + ('approve_state', 'in', ['pending', 'end']), + ]) + total_overtime = 0.0 + for workflow in workflow_records: + related_model = self.env[workflow.res_model].browse(workflow.res_id) + start_time = related_model.start_time + if first_datetime <= start_time <= last_datetime: + if related_model.duration: + total_overtime += related_model.duration + + rec.overtime_hours = total_overtime + + @api.constrains('users_id') + def _check_overtime_hours(self): + if self.overtime_hours + self.duration > 36 and not self.is_thwg: + message = _('本月已加班时长已超过 36 小时') + raise ValidationError(message) @api.depends('start_time', 'end_time', 'attendance_id', 'rest_start_time', 'rest_end_time') def _compute_duration(self): @@ -407,31 +422,47 @@ class OvertimeApprovals(models.Model): @api.depends('start_time', 'end_time') def _compute_overtime_type(self): for record in self: + current_date = datetime.today() if record.start_time and record.end_time: if record.start_time > record.end_time: raise UserError("开始时间不能晚于结束时间") - start_date = fields.Datetime.from_string(record.start_time) - end_date = fields.Datetime.from_string(record.end_time) - current_year = (fields.Date.today() + timedelta(hours=8)).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) - public_holidays = self.env['resource.calendar.leaves'].search([("calendar_id.name", "=", "行政考勤工作日"), - ("date_from", ">=", query_start), - ("date_from", "<=", query_end)]) - for holiday in public_holidays: - holiday_start = fields.Datetime.from_string(holiday.date_from) - holiday_end = fields.Datetime.from_string(holiday.date_to) - if start_date <= holiday_end and end_date >= holiday_start: - record.type_overtime = 'holiday' - break + start_date = record.start_time.date() + current_year = current_date.year + original_year_start = datetime(current_year, 1, 1, 0, 0, 0) + original_year_end = datetime(current_year, 12, 31, 23, 59, 59) + query_start = original_year_start - timedelta(hours=8) + query_end = original_year_end - timedelta(hours=8) + calendar_leaves = self.env['resource.calendar.leaves'].sudo().search([ + ("calendar_id.name", "=", "行政考勤工作日"), + ("date_from", ">=", query_start), + ("date_from", "<=", query_end) + ]) + holidays_set = set() + shift_days_set = set() + statutory_set = set() + for leave in calendar_leaves: + if leave.holidays: + statutory_set.update(leave.holidays.split(',')) + if leave.alternate_rest_day: + holidays_set.update(leave.alternate_rest_day.split(',')) + if leave.shift_replacement_day: + shift_days_set.update(leave.shift_replacement_day.split(',')) + date_str = start_date.strftime('%m月%d日') + date_str = self.remove_leading_zero(date_str) + is_weekend = start_date.weekday() in [5, 6] + if date_str in statutory_set: + record.type_overtime = 'holiday' + elif date_str in holidays_set or is_weekend: + record.type_overtime = 'weekend' else: - if start_date.weekday() < 5 and end_date.weekday() < 5: # Not Saturday or Sunday - record.type_overtime = 'work' - elif start_date.weekday() >= 5 or end_date.weekday() >= 5: # Saturday or Sunday - record.type_overtime = 'weekend' - else: - record.type_overtime = False + record.type_overtime = 'work' + def remove_leading_zero(self, date_str): + month, day = date_str.split('月') + month = month.lstrip('0') + day = day.rstrip('日') + day = day.lstrip('0') + return f'{month}月{day}日' class OvertimeUserLine(models.Model): _name = 'overtime.user.line' diff --git a/yuthon_property/data/yuthon_new_property.xml b/yuthon_property/data/yuthon_new_property.xml index 45f249011..bdafe8453 100644 --- a/yuthon_property/data/yuthon_new_property.xml +++ b/yuthon_property/data/yuthon_new_property.xml @@ -1,6 +1,19 @@ + + 定时任务:更新物业管理信息 + + code + model.update_manage() + + + 1 + days + + -1 + + 定时任务:触发只显示最新物业方法 diff --git a/yuthon_property/models/yuthon_property.py b/yuthon_property/models/yuthon_property.py index 612f39ee6..8dfab6bb6 100644 --- a/yuthon_property/models/yuthon_property.py +++ b/yuthon_property/models/yuthon_property.py @@ -13,6 +13,7 @@ class YuthonProperty(models.Model): _order = 'first_letter' name = fields.Text(string="资产名称") + tax = fields.Float(string="税率", default=0.09) users_id = fields.Many2one('res.users', string="申请人", default=lambda self: self.env.user.id) code = fields.Char(string="物业编号", default=lambda self: self.env['ir.sequence'].next_by_code('yuthon_property_message_code')) referred_id = fields.Many2one('yuthon.lot.setting', string="地段") @@ -222,6 +223,11 @@ class YuthonProperty(models.Model): 'equity_area': latest_title.equity_area, }) + def update_manage(self): + property_ids = self.env['yuthon.property'].search([]) + for record in property_ids: + record.compute_information_fields() + @api.depends('manage_information_ids.start_time', 'manage_information_ids.end_date', 'manage_information_ids.precinct_id', 'manage_information_ids.tenure_type', 'manage_information_ids.management_area', 'manage_information_ids.rent_area', diff --git a/yuthon_property/views/yuthon_property_views.xml b/yuthon_property/views/yuthon_property_views.xml index fe94712b6..98253023d 100644 --- a/yuthon_property/views/yuthon_property_views.xml +++ b/yuthon_property/views/yuthon_property_views.xml @@ -72,6 +72,7 @@ + diff --git a/yuthon_property_approval/models/property_lease_contract.py b/yuthon_property_approval/models/property_lease_contract.py index 51a7d26df..19445b586 100644 --- a/yuthon_property_approval/models/property_lease_contract.py +++ b/yuthon_property_approval/models/property_lease_contract.py @@ -325,6 +325,28 @@ class PropertyLeaseContract(models.Model): employee_ids = fields.Many2many('hr.employee', string="当前经办人", compute='_compute_workflow') approve_state = fields.Selection([("start", "草稿"), ("pending", "审批中"), ("end", "结束")], string="审批状态", compute='_compute_workflow') + @api.onchange('term_start_time') + def onchange_lessor_id(self): + if not self.term_start_time: + return + if not self.lease_ids: + return + property_id = self.lease_ids[0].address_id.id + manage_line_domain = [ + ('yuthon_property_id', '=', property_id), + ('start_time', '<=', self.term_start_time), + '|', + ('end_date', '=', False), + ('end_date', '>=', self.term_start_time) + ] + manage_line = self.env['manage.information.line'].search( + manage_line_domain, + order='start_time desc', + limit=1 + ) + if manage_line and manage_line.company_id: + self.lessor_id = manage_line.company_id.id + @api.depends('code') def _compute_workflow(self): for record in self: @@ -2351,6 +2373,7 @@ class PropertyLeaseContractLine(models.Model): accounting_id = fields.Many2one('property.accounting.approval', string="关联建设工程委托监理合同审批") supervising_id = fields.Many2one('property.supervising.approval', string="关联建设工程施工合同审批") address_id = fields.Many2one('yuthon.property', string="物业地址") + tax = fields.Float(related='address_id.tax',string="税率") admin_line_id = fields.Many2one(related='address_id.admin_id', string="管理员", store=True) property_area = fields.Float(related='address_id.rent_area', string="可租面积", store=True) message_standard_id = fields.Many2one(related='address_id.message_standard_id', string="管理费标准", store=True) diff --git a/yuthon_property_approval/views/property_lease_contract.xml b/yuthon_property_approval/views/property_lease_contract.xml index 8fa3bd9a2..8440aa0f6 100644 --- a/yuthon_property_approval/views/property_lease_contract.xml +++ b/yuthon_property_approval/views/property_lease_contract.xml @@ -556,6 +556,7 @@ +