Newer
Older
# © 2019 Le Filament (<http://www.le-filament.com>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).

Benjamin - Le Filament
committed
from datetime import datetime, time

Benjamin - Le Filament
committed
from odoo.exceptions import UserError, ValidationError
class ScopHrTimesheet(models.Model):
_inherit = "account.analytic.line"
def _default_ur(self):
return self.env['res.company']._ur_default_get()
partner_id = fields.Many2one(required=True)
# New fields
cgscop_timesheet_code_id = fields.Many2one(
related='project_id.cgscop_timesheet_code_id',
store=True)
ur_financial_system_id = fields.Many2one(
comodel_name='ur.financial.system',
string='Dispositif Financier')

Benjamin - Le Filament
committed
ur_regional_convention_id = fields.Many2one(
comodel_name='ur.regional.convention',
string='Convention Régionale')
ur_id = fields.Many2one(
'union.regionale',
string='Union Régionale',
index=True,

Benjamin - Le Filament
committed
sheet_id = fields.Many2one(
comodel_name='cgscop.timesheet.sheet',
string="Feuille de temps",
readonly=True,
copy=False)
state = fields.Selection([
('to_report', 'A rapporter'),

Benjamin - Le Filament
committed
('draft', 'Brouillon'),
('submit', 'Soumis'),
('valid', 'Validé')],
compute='_compute_state',
string='Statut',
copy=False,
index=True,
readonly=True,
store=True,)

Benjamin - Le Filament
committed
ur_financial_system_nb = fields.Integer(
string="Nb Dispositifs Financiers",
compute="_compute_ur_system_nb")
ur_regional_convention_nb = fields.Integer(
string="Nb conventions régionales",
compute="_compute_ur_system_nb")
is_present = fields.Boolean("Présentiel")
justificatifs = fields.Char(
string="Justificatifs",
required=False)

Benjamin - Le Filament
committed
# ------------------------------------------------------
# Compute Functions
# ------------------------------------------------------

Benjamin - Le Filament
committed
@api.depends('ur_id')
def _compute_ur_system_nb(self):

Benjamin - Le Filament
committed
for timesheet in self:

Benjamin - Le Filament
committed
# Calcul nombre de dispositifs financiers

Benjamin - Le Filament
committed
financial_system = timesheet.env['ur.financial.system'].search([
('ur_id', '=', timesheet.ur_id.id)])
timesheet.ur_financial_system_nb = len(

Benjamin - Le Filament
committed
financial_system)
# Calcul nombre de conventions

Benjamin - Le Filament
committed
regional_convention = timesheet.env['ur.regional.convention'].search([
('ur_id', '=', timesheet.ur_id.id)])
timesheet.ur_regional_convention_nb = len(

Benjamin - Le Filament
committed
regional_convention)

Benjamin - Le Filament
committed
@api.depends('sheet_id', 'sheet_id.state')
def _compute_state(self):
for timesheet in self:
if not timesheet.sheet_id:
timesheet.state = "to_report"

Benjamin - Le Filament
committed
else:
timesheet.state = timesheet.sheet_id.state
# ------------------------------------------------------
# OnChange Functions
# ------------------------------------------------------
@api.onchange('project_id')
def onchange_project_id(self):
self.partner_id = self.project_id.partner_id

Benjamin - Le Filament
committed

Benjamin - Le Filament
committed
@api.onchange('partner_id')
def onchange_partner_id(self):
# affiche le Dispositif Financier par défaut sur la LdT
# si il n'y a pas de date limite du dispositif
# ou si la date de la Ldt est inférieure à la date limite du dispositif

Benjamin - Le Filament
committed
if not self.partner_id.ur_financial_system_date or \
self.date <= self.partner_id.ur_financial_system_date:

Benjamin - Le Filament
committed
self.ur_financial_system_id = self.partner_id.ur_financial_system_id
# affiche la Convention par défaut sur la LdT
# si il n'y a pas de date limite de la convention
# ou si la date de la LdT est inférieure à la date limite de la convention

Benjamin - Le Filament
committed
if not self.partner_id.ur_regional_convention_date or \
self.date <= self.partner_id.ur_regional_convention_date:
self.ur_regional_convention_id = self.partner_id.\
ur_regional_convention_id

Benjamin - Le Filament
committed

Benjamin - Le Filament
committed
# ------------------------------------------------------
# Contrains
# ------------------------------------------------------
@api.constrains('unit_amount')
def _check_hours(self):
for record in self:
lines = self.search([
('date', '=', record.date),
('employee_id', '=', record.employee_id.id)])
total = sum(lines.mapped('unit_amount'))
if (not self.env.user.company_id.day_working
and total > self.env.user.company_id.day_duration):

Benjamin - Le Filament
committed
raise ValidationError(
"Vous ne pouvez imputer plus de %sh sur la même journée.\n"
"Journée du %s" % (
self.env.user.company_id.day_duration,
record.date.strftime("%d/%m/%Y")))

Benjamin - Le Filament
committed

Benjamin - Le Filament
committed
@api.constrains('date')
def _check_weekday(self):
for line in self:
dt = datetime.combine(line.date, time(12, 00))
holiday = self.env['resource.calendar.leaves'].search([

Benjamin - Le Filament
committed
'|',
('company_id', '=', False),

Benjamin - Le Filament
committed
('company_id', '=', self.env.user.company_id.id),
('date_from', '<=', dt),
('date_to', '>=', dt),
])
if line.date.weekday() in (5, 6) or holiday:
raise ValidationError(
"Vous ne pouvez imputer du temps sur un weekend "

Benjamin - Le Filament
committed
"ou un jour férié.")

Benjamin - Le Filament
committed
# ------------------------------------------------------
# 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 '
'ligne de temps soumise ou validée')
super(ScopHrTimesheet, self).unlink()

Benjamin - Le Filament
committed
# ------------------------------------------------------
# Actions
# ------------------------------------------------------
@api.multi
def action_submit_timesheet_lines(self):

Benjamin - Le Filament
committed
"""
Crée une feuille de temps avec les lignes sélectionnées
"""
if any(time.state != 'to_report' or time.sheet_id for time in self):

Benjamin - Le Filament
committed
raise UserError(
"Vous ne pouvez pas insérer 2 fois la même ligne !")
if len(self.mapped('employee_id')) != 1:
raise UserError(
"Il ne peut y avoir plusieurs employés dans une "
"même feuille de temps.")
return {
'name': 'New Expense Report',
'type': 'ir.actions.act_window',
'view_mode': 'form',
'res_model': 'cgscop.timesheet.sheet',
'target': 'current',
'context': {
'default_timesheet_line_ids': self.ids,
'default_employee_id': self[0].employee_id.id,
'default_name': self[0].name if len(self) == 1 else ''
}
}