cefope_core/models/academic_applicant.py

79 lines
3.1 KiB
Python

# -*- 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'