|
|
|
@ -5,6 +5,10 @@ from odoo import fields, models, api
|
|
|
|
|
from dateutil.relativedelta import relativedelta
|
|
|
|
|
from datetime import date
|
|
|
|
|
|
|
|
|
|
class GnCalendarEvent(models.Model):
|
|
|
|
|
_inherit = "calendar.event"
|
|
|
|
|
entretien_id = fields.Many2one("gn_payroll.hr.contract.entretien", string="Entretien professionnel associé")
|
|
|
|
|
|
|
|
|
|
class GnHrContract(models.Model):
|
|
|
|
|
_inherit = "hr.contract"
|
|
|
|
|
|
|
|
|
@ -15,7 +19,16 @@ class GnHrContract(models.Model):
|
|
|
|
|
updated_wage = fields.Integer(string="Salaire actualisé", compute='_get_updated_wage', readonly=True, store=True)
|
|
|
|
|
|
|
|
|
|
entretien_type_ids = fields.Many2many('gn_payroll.hr.contract.entretien.type', string="Catégories d'entretiens prévues au contrat")
|
|
|
|
|
entretien_sequence_number = fields.Integer(string="Entretien Sequence Number", default=0)
|
|
|
|
|
entretien_sequence_number = fields.Integer(string="Entretien Sequence Number", default=1)
|
|
|
|
|
|
|
|
|
|
entretien_ids = fields.One2many('gn_payroll.hr.contract.entretien', inverse_name='main_contract_id', string="Entretiens liés au contrat")
|
|
|
|
|
|
|
|
|
|
def update_entretiens_names(self):
|
|
|
|
|
for contract in self:
|
|
|
|
|
sequence_number = 1
|
|
|
|
|
for entretien in contract.entretien_ids.sorted('start'):
|
|
|
|
|
entretien.name = 'Entretien n°{}: {}'.format(sequence_number, entretien.type_id.name )
|
|
|
|
|
sequence_number += 1
|
|
|
|
|
|
|
|
|
|
@api.model
|
|
|
|
|
def _get_groups_selection(self):
|
|
|
|
@ -51,6 +64,7 @@ class GnHrContract(models.Model):
|
|
|
|
|
'main_contract_id': contract.id,
|
|
|
|
|
'type_id': entretien_type.id,
|
|
|
|
|
})
|
|
|
|
|
contract.entretien_sequence_number += 1
|
|
|
|
|
return contract
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -66,7 +80,7 @@ class EntretienType(models.Model):
|
|
|
|
|
generate_subcontract = fields.Boolean("Génère la création d'un avenant au contrat")
|
|
|
|
|
parent_id = fields.Many2one('gn_payroll.hr.contract.entretien.type', string="Type d'entretien parent", ondelete="cascade")
|
|
|
|
|
child_ids = fields.One2many('gn_payroll.hr.contract.entretien.type', 'parent_id', string="Types d'entretien enfants")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@api.constrains('parent_id')
|
|
|
|
|
def _check_parent_id(self):
|
|
|
|
@ -107,24 +121,54 @@ class Entretien(models.Model):
|
|
|
|
|
ref = fields.Char(string="Référence", readonly=True)
|
|
|
|
|
name = fields.Char(string="Titre", readonly=True)
|
|
|
|
|
employee_id = fields.Many2one('hr.employee', string="Employé", required=True)
|
|
|
|
|
interviewer_ids = fields.Many2many('hr.employee', string="Participants à l'entretien", required=True)
|
|
|
|
|
interviewer_ids = fields.Many2many('hr.employee', string="Participants à l'entretien")
|
|
|
|
|
main_contract_id = fields.Many2one('hr.contract', string = "Contrat concerné", required=True)
|
|
|
|
|
running_contract_id = fields.Many2one('hr.contract', string="Avenant concerné")
|
|
|
|
|
generated_contract_id = fields.Many2one('hr.contract', string="Avenant généré")
|
|
|
|
|
|
|
|
|
|
type_id = fields.Many2one('gn_payroll.hr.contract.entretien.type', string="Type d'entretien", required=True)
|
|
|
|
|
first_date = fields.Date(string="Premier entretien", compute='_compute_first_date', store=True)
|
|
|
|
|
date = fields.Datetime(string="Date et heure de l'entretien", required=True, default=fields.Date.today())
|
|
|
|
|
next_date = fields.Date(string="Date du prochain entretien", compute='_compute_next_entretien_date', store=True)
|
|
|
|
|
|
|
|
|
|
report = fields.Html(string="Compte-rendu")
|
|
|
|
|
event_ids = fields.One2many('calendar.event', 'entretien_id')
|
|
|
|
|
event_id = fields.Many2one('calendar.event', string="Rendez-vous programmé", compute='compute_event', inverse='event_inverse')
|
|
|
|
|
start = fields.Datetime("Date et heure du rendez-vous", compute='_get_date_from_event', store=True)
|
|
|
|
|
|
|
|
|
|
def update_main_contract(self):
|
|
|
|
|
for entretien in self:
|
|
|
|
|
if entretien['main_contract_id']:
|
|
|
|
|
contract = self.env['hr.contract'].browse(entretien['main_contract_id'].id)
|
|
|
|
|
contract.update_entretiens_names()
|
|
|
|
|
|
|
|
|
|
@api.depends('event_ids')
|
|
|
|
|
def compute_event(self):
|
|
|
|
|
if len(self.event_ids) > 0:
|
|
|
|
|
self.event_id = self.event_ids[0]
|
|
|
|
|
|
|
|
|
|
def event_inverse(self):
|
|
|
|
|
if len(self.event_ids) > 0:
|
|
|
|
|
# delete previous reference
|
|
|
|
|
event = self.env['calendar.event'].browse(self.event_ids[0].id)
|
|
|
|
|
event.entretien_id = False
|
|
|
|
|
# set new reference
|
|
|
|
|
self.event_id.entretien_id = self
|
|
|
|
|
|
|
|
|
|
@api.depends('event_id.start')
|
|
|
|
|
def _get_date_from_event(self):
|
|
|
|
|
for entretien in self:
|
|
|
|
|
if entretien.event_id and entretien.event_id.start:
|
|
|
|
|
entretien.start = entretien.event_id.start
|
|
|
|
|
else:
|
|
|
|
|
entretien.start = entretien.first_date
|
|
|
|
|
self.update_main_contract()
|
|
|
|
|
|
|
|
|
|
@api.depends('type_id.start_point', 'type_id.month_delay')
|
|
|
|
|
def _compute_first_date(self):
|
|
|
|
|
for entretien in self:
|
|
|
|
|
if entretien.type_id and entretien.type_id.start_point:
|
|
|
|
|
start_point = entretien.type_id.start_point
|
|
|
|
|
if start_point == "contrat" and entretien.main_contract_id.date_start and entretien.type_id.month_delay:
|
|
|
|
|
if start_point == "contract" and entretien.main_contract_id.date_start and entretien.type_id.month_delay:
|
|
|
|
|
contract_start_date = fields.Date.from_string(entretien.main_contract_id.date_start)
|
|
|
|
|
entretien.first_date = contract_start_date + relativedelta(months=+entretien.type_id.month_delay)
|
|
|
|
|
elif start_point == "endofyear":
|
|
|
|
@ -143,11 +187,20 @@ class Entretien(models.Model):
|
|
|
|
|
|
|
|
|
|
@api.model
|
|
|
|
|
def create(self, vals):
|
|
|
|
|
result = super(Entretien, self).create(vals)
|
|
|
|
|
|
|
|
|
|
# Generate a sequence number for the name field
|
|
|
|
|
if not vals.get('ref'):
|
|
|
|
|
vals['ref'] = self.env['ir.sequence'].next_by_code('gn_payroll.hr.contract.entretien') or _('New')
|
|
|
|
|
contract = self.env['hr.contract'].browse(vals['main_contract_id'])
|
|
|
|
|
entretien_type = self.env['gn_payroll.hr.contract.entretien.type'].browse(vals['type_id'])
|
|
|
|
|
vals['name'] = 'Entretien n°{}: {}'.format(contract.entretien_sequence_number, entretien_type.name )
|
|
|
|
|
result = super(Entretien, self).create(vals)
|
|
|
|
|
|
|
|
|
|
# Fetch contract to regenerated associated entretiens names
|
|
|
|
|
if vals.get('main_contract_id'):
|
|
|
|
|
contract = self.env['hr.contract'].browse(vals['main_contract_id'])
|
|
|
|
|
contract.update_entretiens_names()
|
|
|
|
|
|
|
|
|
|
if vals.get('event_id'):
|
|
|
|
|
existing_entretien = self.search([('event_id', '=', vals['event_id'])], limit=1)
|
|
|
|
|
if existing_entretien:
|
|
|
|
|
raise ValidationError("An entretien is already associated with this event.")
|
|
|
|
|
|
|
|
|
|
return result
|