Ongoing work for dates and status management for contracts

This commit is contained in:
Florian du Garage Num 2024-03-20 21:18:56 +01:00
parent 7b071d7935
commit 58808f5176
4 changed files with 48 additions and 8 deletions

View File

@ -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.4 | Amendements to Hr Contracts |
| gn_contract | 16.0.0.0.6 | Amendements to Hr Contracts |
## ToDo

View File

@ -10,6 +10,8 @@ Module de gestion des avenants aux contrats
## Changelog
- 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):
- Remove next_contract_id and related_contract_ids as it is a nightmare to recompute and avid possible infinite loop. We already have contract's history view per employee.
- v16.0.0.0.4 (2024/03/13):

View File

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

View File

@ -3,6 +3,7 @@
from datetime import timedelta
from odoo import fields, models, api
from odoo.exceptions import ValidationError
from pytz import timezone
import logging
@ -17,6 +18,18 @@ class GnHrContract(models.Model):
date_validity_end = fields.Date(string="Fin de prise en compte de l'avenant")
lineage_sequence_number = fields.Integer(string="Numéro de séquence dans l'historique du salarié", compute='_compute_lineage_sequence_number', store=True)
@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:
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_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.depends('previous_contract_id')
def _compute_lineage_sequence_number(self):
for contract in self:
@ -27,12 +40,6 @@ class GnHrContract(models.Model):
else:
contract.lineage_sequence_number = 0
@api.onchange('date_validity_end')
def update_state(self):
for record in self:
if record.date_validity_end <= fields.Date.context_today(self):
record.state = 'cancel'
def create_child_contract(self):
self.ensure_one()
default_vals = {
@ -97,6 +104,37 @@ class GnHrContract(models.Model):
'target': 'current',
}
@api.onchange('date_validity_start', 'date_validity_end')
def update_state(self):
for record in self:
# Cancel past contracts
if record.date_validity_end and record.date_validity_end < fields.Date.context_today(self):
record.state = 'cancel'
# Open actual contracts:
# - if date_validity_start is in the paste
# - AND :
# - date_validity_end is in the future
# - OR: not date_validity_end but date_end is in the future
if record.date_validity_start and record.date_validity_start < fields.Date.context_today(self) \
and ((not record.date_validity_end or record.date_validity_end > fields.Date.context_today(self)) \
or (not record.date_validity_end and record.date_end and record.date_end > fields.Date.context_today(self))):
record.state = 'open'
def scheduled_update_contract_states(self):
today = fields.Date.context_today(self)
contracts = self.search([
'|',
'&', ('date_validity_start', '<=', today), ('date_validity_end', '>', today),
'&', ('date_validity_start', '<=', today), ('date_validity_end', '=', False),
])
for contract in contracts:
contract.state = 'open'
contracts_to_cancel = self.search([
('date_validity_end', '<', today),
])
for contract in contracts_to_cancel:
contract.state = 'cancel'
def cron_update_contract_status(self):
"""Scheduled action to update contract statuses based on start and end dates."""