270 lines
11 KiB
Python
270 lines
11 KiB
Python
|
|
from flask import request, jsonify, flash
|
||
|
|
from datetime import datetime
|
||
|
|
from werkzeug.exceptions import NotFound
|
||
|
|
|
||
|
|
from services.militante_service import MilitanteService
|
||
|
|
from models.entities.militante import Militante, EstadoMilitante
|
||
|
|
from models.entities.endereco import Endereco
|
||
|
|
from models.entities.email_militante import EmailMilitante
|
||
|
|
from utils.date_utils import validar_data, converter_data, validar_sequencia_datas, calcular_idade
|
||
|
|
|
||
|
|
class MilitanteController:
|
||
|
|
"""Controlador para operações com militantes"""
|
||
|
|
|
||
|
|
@staticmethod
|
||
|
|
def listar_militantes():
|
||
|
|
"""Lista todos os militantes"""
|
||
|
|
return MilitanteService.listar_militantes()
|
||
|
|
|
||
|
|
@staticmethod
|
||
|
|
def buscar_militante(militante_id):
|
||
|
|
"""Busca um militante pelo ID"""
|
||
|
|
militante = MilitanteService.buscar_militante(militante_id)
|
||
|
|
if not militante:
|
||
|
|
raise NotFound(f"Militante com ID {militante_id} não encontrado")
|
||
|
|
return militante
|
||
|
|
|
||
|
|
@staticmethod
|
||
|
|
def criar_militante(form_data):
|
||
|
|
"""Cria um novo militante"""
|
||
|
|
# Validar CPF
|
||
|
|
from functions.validations import validar_cpf
|
||
|
|
cpf = form_data.get('cpf')
|
||
|
|
if not validar_cpf(cpf):
|
||
|
|
return jsonify({
|
||
|
|
'status': 'error',
|
||
|
|
'message': 'CPF inválido'
|
||
|
|
}), 400
|
||
|
|
|
||
|
|
# Verificar se já existe militante com este CPF
|
||
|
|
if MilitanteService.buscar_por_cpf(cpf):
|
||
|
|
return jsonify({
|
||
|
|
'status': 'error',
|
||
|
|
'message': 'CPF já cadastrado'
|
||
|
|
}), 400
|
||
|
|
|
||
|
|
try:
|
||
|
|
# Criar endereço
|
||
|
|
endereco = Endereco(
|
||
|
|
cep=form_data.get('cep'),
|
||
|
|
estado=form_data.get('estado'),
|
||
|
|
cidade=form_data.get('cidade'),
|
||
|
|
bairro=form_data.get('bairro'),
|
||
|
|
rua=form_data.get('logradouro'),
|
||
|
|
numero=form_data.get('numero'),
|
||
|
|
complemento=form_data.get('complemento')
|
||
|
|
)
|
||
|
|
|
||
|
|
# Salvar endereço para obter ID
|
||
|
|
endereco_id = MilitanteService.salvar_endereco(endereco)
|
||
|
|
|
||
|
|
# Processar datas
|
||
|
|
data_nascimento = datetime.strptime(form_data.get('data_nascimento'), '%Y-%m-%d') if form_data.get('data_nascimento') else None
|
||
|
|
data_entrada_oci = datetime.strptime(form_data.get('data_entrada_oci'), '%Y-%m-%d') if form_data.get('data_entrada_oci') else None
|
||
|
|
data_efetivacao_oci = datetime.strptime(form_data.get('data_efetivacao_oci'), '%Y-%m-%d') if form_data.get('data_efetivacao_oci') else None
|
||
|
|
|
||
|
|
# Criar militante
|
||
|
|
militante = Militante(
|
||
|
|
# Dados Básicos
|
||
|
|
nome=form_data.get('nome'),
|
||
|
|
cpf=cpf,
|
||
|
|
titulo_eleitoral=form_data.get('titulo_eleitoral'),
|
||
|
|
data_nascimento=data_nascimento,
|
||
|
|
data_entrada_oci=data_entrada_oci,
|
||
|
|
data_efetivacao_oci=data_efetivacao_oci,
|
||
|
|
|
||
|
|
# Contato
|
||
|
|
telefone1=form_data.get('telefone1'),
|
||
|
|
telefone2=form_data.get('telefone2'),
|
||
|
|
endereco_id=endereco_id,
|
||
|
|
|
||
|
|
# Profissional
|
||
|
|
profissao=form_data.get('profissao'),
|
||
|
|
regime_trabalho=form_data.get('regime_trabalho'),
|
||
|
|
empresa=form_data.get('empresa'),
|
||
|
|
contratante=form_data.get('contratante'),
|
||
|
|
|
||
|
|
# Acadêmico
|
||
|
|
instituicao_ensino=form_data.get('instituicao_ensino'),
|
||
|
|
tipo_instituicao=form_data.get('tipo_instituicao'),
|
||
|
|
|
||
|
|
# Sindical
|
||
|
|
sindicato=form_data.get('sindicato'),
|
||
|
|
cargo_sindical=form_data.get('cargo_sindical'),
|
||
|
|
central_sindical=form_data.get('central_sindical'),
|
||
|
|
dirigente_sindical=form_data.get('dirigente_sindical') == 'on',
|
||
|
|
|
||
|
|
# Organização
|
||
|
|
estado=EstadoMilitante(form_data.get('estado', 'ATIVO')),
|
||
|
|
celula_id=form_data.get('celula_id', type=int),
|
||
|
|
responsabilidades=form_data.get('responsabilidades', type=int, default=0),
|
||
|
|
|
||
|
|
# Por padrão, todo novo militante é aspirante
|
||
|
|
aspirante=True,
|
||
|
|
data_inicio_aspirante=datetime.now()
|
||
|
|
)
|
||
|
|
|
||
|
|
# Salvar militante para obter ID
|
||
|
|
militante_id = MilitanteService.salvar_militante(militante)
|
||
|
|
|
||
|
|
# Adicionar email principal se fornecido
|
||
|
|
email = form_data.get('email')
|
||
|
|
if email:
|
||
|
|
email_militante = EmailMilitante(
|
||
|
|
endereco_email=email,
|
||
|
|
militante_id=militante_id
|
||
|
|
)
|
||
|
|
MilitanteService.salvar_email_militante(email_militante)
|
||
|
|
|
||
|
|
return jsonify({
|
||
|
|
'status': 'success',
|
||
|
|
'message': 'Militante criado com sucesso!',
|
||
|
|
'id': militante_id
|
||
|
|
})
|
||
|
|
|
||
|
|
except Exception as e:
|
||
|
|
return jsonify({
|
||
|
|
'status': 'error',
|
||
|
|
'message': f'Erro ao criar militante: {str(e)}'
|
||
|
|
}), 500
|
||
|
|
|
||
|
|
@staticmethod
|
||
|
|
def atualizar_militante(militante_id, form_data):
|
||
|
|
"""Atualiza um militante existente"""
|
||
|
|
try:
|
||
|
|
militante = MilitanteService.buscar_militante(militante_id)
|
||
|
|
if not militante:
|
||
|
|
return jsonify({
|
||
|
|
'status': 'error',
|
||
|
|
'message': 'Militante não encontrado'
|
||
|
|
}), 404
|
||
|
|
|
||
|
|
# Obter dados do formulário
|
||
|
|
nome = form_data.get('nome')
|
||
|
|
cpf = form_data.get('cpf')
|
||
|
|
titulo_eleitoral = form_data.get('titulo_eleitoral')
|
||
|
|
data_nascimento = form_data.get('data_nascimento')
|
||
|
|
data_entrada_oci = form_data.get('data_entrada_oci')
|
||
|
|
data_efetivacao_oci = form_data.get('data_efetivacao_oci')
|
||
|
|
telefone1 = form_data.get('telefone1')
|
||
|
|
telefone2 = form_data.get('telefone2')
|
||
|
|
email = form_data.get('email')
|
||
|
|
|
||
|
|
# Validar e converter datas
|
||
|
|
try:
|
||
|
|
data_nascimento = converter_data(data_nascimento) if data_nascimento else None
|
||
|
|
data_entrada_oci = converter_data(data_entrada_oci) if data_entrada_oci else None
|
||
|
|
data_efetivacao_oci = converter_data(data_efetivacao_oci) if data_efetivacao_oci else None
|
||
|
|
|
||
|
|
# Validar sequência lógica das datas
|
||
|
|
validar_sequencia_datas(
|
||
|
|
data_nascimento=data_nascimento,
|
||
|
|
data_entrada=data_entrada_oci,
|
||
|
|
data_efetivacao=data_efetivacao_oci
|
||
|
|
)
|
||
|
|
|
||
|
|
except ValueError as e:
|
||
|
|
return jsonify({
|
||
|
|
'status': 'error',
|
||
|
|
'message': str(e)
|
||
|
|
}), 400
|
||
|
|
|
||
|
|
# Atualizar dados básicos
|
||
|
|
if nome: militante.nome = nome
|
||
|
|
if cpf: militante.cpf = cpf
|
||
|
|
if titulo_eleitoral: militante.titulo_eleitoral = titulo_eleitoral
|
||
|
|
militante.data_nascimento = data_nascimento
|
||
|
|
militante.data_entrada_oci = data_entrada_oci
|
||
|
|
militante.data_efetivacao_oci = data_efetivacao_oci
|
||
|
|
militante.telefone1 = telefone1
|
||
|
|
militante.telefone2 = telefone2
|
||
|
|
|
||
|
|
# Calcular idade
|
||
|
|
if data_nascimento:
|
||
|
|
militante.idade = calcular_idade(data_nascimento)
|
||
|
|
|
||
|
|
# Atualizar ou criar email
|
||
|
|
if email:
|
||
|
|
MilitanteService.atualizar_email_militante(militante_id, email)
|
||
|
|
|
||
|
|
# Salvar alterações
|
||
|
|
MilitanteService.salvar_militante(militante)
|
||
|
|
|
||
|
|
return jsonify({
|
||
|
|
'status': 'success',
|
||
|
|
'message': 'Militante atualizado com sucesso',
|
||
|
|
'data': {
|
||
|
|
'nome': militante.nome,
|
||
|
|
'cpf': militante.cpf,
|
||
|
|
'idade': militante.idade if hasattr(militante, 'idade') else None,
|
||
|
|
'emails': [e.endereco_email for e in militante.emails],
|
||
|
|
'telefone1': militante.telefone1,
|
||
|
|
'celula_id': str(militante.celula_id) if militante.celula_id else None,
|
||
|
|
'responsabilidades_valor': militante.responsabilidades
|
||
|
|
}
|
||
|
|
})
|
||
|
|
|
||
|
|
except Exception as e:
|
||
|
|
return jsonify({
|
||
|
|
'status': 'error',
|
||
|
|
'message': f'Erro ao atualizar militante: {str(e)}'
|
||
|
|
}), 500
|
||
|
|
|
||
|
|
@staticmethod
|
||
|
|
def excluir_militante(militante_id):
|
||
|
|
"""Exclui um militante"""
|
||
|
|
try:
|
||
|
|
if MilitanteService.excluir_militante(militante_id):
|
||
|
|
flash('Militante excluído com sucesso!', 'success')
|
||
|
|
return True
|
||
|
|
else:
|
||
|
|
flash('Militante não encontrado', 'danger')
|
||
|
|
return False
|
||
|
|
except Exception as e:
|
||
|
|
flash(f'Erro ao excluir militante: {str(e)}', 'danger')
|
||
|
|
return False
|
||
|
|
|
||
|
|
@staticmethod
|
||
|
|
def buscar_dados_militante(militante_id):
|
||
|
|
"""Busca os dados de um militante específico"""
|
||
|
|
militante = MilitanteService.buscar_militante(militante_id)
|
||
|
|
if not militante:
|
||
|
|
return jsonify({
|
||
|
|
'status': 'error',
|
||
|
|
'message': 'Militante não encontrado'
|
||
|
|
}), 404
|
||
|
|
|
||
|
|
# Função auxiliar para formatar data com validação
|
||
|
|
def formatar_data_segura(data):
|
||
|
|
try:
|
||
|
|
if not data:
|
||
|
|
return None
|
||
|
|
return data.strftime('%Y-%m-%d')
|
||
|
|
except Exception as e:
|
||
|
|
print(f"Erro ao formatar data: {str(e)}, valor: {data}")
|
||
|
|
return None
|
||
|
|
|
||
|
|
# Formatar datas com validação
|
||
|
|
data_nascimento = formatar_data_segura(militante.data_nascimento)
|
||
|
|
data_entrada_oci = formatar_data_segura(militante.data_entrada_oci)
|
||
|
|
data_efetivacao_oci = formatar_data_segura(militante.data_efetivacao_oci)
|
||
|
|
|
||
|
|
return jsonify({
|
||
|
|
'status': 'success',
|
||
|
|
'id': militante.id,
|
||
|
|
'nome': militante.nome,
|
||
|
|
'cpf': militante.cpf,
|
||
|
|
'titulo_eleitoral': militante.titulo_eleitoral,
|
||
|
|
'data_nascimento': data_nascimento,
|
||
|
|
'data_entrada_oci': data_entrada_oci,
|
||
|
|
'data_efetivacao_oci': data_efetivacao_oci,
|
||
|
|
'emails': [email.endereco_email for email in militante.emails] if militante.emails else [],
|
||
|
|
'telefone1': militante.telefone1,
|
||
|
|
'telefone2': militante.telefone2,
|
||
|
|
'celula_id': militante.celula_id,
|
||
|
|
'responsabilidades_valor': militante.responsabilidades,
|
||
|
|
'sindicato': militante.sindicato,
|
||
|
|
'cargo_sindical': militante.cargo_sindical,
|
||
|
|
'central_sindical': militante.central_sindical,
|
||
|
|
'dirigente_sindical': militante.dirigente_sindical
|
||
|
|
})
|