# -*- coding: utf-8 -*- from odoo import fields, models, api from odoo.exceptions import ValidationError class AcademicApplicant(models.Model): _name = 'academic.applicant' _description = 'Candidato Académico' _order = 'id desc' # --- Dados Pessoais --- name = fields.Char(string="Nome Completo", required=True) birth_date = fields.Date(string="Data de Nascimento", required=True) gender = fields.Selection([ ('M', 'Masculino'), ('F', 'Feminino') ], string="Género", required=True) bi = fields.Char(string="Número de Identidade (BI)", required=True) # --- Documentos (Binary) --- photo_bi = fields.Binary(string="Foto do BI (Frente e Verso)", attachment=True, required=True) certificate = fields.Binary(string="Certificado de Conclusão", attachment=True, required=True) # --- Histórico Escolar --- previous_school = fields.Char(string="Escola Anterior", required=True) previous_school_type = fields.Selection([ ('public', 'Pública'), ('private', 'Privada'), ('ppp', 'Parceria Público-Privada') ], string="Tipo de Escola", default='public', required=True) graduation_year = fields.Integer(string="Ano de Conclusão", required=True) # --- Contactos --- phone = fields.Char(string="Telefone") email = fields.Char(string="Email") # --- Relações --- course_id = fields.Many2one('academic.course', string="Curso Pretendido", required=True) exam_id = fields.Many2one("academic.exam", string="Exame de Acesso") exam_score = fields.Float(string="Nota do Exame", digits=(1, 2)) # Relacionamento com o Utilizador (Para Record Rules) user_id = fields.Many2one('res.users', string="Utilizador", default=lambda self: self.env.user) # --- Workflow de Estado --- state = fields.Selection([ ('draft', 'Rascunho'), ('submitted', 'Submetido'), ('exam', 'Exame Marcado'), ('taken', 'Exame Realizado'), ('approved', 'Aprovado'), ('rejected', 'Rejeitado') ], string="Estado", default='draft') # --- Funções de Fluxo (Botões do Header) --- def action_submit(self): """Apenas valida documentos e avança para Submetido""" for record in self: if not record.photo_bi or not record.bi: raise ValidationError("Erro: É obrigatório anexar a foto do BI e preencher o número do BI!") record.state = 'submitted' def action_mark_exam(self): """Esta é a função que exige o exame. Só deve ser clicada APÓS a submissão""" for record in self: if not record.exam_id: raise ValidationError("Erro: Selecione primeiro o Exame de Acesso no campo correspondente.") record.state = 'exam' @api.onchange('exam_score') def _onchange_exam_score(self): """Quando a nota muda (mesmo na lista de chamada), atualiza o estado""" for record in self: if record.exam_score >= 10: record.state = 'approved' elif 0 < record.exam_score < 10: record.state = 'rejected'