From 530179594d35142ac758b85b086b5a09be3a58b7 Mon Sep 17 00:00:00 2001 From: davi Date: Sun, 12 Jul 2026 14:25:47 -0300 Subject: [PATCH] =?UTF-8?q?feat/dataload:=20adiciona=20notebook=20em=20pyt?= =?UTF-8?q?hon=20para=20gera=C3=A7=C3=A3o=20de=20popula=C3=A7=C3=A3o=20do?= =?UTF-8?q?=20banco=20de=20dados=20usando=20Faker?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + python/dataload.ipynb | 799 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 800 insertions(+) create mode 100644 python/dataload.ipynb diff --git a/.gitignore b/.gitignore index e69de29..4f509e5 100644 --- a/.gitignore +++ b/.gitignore @@ -0,0 +1 @@ +*.env \ No newline at end of file diff --git a/python/dataload.ipynb b/python/dataload.ipynb new file mode 100644 index 0000000..c50e518 --- /dev/null +++ b/python/dataload.ipynb @@ -0,0 +1,799 @@ +{ + "cells": [ + { + "cell_type": "code", + "id": "initial_id", + "metadata": { + "collapsed": true, + "ExecuteTime": { + "end_time": "2026-07-12T17:23:20.526188100Z", + "start_time": "2026-07-12T17:23:20.493473500Z" + } + }, + "source": [ + "# fazendo importações\n", + "import os\n", + "from random import choice, choices, randint, triangular, sample\n", + "from dotenv import load_dotenv\n", + "from faker import Faker\n", + "import pandas as pd\n", + "from sqlalchemy import create_engine\n", + "from re import sub\n", + "from unicodedata import normalize\n", + "from string import ascii_lowercase\n", + "from argon2 import PasswordHasher" + ], + "outputs": [], + "execution_count": 177 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-07-12T17:23:20.618278400Z", + "start_time": "2026-07-12T17:23:20.533180400Z" + } + }, + "cell_type": "code", + "source": [ + "# conectando com o banco de dados\n", + "load_dotenv()\n", + "\n", + "engine = create_engine(os.getenv(\"DATABASE_URL\"))\n", + "faker = Faker(\"pt_BR\")" + ], + "id": "50a7a23f67f5e48e", + "outputs": [], + "execution_count": 178 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-07-12T17:23:20.664268600Z", + "start_time": "2026-07-12T17:23:20.628274900Z" + } + }, + "cell_type": "code", + "source": [ + "# constantes\n", + "QTD_COLABORADORES = 50\n", + "QTD_EMPRESAS = 5" + ], + "id": "5b307e990236d04c", + "outputs": [], + "execution_count": 179 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-07-12T17:23:20.736583500Z", + "start_time": "2026-07-12T17:23:20.666265600Z" + } + }, + "cell_type": "code", + "source": [ + "# utilitários\n", + "quantidade_dependencias = [1, 2, 3, 4]\n", + "\n", + "provedores_email = ['gmail.com', 'hotmail.com', 'outlook.com', 'yahoo.com.br']\n", + "\n", + "tamanho_empresa = ['PEQUENA', 'MEDIA', 'GRANDE']\n", + "\n", + "setores = [\"Tecnologia\", \"Saúde\", \"Educação\", \"Financeiro\", \"Indústria\", \"Varejo\", \"Atacado\", \"Logística\", \"Transporte\", \"Construção Civil\", \"Agronegócio\", \"Alimentação\", \"Bebidas\", \"Farmacêutico\", \"Químico\", \"Metalurgia\", \"Mineração\", \"Energia\", \"Telecomunicações\", \"Turismo\", \"Hotelaria\", \"Restaurante\", \"Imobiliário\", \"Marketing\", \"Publicidade\", \"Recursos Humanos\", \"Consultoria\", \"Jurídico\", \"Contabilidade\", \"Seguros\", \"Automotivo\", \"Têxtil\", \"Moda\", \"Cosméticos\", \"Beleza\", \"Entretenimento\", \"Mídia\", \"E-commerce\", \"Serviços\", \"Segurança\"]\n", + "\n", + "areas = [\"Administrativo\",\"Financeiro\",\"Contabilidade\",\"Recursos Humanos\",\"Departamento Pessoal\",\"Comercial\",\"Vendas\",\"Marketing\",\"Atendimento\",\"SAC\",\"Tecnologia da Informação\",\"Desenvolvimento\",\"Infraestrutura\",\"Segurança da Informação\",\"Jurídico\",\"Compras\",\"Logística\",\"Almoxarifado\",\"Produção\",\"Qualidade\",\"Engenharia\",\"Projetos\",\"Operações\",\"Manutenção\",\"Auditoria\",\"Controladoria\",\"Planejamento\",\"B.I.\",\"Comunicação\",\"Diretoria\",\"Presidência\"]\n", + "\n", + "ddds = [11,12,13,14,15,16,17,18,19,21,22,24,27,28,31,32,33,34,35,37,38,41,42,43,44,45,46,47,48,49,51,53,54,55,61,62,63,64,65,66,67,68,69,71,73,74,75,77,79,81,82,83,84,85,86,87,88,89,91,92,93,94,95,96,97,98,99]\n", + "\n", + "ph = PasswordHasher(time_cost=4, memory_cost=262144, parallelism=2)\n", + "PEPPER = os.getenv('PEPPER')" + ], + "id": "8d2e0a13f81ee6e7", + "outputs": [], + "execution_count": 180 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-07-12T17:23:20.852379600Z", + "start_time": "2026-07-12T17:23:20.751092800Z" + } + }, + "cell_type": "code", + "source": [ + "# funções\n", + "def normalizar(valor: str) -> str:\n", + " return sub(r'[^a-zA-Z0-9]+', '.', normalize('NFKD', valor).encode('ASCII', 'ignore').decode('ASCII').lower())\n", + "\n", + "def apenas_numeros(valor: str) -> str:\n", + " return sub(r'\\D', '', valor)\n", + "\n", + "def gerar_lista_ids(limite: int) -> list:\n", + " return list(range(1, limite + 1))\n", + "\n", + "def gerar_valor_aleatorio(qtd_caracteres: int) -> str:\n", + " return ''.join(choices(ascii_lowercase, k=qtd_caracteres))\n", + "\n", + "def gerar_email(nome_email: str) -> str:\n", + " return f'{normalizar(nome_email)}_{gerar_valor_aleatorio(4)}@{choice(provedores_email)}'\n", + "\n", + "def gerar_telefone() -> str:\n", + " return f'{choice(ddds)}9{randint(1000, 9999)}{randint(1000,9999)}'\n", + "\n", + "def gerar_hash_senha() -> str:\n", + " senha = faker.password(special_chars=True, digits=True, upper_case=True, lower_case=True)\n", + " return ph.hash(senha + PEPPER)\n" + ], + "id": "5c640d3265f55391", + "outputs": [], + "execution_count": 181 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-07-12T17:23:20.876342600Z", + "start_time": "2026-07-12T17:23:20.855339800Z" + } + }, + "cell_type": "code", + "source": [ + "# listas de id\n", + "lista_id_empresa = gerar_lista_ids(QTD_EMPRESAS)\n", + "lista_id_usuario = gerar_lista_ids(QTD_COLABORADORES)" + ], + "id": "8d4731bc6523baff", + "outputs": [], + "execution_count": 182 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-07-12T17:23:20.916771800Z", + "start_time": "2026-07-12T17:23:20.878338200Z" + } + }, + "cell_type": "code", + "source": [ + " # informações de empresa\n", + "dados_email_empresa = []\n", + "dados_telefone_empresa = []\n", + "dados_endereco_empresa = []\n", + "dados_empresa = []\n", + "\n", + "for i in range(QTD_EMPRESAS):\n", + " QTD_EMAILS_EMPRESA = choices(quantidade_dependencias, weights=(60, 25, 10, 5), k=1)[0]\n", + " QTD_TELEFONES_EMPRESA = choices(quantidade_dependencias, weights=(60, 25, 10, 5), k=1)[0]\n", + " QTD_ENDERECOS_EMPRESA = choices(quantidade_dependencias, weights=(60, 25, 10, 5), k=1)[0]\n", + "\n", + " id_empresa = i + 1\n", + " nome = faker.company()\n", + "\n", + " for j in range(QTD_EMAILS_EMPRESA):\n", + " dados_email_empresa.append({\n", + " 'id_empresa': id_empresa,\n", + " 'email': gerar_email(nome),\n", + " 'principal': True if j == 0 else False\n", + " })\n", + "\n", + " for j in range(QTD_TELEFONES_EMPRESA):\n", + " dados_telefone_empresa.append({\n", + " 'id_empresa': id_empresa,\n", + " 'numero_telefone': gerar_telefone(),\n", + " 'principal': True if j == 0 else False\n", + " })\n", + " \n", + " for j in range(QTD_ENDERECOS_EMPRESA):\n", + " dados_endereco_empresa.append({\n", + " 'id_empresa': id_empresa,\n", + " 'cep': apenas_numeros(faker.postcode()),\n", + " 'uf': faker.state_abbr(),\n", + " 'cidade': faker.city(),\n", + " 'bairro': faker.neighborhood(),\n", + " 'logradouro': faker.street_name(),\n", + " 'numero_endereco': faker.building_number(),\n", + " 'principal': True if j == 0 else False\n", + " })\n", + "\n", + " dados_empresa.append({\n", + " 'cnpj': apenas_numeros(faker.cnpj()),\n", + " 'nome': nome,\n", + " 'tamanho_empresa': choice(tamanho_empresa),\n", + " 'setor_empresa': choice(setores),\n", + " 'status': 'ATIVO'\n", + " })" + ], + "id": "f763f6fd19c4eb63", + "outputs": [], + "execution_count": 183 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-07-12T17:23:55.902598600Z", + "start_time": "2026-07-12T17:23:20.919832Z" + } + }, + "cell_type": "code", + "source": [ + "# informações de colaborador\n", + "\n", + "def gerar_colaborador(id_empresa: int, tipo: str, id: int):\n", + " qtd_emails = choices(quantidade_dependencias, weights=(80, 20, 0, 0), k=1)[0]\n", + " qtd_telefones = choices(quantidade_dependencias, weights=(80, 20, 0, 0), k=1)[0]\n", + "\n", + " nome = faker.name()\n", + "\n", + " for i in range(qtd_emails):\n", + " dados_email_colaborador.append({\n", + " 'id_colaborador': id,\n", + " 'email': gerar_email(nome),\n", + " 'principal': True if i == 0 else False\n", + " })\n", + "\n", + " for i in range(qtd_telefones):\n", + " dados_telefone_colaborador.append({\n", + " 'id_colaborador': id,\n", + " 'numero_telefone': apenas_numeros(faker.cellphone_number()),\n", + " 'principal': True if i== 0 else False\n", + " })\n", + "\n", + " dados_usuario.append({\n", + " 'id_empresa': id_empresa,\n", + " 'nome': nome,\n", + " 'email_login': gerar_email(nome),\n", + " 'senha_hash': gerar_hash_senha(),\n", + " 'tipo_usuario': tipo,\n", + " 'status': 'ATIVO'\n", + " })\n", + "\n", + " dados_colaborador.append({\n", + " 'nome': nome,\n", + " 'id_empresa': id_empresa,\n", + " 'id_usuario': id,\n", + " 'cpf': apenas_numeros(faker.cpf()),\n", + " 'cargo': faker.job(),\n", + " 'area': choice(areas),\n", + " 'data_nascimento': faker.date_of_birth(minimum_age=18, maximum_age=70),\n", + " 'data_contratacao': faker.date_this_decade(),\n", + " 'permissao_gestor': True if tipo == 'GESTOR' or tipo == 'ADMIN' else False,\n", + " 'status': 'ATIVO'\n", + " })\n", + "\n", + "dados_email_colaborador = []\n", + "dados_telefone_colaborador = []\n", + "dados_usuario = []\n", + "dados_colaborador = []\n", + "\n", + "id = 1\n", + "for id_empresa in lista_id_empresa:\n", + " qtd_colaboradores = randint(4, 29)\n", + "\n", + " # gerar gestor\n", + " gerar_colaborador(id_empresa, 'GESTOR', id)\n", + " id += 1\n", + "\n", + " for _ in range(qtd_colaboradores):\n", + " tipo = choices(['COLABORADOR', 'ADMIN'], weights=(95, 5), k=1)[0]\n", + " gerar_colaborador(id_empresa, tipo, id)\n", + " id+=1" + ], + "id": "7fb98319d9671d77", + "outputs": [], + "execution_count": 184 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-07-12T17:23:56.009221Z", + "start_time": "2026-07-12T17:23:55.959246Z" + } + }, + "cell_type": "code", + "source": [ + "# informações do ciclo\n", + "dados_ciclo = []\n", + "gestor_ciclo = pd.DataFrame(dados_colaborador).groupby('id_empresa').first().reset_index()\n", + "\n", + "for _, gestor in gestor_ciclo.iterrows():\n", + " dados_ciclo.append({\n", + " 'id_empresa': gestor['id_empresa'],\n", + " 'id_responsavel': gestor['id_usuario'],\n", + " 'id_ishikawa_mongo': randint(1, 9999),\n", + " 'titulo': faker.sentence(nb_words=5),\n", + " 'descricao': faker.paragraph(nb_sentences=10),\n", + " 'status': 'CONCLUIDO',\n", + " 'data_inicio': faker.past_date(start_date='-1y'),\n", + " 'data_estimada_fim': faker.future_date(),\n", + " 'data_fim_real': faker.future_date()\n", + " })" + ], + "id": "a79912991e1fa0fe", + "outputs": [], + "execution_count": 185 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-07-12T17:23:56.043464400Z", + "start_time": "2026-07-12T17:23:56.025771Z" + } + }, + "cell_type": "code", + "source": [ + "# informações de plano de ação\n", + "dados_plano_acao = []\n", + "id_plano_acao = 1\n", + "\n", + "for id_ciclo, ciclo in enumerate(dados_ciclo, start=1):\n", + " dados_plano_acao.append({\n", + " 'id': id_plano_acao,\n", + " 'id_ciclo': id_ciclo,\n", + " 'nome': faker.sentence(nb_words=5),\n", + " 'objetivo': faker.sentence(nb_words=10),\n", + " 'prioridade': choice(['BAIXA', 'MEDIA', 'ALTA', 'CRITICA']),\n", + " 'status': 'APROVADO',\n", + " 'origem': 'MANUAL',\n", + " 'criado_por': ciclo['id_responsavel']\n", + " })\n", + "\n", + " id_plano_acao += 1" + ], + "id": "fbbdaf0803f052ce", + "outputs": [], + "execution_count": 186 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-07-12T17:23:56.059478800Z", + "start_time": "2026-07-12T17:23:56.046474900Z" + } + }, + "cell_type": "code", + "source": [ + "# informações do problema\n", + "dados_problema = []\n", + "id_problema = 1\n", + "\n", + "for id_ciclo, ciclo in enumerate(dados_ciclo, start=1):\n", + " qtd_problema = randint(1, 5)\n", + "\n", + " for i in range(qtd_problema):\n", + " dados_problema.append({\n", + " 'id': id_problema,\n", + " 'id_ciclo': id_ciclo,\n", + " 'criado_por': ciclo['id_responsavel'],\n", + " 'titulo': faker.sentence(nb_words=5),\n", + " 'descricao': faker.paragraph(nb_sentences=10),\n", + " 'peso': round((1 / qtd_problema), 2),\n", + " 'status': 'ABERTO',\n", + " 'origem': 'MANUAL',\n", + " 'persistente': False,\n", + "\n", + " # apenas para referência da causa raiz\n", + " 'principal': True if i == 0 else False\n", + " })\n", + "\n", + " id_problema += 1" + ], + "id": "bc0e3a2cb9897c5c", + "outputs": [], + "execution_count": 187 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-07-12T17:23:56.078363200Z", + "start_time": "2026-07-12T17:23:56.062475800Z" + } + }, + "cell_type": "code", + "source": [ + "# informações da causa raiz\n", + "dados_causa_raiz = []\n", + "planos = {plano['id_ciclo']: plano['id'] for plano in dados_plano_acao}\n", + "\n", + "for problema in dados_problema:\n", + " dados_causa_raiz.append({\n", + " 'id_ciclo': problema['id_ciclo'],\n", + " 'id_problema': problema['id'],\n", + " 'id_plano_acao': planos[problema['id_ciclo']],\n", + " 'id_5_porques_mongo': randint(1, 9999),\n", + " 'validada_por': problema['criado_por'],\n", + " 'descricao': faker.paragraph(nb_sentences=10),\n", + " 'origem': 'MANUAL',\n", + " 'principal': problema['principal'],\n", + " 'aceita': False\n", + " })" + ], + "id": "5531d480b5fcddac", + "outputs": [], + "execution_count": 188 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-07-12T17:23:56.098918600Z", + "start_time": "2026-07-12T17:23:56.080369300Z" + } + }, + "cell_type": "code", + "source": [ + "# informações de meta\n", + "dados_meta = []\n", + "\n", + "for id_ciclo, ciclo in enumerate(dados_ciclo, start=1):\n", + " for _ in range(randint(1, 3)):\n", + " dados_meta.append({\n", + " 'id_ciclo': id_ciclo,\n", + " 'objetivo': faker.sentence(nb_words=10),\n", + " 'valor_base': randint(1000, 100000),\n", + " 'valor_alvo': randint(1000, 100000),\n", + " 'unidade': choice(['R$', 'US$', 'EUR']),\n", + " 'prazo': faker.future_date(),\n", + " 'status': choice(['PARCIALMENTE_ATINGIDA', 'ATINGIDA', 'NAO_ATINGIDA']),\n", + " 'prioridade': choice(['BAIXA', 'MEDIA', 'ALTA', 'CRITICA']),\n", + " 'area': choice(areas),\n", + " 'categoria': faker.word()\n", + " })" + ], + "id": "4edfec3c7a92d498", + "outputs": [], + "execution_count": 189 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-07-12T17:23:56.114463600Z", + "start_time": "2026-07-12T17:23:56.100915300Z" + } + }, + "cell_type": "code", + "source": [ + "# informações de 5W2H\n", + "dados_5w2h = []\n", + "\n", + "for id_plano_acao, plano_acao in enumerate(dados_plano_acao, start=1):\n", + " dados_5w2h.append({\n", + " 'id_plano_acao': id_plano_acao,\n", + " 'id_who_responsavel': plano_acao['criado_por'],\n", + " 'what_acao': faker.sentence(nb_words=10),\n", + " 'why_justificativa': faker.sentence(nb_words=10),\n", + " 'where_local': faker.sentence(nb_words=10),\n", + " 'when_fim': faker.future_date(),\n", + " 'how_modo_execucao': faker.sentence(nb_words=10),\n", + " 'how_much_custo': randint(1000, 100000),\n", + " })" + ], + "id": "75679ba628965064", + "outputs": [], + "execution_count": 190 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-07-12T17:23:56.129285100Z", + "start_time": "2026-07-12T17:23:56.116483600Z" + } + }, + "cell_type": "code", + "source": [ + "# informações de tarefa\n", + "dados_tarefa = []\n", + "\n", + "for id_plano_acao, plano_acao in enumerate(dados_plano_acao, start=1):\n", + " for _ in range(randint(1, 10)):\n", + " dados_tarefa.append({\n", + " 'id_plano_acao': id_plano_acao,\n", + " 'id_responsavel': plano_acao['criado_por'],\n", + " 'titulo': faker.sentence(nb_words=5),\n", + " 'descricao': faker.sentence(nb_words=10),\n", + " 'prioridade': choice(['BAIXA', 'MEDIA', 'ALTA', 'CRITICA']),\n", + " 'status': 'PENDENTE',\n", + " 'data_fim_prevista': faker.future_date()\n", + " })" + ], + "id": "914fe4148f0e775", + "outputs": [], + "execution_count": 191 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-07-12T17:23:56.144590900Z", + "start_time": "2026-07-12T17:23:56.130290300Z" + } + }, + "cell_type": "code", + "source": [ + "# informações de treinamento\n", + "dados_treinamento = []\n", + "\n", + "for id_ciclo, ciclo in enumerate(dados_ciclo, start=1):\n", + " dados_treinamento.append({\n", + " 'id_ciclo': id_ciclo,\n", + " 'id_anexo_mongo': randint(1, 9999),\n", + " 'id_responsavel': ciclo['id_responsavel'],\n", + " 'titulo': faker.sentence(nb_words=5),\n", + " 'descricao': faker.sentence(nb_words=10),\n", + " 'data_treinamento': faker.future_date(),\n", + " 'obrigatorio': choice([True, False])\n", + " })" + ], + "id": "f1f1226dc957c543", + "outputs": [], + "execution_count": 192 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-07-12T17:23:56.155507500Z", + "start_time": "2026-07-12T17:23:56.146541Z" + } + }, + "cell_type": "code", + "source": [ + "# dados de verificação do resultado\n", + "dados_verificacao = []\n", + "\n", + "for id_ciclo, ciclo in enumerate(dados_ciclo, start=1):\n", + " dados_verificacao.append({\n", + " 'id_ciclo': id_ciclo,\n", + " 'criado_por': ciclo['id_responsavel'],\n", + " 'status': choice(['APROVADO', 'REPROVADO', 'NAO_VERIFICADO', 'PARCIAL']),\n", + " 'resumo': faker.sentence(nb_words=10),\n", + " 'observacao': faker.sentence(nb_words=10)\n", + " })" + ], + "id": "553d833704f121cf", + "outputs": [], + "execution_count": 193 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-07-12T17:23:56.172117400Z", + "start_time": "2026-07-12T17:23:56.157517200Z" + } + }, + "cell_type": "code", + "source": [ + "# dados de efeito secundário\n", + "dados_efeito_secundario = []\n", + "\n", + "for id_verificacao, verificacao in enumerate(dados_verificacao, start=1):\n", + " for _ in range(randint(1, 10)):\n", + " dados_efeito_secundario.append({\n", + " 'id_verificacao_resultado': id_verificacao,\n", + " 'descricao': faker.sentence(nb_words=10),\n", + " 'peso': round(triangular(0.01, 0.99, 0.5), 2),\n", + " 'impacto_estimado': faker.sentence(nb_words=10),\n", + " 'tipo': choice(['POSITIVO', 'NEGATIVO'])\n", + " })" + ], + "id": "de1c8d58b118b9f6", + "outputs": [], + "execution_count": 194 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-07-12T17:23:56.191141600Z", + "start_time": "2026-07-12T17:23:56.174171900Z" + } + }, + "cell_type": "code", + "source": [ + "# criando dataframes\n", + "df_email_empresa = pd.DataFrame(dados_email_empresa)\n", + "df_telefone_empresa = pd.DataFrame(dados_telefone_empresa)\n", + "df_endereco_empresa = pd.DataFrame(dados_endereco_empresa)\n", + "df_empresa = pd.DataFrame(dados_empresa)\n", + "df_email_colaborador = pd.DataFrame(dados_email_colaborador)\n", + "df_telefone_colaborador = pd.DataFrame(dados_telefone_colaborador)\n", + "df_usuario = pd.DataFrame(dados_usuario)\n", + "df_colaborador = pd.DataFrame(dados_colaborador)\n", + "df_ciclo = pd.DataFrame(dados_ciclo)\n", + "df_plano_acao = pd.DataFrame(dados_plano_acao)\n", + "df_causa_raiz = pd.DataFrame(dados_causa_raiz)\n", + "df_efeito_secundario = pd.DataFrame(dados_efeito_secundario)\n", + "df_meta = pd.DataFrame(dados_meta)\n", + "df_5w2h = pd.DataFrame(dados_5w2h)\n", + "df_problema = pd.DataFrame(dados_problema)\n", + "df_tarefa = pd.DataFrame(dados_tarefa)\n", + "df_treinamento = pd.DataFrame(dados_treinamento)\n", + "df_verificacao = pd.DataFrame(dados_verificacao)" + ], + "id": "5fe35937f40bd1ef", + "outputs": [], + "execution_count": 195 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-07-12T17:23:56.215711500Z", + "start_time": "2026-07-12T17:23:56.193151500Z" + } + }, + "cell_type": "code", + "source": [ + "# dados das tabelas de ligação\n", + "usuarios_empresa = df_colaborador.groupby('id_empresa')['id_usuario'].apply(list).to_dict()\n", + "ciclo_empresa = {id_ciclo: ciclo['id_empresa'] for id_ciclo, ciclo in enumerate(dados_ciclo, start=1)}\n", + "\n", + "# usuários por ciclo\n", + "dados_usuario_ciclo = []\n", + "dados_meta_responsavel = []\n", + "dados_usuario_treinamento = []\n", + "dados_priorizacao = []\n", + "\n", + "for id_ciclo, ciclo in enumerate(dados_ciclo, start=1):\n", + " colaborador_empresa = usuarios_empresa[ciclo['id_empresa']]\n", + " gestor = ciclo['id_responsavel']\n", + "\n", + " dados_usuario_ciclo.append({\n", + " 'id_usuario': gestor,\n", + " 'id_ciclo': id_ciclo,\n", + " 'papel_ciclo': 'RESPONSAVEL'\n", + " })\n", + "\n", + " outros = [c for c in colaborador_empresa if c != gestor]\n", + " for id_usuario in outros:\n", + " dados_usuario_ciclo.append({\n", + " 'id_usuario': id_usuario,\n", + " 'id_ciclo': id_ciclo,\n", + " 'papel_ciclo': choices(['PARTICIPANTE', 'EXECUTOR', 'VALIDADOR', 'OBSERVADOR'], weights=[70, 10, 10, 10], k=1)[0]\n", + " })\n", + "\n", + "for id_meta, meta in enumerate(dados_meta, start=1):\n", + " colaborador_empresa = usuarios_empresa[ciclo_empresa[meta['id_ciclo']]]\n", + "\n", + " for id_usuario in colaborador_empresa:\n", + " dados_meta_responsavel.append({\n", + " 'id_meta': id_meta,\n", + " 'id_usuario': id_usuario,\n", + " })\n", + "\n", + "for id_treinamento, treinamento in enumerate(dados_treinamento, start = 1):\n", + " colaborador_empresa = usuarios_empresa[ciclo_empresa[treinamento['id_ciclo']]]\n", + "\n", + " for id_usuario in colaborador_empresa:\n", + " dados_usuario_treinamento.append({\n", + " 'id_treinamento': id_treinamento,\n", + " 'id_usuario': id_usuario,\n", + " 'obrigatorio': treinamento['obrigatorio'],\n", + " 'status': choice(['PENDENTE', 'CONFIRMADO', 'CONCLUIDO']),\n", + " 'terminado_em': faker.future_date()\n", + " })\n", + "\n", + "for problema in dados_problema:\n", + " colaborador_empresa = usuarios_empresa[ciclo_empresa[problema['id_ciclo']]]\n", + "\n", + " for _, id_usuario in enumerate(colaborador_empresa, start=1):\n", + " posicao = randint(1, 10)\n", + "\n", + " dados_priorizacao.append({\n", + " 'id_problema': problema['id'],\n", + " 'id_usuario': id_usuario,\n", + " 'posicao': posicao,\n", + " 'peso_calculado': round(1 / posicao, 2)\n", + " })\n", + "\n", + "# criando dataframes\n", + "df_meta_responsavel = pd.DataFrame(dados_meta_responsavel)\n", + "df_priorizacao_problema = pd.DataFrame(dados_priorizacao)\n", + "df_usuario_treinamento = pd.DataFrame(dados_usuario_treinamento)\n", + "df_usuario_ciclo = pd.DataFrame(dados_usuario_ciclo)" + ], + "id": "4ade28691351ca02", + "outputs": [], + "execution_count": 196 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-07-12T17:23:56.238270600Z", + "start_time": "2026-07-12T17:23:56.218801400Z" + } + }, + "cell_type": "code", + "source": [ + "tabelas = {\n", + " ('public', 'empresa'): df_empresa,\n", + " ('public', 'usuario_sistema'): df_usuario,\n", + " ('public', 'colaborador'): df_colaborador,\n", + " ('public', 'email_empresa'): df_email_empresa,\n", + " ('public', 'telefone_empresa'): df_telefone_empresa,\n", + " ('public', 'endereco_empresa'): df_endereco_empresa,\n", + " ('public', 'email_colaborador'): df_email_colaborador,\n", + " ('public', 'telefone_colaborador'): df_telefone_colaborador,\n", + " ('pdca', 'ciclo'): df_ciclo,\n", + " ('pdca', 'meta'): df_meta,\n", + " ('pdca', 'plano_acao'): df_plano_acao,\n", + " ('pdca', 'treinamento'): df_treinamento,\n", + " ('pdca', 'verificacao_resultado'): df_verificacao,\n", + " ('pdca', 'problema'): df_problema,\n", + " ('pdca', 'causa_raiz'): df_causa_raiz,\n", + " ('pdca', 'plano_5w2h'): df_5w2h,\n", + " ('pdca', 'efeito_secundario'): df_efeito_secundario,\n", + " ('pdca', 'tarefa'): df_tarefa,\n", + " ('pdca', 'meta_responsavel'): df_meta_responsavel,\n", + " ('pdca', 'priorizacao_problema_usuario'): df_priorizacao_problema,\n", + " ('pdca', 'usuario_ciclo'): df_usuario_ciclo,\n", + " ('pdca', 'usuario_treinamento'): df_usuario_treinamento\n", + "}" + ], + "id": "8fbc0604c8d1afb2", + "outputs": [], + "execution_count": 197 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-07-12T17:23:56.250788100Z", + "start_time": "2026-07-12T17:23:56.239277900Z" + } + }, + "cell_type": "code", + "source": [ + "# tratamento dos dados\n", + "df_problema.drop(columns=['principal'], inplace=True)" + ], + "id": "627beae77ba3737d", + "outputs": [], + "execution_count": 198 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-07-12T17:23:56.938089600Z", + "start_time": "2026-07-12T17:23:56.252786700Z" + } + }, + "cell_type": "code", + "source": [ + "print('Iniciando conexão com o banco de dados')\n", + "for (schema, tabela), df in tabelas.items():\n", + " try:\n", + " df.to_sql(name = tabela, schema = schema, con = engine, if_exists = 'append', index = False)\n", + " except Exception as e:\n", + " print(f'Um erro no banco de dados ocorreu: {e}')\n", + " break\n", + "\n", + "print('Conexão com o banco de dados finalizada com sucesso')" + ], + "id": "75085470c5a76148", + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Iniciando conexão com o banco de dados\n", + "Conexão com o banco de dados finalizada com sucesso\n" + ] + } + ], + "execution_count": 199 + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}