# © 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)