Sélectionner une révision Git
training_training.py
training_training.py 5,47 Kio
# -*- coding: utf-8 -*-
# © 2019 Le Filament (<http://www.le-filament.com>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from odoo import models, fields, api
class Training(models.Model):
_name = 'training.training'
_inherit = 'mail.thread'
_rec_name = 'course_id'
_description = 'Training for customers'
customer_id = fields.Many2one(
comodel_name='res.partner',
string='Client',
domain=[('is_company', '=', True)])
opco_id = fields.Many2one(
comodel_name='res.partner',
string='OPCO',
domain=[('is_company', '=', True), ('is_opco', '=', True)])
student_ids = fields.One2many(
comodel_name='training.student',
inverse_name='training_id',
string='Stagiaires',)
session_ids = fields.One2many(
comodel_name='training.session',
inverse_name='training_id',
string='Sessions',)
course_id = fields.Many2one(
comodel_name='training.course',
string='Programme')
type = fields.Selection(
string='Type',
required=True,
selection=[('intra', 'INTRA'), ('inter', 'INTER')])
agreement_number = fields.Char(
string='Numéro Convention',
required=True,
copy=False,
readonly=True,
states={'draft': [('readonly', False)]},
index=True,
default='Brouillon')
payment = fields.Boolean(string="Pris en charge par l'OPCO ?")
date_begin = fields.Date(string='Début de la formation')
date_end = fields.Date(string='Fin de la formation')
convention = fields.Binary(string="Convention")
date_convention = fields.Date(string="Date Convention")
hours = fields.Integer(
string='Durée (h)',
compute='_compute_sessions',
store=True)
hours_total = fields.Integer(
string="Nombre d'heures",
compute='_compute_hours_total',
store=True)
session_count = fields.Integer(
string="Nbre Sessions",
compute='_compute_sessions',
default=0,
store=True)
rate = fields.Integer(
string="Taux horaire",
compute='_compute_costs')
students_count = fields.Integer(
string='Nombre de stagiaires',
compute='_compute_students_count',
store=True,)
cost = fields.Float(string='Prix de vente')
student_cost = fields.Float(string='Prix / Stagiaire')
amount = fields.Float(
string='Commandé',
compute='_compute_amount',
store=True,)
invoiced = fields.Float(
string='Facturé',
compute='_compute_invoiced',
store=True,)
order_ids = fields.One2many(
comodel_name='sale.order',
inverse_name='training_id',
string='Commandes',)
invoice_ids = fields.One2many(
comodel_name='account.invoice',
inverse_name='training_id',
string='Factures',)
state = fields.Selection(
string='State',
selection=[
('draft', 'Brouillon'),
('current', 'Accepté'),
('done', 'Réalisé')],
default='draft')
place = fields.Text(string='Lieu de la formation')
company_id = fields.Many2one(
comodel_name='res.company',
string='Company',
change_default=True,
required=True,
readonly=True,
default=lambda self: self.env['res.company']._company_default_get())
file_number = fields.Char(string='N° Dossier')
plan = fields.Char(string='Dispositif')
@api.depends('student_ids')
def _compute_students_count(self):
self.students_count = len(self.student_ids)
@api.depends('student_ids', 'cost')
def _compute_costs(self):
self.student_cost = self.cost / self.students_count
self.rate = self.cost / self.hours_total
@api.depends('session_ids')
def _compute_sessions(self):
self.session_count = len(self.session_ids)
self.hours = sum(self.session_ids.mapped('date_delay'))
@api.depends('session_ids', 'student_ids')
def _compute_hours_total(self):
self.hours_total = self.students_count * self.hours
@api.depends('order_ids')
def _compute_amount(self):
self.amount = sum(self.order_ids.mapped('amount_untaxed'))
@api.depends('invoice_ids')
def _compute_invoiced(self):
self.invoiced = sum(self.invoice_ids.mapped('amount_untaxed_signed'))
@api.onchange('course_id')
def _onchange_session_ids(self):
# Delete all training session
old_session_ids = self.env['training.session'].search(
[['training_id', '=', self.id]])
if old_session_ids:
old_session_ids.unlink()
# Populate sessions from course
for session in self.course_id.session_ids:
self.env['training.session'].create({
'session_id': session.id,
'training_id': self._origin.id,
'duration': session.duration,
})
@api.multi
def action_valid(self):
for training in self:
training.state = 'current'
training.agreement_number = self.env['ir.sequence'].next_by_code('training.training')
@api.multi
def action_done(self):
for training in self:
training.state = 'done'
@api.multi
def action_draft(self):
for training in self:
training.state = 'draft'
@api.multi
def _get_trainers(self):
for training in self:
trainers = training.session_ids.mapped('user_id')
return trainers