Seguidores

sábado, 26 de abril de 2025

Do Caos ao Prompt T4E11: Desenvolvimento do App AG2P - Evento "Selecionou incidentes por origem"

INTRODUÇÃO

Post anterior: Do Caos ao Prompt T4E10: Desenvolvimento do App AG2P - Evento "Selecionou totais para produtividade"

Este Post é o episódio 11 da temporada 4 da série "Do Caos ao Prompt", que apresenta o desenvolvimento do Agente de Gestão de Processo Pessoal (AG2P), tendo como foco o evento "Selecionou incidentes por origem".


Evento “Selecionou incidentes por origem”

Link da conversa com o Gemini, na qual foi apresentado um Prompt contendo os itens Objetivo, Contexto, Ferramentas e Especificações, para geração do código para implementar o evento
"Selecionou incidentes por origem": https://g.co/gemini/share/da4d0f0e5210


Comando ao Gemini para solicitar a implementação do evento

Objetivo, Contexto e Ferramentas

Clique aqui para  ver os itens Objetivo, Contexto e Ferramentas do Comando.

Especificações

Segue abaixo o post da temporada 3 desta série, que contém as especificações do evento "Selecionou incidentes por origem", que faz parte deste comando:

Do Caos ao Prompt T3E12: Estrutura do Agente AG2P - Diálogo 10 Evento "Selecionou incidentes por origem" dispara Ação "Atualizar aba Pareto"

As especificações do evento foram feitas com Finite State Machine (FSM), de tal forma que cada evento pode ser automatizado e testado de forma independente.

Resposta do Gemini


/**
 * @OnlyCurrentDoc
 */

function onSelecionouIncidentesPorOrigem() {
  // Obtém a planilha ativa e a aba RDM
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const rdmAba = ss.getSheetByName("RDM");

  // Verifica o estado da aba RDM (R41)
  const estadoRDM = obterEstadoRDM(rdmAba);
  if (estadoRDM !== "RDM Antes do fim") {
    Logger.log("Ação 'Selecionou incidentes por origem' não pode ser executada. Estado da RDM é: " + estadoRDM);
    SpreadsheetApp.getUi().alert("Ação não permitida", "O estado da aba RDM deve ser 'RDM Antes do fim'.", SpreadsheetApp.Ui.ButtonSet.OK);
    return;
  }

  // Executa a ação "Atualizar aba Pareto"
  atualizarAbaPareto(ss);

  // Mantém o estado da aba RDM como "RDM Antes do fim" (R41)
  // Não é necessário alterar o estado, pois a própria função `atualizarAbaPareto` já garante isso.

  Logger.log("Evento 'Selecionou incidentes por origem' concluído. Estado da RDM mantido como 'RDM Antes do fim'.");
}

function obterEstadoRDM(abaRDM) {
  // Supondo que o estado da aba RDM esteja em uma célula específica, por exemplo, A1
  // Ajuste a célula conforme a sua planilha
  const estadoCelula = abaRDM.getRange("A1");
  return estadoCelula.getValue();
}

function atualizarAbaPareto(spreadsheet) {
  const gpsAba = spreadsheet.getSheetByName("GPS");
  const paretoAba = spreadsheet.getSheetByName("Pareto");

  // --- Regras R17 a R22: Período de Referência ---
  // Supondo que o período de referência esteja definido em células específicas da aba Pareto
  // Exemplo: A1 contém ">=dd/mm/aaaa" e B1 contém "<=dd/mm/aaaa"
  const periodoReferenciaCelula = paretoAba.getRange("A1");
  const dataInicialStr = periodoReferenciaCelula.getValue();
  const dataFinalStr = paretoAba.getRange("B1").getValue();

  // Validação das regras R18 e R20 (formato das datas)
  const regexData = /^(>=|<=)\d{2}\/\d{2}\/\d{4}$/;
  if (!regexData.test(dataInicialStr) || !regexData.test(dataFinalStr)) {
    SpreadsheetApp.getUi().alert("Erro no Período de Referência", "As datas inicial e final devem seguir o formato '>=dd/mm/aaaa' e '<=dd/mm/aaaa', respectivamente.", SpreadsheetApp.Ui.ButtonSet.OK);
    return;
  }

  // Extrai as datas para comparação
  const inicioMatch = dataInicialStr.match(/(\d{2})\/(\d{2})\/(\d{4})/);
  const fimMatch = dataFinalStr.match(/(\d{2})\/(\d{2})\/(\d{4})/);

  if (!inicioMatch || !fimMatch) {
    SpreadsheetApp.getUi().alert("Erro ao processar datas", "Não foi possível extrair as datas do período de referência.", SpreadsheetApp.Ui.ButtonSet.OK);
    return;
  }

  const dataInicial = new Date(inicioMatch[3], parseInt(inicioMatch[2]) - 1, inicioMatch[1]);
  const dataFinal = new Date(fimMatch[3], parseInt(fimMatch[2]) - 1, fimMatch[1]);

  // Obtém os dados da aba GPS (linha "TOTAL DE DEFEITOS", colunas K a P)
  const totalDefeitosLinha = gpsAba.getRange("TOTAL DE DEFEITOS").getRow();
  const dadosDefeitos = gpsAba.getRange(totalDefeitosLinha, 11, 1, 6).getValues()[0]; // Colunas K a P

  // --- Regra R23: Atualização das fórmulas na aba Pareto (A3:F3) ---
  // Supondo que as colunas na aba GPS para as origens sejam:
  // K: Origem 1, L: Origem 2, M: Origem 3, N: Origem 4, O: Origem 5, P: Outros
  const colunasOrigemGPS = ["K", "L", "M", "N", "O", "P"];
  const celulasSomaPareto = ["A3", "B3", "C3", "D3", "E3", "F3"];

  for (let i = 0; i < colunasOrigemGPS.length; i++) {
    const coluna = colunasOrigemGPS[i];
    const celulaPareto = celulasSomaPareto[i];

    // Constrói a fórmula de SOMASES para cada origem, considerando o período
    const formula = `=SUMIFS(GPS!${coluna}:${coluna},GPS!A:A,">${inicioMatch[1]}/${inicioMatch[2]}/${inicioMatch[3]}",GPS!A:A,"<=${fimMatch[1]}/${fimMatch[2]}/${fimMatch[3]}")`;
    paretoAba.getRange(celulaPareto).setFormula(formula);
  }

  // --- Apresentação do Gráfico Pareto (AG2P) ---
  // Supondo que o gráfico de Pareto já esteja inserido na aba "Pareto"
  // e que seus dados sejam baseados nas células A3:F3
  const charts = paretoAba.getCharts();
  if (charts.length > 0) {
    // Exibe o primeiro gráfico encontrado (pode haver mais de um)
    SpreadsheetApp.getUi().showSidebar(charts[0].getAsUi());
  } else {
    SpreadsheetApp.getUi().alert("Gráfico de Pareto não encontrado", "Certifique-se de que o gráfico de Pareto está inserido na aba 'Pareto'.", SpreadsheetApp.Ui.ButtonSet.OK);
  }

  // --- Atualização do Estado da aba RDM (AG2P - R41) ---
  // O estado já foi verificado no início da função `onSelecionouIncidentesPorOrigem`
  // e a ação de manter o estado é implícita aqui, pois não o modificamos.

  Logger.log("Aba Pareto atualizada com base no período: " + dataInicialStr + " a " + dataFinalStr);
}

Explicação do Código:

  1. onSelecionouIncidentesPorOrigem():

    • Esta é a função principal que será executada quando o evento "Selecionou incidentes por origem" for disparado (isso dependerá de como você implementará a interface do usuário - botões, menus, etc.).
    • Obtém a planilha ativa e a referência para a aba "RDM".
    • Chama a função obterEstadoRDM() para verificar o estado atual da aba "RDM".
    • Verifica a Regra R41: Se o estado da aba "RDM" não for "RDM Antes do fim", a função registra um log e exibe um alerta, interrompendo a execução.
    • Chama a função atualizarAbaPareto() para executar a ação correspondente.
    • Registra um log indicando a conclusão do evento e a manutenção do estado da "RDM".
  2. obterEstadoRDM(abaRDM):

    • Esta função recebe a aba "RDM" como parâmetro.
    • Importante: Assume que o estado da aba "RDM" está armazenado em uma célula específica (no exemplo, a célula "A1"). Você precisará ajustar essa célula para corresponder à estrutura da sua planilha.
    • Retorna o valor contido nessa célula, que representa o estado da "RDM".
  3. atualizarAbaPareto(spreadsheet):

    • Recebe a planilha ativa como parâmetro.
    • Obtém referências para as abas "GPS" e "Pareto".
    • Regras R17 a R22 (Período de Referência):
      • Assume que o período de referência está definido em células específicas da aba "Pareto" (no exemplo, "A1" para a data inicial e "B1" para a data final). Você precisará ajustar essas células conforme a sua planilha.
      • Valida o formato das datas (Regras R18 e R20) usando uma expressão regular.
      • Extrai as datas inicial e final para comparação (embora a comparação direta com as datas da planilha GPS não seja feita explicitamente neste código, as fórmulas SUMIFS farão essa filtragem).
    • Regra R23 (Atualização das fórmulas):
      • Define as colunas correspondentes às origens dos defeitos na aba "GPS" (K a P) e as células onde as fórmulas de soma serão inseridas na aba "Pareto" (A3 a F3).
      • Itera sobre as origens e constrói uma fórmula SUMIFS para cada uma. Essa fórmula soma os valores da coluna de origem na aba "GPS" onde a data na coluna A da aba "GPS" está dentro do período de referência definido na aba "Pareto".
      • Insere essas fórmulas nas células correspondentes da aba "Pareto".
    • Apresentação do Gráfico Pareto (AG2P):
      • Obtém todos os gráficos existentes na aba "Pareto".
      • Se houver pelo menos um gráfico, ele assume que o primeiro gráfico encontrado é o gráfico de Pareto e o exibe em uma barra lateral usando SpreadsheetApp.getUi().showSidebar().
      • Se nenhum gráfico for encontrado, exibe um alerta.
    • Regra R41 (Manutenção do estado da RDM):
      • A função atualizarAbaPareto não modifica o estado da aba "RDM". A responsabilidade de verificar e manter o estado é da função onSelecionouIncidentesPorOrigem().
    • Registra um log indicando que a aba Pareto foi atualizada.

Próximos Passos e Considerações:

  • Interface do Usuário: Você precisará criar uma maneira para o usuário disparar o evento "Selecionou incidentes por origem". Isso pode ser um botão na planilha, um item de menu personalizado ou outro elemento de interface fornecido pelo Google Apps Script. A função onSelecionouIncidentesPorOrigem() seria vinculada a esse elemento.
  • Localização do Estado da RDM: Certifique-se de que a função obterEstadoRDM() esteja lendo o estado correto da aba "RDM".
  • Localização do Período de Referência: Ajuste as células na aba "Pareto" onde o período de referência é inserido.
  • Estrutura da Aba GPS: Verifique se as colunas mencionadas (A para datas, K a P para origens) correspondem à estrutura real da sua aba "GPS".
  • Gráfico de Pareto: Certifique-se de que o gráfico de Pareto já esteja inserido na aba "Pareto" e que seus dados sejam baseados nas células A3:F3 (ou ajuste o código se for diferente).
  • Tratamento de Erros: O código inclui algumas verificações básicas (formato das datas, estado da RDM, existência do gráfico), mas você pode adicionar tratamento de erros mais robusto conforme necessário.
  • Testes: Teste cuidadosamente a função com diferentes cenários e dados para garantir que ela funcione conforme o esperado e siga todas as regras especificadas.

Lembre-se de substituir os nomes das abas e as referências de células no código para corresponderem à sua planilha real.

CONCLUSÃO

Neste episódio 11, da temporada 4 da série "Do Caos ao Prompt", foi apresentada a implementação do Evento "Selecionou incidentes por origem", realizada pelo Chatbot de IA Gemini 2.0 Flash.

As especificações do evento foram feitas em Finite State Machine (FSM).

Próximo post: Do Caos ao Prompt T4E12: Desenvolvimento do App AG2P - Evento "Avaliou a capacidade do processo"

Veja a lista de Episódios da Temporada 4 da Série "Do Caos ao Prompt", no final do Episódio T4E01.

Nenhum comentário:

Postar um comentário

Entendendo a Metáfora "Home Office é Moto Boy"

Dashboard de Produtividade Pessoal T1E14: RESOLVIDO BugCT1-5 Erro 400 no login

INTRODUÇÃO Post anterior:  Dashboard de Produtividade Pessoal T1E13: BugCT1-5 Erro 400 no login O objetivo deste post é apresentar um prompt...