79 lines
3.1 KiB
Python
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' |