resolvido merge com nova ui
This commit is contained in:
356
seed_data.py
356
seed_data.py
@@ -3,16 +3,60 @@ from functions.database import (
|
||||
Base, Militante, CotaMensal, TipoPagamento, Pagamento,
|
||||
MaterialVendido, TipoMaterial, VendaJornalAvulso, AssinaturaAnual,
|
||||
RelatorioCotasMensais, RelatorioVendasMateriais, engine, SessionLocal,
|
||||
Setor, ComiteCentral, Usuario, Role, EmailMilitante, Endereco
|
||||
Setor, ComiteCentral, Usuario, Role, EmailMilitante, Endereco,
|
||||
ComiteRegional, Celula, EstadoMilitante
|
||||
)
|
||||
import random
|
||||
from faker import Faker
|
||||
import time
|
||||
from werkzeug.security import generate_password_hash
|
||||
|
||||
fake = Faker('pt_BR')
|
||||
|
||||
def criar_estrutura_organizacional(session):
|
||||
"""Cria a estrutura organizacional básica"""
|
||||
print("\nCriando estrutura organizacional...")
|
||||
|
||||
# Criar Comitê Central
|
||||
cc = ComiteCentral(nome="Comitê Central SP")
|
||||
session.add(cc)
|
||||
session.flush()
|
||||
|
||||
# Criar Comitês Regionais
|
||||
crs = []
|
||||
for nome in ["CR São Paulo", "CR ABC", "CR Campinas"]:
|
||||
cr = ComiteRegional(nome=nome)
|
||||
session.add(cr)
|
||||
session.flush()
|
||||
crs.append(cr)
|
||||
|
||||
# Criar Setores para cada CR
|
||||
setores = []
|
||||
for cr in crs:
|
||||
for i in range(2): # 2 setores por CR
|
||||
setor = Setor(
|
||||
nome=f"Setor {i+1} - {cr.nome}",
|
||||
cr_id=cr.id
|
||||
)
|
||||
session.add(setor)
|
||||
session.flush()
|
||||
setores.append(setor)
|
||||
|
||||
# Criar Células para cada Setor
|
||||
for setor in setores:
|
||||
for i in range(2): # 2 células por setor
|
||||
celula = Celula(
|
||||
nome=f"Célula {i+1} - {setor.nome}",
|
||||
setor_id=setor.id
|
||||
)
|
||||
session.add(celula)
|
||||
|
||||
session.commit()
|
||||
return crs, setores
|
||||
|
||||
def criar_tipos_pagamento(session):
|
||||
"""Cria tipos de pagamento padrão"""
|
||||
print("\nCriando tipos de pagamento...")
|
||||
tipos = [
|
||||
"Dinheiro",
|
||||
"PIX",
|
||||
@@ -27,6 +71,7 @@ def criar_tipos_pagamento(session):
|
||||
|
||||
def criar_tipos_material(session):
|
||||
"""Cria tipos de material padrão"""
|
||||
print("\nCriando tipos de material...")
|
||||
tipos = [
|
||||
"Jornal",
|
||||
"Revista",
|
||||
@@ -39,42 +84,66 @@ def criar_tipos_material(session):
|
||||
session.add(TipoMaterial(descricao=tipo))
|
||||
session.commit()
|
||||
|
||||
def criar_militantes(session, num_militantes):
|
||||
def criar_militantes(session, num_militantes, setores):
|
||||
"""Cria militantes com todos os dados necessários"""
|
||||
print(f"\nCriando {num_militantes} militantes...")
|
||||
militantes = []
|
||||
emails_usados = set()
|
||||
|
||||
# Obter um setor existente
|
||||
setor = session.query(Setor).first()
|
||||
if not setor:
|
||||
print("Erro: Nenhum setor encontrado!")
|
||||
return []
|
||||
|
||||
for i in range(num_militantes):
|
||||
try:
|
||||
# Dados básicos
|
||||
nome = fake.name()
|
||||
cpf = fake.cpf()
|
||||
|
||||
# Email único
|
||||
while True:
|
||||
email = fake.email()
|
||||
if email not in emails_usados:
|
||||
emails_usados.add(email)
|
||||
break
|
||||
|
||||
# Criar endereço
|
||||
endereco = Endereco(
|
||||
cep=fake.postcode(),
|
||||
estado=fake.estado_sigla(),
|
||||
cidade=fake.city(),
|
||||
bairro=fake.bairro(),
|
||||
rua=fake.street_name(),
|
||||
numero=str(random.randint(1, 999)),
|
||||
complemento=f"Bloco {random.randint(1, 10)}, Apto {random.randint(1, 999)}" if random.random() < 0.3 else None,
|
||||
cep=fake.postcode()
|
||||
complemento=f"Bloco {random.randint(1, 10)}, Apto {random.randint(1, 999)}" if random.random() < 0.3 else None
|
||||
)
|
||||
session.add(endereco)
|
||||
session.flush()
|
||||
|
||||
print(f"Criando militante {i+1}: {nome} (CPF: {cpf})")
|
||||
# Selecionar setor e célula aleatórios
|
||||
setor = random.choice(setores)
|
||||
celula = random.choice(session.query(Celula).filter_by(setor_id=setor.id).all())
|
||||
|
||||
# Definir responsabilidades
|
||||
responsabilidades = 0
|
||||
if random.random() < 0.2: # 20% chance de ser Responsável de Finanças
|
||||
responsabilidades |= Militante.RESPONSAVEL_FINANCAS
|
||||
if random.random() < 0.2: # 20% chance de ser Responsável de Imprensa
|
||||
responsabilidades |= Militante.RESPONSAVEL_IMPRENSA
|
||||
if random.random() < 0.2: # 20% chance de ser Quadro-Orientador
|
||||
responsabilidades |= Militante.QUADRO_ORIENTADOR
|
||||
if random.random() < 0.2: # 20% chance de ser Secretário
|
||||
responsabilidades |= Militante.SECRETARIO
|
||||
if random.random() < 0.2: # 20% chance de ser MPS
|
||||
responsabilidades |= Militante.MPS
|
||||
if random.random() < 0.2: # 20% chance de ser Tesoureiro
|
||||
responsabilidades |= Militante.TESOUREIRO
|
||||
if random.random() < 0.2: # 20% chance de ser MNS
|
||||
responsabilidades |= Militante.MNS
|
||||
if random.random() < 0.2: # 20% chance de ser da Juventude
|
||||
responsabilidades |= Militante.JUVENTUDE
|
||||
if random.random() < 0.3: # 30% chance de ser Aspirante
|
||||
responsabilidades |= Militante.ASPIRANTE
|
||||
|
||||
print(f"Criando militante {i+1}: {nome}")
|
||||
|
||||
# Criar militante com todos os dados
|
||||
militante = Militante(
|
||||
nome=nome,
|
||||
cpf=cpf,
|
||||
@@ -95,11 +164,14 @@ def criar_militantes(session, num_militantes):
|
||||
dirigente_sindical=random.random() < 0.2,
|
||||
central_sindical=random.choice(['CUT', 'CSP-Conlutas', 'CTB', 'Força Sindical']) if random.random() < 0.4 else None,
|
||||
endereco_id=endereco.id,
|
||||
responsabilidades=random.randint(0, 1023)
|
||||
celula_id=celula.id,
|
||||
responsabilidades=responsabilidades,
|
||||
estado=random.choice(list(EstadoMilitante))
|
||||
)
|
||||
session.add(militante)
|
||||
session.flush()
|
||||
|
||||
# Criar email do militante
|
||||
email_militante = EmailMilitante(
|
||||
militante_id=militante.id,
|
||||
endereco_email=email
|
||||
@@ -107,8 +179,6 @@ def criar_militantes(session, num_militantes):
|
||||
session.add(email_militante)
|
||||
|
||||
militantes.append(militante)
|
||||
|
||||
# Commit a cada militante para evitar transações muito longas
|
||||
session.commit()
|
||||
|
||||
except Exception as e:
|
||||
@@ -118,12 +188,13 @@ def criar_militantes(session, num_militantes):
|
||||
|
||||
return militantes
|
||||
|
||||
def criar_cotas(session, militantes, quantidade_por_militante=3):
|
||||
print(f"Criando {quantidade_por_militante} cotas para cada um dos {len(militantes)} militantes...")
|
||||
def criar_cotas(session, militantes):
|
||||
"""Cria cotas mensais para os militantes"""
|
||||
print("\nCriando cotas mensais...")
|
||||
for militante in militantes:
|
||||
try:
|
||||
print(f"Criando cotas para militante {militante.nome}")
|
||||
for i in range(quantidade_por_militante):
|
||||
# Criar 12 cotas (1 ano) para cada militante
|
||||
for i in range(12):
|
||||
data_base = datetime.now() - timedelta(days=30 * i)
|
||||
valor = random.uniform(50, 200)
|
||||
cota = CotaMensal(
|
||||
@@ -139,164 +210,123 @@ def criar_cotas(session, militantes, quantidade_por_militante=3):
|
||||
except Exception as e:
|
||||
print(f"Erro ao criar cotas para militante {militante.nome}: {e}")
|
||||
session.rollback()
|
||||
continue
|
||||
print("Cotas criadas com sucesso!")
|
||||
|
||||
def criar_pagamentos(militantes):
|
||||
"""Cria pagamentos fictícios"""
|
||||
tipos_pagamento = ["Cota", "Jornal", "Assinatura", "Campanha Financeira"]
|
||||
for militante in militantes:
|
||||
for _ in range(random.randint(1, 5)):
|
||||
pagamento = Pagamento(
|
||||
militante_id=militante.id,
|
||||
tipo_pagamento=random.choice(tipos_pagamento),
|
||||
valor=random.uniform(50, 500),
|
||||
data_pagamento=fake.date_between(start_date='-1y', end_date='today')
|
||||
)
|
||||
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)
|
||||
def criar_pagamentos(session, militantes):
|
||||
"""Cria pagamentos para os militantes"""
|
||||
print("\nCriando pagamentos...")
|
||||
tipos_pagamento = session.query(TipoPagamento).all()
|
||||
|
||||
db_session.commit()
|
||||
for militante in militantes:
|
||||
try:
|
||||
# Criar entre 3 e 8 pagamentos por militante
|
||||
for _ in range(random.randint(3, 8)):
|
||||
tipo = random.choice(tipos_pagamento)
|
||||
pagamento = Pagamento(
|
||||
militante_id=militante.id,
|
||||
tipo_pagamento=tipo.descricao, # Usando a descrição do tipo
|
||||
valor=random.uniform(50, 500),
|
||||
data_pagamento=fake.date_between(start_date='-1y', end_date='today')
|
||||
)
|
||||
session.add(pagamento)
|
||||
session.commit()
|
||||
except Exception as e:
|
||||
print(f"Erro ao criar pagamentos para militante {militante.nome}: {e}")
|
||||
session.rollback()
|
||||
|
||||
def criar_setores():
|
||||
"""Cria setores padrão"""
|
||||
setores = [
|
||||
"Setor 1",
|
||||
"Setor 2",
|
||||
"Setor 3",
|
||||
"Setor 4",
|
||||
"Setor 5"
|
||||
]
|
||||
for setor in setores:
|
||||
if not db_session.query(Setor).filter_by(nome=setor).first():
|
||||
db_session.add(Setor(nome=setor))
|
||||
db_session.commit()
|
||||
def criar_materiais_vendidos(session, militantes):
|
||||
"""Cria registros de materiais vendidos"""
|
||||
print("\nCriando materiais vendidos...")
|
||||
tipos_material = session.query(TipoMaterial).all()
|
||||
|
||||
for militante in militantes:
|
||||
try:
|
||||
# Criar entre 2 e 5 materiais vendidos por militante
|
||||
for _ in range(random.randint(2, 5)):
|
||||
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')
|
||||
)
|
||||
session.add(material)
|
||||
session.commit()
|
||||
except Exception as e:
|
||||
print(f"Erro ao criar materiais vendidos para militante {militante.nome}: {e}")
|
||||
session.rollback()
|
||||
|
||||
def criar_comites():
|
||||
"""Cria comitês padrão"""
|
||||
comites = [
|
||||
"Comitê 1",
|
||||
"Comitê 2",
|
||||
"Comitê 3"
|
||||
]
|
||||
for comite in comites:
|
||||
if not db_session.query(ComiteCentral).filter_by(nome=comite).first():
|
||||
db_session.add(ComiteCentral(nome=comite))
|
||||
db_session.commit()
|
||||
def criar_vendas_jornal(session, militantes):
|
||||
"""Cria vendas de jornal avulso"""
|
||||
print("\nCriando vendas de jornal...")
|
||||
for militante in militantes:
|
||||
try:
|
||||
# Criar entre 2 e 6 vendas de jornal por militante
|
||||
for _ in range(random.randint(2, 6)):
|
||||
quantidade = random.randint(1, 10)
|
||||
valor_unitario = random.uniform(5, 15)
|
||||
venda = VendaJornalAvulso(
|
||||
militante_id=militante.id,
|
||||
quantidade=quantidade,
|
||||
valor_total=quantidade * valor_unitario,
|
||||
data_venda=fake.date_time_between(start_date='-1y', end_date='now')
|
||||
)
|
||||
session.add(venda)
|
||||
session.commit()
|
||||
except Exception as e:
|
||||
print(f"Erro ao criar vendas de jornal para militante {militante.nome}: {e}")
|
||||
session.rollback()
|
||||
|
||||
def criar_roles():
|
||||
"""Cria roles padrão"""
|
||||
roles = [
|
||||
("admin", 1), # Nível 1: Administrador
|
||||
("gestor", 2), # Nível 2: Gestor
|
||||
("usuario", 3) # Nível 3: Usuário comum
|
||||
]
|
||||
for nome, nivel in roles:
|
||||
if not db_session.query(Role).filter_by(nome=nome).first():
|
||||
db_session.add(Role(nome=nome, nivel=nivel))
|
||||
db_session.commit()
|
||||
|
||||
def criar_usuario_admin():
|
||||
"""Cria usuário admin inicial"""
|
||||
if not db_session.query(Usuario).filter_by(username='admin').first():
|
||||
role_admin = db_session.query(Role).filter_by(nome='admin').first()
|
||||
setor = db_session.query(Setor).first()
|
||||
|
||||
admin = Usuario(
|
||||
username='admin',
|
||||
email='admin@example.com',
|
||||
is_admin=True,
|
||||
ativo=True,
|
||||
role_id=role_admin.id if role_admin else None,
|
||||
setor_id=setor.id if setor else None
|
||||
)
|
||||
admin.set_password('admin123') # Método que deve existir na classe Usuario
|
||||
db_session.add(admin)
|
||||
db_session.commit()
|
||||
print("Usuário admin criado com sucesso!")
|
||||
def criar_assinaturas(session, militantes):
|
||||
"""Cria assinaturas anuais"""
|
||||
print("\nCriando assinaturas anuais...")
|
||||
tipos_material = session.query(TipoMaterial).all()
|
||||
|
||||
for militante in militantes:
|
||||
try:
|
||||
# 30% de chance de ter assinatura
|
||||
if random.random() < 0.3:
|
||||
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)
|
||||
)
|
||||
session.add(assinatura)
|
||||
session.commit()
|
||||
except Exception as e:
|
||||
print(f"Erro ao criar assinatura para militante {militante.nome}: {e}")
|
||||
session.rollback()
|
||||
|
||||
def seed_database():
|
||||
"""Função principal para popular o banco de dados com dados fictícios"""
|
||||
print("Populando banco de dados com dados fictícios...")
|
||||
|
||||
"""Função principal para popular o banco de dados"""
|
||||
session = SessionLocal()
|
||||
try:
|
||||
print("Iniciando população do banco de dados...")
|
||||
|
||||
# Criar estrutura organizacional
|
||||
crs, setores = criar_estrutura_organizacional(session)
|
||||
|
||||
# Criar tipos básicos
|
||||
criar_tipos_pagamento(session)
|
||||
criar_tipos_material(session)
|
||||
|
||||
militantes = criar_militantes(session, 50)
|
||||
if militantes:
|
||||
criar_cotas(session, militantes)
|
||||
print("Dados fictícios criados com sucesso!")
|
||||
# Criar militantes (30 militantes para teste)
|
||||
militantes = criar_militantes(session, 30, setores)
|
||||
|
||||
# Criar dados financeiros e materiais
|
||||
criar_cotas(session, militantes)
|
||||
criar_pagamentos(session, militantes)
|
||||
criar_materiais_vendidos(session, militantes)
|
||||
criar_vendas_jornal(session, militantes)
|
||||
criar_assinaturas(session, militantes)
|
||||
|
||||
print("\nBanco de dados populado com sucesso!")
|
||||
|
||||
except Exception as e:
|
||||
print(f"Erro ao popular banco de dados: {e}")
|
||||
print(f"Erro durante a população do banco: {e}")
|
||||
session.rollback()
|
||||
finally:
|
||||
session.close()
|
||||
|
||||
Reference in New Issue
Block a user