feat: adiciona script de dados fictícios e padroniza tratamento de erros

This commit is contained in:
andersonid
2025-04-02 19:32:39 -03:00
parent 06e7c79488
commit d4869dcfaa
2 changed files with 234 additions and 29 deletions

192
seed_data.py Normal file
View File

@@ -0,0 +1,192 @@
from datetime import datetime, timedelta
from functions.database import (
Base, Militante, CotaMensal, TipoPagamento, Pagamento,
MaterialVendido, TipoMaterial, VendaJornalAvulso, AssinaturaAnual,
RelatorioCotasMensais, RelatorioVendasMateriais, engine, get_db_connection
)
import random
from faker import Faker
fake = Faker('pt_BR')
db_session = get_db_connection()
def criar_tipos_pagamento():
"""Cria tipos de pagamento padrão"""
tipos = [
"Dinheiro",
"PIX",
"Cartão de Crédito",
"Cartão de Débito",
"Transferência Bancária"
]
for tipo in tipos:
if not db_session.query(TipoPagamento).filter_by(descricao=tipo).first():
db_session.add(TipoPagamento(descricao=tipo))
db_session.commit()
def criar_tipos_material():
"""Cria tipos de material padrão"""
tipos = [
"Jornal",
"Revista",
"Livro",
"Panfleto",
"Cartilha"
]
for tipo in tipos:
if not db_session.query(TipoMaterial).filter_by(descricao=tipo).first():
db_session.add(TipoMaterial(descricao=tipo))
db_session.commit()
def criar_militantes(quantidade=50):
"""Cria militantes fictícios"""
militantes = []
for _ in range(quantidade):
militante = Militante(
nome=fake.name(),
cpf=fake.cpf(),
email=fake.email(),
telefone=fake.phone_number(),
endereco=fake.address(),
filiado=random.choice([True, False])
)
db_session.add(militante)
militantes.append(militante)
db_session.commit()
return militantes
def criar_cotas(militantes, quantidade_por_militante=3):
"""Cria cotas mensais fictícias"""
for militante in militantes:
for i in range(quantidade_por_militante):
data_base = datetime.now() - timedelta(days=30 * i)
valor = random.uniform(50, 200)
cota = CotaMensal(
militante_id=militante.id,
valor_antigo=valor,
valor_novo=valor * 1.1,
data_alteracao=data_base,
data_vencimento=data_base + timedelta(days=30),
pago=random.choice([True, False])
)
db_session.add(cota)
db_session.commit()
def criar_pagamentos(militantes):
"""Cria pagamentos fictícios"""
tipos_pagamento = db_session.query(TipoPagamento).all()
for militante in militantes:
for _ in range(random.randint(1, 5)):
pagamento = Pagamento(
militante_id=militante.id,
tipo_pagamento_id=random.choice(tipos_pagamento).id,
valor=random.uniform(50, 500),
data_pagamento=fake.date_time_between(start_date='-1y', end_date='now')
)
db_session.add(pagamento)
db_session.commit()
def criar_materiais_vendidos(militantes):
"""Cria materiais vendidos fictícios"""
tipos_material = db_session.query(TipoMaterial).all()
for militante in militantes:
for _ in range(random.randint(1, 3)):
material = MaterialVendido(
militante_id=militante.id,
tipo_material_id=random.choice(tipos_material).id,
descricao=fake.sentence(),
valor=random.uniform(20, 100),
data_venda=fake.date_time_between(start_date='-1y', end_date='now')
)
db_session.add(material)
db_session.commit()
def criar_vendas_jornal(militantes):
"""Cria vendas de jornal avulso fictícias"""
for militante in militantes:
for _ in range(random.randint(1, 4)):
venda = VendaJornalAvulso(
militante_id=militante.id,
quantidade=random.randint(1, 10),
valor_total=random.uniform(10, 100),
data_venda=fake.date_time_between(start_date='-1y', end_date='now')
)
db_session.add(venda)
db_session.commit()
def criar_assinaturas(militantes):
"""Cria assinaturas anuais fictícias"""
tipos_material = db_session.query(TipoMaterial).all()
for militante in militantes:
if random.random() < 0.3: # 30% de chance de ter assinatura
data_inicio = fake.date_time_between(start_date='-1y', end_date='now')
assinatura = AssinaturaAnual(
militante_id=militante.id,
tipo_material_id=random.choice(tipos_material).id,
quantidade=random.randint(1, 3),
valor_total=random.uniform(100, 500),
data_inicio=data_inicio,
data_fim=data_inicio + timedelta(days=365)
)
db_session.add(assinatura)
db_session.commit()
def criar_relatorios():
"""Cria relatórios fictícios"""
for _ in range(12): # Um relatório por mês do último ano
data = fake.date_time_between(start_date='-1y', end_date='now')
relatorio_cotas = RelatorioCotasMensais(
setor_id=random.randint(1, 5),
comite_id=random.randint(1, 3),
total_cotas=random.uniform(1000, 5000),
data_relatorio=data
)
relatorio_vendas = RelatorioVendasMateriais(
setor_id=random.randint(1, 5),
comite_id=random.randint(1, 3),
total_vendas=random.uniform(500, 3000),
data_relatorio=data
)
db_session.add(relatorio_cotas)
db_session.add(relatorio_vendas)
db_session.commit()
def seed_database():
"""Função principal para popular o banco de dados com dados fictícios"""
print("Iniciando população do banco de dados com dados fictícios...")
print("Criando tipos de pagamento...")
criar_tipos_pagamento()
print("Criando tipos de material...")
criar_tipos_material()
print("Criando militantes...")
militantes = criar_militantes(50)
print("Criando cotas mensais...")
criar_cotas(militantes)
print("Criando pagamentos...")
criar_pagamentos(militantes)
print("Criando materiais vendidos...")
criar_materiais_vendidos(militantes)
print("Criando vendas de jornal...")
criar_vendas_jornal(militantes)
print("Criando assinaturas...")
criar_assinaturas(militantes)
print("Criando relatórios...")
criar_relatorios()
print("Banco de dados populado com sucesso!")
if __name__ == "__main__":
seed_database()