Debug entretiens creation, Closes #5, #6

16-payroll-cc-dev
Florian Roger 7 months ago
parent 230521005d
commit 8e8d04ad27

@ -27,5 +27,5 @@ Addons for Odoo 16.
### Minor
- [] In gn_payroll_contract.py, class Entretien, need compute rule for "absence" start_point in entretien.type model (cf issue #3)
- [] compute contract.cc_id from contract.company_id.cc (cf issue #4)
- [] debug entretien start date on creation (cf issue #5)
- [] debug numérotation des entretiens par salarié on creation (cf issue #6)
- [x] debug entretien start date on creation (cf issue #5)
- [x] debug numérotation des entretiens par salarié on creation (cf issue #6)

@ -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

@ -16,13 +16,11 @@
<field name="employee_id"/>
<field name="interviewer_ids"/>
<field name="first_date"/>
<field name="date"/>
<field name="next_date"/>
<field name="main_contract_id"/>
<field name="running_contract_id"/>
<field name="generated_contract_id"/>
<field name="type_id"/>
<field name="next_date"/>
<field name="report"/>
</group>
</sheet>

Loading…
Cancel
Save