from datetime import datetime, timedelta from functions.database import ( Base, Militante, CotaMensal, TipoPagamento, Pagamento, MaterialVendido, TipoMaterial, VendaJornalAvulso, AssinaturaAnual, RelatorioCotasMensais, RelatorioVendasMateriais, engine, get_db_connection, Setor, ComiteCentral, Usuario, Role ) 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(num_militantes): print(f"\nCriando {num_militantes} militantes...") militantes = [] emails_usados = set() # Conjunto para rastrear emails já usados for i in range(num_militantes): nome = fake.name() cpf = fake.cpf() # Gerar email único while True: email = fake.email() if email not in emails_usados: emails_usados.add(email) break telefone = fake.phone_number() endereco = fake.address() filiado = fake.boolean() print(f"Criando militante {i+1}: {nome} (CPF: {cpf})") militante = Militante( nome=nome, cpf=cpf, email=email, telefone=telefone, endereco=endereco, filiado=filiado ) militantes.append(militante) db_session.add_all(militantes) db_session.commit() return militantes def criar_cotas(militantes, quantidade_por_militante=3): """Cria cotas mensais fictícias""" print(f"Criando {quantidade_por_militante} cotas para cada um dos {len(militantes)} militantes...") for militante in militantes: print(f"Criando cotas para militante {militante.nome}") 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) print(f" Cota criada: valor={valor:.2f}, vencimento={data_base + timedelta(days=30)}") db_session.commit() print("Cotas criadas com sucesso!") 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 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_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_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 seed_database(): """Função principal para popular o banco de dados com dados fictícios""" print("Populando banco de dados com dados fictícios...") criar_tipos_pagamento() criar_tipos_material() criar_setores() criar_comites() criar_roles() militantes = criar_militantes(50) criar_cotas(militantes) criar_pagamentos(militantes) criar_materiais_vendidos(militantes) criar_vendas_jornal(militantes) criar_assinaturas(militantes) criar_relatorios() print("Dados fictícios criados com sucesso!") if __name__ == "__main__": seed_database()