70 lines
3.1 KiB
Python
70 lines
3.1 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é")
|
|
|
|
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")
|
|
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") |