75 lines
3.7 KiB
Python
75 lines
3.7 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from odoo import fields, models
|
|
from odoo.osv.expression import OR
|
|
|
|
|
|
class ResCompany(models.Model):
|
|
_inherit = 'res.company'
|
|
|
|
hr_attendance_overtime = fields.Boolean(string="Count Extra Hours")
|
|
overtime_start_date = fields.Date(string="Extra Hours Starting Date")
|
|
overtime_company_threshold = fields.Integer(string="Tolerance Time In Favor Of Company", default=0)
|
|
overtime_employee_threshold = fields.Integer(string="Tolerance Time In Favor Of Employee", default=0)
|
|
|
|
attendance_kiosk_mode = fields.Selection([
|
|
('barcode', 'Barcode / RFID'),
|
|
('barcode_manual', 'Barcode / RFID and Manual Selection'),
|
|
('manual', 'Manual Selection'),
|
|
], string='Attendance Mode', default='barcode_manual')
|
|
attendance_barcode_source = fields.Selection([
|
|
('scanner', 'Scanner'),
|
|
('front', 'Front Camera'),
|
|
('back', 'Back Camera'),
|
|
], string='Barcode Source', default='front')
|
|
attendance_kiosk_delay = fields.Integer(default=10)
|
|
|
|
def write(self, vals):
|
|
search_domain = False # Overtime to generate
|
|
delete_domain = False # Overtime to delete
|
|
|
|
overtime_enabled_companies = self.filtered('hr_attendance_overtime')
|
|
# Prevent any further logic if we are disabling the feature
|
|
is_disabling_overtime = False
|
|
# If we disable overtime
|
|
if 'hr_attendance_overtime' in vals and not vals['hr_attendance_overtime'] and overtime_enabled_companies:
|
|
delete_domain = [('company_id', 'in', overtime_enabled_companies.ids)]
|
|
vals['overtime_start_date'] = False
|
|
is_disabling_overtime = True
|
|
|
|
start_date = vals.get('hr_attendance_overtime') and vals.get('overtime_start_date')
|
|
# Also recompute if the threshold have changed
|
|
if not is_disabling_overtime and (
|
|
start_date or 'overtime_company_threshold' in vals or 'overtime_employee_threshold' in vals):
|
|
for company in self:
|
|
# If we modify the thresholds only
|
|
if start_date == company.overtime_start_date and \
|
|
(vals.get('overtime_company_threshold') != company.overtime_company_threshold) or\
|
|
(vals.get('overtime_employee_threshold') != company.overtime_employee_threshold):
|
|
search_domain = OR([search_domain, [('employee_id.company_id', '=', company.id)]])
|
|
# If we enabled the overtime with a start date
|
|
elif not company.overtime_start_date and start_date:
|
|
search_domain = OR([search_domain, [
|
|
('employee_id.company_id', '=', company.id),
|
|
('check_in', '>=', start_date)]])
|
|
# If we move the start date into the past
|
|
elif start_date and company.overtime_start_date > start_date:
|
|
search_domain = OR([search_domain, [
|
|
('employee_id.company_id', '=', company.id),
|
|
('check_in', '>=', start_date),
|
|
('check_in', '<=', company.overtime_start_date)]])
|
|
# If we move the start date into the future
|
|
elif start_date and company.overtime_start_date < start_date:
|
|
delete_domain = OR([delete_domain, [
|
|
('company_id', '=', company.id),
|
|
('date', '<', start_date)]])
|
|
|
|
res = super().write(vals)
|
|
if delete_domain:
|
|
self.env['hr.attendance.overtime'].search(delete_domain).unlink()
|
|
if search_domain:
|
|
self.env['hr.attendance'].search(search_domain)._update_overtime()
|
|
|
|
return res
|