# -*- 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' _order = 'date_begin desc' _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="Subrogation de paiement") date_begin = fields.Date(string='Début de la formation') date_end = fields.Date(string='Fin de la formation') session_hours = fields.Char(string='Horaires') students_nb_prev = fields.Char(string="Nb Stagiaires Prévisionnel") convention = fields.Binary(string="Convention") date_convention = fields.Date(string="Date Convention") date_attestation = fields.Date(string="Date Attestation") 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') # ------------------------------------------------------ # Override ORM # ------------------------------------------------------ @api.model def create(self, vals): record = super(Training, self).create(vals) if vals.get('course_id', False): for s in record.course_id.session_ids: self.env['training.session'].create({ 'session_id': s.id, 'training_id': record.id, 'date_delay': s.duration, 'sequence': s.sequence, }) return record @api.multi def write(self, vals): record = super(Training, self).write(vals) if vals.get('course_id', False): self.session_ids.unlink() for s in self.course_id.session_ids: self.env['training.session'].create({ 'session_id': s.id, 'training_id': self.id, 'date_delay': s.duration, 'sequence': s.sequence, }) return record # ------------------------------------------------------ # compute # ------------------------------------------------------ @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): if self.students_count > 0: self.student_cost = self.cost / self.students_count if self.hours_total > 0: 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')) # ------------------------------------------------------ # Buttons # ------------------------------------------------------ @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