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