93 lines
4.4 KiB
Python
93 lines
4.4 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from odoo import fields, models, api
|
|
from odoo.exceptions import ValidationError
|
|
import logging
|
|
|
|
_logger = logging.getLogger(__name__)
|
|
|
|
class GnCareer(models.Model):
|
|
_name = "gn_career.career"
|
|
_description = "Analyse du poste"
|
|
_order = 'start_date'
|
|
|
|
name = fields.Char("Nom", compute='_compute_name')
|
|
start_date = fields.Date('From', required=True, default=lambda self: fields.Date.today())
|
|
contract_id = fields.Many2one('hr.contract', string="Contrat ou Avenant associé")
|
|
employee_id = fields.Many2one(string="Employee", related='contract_id.employee_id', readonly=True, store=True)
|
|
|
|
status = fields.Selection([
|
|
('draft', 'Brouillon'),
|
|
('wait_manager_approval', "En attente de validation du manager"),
|
|
('wait_director_approval', "En attente de validation par la direction"),
|
|
('wait_employee_approval', "En attente de signature par le salarié"),
|
|
('ready', 'Prête'),
|
|
('active', 'Active'),
|
|
], string="Statut", default='draft')
|
|
|
|
mission_ids = fields.Many2many('gn_career.mission', 'career_ids', compute='_compute_mission_ids', string="Missions effectuées", store=True)
|
|
mission_detail_ids = fields.One2many('gn_career.mission.detail', 'career_id', string="Détail de la mission")
|
|
|
|
total_percentage = fields.Float(compute='_compute_total_percentage', string="Total Percentage")
|
|
|
|
@api.depends('mission_detail_ids.percentage')
|
|
def _compute_total_percentage(self):
|
|
for record in self:
|
|
record.total_percentage = sum(mission.percentage for mission in record.mission_detail_ids)
|
|
|
|
@api.constrains('mission_detail_ids', 'total_percentage')
|
|
def _check_total_percentage(self):
|
|
for record in self:
|
|
if record.total_percentage != 100:
|
|
raise ValidationError("Le pourcentage total des missions au sein de la fiche de poste doit atteindre 100%. Veuillez ajuster la répartition de la mission.")
|
|
|
|
@api.depends('mission_detail_ids.mission_id')
|
|
def _compute_mission_ids(self):
|
|
for record in self:
|
|
mission_ids_set = set()
|
|
for mission_detail in record.mission_detail_ids:
|
|
mission_ids_set.add(mission_detail.mission_id.id)
|
|
record.mission_ids = [(6, 0, list(mission_ids_set))]
|
|
|
|
@api.depends('start_date')
|
|
def _compute_name(self):
|
|
for record in self:
|
|
if record.start_date:
|
|
# Use an f-string for formatting
|
|
record.name = f"Fiche de poste du {record.start_date}"
|
|
else:
|
|
# Provide a default or handle the case where start_date isn't set
|
|
record.name = "Fiche de poste sans date"
|
|
|
|
class GnCareerMissionDetail(models.Model):
|
|
_name = 'gn_career.mission.detail'
|
|
_description = "Détails d'une mission pour une fiche de poste"
|
|
|
|
name = fields.Char(related='mission_id.name')
|
|
career_id = fields.Many2one('gn_career.career', string="Fiche de poste")
|
|
mission_id = fields.Many2one('gn_career.mission', string="Mission")
|
|
percentage = fields.Integer("Temps occupé par la mission en %", default="100")
|
|
task_ids = fields.Many2many('gn_career.task', 'mission_detail', string="Tâches incluses dans la mission")
|
|
related_mission_task_ids = fields.Many2many('gn_career.task', compute='_compute_related_mission_task_ids')
|
|
task_ids_display = fields.Many2many('gn_career.task', compute='_compute_task_ids_display')
|
|
employee_id = fields.Many2one(string="Employee", related='career_id.contract_id.employee_id', readonly=True, store=True)
|
|
|
|
# A special field used to update task_ids domain in mission.detail form
|
|
@api.depends('mission_id.task_ids')
|
|
def _compute_related_mission_task_ids(self):
|
|
for record in self:
|
|
if record.mission_id:
|
|
record.related_mission_task_ids = record.mission_id.task_ids
|
|
else:
|
|
record.related_mission_task_ids = False
|
|
|
|
#A special field used for many2many tag in task form display
|
|
@api.depends('task_ids')
|
|
def _compute_task_ids_display(self):
|
|
current_task_id = self._context.get('exclude_task_id')
|
|
for record in self:
|
|
if current_task_id:
|
|
record.task_ids_display = record.task_ids.filtered(lambda t: t.id != current_task_id)
|
|
else:
|
|
record.task_ids_display = record.task_ids |