@ -1,7 +1,10 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from datetime import timedelta
from odoo import fields , models , api
from pytz import timezone
import logging
_logger = logging . getLogger ( __name__ )
@ -9,23 +12,33 @@ _logger = logging.getLogger(__name__)
class GnHrContract ( models . Model ) :
_inherit = " hr.contract "
previous_contract_id = fields . Many2one ( " hr.contract " , string = " Contrat précédent (en cas d ' avenant, de renouvellement ou de changement de poste) " )
previous_contract_id = fields . Many2one ( " hr.contract " , string = " Contrat précédent " )
next_contract_id = fields . Many2one ( " hr.contract " , string = " Contrat suivant " )
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 " )
lineage_sequence_number = fields . Integer ( string = " Numéro de séquence dans l ' historique du salarié " , compute = ' _compute_lineage_sequence_number ' , store = True )
related_contract_ids = fields . Many2many ( ' hr.contract ' ,
string = " Ensemble des contrats liés " , compute = ' _compute_related_contracts ' )
len_related_contracts = fields . Integer ( string = " Nombre de contrats liés " , compute = ' _len_related_contracts ' , store = True )
@api.depends ( ' previous_contract_id ' )
@api.depends ( ' previous_contract_id ' , ' next_contract_id ' )
def _compute_related_contracts ( self ) :
for contract in self :
associated_contract_ids = [ ]
if contract . previous_contract_id or contract . next_contract_id :
if contract . previous_contract_id :
previous_contract = contract . previous_contract_id
associated_contract_ids = [ previous_contract . id , ]
associated_contract_ids . append ( previous_contract . id )
while previous_contract . previous_contract_id :
previous_contract = previous_contract . previous_contract_id
associated_contract_ids . append ( previous_contract . id )
if contract . next_contract_id :
next_contract = contract . next_contract_id
associated_contract_ids . append ( next_contract . id )
while next_contract . next_contract_id :
next_contract = next_contract . next_contract_id
associated_contract_ids . append ( next_contract . id )
contract . related_contract_ids = [ ( 6 , 0 , associated_contract_ids ) ]
else :
contract . related_contract_ids = False
@ -62,6 +75,7 @@ class GnHrContract(models.Model):
' previous_contract_id ' : self . id ,
' date_start ' : self . date_start ,
' date_end ' : self . date_end ,
' date_validity_start ' : fields . Date . context_today ( self ) ,
' resource_calendar_id ' : self . resource_calendar_id . id ,
' department_id ' : self . department_id . id ,
' job_id ' : self . job_id . id ,
@ -73,6 +87,9 @@ class GnHrContract(models.Model):
' struct_id ' : self . struct_id . id ,
}
new_contract = self . create ( default_vals )
self . write ( { ' next_contract_id ' : new_contract . id } )
for contract in self . related_contract_ids :
contract . _compute_related_contracts ( )
return {
' type ' : ' ir.actions.act_window ' ,
' name ' : ' Avenant ' ,
@ -82,6 +99,22 @@ class GnHrContract(models.Model):
' target ' : ' current ' ,
}
def cron_update_contract_status ( self ) :
""" Scheduled action to update contract statuses based on start and end dates. """
today = fields . Date . context_today ( self )
contracts_to_close = self . search ( [ ( ' date_validity_end ' , ' <= ' , today ) , ( ' status ' , ' = ' , ' open ' ) ] )
for contract in contracts_to_close :
contract . ensure_one ( )
contract . write ( { ' status ' : ' close ' } )
contracts_to_open = self . search ( [ ( ' date_start ' , ' <= ' , today ) , ( ' date_validity_start ' , ' <= ' , today ) , ( ' status ' , ' = ' , ' draft ' ) , ' | ' , ( ' date_validity_end ' , ' > ' , today ) , ( ' date_validity_end ' , ' = ' , False ) ] )
for contract in contracts_to_open :
contract . ensure_one ( )
contract . write ( { ' status ' : ' open ' } )
if contract . previous_contract_id :
contract . previous_contract_id . write ( { ' status ' : ' close ' ,
' date_validity_end ' : contract . date_validity_start - timedelta ( days = 1 )
} )
def open_related_contracts ( self ) :
self . ensure_one ( )