open-synergy/opnsynid-hr

View on GitHub
hr_timesheet_attendance_schedule/models/hr_attendance.py

Summary

Maintainability
D
3 days
Test Coverage
# -*- coding: utf-8 -*-
# Copyright 2018 OpenSynergy Indonesia
# Copyright 2020 PT. Simetri Sinergi Indonesia
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).

from dateutil.relativedelta import relativedelta
from openerp import _, api, fields, models
from openerp.exceptions import Warning as UserError


class HrAttendance(models.Model):
    _inherit = "hr.attendance"

    @api.multi
    @api.depends("name")
    def _compute_schedule(self):
        obj_schedule = self.env["hr.timesheet_attendance_schedule"]
        for attn in self:
            company = attn.employee_id.company_id
            early_buffer = fields.Datetime.from_string(attn.name) + relativedelta(
                hours=company.early_attendance_buffer
            )
            early_buffer = fields.Datetime.to_string(early_buffer)
            late_buffer = fields.Datetime.from_string(attn.name) + relativedelta(
                hours=-company.late_attendance_buffer
            )
            late_buffer = fields.Datetime.to_string(late_buffer)

            criteria = [
                ("employee_id", "=", attn.employee_id.id),
                ("date_start", "<=", early_buffer),
                ("date_end", ">=", late_buffer),
            ]
            schedules = obj_schedule.search(criteria, limit=1)
            attn.schedule_id = schedules[0].id if len(schedules) > 0 else False

    schedule_id = fields.Many2one(
        string="Attendance Schedule",
        comodel_name="hr.timesheet_attendance_schedule",
        compute="_compute_schedule",
        store=True,
    )

    @api.constrains(
        "schedule_id",
    )
    def _check_att_sign_in_out(self):
        for document in self:
            company = document.employee_id.company_id

            if not document.schedule_id:
                continue

            if company.max_att_sign_in > 0:
                len_att_sign_in = len(
                    document.schedule_id.attendance_ids.filtered(
                        lambda x: x.action == "sign_in"
                    )
                )
                if len_att_sign_in > company.max_att_sign_in:
                    msg = _(
                        "Total Sign In has reached maximum " "attempts per schedule"
                    )
                    raise UserError(msg)

            if company.max_att_sign_out > 0:
                len_att_sign_out = len(
                    document.schedule_id.attendance_ids.filtered(
                        lambda x: x.action == "sign_out"
                    )
                )
                if len_att_sign_out > company.max_att_sign_out:
                    msg = _(
                        "Total Sign Out has reached maximum " "attempts per schedule"
                    )
                    raise UserError(msg)