Skip to content
Snippets Groups Projects
cgscop_timesheet_sheet.py 4.51 KiB
Newer Older
  • Learn to ignore specific revisions
  • # © 2020 Le Filament (<http://www.le-filament.com>)
    # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
    
    from odoo import models, fields, api
    from odoo.exceptions import UserError, ValidationError
    
    
    class ScopHrTimesheetSheet(models.Model):
        _name = "cgscop.timesheet.sheet"
        _inherit = ['mail.thread', 'mail.activity.mixin']
        _description = "Timesheet Report"
        _order = "create_date desc, validation_date desc, id desc"
    
        def _default_ur(self):
            return self.env['res.company']._ur_default_get()
    
        name = fields.Char('Nom', required=True)
        timesheet_line_ids = fields.One2many(
            comodel_name='account.analytic.line',
            inverse_name='sheet_id',
            string='Lignes de temps',
            states={'valid': [('readonly', True)]},
            copy=False)
        state = fields.Selection([
            ('draft', 'Brouillon'),
            ('submit', 'Soumis'),
            ('valid', 'Validé')],
            string='Statut',
            index=True,
            track_visibility='onchange',
            copy=False,
            default='draft',
            required=True)
        employee_id = fields.Many2one(
            comodel_name='hr.employee',
            string="Employé",
            required=True,
            readonly=True,
            states={'draft': [('readonly', False)]},
            default=lambda self: self.env['hr.employee'].search(
                [('user_id', '=', self.env.uid)], limit=1))
        total_hour = fields.Float(
            string='Total',
            compute='_compute_hour',
            store=True)
        company_id = fields.Many2one(
            comodel_name='res.company',
            string='Company',
            readonly=True,
            states={'draft': [('readonly', False)]},
            default=lambda self: self.env.user.company_id)
        validation_date = fields.Date("Date de validation")
        submit_date = fields.Date("Soumis le")
        ur_id = fields.Many2one(
            'union.regionale',
            string='Union Régionale',
            index=True,
            on_delete='restrict',
            default=_default_ur)
        can_edit = fields.Boolean('Can Reset', compute='_compute_can_reset')
    
        # ------------------------------------------------------
        # Compute Functions
        # ------------------------------------------------------
        @api.depends(
            'timesheet_line_ids',
            'timesheet_line_ids.unit_amount')
        def _compute_hour(self):
            for sheet in self:
                sheet.total_hour = sum(
                    sheet.timesheet_line_ids.mapped('unit_amount'))
    
        @api.multi
        def _compute_can_reset(self):
            is_timesheet_user = self.user_has_groups(
                'hr_timesheet.group_timesheet_manager')
            for sheet in self:
                if sheet.state == 'draft' or is_timesheet_user:
                    sheet.can_edit = True
                else:
                    sheet.can_edit = False
    
        # ------------------------------------------------------
        # Constain Functions
        # ------------------------------------------------------
        @api.constrains('timesheet_line_ids', 'employee_id')
        def _check_employee(self):
            for sheet in self:
                employee_ids = sheet.timesheet_line_ids.mapped('employee_id')
                if len(employee_ids) > 1 or (len(employee_ids) == 1 and employee_ids != sheet.employee_id):
                    raise ValidationError(
                        'Vous ne pouvez pas ajouter les lignes'
                        ' de temps de plusieurs employés.')
    
        # ------------------------------------------------------
        # Override ORM
        # ------------------------------------------------------
        @api.multi
        def unlink(self):
            for timesheet in self:
                if timesheet.state in ['submit', 'valid']:
                    raise UserError('Vous ne pouvez pas supprimer une '
                                    'feuille de temps soumise ou validée')
            super(ScopHrTimesheetSheet, self).unlink()
    
        # ------------------------------------------------------
        # Action button
        # ------------------------------------------------------
        @api.multi
        def action_submit_timesheet(self):
            self.write({
                'state': 'submit',
                'submit_date': fields.Date.today()})
    
        @api.multi
        def approve_timesheet_sheets(self):
            self.write({
                'state': 'valid',
                'validation_date': fields.Date.today()})
    
        @api.multi
        def reset_timesheet_sheets(self):
            self.write({
                'state': 'draft',
                'submit_date': False,
                'validation_date': False})
    
        def print_timesheet(self):
            return self.env.ref(
                'cgscop_timesheet.cgscop_timesheet_sheet_report').report_action(self)