Skip to content
Snippets Groups Projects
training_training.py 6.52 KiB
Newer Older
  • Learn to ignore specific revisions
  • Benjamin's avatar
    Benjamin committed
    # -*- 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'
    
    Benjamin's avatar
    Benjamin committed
        _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")
    
    Benjamin's avatar
    Benjamin committed
        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")
    
    Benjamin's avatar
    Benjamin committed
        convention = fields.Binary(string="Convention")
        date_convention = fields.Date(string="Date Convention")
    
    Benjamin's avatar
    Benjamin committed
        date_attestation = fields.Date(string="Date Attestation")
    
    Benjamin's avatar
    Benjamin committed
        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
        # ------------------------------------------------------
    
    Benjamin's avatar
    Benjamin committed
        @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):
    
    Benjamin's avatar
    Benjamin committed
            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
    
    Benjamin's avatar
    Benjamin committed
    
        @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
        # ------------------------------------------------------
    
    Benjamin's avatar
    Benjamin committed
        @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