Files
controles/models/pagamento_model.py
Mateus Tavares 2b1668206d - inits centralizados, READMEs atualizados
- padronizando o nome de get_db_connection e session para get_db_session, para não confundir com session do Flask ou sessoes web

- corrigindo potenciais erros

-- has_permission nao consegue com lazy load carregar permission depois de load_user fechar a conexao, entao joinedLoad com Permission antes de fechar

-- db.rollback não existe caso db = get_db_session() apareça muito depois dentro do try, padronizando antes de try

--- comparar role por nivel (Role.SECRETARIO_GERAL) e nao por nome ("Secretario Geral")

- unificacao de get_otp_qr_code

- mudança de nowutc() para now(UTC) conforme novo padrão
2026-02-20 17:19:15 -03:00

184 lines
6.2 KiB
Python

from functions.database import get_db_session, Pagamento, Militante, TipoPagamento
from sqlalchemy.orm import joinedload
from datetime import datetime
from typing import List, Dict, Optional
class PagamentoModel:
"""Model para operações com pagamentos"""
@staticmethod
def criar_pagamento(data: Dict) -> Dict:
"""Cria um novo pagamento"""
db = get_db_session()
try:
pagamento = Pagamento(
militante_id=data['militante_id'],
tipo_pagamento_id=data.get('tipo_pagamento_id'),
valor=data['valor'],
data_pagamento=data['data_pagamento']
)
db.add(pagamento)
db.commit()
return {
'status': 'success',
'message': 'Pagamento criado com sucesso',
'pagamento_id': pagamento.id
}
except Exception as e:
db.rollback()
return {
'status': 'error',
'message': f'Erro ao criar pagamento: {str(e)}'
}
finally:
db.close()
@staticmethod
def listar_pagamentos() -> List[Pagamento]:
"""Lista todos os pagamentos"""
db = get_db_session()
try:
return db.query(Pagamento).join(Militante).order_by(Pagamento.data_pagamento.desc()).all()
finally:
db.close()
@staticmethod
def buscar_por_id(pagamento_id: int) -> Optional[Pagamento]:
"""Busca um pagamento por ID"""
db = get_db_session()
try:
return db.query(Pagamento).get(pagamento_id)
finally:
db.close()
@staticmethod
def atualizar_pagamento(pagamento_id: int, data: Dict) -> Dict:
"""Atualiza um pagamento existente"""
db = get_db_session()
try:
pagamento = db.query(Pagamento).get(pagamento_id)
if not pagamento:
return {
'status': 'error',
'message': 'Pagamento não encontrado'
}
pagamento.militante_id = data.get('militante_id', pagamento.militante_id)
pagamento.tipo_pagamento_id = data.get('tipo_pagamento_id', pagamento.tipo_pagamento_id)
pagamento.valor = data.get('valor', pagamento.valor)
pagamento.data_pagamento = data.get('data_pagamento', pagamento.data_pagamento)
db.commit()
return {
'status': 'success',
'message': 'Pagamento atualizado com sucesso'
}
except Exception as e:
db.rollback()
return {
'status': 'error',
'message': f'Erro ao atualizar pagamento: {str(e)}'
}
finally:
db.close()
@staticmethod
def excluir_pagamento(pagamento_id: int) -> Dict:
"""Exclui um pagamento"""
db = get_db_session()
try:
pagamento = db.query(Pagamento).get(pagamento_id)
if not pagamento:
return {
'status': 'error',
'message': 'Pagamento não encontrado'
}
db.delete(pagamento)
db.commit()
return {
'status': 'success',
'message': 'Pagamento excluído com sucesso'
}
except Exception as e:
db.rollback()
return {
'status': 'error',
'message': f'Erro ao excluir pagamento: {str(e)}'
}
finally:
db.close()
@staticmethod
def listar_por_celula(celula_id: int) -> List[Pagamento]:
"""Lista pagamentos de uma célula específica"""
db = get_db_session()
try:
return db.query(Pagamento).filter_by(celula_id=celula_id).all()
finally:
db.close()
@staticmethod
def listar_por_setor(setor_id: int) -> List[Pagamento]:
"""Lista pagamentos de um setor específico"""
db = get_db_session()
try:
return db.query(Pagamento).join(Usuario).filter(Usuario.setor_id == setor_id).all()
finally:
db.close()
@staticmethod
def listar_por_cr(cr_id: int) -> List[Pagamento]:
"""Lista pagamentos de um CR específico"""
db = get_db_session()
try:
return db.query(Pagamento).join(Usuario).filter(Usuario.cr_id == cr_id).all()
finally:
db.close()
@staticmethod
def listar_por_militante(militante_id: int) -> List[Pagamento]:
"""Lista pagamentos de um militante específico"""
db = get_db_session()
try:
return db.query(Pagamento).filter_by(militante_id=militante_id).order_by(Pagamento.data_pagamento.desc()).all()
finally:
db.close()
@staticmethod
def obter_tipos_pagamento() -> List[TipoPagamento]:
"""Obtém todos os tipos de pagamento"""
db = get_db_session()
try:
return db.query(TipoPagamento).order_by(TipoPagamento.descricao).all()
finally:
db.close()
@staticmethod
def obter_militantes() -> List[Militante]:
"""Obtém todos os militantes"""
db = get_db_session()
try:
return db.query(Militante).order_by(Militante.nome).all()
finally:
db.close()
@staticmethod
def formatar_dados_pagamento(pagamento: Pagamento) -> Dict:
"""Formata os dados de um pagamento para retorno JSON"""
return {
'id': pagamento.id,
'militante_id': pagamento.militante_id,
'tipo_pagamento_id': pagamento.tipo_pagamento_id,
'valor': float(pagamento.valor) if pagamento.valor else 0.0,
'data_pagamento': pagamento.data_pagamento.strftime('%Y-%m-%d') if pagamento.data_pagamento else None,
'militante_nome': pagamento.militante.nome if pagamento.militante else None,
'tipo_pagamento_nome': pagamento.tipo_pagamento.descricao if pagamento.tipo_pagamento else None
}