inherit HrContractType to allow overlapping for some types of contracts

16-contract-dev
Florian Roger 6 months ago
parent 58808f5176
commit 7a3563f11d

@ -11,7 +11,7 @@ Addons for Odoo 16.
| gn_cc | 16.0.0.0.2 | Configuration for French convention collective, with data for IDCC3442 | | gn_cc | 16.0.0.0.2 | Configuration for French convention collective, with data for IDCC3442 |
| gn_holidays | 16.0.0.0.1 | French configuration for Publics Holidays and Leave Management | | gn_holidays | 16.0.0.0.1 | French configuration for Publics Holidays and Leave Management |
| gn_career | 16.0.0.0.11 | Fiche de poste et évolution de carrière | | gn_career | 16.0.0.0.11 | Fiche de poste et évolution de carrière |
| gn_contract | 16.0.0.0.6 | Amendements to Hr Contracts | | gn_contract | 16.0.0.0.7 | Amendements to Hr Contracts |
## ToDo ## ToDo

@ -10,6 +10,8 @@ Module de gestion des avenants aux contrats
## Changelog ## Changelog
- v16.0.0.0.7 (2024/03/22):
- inherit HrContractType to allow overlapping for some types of contracts
- v16.0.0.0.6 (2024/03/20): - v16.0.0.0.6 (2024/03/20):
- Ongoing work for dates and status management for contracts - Ongoing work for dates and status management for contracts
- v16.0.0.0.5 (2024/03/19): - v16.0.0.0.5 (2024/03/19):

@ -1,6 +1,6 @@
{ {
"name": "Gestion des Contrats: Typologie et Gestion des Avenants", "name": "Gestion des Contrats: Typologie et Gestion des Avenants",
"version": "16.0.0.0.6", "version": "16.0.0.0.7",
"category": "HR", "category": "HR",
"summary": "Permet de relier entre eux les contrats", "summary": "Permet de relier entre eux les contrats",
"author": "Le Garage Numérique", "author": "Le Garage Numérique",

@ -24,15 +24,19 @@
</record> </record>
<record id="gn_contract_contract_cae" model="hr.contract.type"> <record id="gn_contract_contract_cae" model="hr.contract.type">
<field name="name">PEC - CAE</field> <field name="name">PEC - CAE</field>
<field name="is_unique" eval="True"></field>
</record> </record>
<record id="gn_contract_contract_apprentissage" model="hr.contract.type"> <record id="gn_contract_contract_apprentissage" model="hr.contract.type">
<field name="name">Contrat d'apprentissage</field> <field name="name">Contrat d'apprentissage</field>
<field name="is_unique" eval="True"></field>
</record> </record>
<record id="gn_contract_contract_cdd" model="hr.contract.type"> <record id="gn_contract_contract_cdd" model="hr.contract.type">
<field name="name">CDD</field> <field name="name">CDD</field>
<field name="is_unique" eval="True"></field>
</record> </record>
<record id="gn_contract_contract_cdi" model="hr.contract.type"> <record id="gn_contract_contract_cdi" model="hr.contract.type">
<field name="name">CDI</field> <field name="name">CDI</field>
<field name="is_unique" eval="True"></field>
</record> </record>
<record id="gn_contract_contract_service_civique" model="hr.contract.type"> <record id="gn_contract_contract_service_civique" model="hr.contract.type">
<field name="name">Service civique</field> <field name="name">Service civique</field>

@ -2,17 +2,35 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details. # Part of Odoo. See LICENSE file for full copyright and licensing details.
from datetime import timedelta from datetime import timedelta
from odoo import fields, models, api from odoo import fields, models, api, _
from odoo.exceptions import ValidationError from odoo.exceptions import ValidationError
from odoo.osv import expression
from pytz import timezone from pytz import timezone
import logging import logging
_logger = logging.getLogger(__name__) _logger = logging.getLogger(__name__)
class GnHrContractType(models.Model):
_inherit = "hr.contract.type"
is_unique = fields.Boolean(string="Un seul contrat à la fois", default=False)
# @api.constrains(is_unique)
# def _check_unicity(self):
# if any(record.is_unique for record in self):
# Contract = self.env['hr.contract']
# for record in self.filtered('is_unique'):
# contracts = Contract.search([
# ('type_id', '=', record.id),
# ('state', 'in', ['open', 'pending'])
# ])
class GnHrContract(models.Model): class GnHrContract(models.Model):
_inherit = "hr.contract" _inherit = "hr.contract"
is_unique = fields.Boolean(string="Un seul contrat à la fois", related='contract_type_id.is_unique')
previous_contract_id = fields.Many2one("hr.contract", string="Contrat précédent") previous_contract_id = fields.Many2one("hr.contract", string="Contrat précédent")
date_validity_start = fields.Date(string="Date de prise en compte de l'avenant") date_validity_start = fields.Date(string="Date de prise en compte de l'avenant")
date_validity_end = fields.Date(string="Fin de prise en compte de l'avenant") date_validity_end = fields.Date(string="Fin de prise en compte de l'avenant")
@ -21,15 +39,47 @@ class GnHrContract(models.Model):
@api.constrains('date_validity_start', 'date_validity_end', 'date_start', 'date_end') @api.constrains('date_validity_start', 'date_validity_end', 'date_start', 'date_end')
def _check_dates_validity(self): def _check_dates_validity(self):
for record in self: for record in self:
if record.date_validity_start < record.date_start: if record.date_validity_start and record.date_validity_start < record.date_start:
raise ValidationError("La date de début de validité de l'avenant ne peut être antérieure à la date de début du contrat") raise ValidationError("La date de début de validité de l'avenant ne peut être antérieure à la date de début du contrat")
if record.date_end: if record.date_end and record.date_validity_end:
if record.date_validity_end > record.date_end: if record.date_validity_end > record.date_end:
raise ValidationError("La date de fin de validité de l'avenant ne peut être postérieur à la date de fin du contrat") raise ValidationError("La date de fin de validité de l'avenant ne peut être postérieur à la date de fin du contrat")
if record.date_validity_start and record.date_validity_end: if record.date_validity_start and record.date_validity_end:
if record.date_validity_start > record.date_validity_end: if record.date_validity_start > record.date_validity_end:
raise ValidationError("La date de fin de valididité de l'avenant ne peut être antérieure à la date de début de validité") raise ValidationError("La date de fin de valididité de l'avenant ne peut être antérieure à la date de début de validité")
@api.constrains('employee_id', 'state', 'kanban_state', 'date_start', 'date_end', 'is_unique')
def _check_current_contract(self):
""" Two contracts in state [incoming | open | close] cannot overlap """
for contract in self.filtered(lambda c: c.is_unique and (c.state not in ['draft', 'cancel'] or c.state == 'draft' and c.kanban_state == 'done') and c.employee_id):
domain = [
('id', '!=', contract.id),
('employee_id', '=', contract.employee_id.id),
('company_id', '=', contract.company_id.id),
('is_unique', '=', True),
'|',
('state', 'in', ['open', 'close']),
'&',
('state', '=', 'draft'),
('kanban_state', '=', 'done') # replaces incoming
]
if not contract.date_end:
start_domain = []
end_domain = ['|', ('date_end', '>=', contract.date_start), ('date_end', '=', False)]
else:
start_domain = [('date_start', '<=', contract.date_end)]
end_domain = ['|', ('date_end', '>', contract.date_start), ('date_end', '=', False)]
domain = expression.AND([domain, start_domain, end_domain])
if self.search_count(domain):
raise ValidationError(
_(
'An employee can only have one contract at the same time. (Excluding Draft and Cancelled contracts).\n\nEmployee: %(employee_name)s',
employee_name=contract.employee_id.name
)
)
@api.depends('previous_contract_id') @api.depends('previous_contract_id')
def _compute_lineage_sequence_number(self): def _compute_lineage_sequence_number(self):
for contract in self: for contract in self:

@ -20,6 +20,7 @@
<xpath expr="//field[@name='date_end']" position="after"> <xpath expr="//field[@name='date_end']" position="after">
<field name="date_end" attrs="{'readonly': [('previous_contract_id', '!=', False), ('date_end', '=', False)]}"/> <field name="date_end" attrs="{'readonly': [('previous_contract_id', '!=', False), ('date_end', '=', False)]}"/>
<field name="date_validity_end" attrs="{'invisible': [('previous_contract_id', '=', False)]}"/> <field name="date_validity_end" attrs="{'invisible': [('previous_contract_id', '=', False)]}"/>
<field name="is_unique"/>
</xpath> </xpath>
<header> <header>
<button name="create_child_contract" type="object" string="Créer un avenant" class="oe_highlight"/> <button name="create_child_contract" type="object" string="Créer un avenant" class="oe_highlight"/>

Loading…
Cancel
Save