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_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_contract | 16.0.0.0.6 | Amendements to Hr Contracts |
| gn_contract | 16.0.0.0.7 | Amendements to Hr Contracts |
## ToDo

@ -10,6 +10,8 @@ Module de gestion des avenants aux contrats
## 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):
- Ongoing work for dates and status management for contracts
- v16.0.0.0.5 (2024/03/19):

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

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

@ -2,17 +2,35 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from datetime import timedelta
from odoo import fields, models, api
from odoo import fields, models, api, _
from odoo.exceptions import ValidationError
from odoo.osv import expression
from pytz import timezone
import logging
_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):
_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")
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")
@ -21,15 +39,47 @@ class GnHrContract(models.Model):
@api.constrains('date_validity_start', 'date_validity_end', 'date_start', 'date_end')
def _check_dates_validity(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")
if record.date_end:
if record.date_end and record.date_validity_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")
if record.date_validity_start and 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é")
@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')
def _compute_lineage_sequence_number(self):
for contract in self:

@ -20,6 +20,7 @@
<xpath expr="//field[@name='date_end']" position="after">
<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="is_unique"/>
</xpath>
<header>
<button name="create_child_contract" type="object" string="Créer un avenant" class="oe_highlight"/>

Loading…
Cancel
Save