Árvore de páginas

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.
HTML
<style>
  /* Início estilo banner */

  .compositiondani-banner {
    position: relative;
    min-height: 220px;
    border-radius: 5px;
    margin-bottom: 5px;
    overflow: hidden;
  }

  .compositiondani-banner-image {
    background-image: url("https://totvscrm.com/wp-content/uploads/2023/08/capa-com-fundo-e-sem-icone-TDN21.png");
    background-size: cover;
    min-height: inherit;
    width: 100%;
  }

  .compositiondani-banner-overlay {
    min-height: inherit;
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    border-radius: 5px;
    pointer-events: none;
  }

  .compositiondani-banner-logo-container {
    display: flex;
    justify-content: center;
    align-items: center;
    position: absolute;
    top: 50%;
    left: 50%;
    bottom: 0;
    transform: translate(-50%, -50%);
  }

  .compositiondani-banner-logo {
    width: 350px;
    height: 180px;
    background-image: url("https://totvscrm.com/wp-content/uploads/2023/08/logo.png");
    background-size: contain;
    background-repeat: no-repeat;
  }

  .compositiondani-banner-title {
    margin-bottom: 10px !important;
    padding: 10px !important;
    background: rgba(0, 0, 0, 0.5) !important;
    display: flex !important;
    justify-content: center !important;
    align-items: center !important;
    font-size: 12px !important;
    line-height: 1.3 !important;
    max-height: 133px !important;
    font-family: "Roboto", sans-serif !important;
    -webkit-line-clamp: 3 !important;
    -webkit-box-orient: vertical !important;
    overflow: hidden !important;
    text-overflow: ellipsis !important;
    color: #ffffff !important;
    position: relative !important;
    margin-top: 130px !important;
    border-radius: 10px !important;
  }

  .compositiondani-banner-content {
    position: absolute;
    padding: 30px;
    max-width: 60%;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    z-index: 1;
    color: white;
    text-align: center;
  }

  .custom-header h1 {
    font-size: 16px;
    background-color: rgba(0, 0, 0, 0.6);
    padding: 10px;
    border-radius: 5px;
    margin: 0;
  }

  .negrito-materialize {
    font-weight: bold;
  }

  .custom-margin-justified {
    margin: 0 20px;
    text-align: justify;
  }
    /* Final estilo banner */

       /* Final estilo banner */

      #content.page.view {
    padding-right: 0 !important;
}   /* impedir vermelho no nav */

#breadcrumb-section > nav {
    background-color: initial !important;
    box-shadow: none !important;
}

@media only screen and (min-width: 601px) {
    nav, 
    nav .nav-wrapper i, 
    nav a.sidenav-trigger, 
    nav a.sidenav-trigger i {
        height: auto !important;
        line-height: normal !important;
    }
}
/* final vermelho no nav */   </style>

<header>
  <link href="https://fonts.googleapis.com/css2?family=Roboto:wght@400&display=swap" rel="stylesheet"/>

  <div class="compositiondani-banner">
    <div class="compositiondani-banner-image"></div>
    <div class="compositiondani-banner-overlay"></div>
    <div class="compositiondani-banner-logo-container">
      <div class="compositiondani-banner-logo"></div>
    </div>
    <div class="compositiondani-banner-content">
      <h1 class="compositiondani-banner-title">CAMPOS ADICIONAIS DINÂMICOS (SQL) EM FORMULÁRIOS</h1>
</header>
  </div>
</div>
HTML
<link href="https://fonts.googleapis.com/css2?family=Roboto:wght@400&display=swap" rel="stylesheet"/>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/css/materialize.min.css"/>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/css/all.min.css"/>
    <link href="https://fonts.googleapis.com/css2?family=Roboto:wght@400&display=swap" rel="stylesheet"/>

<link
  rel="stylesheet"
  href="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/css/materialize.min.css"
/>
<link
  href="https://fonts.googleapis.com/icon?family=Material+Icons"
  rel="stylesheet"
/>
<link
  rel="stylesheet"
  href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/css/all.min.css"
/>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css">
<!-- Inclua o estilo do tema Monokai -->



  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/styles/monokai.min.css"/>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/highlight.min.js"></script>
  

  <style>
  /* ==============================
    =       CONFIGURAÇÕES GERAIS      =
    =============================== */

* {
  font-family: "Roboto", sans-serif;
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

body {
  margin: 0;
  padding: 0;
}

a {
  color: #42526e;
  text-decoration: none;
  -webkit-tap-highlight-color: transparent;
}

a:hover {
  color: white;
}

li {  font-size: 14px !important;
}

h3 {  font-size: 14px !important;
  font-weight: bold;  

}

h1 {  font-size: 13px !important;
  

}

h2 {  font-size: 15px !important;
  font-weight: bold;  

}

td, th {
    padding: 4px;
}


/* ==============================
      =        ESTILOS DE TÍTULOS       =
      =============================== */

#title-text {
  display: none !important;
}

.wiki-content h1,
.wiki-content h2 {
  font-family: "Roboto", sans-serif !important;
  font-size: 13px!important;
 
}

.wiki-content h1 {
  font-size: 13px !important;
}

.wiki-content h2 {
  font-size: 14px !important;
  color: #42526e !important;
  border-bottom: 2px solid #dfe1e5;
   padding-bottom: 5px;
  font-weight: bold;  
}

.custom-heading,
h3.custom-h3 {
  font-size: 16px;
  color: #42526e;
  margin-bottom: 20px;
}

.custom-h1 {
  color: #feac0e;
}

.explanation h2 {
  font-weight: bold;
}

/* ==============================
      =        ESTILOS DE TEXTO         =
      =============================== */

.wiki-content p {
  font-size: 14px !important;
}

.justificado,
.custom-justified {
  text-align: justify;
  margin: 10px 0;
}

/* ==============================
      =       ESTILOS DE LINKS         =
      =============================== */

.wiki-content a,
.wiki-content a:link,
.wiki-content a:visited,
.wiki-content a:focus,
.wiki-content a:active {
  text-decoration: none;
  color: #42526e;
  font-size: 14px;


}

.wiki-content a:hover {
  color: white;
}

/* ==============================
      =       ESTILOS DE CONTAINER     =
      =============================== */



.custom-content {
  background-color: #f5f5f5;
  padding: 20px;
  border-radius: 8px;
  margin: 0 10px;
  max-width: 100%;
  overflow: hidden;
}

.faq-container {
  max-width: 800px;
  margin: 0 auto;
  padding: 20px;
}

/* ==============================
      =       ESTILOS DE CARDS         =
      =============================== */

.card {
  border: 2px solid #9aa1ad;
  padding: 20px;
    box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
  border-radius: 8px;
  background-color: #f4f5f7;
  color: #42526e;
  overflow-x: hidden;
   top: 0;
  
}



/* ==============================
      =       ESTILOS DE TABS          =
      =============================== */

.tabs {
  background-color: #dfe1e5;
}

.tabs .tab a {
  color: rgb(66, 82, 110);
}

.tabs .tab a:hover,
.tabs .tab a.active,
.tabs .tab a:focus.active {
  color: #6B48FF;
  background-color: transparent;
}

.tabs .tab a:focus {
  background-color: rgba(82, 97, 232, 0.25);
}

.tabs .tab.disabled a,
.tabs .tab.disabled a:hover {
  color: rgba(16, 148, 184, 0.24);
}

.tabs .indicator {
  background-color: #6B48FF;
}

.tab-content {
   gap: 0;
  padding: 10px;
}

.tab-content pre {
  max-width: 100%;
  overflow-x: hidden;
}

/* ==============================
      =        ESTILOS DE ÍCONES        =
      =============================== */

.icon-list,
.icon {
  padding-left: 0;
  list-style-type: none;
}

.icon {
  display: inline-block;
  width: 24px;
  vertical-align: middle;
  margin-right: 45px;
  position: relative;
  left: -25px;
}

.item .label i {
  margin-right: 10px;
}

/* ==============================
      =    ESTILOS DE COMPONENTES      =
      =============================== */

.collapsible,
.collapsible-header,
.collapsible-body {
  box-shadow: none !important;
}

.faq-question {
  font-weight: bold;
  margin-bottom: 5px;
}

.faq-answer {
  margin-bottom: 20px;
}

.custom-list {
  padding-left: 0;
  margin-left: 1.5em;
}

.custom-list li {
  position: relative;
  padding-left: 1em;
}

ul.custom-list {
  padding-left: 10px;
}

ul.custom-list li {
  position: relative;
  list-style-type: disc;
  padding-left: 30px;
  margin-bottom: 10px;
}

.item {
  display: flex;
  align-items: center;
  padding: 10px;
  border-bottom: 1px solid #eee;
}

.item:last-child {
  border-bottom: none;
}

.item .label {
  flex: 1;
  font-weight: bold;
}

.item .value {
  flex: 1;
  text-align: right;
}
.item {
  border-bottom: 1px solid #e0e0e0;
  padding: 10px 0;
  display: flex;
  justify-content: space-between;
  align-items: center;
}

.item:last-child {
  border-bottom: none;
}

/* Estilos para o label */
.label {
  font-weight: bold;
  display: flex;
  align-items: center;
}

.item .label i {
  margin-right: 10px; /* Adiciona espaço depois dos ícones */
}

/* ==============================
      =     ESTILOS DE IMAGENS         =
      =============================== */

.imagem-responsiva {
  max-width: 100%;
  height: auto;
}

.custom-header-bg img {
  width: 100%;
  height: auto;
  display: block;
}

/* ==============================
      =     ESTILOS DE VÍDEO           =
      =============================== */

#youtube-video-container iframe {
  width: 100%;
  height: auto;
  display: block;
}

.video-container {
    max-width: 800px;
    margin: 0 auto;
  }

.ytp-cued-thumbnail-overlay-image {
  background-size: cover;
  background-position: center;
  width: 100%;
  height: 100%;
  position: absolute;
}

/* ==============================
      =    OUTROS ESTILOS PERSONALIZADOS =
      =============================== */
.custom-content {
  background-color: #f5f5f5;
  padding: 20px;
  border-radius: 8px;
  margin: 0 10px;
  max-width: 100%;
  overflow: hidden;
}

.custom-heading {
  font-size: 16px;
  color: #42526e;
  margin: 10px 0;
  border-bottom: 2px solid #e0e0e0;
  padding-bottom: 5px;
  font-weight: bold;  
}

#indice {
  border-radius: 5px;
  padding: 20px;
  max-width: 100%;
  overflow: hidden;
}

#indice h2 {
  text-align: center;
  margin-bottom: 16px;
}

#indice ul {
  list-style-type: none;
  padding-left: 0;
}

#indice li {
  padding: 10px;
  border-bottom: 1px solid #eee;
  cursor: pointer;
  transition: background-color 0.1s ease;
}

#indice li:last-child {
  border-bottom: none;
}

#indice li:hover {
  background-color: #6B48FF;
  color: white;
}

/* ==============================
  =      ESTILOS DE TABELAS        =
  ============================== */
.custom-grey {
  background-color: #ffffff;
}

.custom-grey th,
.custom-grey td {
  border: 1px solid #42526e;
  padding: 10px;
}

.custom-grey th {
  color: #fff;
  background-color: #42526e;
}



.custom-grey td {
  font-size: 13px;
}

.custom-grey tr:nth-child(odd) {
  background-color: #e4e4e6;
}

.custom-grey tr:nth-child(even) {
  background-color: #dfdfdf;
}

/* ========== FIM DO ESTILO ========= */
/* Estilo para o bloco de código */

/* Estilo para blocos de código dentro de .tab-content */


           .highlight-container pre code {
            background-color: #2d2d2d; /* Cor de fundo escuro */
            color: #f8f8f2; /* Cor do texto claro */
            padding: 10px; /* Espaçamento interno */
            border-radius: 5px; /* Bordas arredondadas */
            overflow-x: auto; /* Barra de rolagem horizontal se necessário */
            font-family: 'Courier New', Courier, monospace; /* Fonte do código */
        }

        /* Estilo para a tag <pre> dentro do contêiner */
        .highlight-container pre {
            margin: 20px 0; /* Margem acima e abaixo do bloco de código */
            padding: 0; /* Sem preenchimento extra */
        }
 

  </style>
  






  <!-- Tabs e conteúdo das guias -->
  <div class="card">
    <ul class="tabs">
      <li class="tab col s4"><a href="#tab1">DETALHES FUNCIONAIS</a></li>
      <li class="tab col s4"><a href="#tab2">DETALHES TÉCNICOS</a></li>
      <li class="tab col s4"><a href="#tab3">FAQ</a></li>
    </ul>
     <!-- Tab Content -->
 
      <div id="tab1" class="col s12">
        <div class="tab-content">
          <div style="background-color: #f4f5f7; padding: 10px; margin-left: 50px; margin-right: 50px;">
            <section id="section1" style="margin-top: 40px;">
               <!-- Tab 70 conteúdo -->
  <!-- Segundo Card -->

    <!-- Primeiro Card -->
  <!-- Primeiro Card -->
  <div class="card">
    <div class="item">
      <span class="label">
        <table border="1">
          <tr>
              <td><i class="fas fa-tags"></i> Produto:</td>
              <td>Automação da Força de Vendas</td>
          </tr>
          <tr>
              <td><i class="fas fa-link"></i> Linha de Produto:</td>
              <td>TOTVS CRM</td>
          </tr>
          <tr>
              <td><i class="fas fa-chart-pie"></i> Segmento:</td>
              <td>Cross Segmentos</td>
          </tr>
          <tr>
              <td><i class="fas fa-desktop"></i> Módulo:</td>
              <td>Formulário/Campos adicionais
            </td>
          </tr>
          <tr>
              <td><i class="fas fa-globe"></i> Aplicação:</td>
              <td>Web/app móvel</td>
          </tr>
          <tr>
              <td><i class="fas fa-hashtag"></i> Identificador:</td>
              <td>DTSFAPD-2616 </td>
          </tr>
      </table>
      </span>
    </div>
    </div>
 

      <br>

       <!-- Segundo Card -->

       <h2 class="custom-heading">
        <i class="fa-solid fa-eye"></i>&nbsp &nbsp VISÃO GERAL
      </h2>
      <p class="justificado">
        Agora, é possível incluir "Campos Adicionais" em formulários, utilizando consultas SQL personalizadas. Isso permite uma maior flexibilidade e adaptação às necessidades específicas do usuário, utilizando dados diretamente do banco de dados.

        
      </p>
<br>

    <h2 class="custom-heading">
      <i class="fa-solid fa-rocket"></i>&nbsp &nbsp OBJETIVO
    </h2>
    <p class="justificado">
      O objetivo é oferecer maior versatilidade e customização em formulários do TOTVS CRM SFA, permitindo que os usuários criem perguntas personalizadas com base em informações específicas do sistema, acessadas por consultas SQL.
    </p>

  <!-- ... (seu conteúdo existente) ... -->
                          
          </section>

          <section id="section2" style="margin-top: 40px;">
            <h2 class="custom-heading"><i class="fa-solid fa-star"></i>&nbsp DETALHES FUNCIONAIS</h2>
            <h3>Funções </h3>
        
            <ol>
                <li>Implementação de "Campos Adicionais" para o contexto de formulários.</li>
                <li>Nova busca para tipo de campo "Pesquisa em Entidade", permitindo uso de Consulta SQL em banco de dados.</li>
                <li>Configuração de campos adicionais na tela de cadastro de campos adicionais (Cadastro -> Geral -> Campos Adicionais), com opções para Base de Dados e Consulta SQL.</li>
                <li>Integração dos campos adicionais nas perguntas dos formulários.</li>       
            </ol>
            
          </section>
         
      
          <section id="section3" style="margin-top: 40px;">
            <h2 class="custom-heading"><i class="fa-solid fa-shoe-prints"></i>&nbsp COMO USAR?</h2>
            <h3> Passo a Passo</h3>

            <ol><li><p><b>Configuração de Campos Adicionais:</b></p><ul><li>Acesse 'Cadastro Geral' > 'Campos Adicionais' no TOTVS CRM SFA.</li><li>Crie ou edite campos, definindo o contexto como "Formulário" e tipo como "Pesquisa em Entidade".</li></ul></li><li><p><b>Definição da Consulta SQL:</b></p><ul><li>Escolha uma consulta pré-cadastrada ou insira uma consulta SQL personalizada em 'Consulta SQL'.</li></ul></li><li><p><b>Integração com Formulários:</b></p><ul><li>Em 'Cadastro de Formulários', adicione perguntas selecionando "Campo Adicional" e escolha o campo personalizado.</li></ul></li><li><p><b>Responder e Visualizar Formulários:</b></p><ul><li>Responda aos formulários na Web ou no Android, utilizando as opções dos campos adicionais.</li></ul></li></ol>
            <br>

          <p>
            <video autoplay loop muted style="width: 100%; height: auto; max-width: 100%; display: block;">
              <source src="https://totvscrm.com/wp-content/uploads/2024/01/SQLcompressaomp4.mp4" type="video/mp4">
            </video>
          </p><br>   
         

          </section>

          <section id="section4" style="margin-top: 40px;">
            <h2 class="custom-heading"><i class="fa-solid fa-signs-post"></i> &nbspEXEMPLO PRÁTICO</h2>
                       

             
              <b>Desafio Antigo:</b>
              <p>Limitação na personalização de formulários devido à falta de opções para incluir dados específicos do sistema.
                
                </p>
              
              <br>
              
              <b>Solução Atualizada:</b>
              <p>Com a nova funcionalidade, os usuários podem agora criar campos adicionais em formulários com dados dinâmicos obtidos através de consultas SQL, melhorando a personalização e a relevância das informações coletadas.
                </p>
              
              <br>
              
              
              </p>
          </section>
      
         
          </div>
          
            <!-- Tab 30 fim -->
          
            <!-- Tab 30 fim -->
          
          </div>
        </div>
    


      <div id="tab2" class="col s12">
        <div class="tab-content">
          <div style="background-color: #f4f5f7; padding: 20px; margin-left: 50px; margin-right: 50px;">
            <section id="section5" style="margin-top: 40px;">
            <!-- Primeira coluna do conteúdo da guia 2 -->
            <h2 class="custom-heading"><i class="fa-solid fa-gear"></i>&nbsp DETALHES TÉCNICOS</h2>
<b> <p>Banco de Dados</p></b>

<b><p>Tools, Opção 3</p></b>
            <ol><li>Na tabela 'campo', adicionar:<ul><li>'idconsulta': integer, nullable, FK para 'consulta'</li><li>'idconexao': integer, nullable, FK para 'conexao'</li><li>'sql': bytea, nullable</li></ul></li><li>Na tabela 'pesquisapergunta', adicionar:<ul><li>'idcampo': integer, nullable, FK para 'campo'</li></ul></li><li>Na tabela 'pesquisapergresulopcao', adicionar:<ul><li>'respostacodigo': varchar(200), nullable</li></ul></li>
<br>

<b> <p>Menu Consulta:</p></b>


            <li><b>Alteração de Endereço do Menu</b>:<ul><li>Modificar endereço de "Cadastro > Dashboard > Consulta" para "Cadastro > Geral > Consulta".</li></ul></li>

            <br>
            <b> <p>Cadastro de Campos Adicionais:</p></b>

            <li><b>Tela de Cadastro de Campos Adicionais</b>:<ul><li>Na tela "Cadastro > Geral > Campos adicionais":<ul><li>Em "Contexto", incluir nova opção "Formulário" (valor "FORM").</li><li>Se "Contexto" = "Formulário" e "Tipo de campo" = "Pesquisa em entidade":<ul><li>Adicionar opção "Entidade genérica" (valor "GENERICO") em "Busca".</li><li>Mostrar campos adicionais após "Busca" para "Consulta" e opções avançadas.</li></ul></li><li>Em "Opções Avançadas", inserir "Base de dados", "Consulta SQL" e botão "Confirmar" para validação da consulta SQL.</li></ul></li></ul></li>
            <br>
            <b><p>Cadastro de Formulário:</p></b>
            <li><b>Tela de Cadastro de Formulários</b>:<ul><li>No campo "Tipo da pergunta", adicionar "Campo adicional" (valor "ADIC").</li><li>Quando "Tipo da pergunta" = "Campo adicional", exibir dropdown "Campo adicional" com seleções da consulta especificada.</li></ul></li> </ol>
            <br>
          <b><p>Cadastro de Formulário:</p></b>

          <li><b>Tela de Cadastro de Formulários</b>:<ul><li>No campo "Tipo da pergunta", adicionar "Campo adicional" (valor "ADIC").</li><li>Quando "Tipo da pergunta" = "Campo adicional", exibir dropdown "Campo adicional" com seleções da consulta especificada.</li></ul></li>
          <br>

        <b><p>Responder Formulário:</p></b>

        <li><b>Implementação de Novos Tipos de Pergunta</b>:<ul><li>Aplicar perguntas do tipo "Campo adicional" ("PESENT") como pesquisa (Chave e valor).</li><li>As opções virão das consultas em 'campo.idconsulta > sql' ou 'campo.sql'.</li><li>No Android, sincronizar view 'ventidadegenerica' para uso offline.</li><li>Seleções em perguntas serão salvas em 'pesquisapergresulopcao', com chaves e valores apropriados.</li></ul></li>
        <br>

      <b><p>Visualizar Formulário:</p></b>
      <li><b>Tela de Visualização de Formulários Respondidos</b>:<ul><li>Exibir respostas de campos adicionais do tipo pesquisa em entidade genérica, usando o valor de 'pesquisapergresulopcao.respostadescricao'.</li></ul></li>


<!-- Second Card -->

           


              </div>

        </div>
    </div> 

    <div id="tab3" class="col s12">
      <div class="tab-content">
        <div style="background-color: #f4f5f7; padding: 20px; margin-left: 50px; margin-right: 50px;">
              <!-- Primeira coluna do conteúdo da guia 2 -->
              <div class="container">
                <h2 class="custom-heading"><i class="fa-solid fa-circle-question"></i> PERGUNTAS FREQUENTES</h2>
                <ul class="collapsible">
                  <li>
                    <div class="collapsible-header"><i class="material-icons">question_answer</i>Existe limite para a quantidade de Campos Adicionais que posso criar?</div>
                    <div class="collapsible-body"><span>Não há um limite específico, mas é recomendável manter um número gerenciável para garantir a eficiência e a usabilidade dos formulários.
                      </span></div>
                </li> 
                   
                    <!-- Adicione mais perguntas e respostas aqui conforme necessário -->
                </ul>
            </div>

            
                            <!-- Primeira coluna do conteúdo da guia 2 -->

            
            </div>
             
      </div>
  </div>

    
<script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/js/materialize.min.js"></script>
<script>
  // Inicialização das tabs
  document.addEventListener("DOMContentLoaded", function () {
    var tabs = document.querySelectorAll(".tabs");
    M.Tabs.init(tabs);
  });
</script>

<script>
  const items = document.querySelectorAll("#indice li");

  items.forEach(item => {
      item.addEventListener('click', (e) => {
          const targetId = e.target.getAttribute('data-target');
          const targetElement = document.getElementById(targetId);
          window.scrollTo({
              top: targetElement.offsetTop - 10,
              behavior: "smooth"
          });
      });
  });
</script>   <script src="https://kit.fontawesome.com/c97d4c197a.js" crossorigin="anonymous"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/js/materialize.min.js"></script>
   
  
  
  <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/highlight.min.js"></script> 
  
  <script>hljs.highlightAll();</script>
    
  
  
  <script src="scripts.js"></script>
  
  <script>
    document.addEventListener('DOMContentLoaded', function() {
        var elems = document.querySelectorAll('.collapsible');
        var instances = M.Collapsible.init(elems);
    });
  </script>
    <script>
    document.addEventListener('DOMContentLoaded', (event) => {
        hljs.highlightAll();
    });
</script>


  



01. DADOS GERAIS

...

TOTVS CRM Automação da Força de Vendas

...

Linha TOTVS CRM

...

Jira
serverJIRA
serverId0c783de1-186e-383b-975c-a1acd7d76cb5
keyDTSFAPD-2616

02. ESCOPO FUNCIONAL

CAMPOS ADICIONAIS PARA CONTEXTO FORMULÁRIO

Para que seja possível incluir outros tipos de campos nos formulários, será necessário implementar campos adicionais para o contexto de Formulários, de forma que seja possível criar facilmente novas possibilidades de campos para os formulários, permitindo ainda a reutilização dos campos customizados em mais de um mesmo formulário.

Estes campos adicionais devem ser cadastrados na tela de cadastro de campos adicionais da ferramenta (Cadastro -> Geral -> Campos Adicionais), onde deve haver um novo tipo de contexto, chamado “FORMULARIO”.

...

Protótipo

Image Removed

CONSULTA SQL EM CAMPOS ADICIONAIS

Nos campos adicionais, será necessário criar uma nova busca para o tipo de campo “Pesquisa em Entidade”, chamado “Entidade Genérica”, o qual permitirá a utilização de Consulta SQL em banco de dados, para que seja possível criar campos customizados, usando as informações do sistema.

Ao utilizar esta nova busca, a aplicação apresentará alguns novos campos na tela de cadastro de campos adicionais, para que seja possível informar a fonte dos dados para a consulta, adicionar as consultas SQL, confirmar a consulta, pré-visualizar os resultados da consulta, validar entrada de dados, permitir utilização de filtro de usuário logado e confirmação do campo adicional.

Segue abaixo o detalhamento dos itens a serem criados:

 

Busca Entidade Genérica

Será necessário implementar um novo tipo de busca para campos adicionais do tipo Pesquisa em Entidade, chamado “Entidade Genérica”, a qual vai ser apresentada inicialmente para campos do contexto de Formulário.

A busca de entidade genérica permitirá ao usuário que selecione a fonte de dados de consulta da entidade, assim como permitirá que o usuário informe uma consulta SQL customizada, para a definição das informações que serão utilizadas neste campo adicional.

Portanto, ao selecionar essa nova opção “Entidade Genérica”, devem ser apresentados os campos “Base de dados” e “Consulta”, conforme descrito a seguir.

...

Protótipo

Image Removed

Base de Dados

Será necessário implementar um novo campo para a busca por Entidade Genérica, onde será possível selecionar a base de dados a ser utilizada na busca das informações do campo adicional.

Este campo terá o seu comportamento similar ao campo de seleção de Base de Dados da tela de cadastro de indicadores do SFA.

...

Protótipo

Image Removed

Consulta

Será necessário implementar um novo campo para as entidades Genéricas, para que seja possível selecionar a Consulta que será utilizada para buscar as informações do campo adicional.

Este campo terá o seu comportamento similar ao campo de seleção de Base de Dados da tela de cadastro de indicadores da ferramenta, onde o usuário poderá selecionar alguma consulta, ou poderá utilizar as configurações avançadas, para informar a sua consulta SQL customizada.

...

Protótipo

Image Removed

Consulta SQL

Será necessário implementar um campo, onde o usuário poderá incluir as consultas SQL, que trarão os dados para o campo adicional.

Este campo será implementado de maneira similar ao existente no cadastro de indicadores de BI, respeitando inclusive as seguintes características:

  • Quando este campo estiver visível, ele deve ter o seu preenchimento obrigatório;
  • Deve ter uma white-list, para definir comandos/ações SQLs permitidos, evitando assim a inclusão de comandos SQL indesejados;
  • Deve ser possível incluir uma variável na consulta, para filtrar pelo usuário logado (WS_USUARIO_LOGADO);
  • A consulta precisa ser padronizada, onde o retorno da mesma precisa ser obrigatoriamente duas colunas:
    • Chave
    • Valor
  • Deve haver um botão para confirmar a consulta SQL. Durante a confirmação, a aplicação deve validar se as regras definidas acima estão sendo respeitadas, e caso alguma delas não seja respeitada, deve ser apresentada uma mensagem de erro ao usuário, informando qual regra que não está sendo cumprida;
  • Deve haver um botão, que permita a pré-visualização dos resultados retornados com a consulta SQL, conforme descrito a seguir.

...

Protótipo

Image Removed

CADASTRO DE FORMULÁRIOS

Será necessário implementar a utilização de “campos adicionais” nas perguntas dos Formulários, de forma que o usuário possa utilizar em seus formulários os campos adicionais previamente criados.

Na tela de edição de formulários, dentro do cadastro de perguntas, será necessário implementar um novo “Tipo da Pergunta”, onde haverá a opção “Campo Adicional”. Essa opção abrirá um novo campo ao usuário, onde ele poderá selecionar um dos campos adicionais cadastrados para o contexto de formulários.

Tipo da Pergunta

Será necessário implementar uma nova opção para o Tipo da Pergunta dos formulários chamada “Campo Adicional”, a qual ao ser selecionada, abrirá um novo campo, para a seleção do adicional desejado.

...

Protótipo

Image Removed

Nova opção no cadastro de Tipo da Pergunta do formulário

Seleção do campo

Será necessário implementar um novo campo no cadastro de perguntas do formulário, onde o usuário poderá selecionar qual o campo adicionar que deseja incluir no formulário.

Este campo será apresentado apenas quando o tipo de pergunta selecionada tenha sido “Campo Adicional”.

Quando apresentado em tela, o preenchimento de campo é obrigatório.

...

Protótipo

Image Removed

Campo para seleção do campo adicional para o Formulário

Pré-visualização do campo adicional no formulário[a]

Será necessário implementar a pré-visualização do campo adicional na tela de edição de formulários, de modo que seja possível pré-visualizar as opções que serão apresentadas no campo.

A pré-visualização dos campos adicionais será similar à pré-visualização das perguntas do tipo “Campos cadastrados”, onde ao clicar sobre a lupa na lateral direita do campo, será apresentada uma popup com a lista de resultados do campo, permitindo inclusive a filtragem dos resultados pela descrição (Valor) do campo.

Nessa popup, será apresentado o conteúdo definido na coluna “valor” do campo adicional.

...

Protótipo

Image Removed

Popup de visualização dos dados que o campo adicional está retornando.

RESPONDER FORMULÁRIO - WEB

Será necessário implementar o campo adicional do tipo Consulta SQL na tela de “responder formulário” da Web do SFA.

Ao carregar a tela de responder, a aplicação efetuará a consulta SQL no banco de dados para gerar as opções do campo, apresentando em tela o Valor encontrado para cada um dos registros.

Os campos adicionais serão apresentados de maneira similar aos campos do tipo “Campos cadastrados”, onde ao clicar sobre a lupa na lateral direita do campo, será apresentada uma popup com a lista de resultados do campo, permitindo inclusive a filtragem dos resultados pela descrição (Valor) do campo.

Nessa popup, será apresentado o conteúdo definido na coluna “valor” do campo adicional.

Quando a aplicação for registrar em banco as respostas destes campos adicionais, deve ser armazenado em banco tanto a Chave quanto o Valor do registro que foi selecionado no formulário, permitindo assim a posterior visualização das respostas incluídas pelo profissional.

...

Protótipo

Image Removed

Exibição do campo complementar do tipo Consulta SQl

Image Removed

Popup com a lista de opções do campo adicional Consulta SQL, apresentando o Valor.

VISUALIZAR ENVIADOS - WEB

Será necessário implementar a visualização do campo adicional do tipo Consulta SQL na tela de “Visualizar Formulários Enviados” da Web do SFA.

Ao carregar a tela de visualização das respostas, a aplicação deve resgatar no banco de dados as informações registradas para o campo adicional, apresentando em tela a descrição do registro (Valor) conforme o que está registrado na resposta do banco de dados.

Como a Consulta SQL pode ter sido totalmente customizada, e a Chave também pode ter sido customizada, a aplicação NÃO deve realizar uma nova Consulta SQL para buscar a descrição do registro, devendo simplesmente apresentar a descrição do registro selecionado.

...

Protótipo

Image Removed

Visualização do campo adicional na tela de Visualização de Formulários Enviados

SINCRONIZAÇÃO DE CAMPOS CONSULTA SQL

Será necessário implementar a sincronização de campos adicionais do tipo Consulta SQL para o Android, de forma que estes campos possam ser utilizados de forma offline no Android.

Para isso, durante a sincronização, devem ser preparadas as opções selecionáveis do campo através de “views”, onde essas opções serão armazenadas dentro de um novo DATS do aparelho.

Dessa forma, será possível utilizar os formulários com perguntas geradas a partir de consultas SQL, uma vez que a consulta foi realizada no momento da sincronização, e o seu resultado está permitido na memória do aparelho.

A cada nova sincronização, as opções selecionáveis serão atualizadas, de forma que elas sempre estejam atualizadas no aparelho do usuário.

RESPONDER FORMULÁRIO - ANDROID

Será necessário implementar o campo adicional do tipo Consulta SQL na tela de “responder formulário” do APP Mobile do SFA.

Ao carregar a tela de responder, a aplicação efetuará a busca a busca das opções do campo de maneira offline, através dos registros presentes na tabela/entidade criada durante a sincronização dos dados.

Como a sincronização atualiza os dados do campo adicional a cada nova sincronização, as informações que estão sendo visualizadas pelo profissional no campo adicional se referem ao momento em que a sincronização foi realizada, assim como ocorre com os demais dados do SFA. Não haverá consulta online para gerar os dados do campo adicional em tempo de execução no APP Mobile.

Os campos adicionais serão apresentados de maneira similar aos campos do tipo “Campos cadastrados”, onde ao clicar sobre o campo, será apresentada uma popup com a lista de resultados do campo, permitindo inclusive a filtragem dos resultados pela descrição (Valor) do campo.

Nessa popup, será apresentado o conteúdo definido na coluna “valor” do campo adicional.

Quando a aplicação for registrar em banco as respostas destes campos adicionais, deve ser armazenado em banco tanto a Chave quanto o Valor do registro que foi selecionado no formulário, permitindo assim a posterior visualização das respostas incluídas pelo profissional.

...

Protótipo

Image Removed Image Removed

Campo adicional com tipo Consulta SQL no Android, com a popup de opções.

VISUALIZAR ENVIADOS - ANDROID

Será necessário implementar a visualização do campo adicional do tipo Consulta SQL na tela de “Visualizar Formulários Enviados” do APP Mobile do SFA.

Ao carregar a tela de visualização das respostas, a aplicação deve resgatar no banco de dados as informações registradas para o campo adicional, apresentando em tela a descrição do registro (Valor) conforme o que está registrado na resposta do banco de dados/memória do aparelho.

Como a Consulta SQL pode ter sido totalmente customizada, e a Chave também pode ter sido customizada, a aplicação NÃO deve realizar uma nova Consulta SQL para buscar a descrição do registro, devendo simplesmente apresentar a descrição do registro selecionado.

...

Protótipo

Image Removed

Visualização campo adicional SQL respondido - Android.

02. ESCOPO TÉCNICO

Banco de dados

  • Pelo tools, opção 3, o sistema deverá fazer a criação dos seguintes campos na tabela campo:
    • idconsulta: integer, nullable, FK para tabela consulta
    • idconexao: integer, nullable, FK para tabela conexao
    • sql: bytea, nullable
  • Pelo tools, opção 3, o sistema deverá fazer a criação dos seguintes campos na tabela pesquisapergunta:
    • idcampo: integer, nullable, FK para tabela campo
  • Pelo tools, opção 3, o sistema deverá fazer a criação dos seguintes campos na tabela pesquisapergresulopcao:
    • respostacodigo: varchar(200), nullable

Menu consulta

  • A opção do menu "Cadastro > Dashboard > Consulta" deverá ser endereçado para "Cadastro > Geral > Consulta" visto que será dependência para campos adicionais, não somente de dashboards

Cadastro de campos adicionais

  • Na Web, Na tela de cadastro de campos adicionais gerais (Cadastro > Geral > Campos adicionais),
    • No campo "Contexto",
      • O sistema deverá adicionar nova opção selecionável de label "Formulário" e valor "FORM", que deverá ser persistido no campo campo.sglentidade
    • Quando selecionado o campo "Contexto" = "Formulário",
      • Quando selecionado o campo "Tipo de campo" = "Pesquisa em entidade"
        • O sistema deve mostrar nova opção selecionável no campo "Busca" de label "Entidade genérica" e valor "GENERICO" que deverá ser persistido no campo campo.nometabela
      • Quando selecionado o campo "Busca" = "Entidade genérica", os seguintes novos campos deverão ser exibidos abaixo do campo "Busca", sendo eles:
        • "Consulta": Campo de pesquisa, cujas opções selecionáveis serão resultado da consulta a seguir:
            • Bloco de código
              /* select idconexao as chave, descricao as valor from consulta where idnativo = 1 */
          • O campo deverá ser persistido no campo campo.idconsulta
          • Ao lado do campo drop-down, o sistema deverá exibir botão de label "Configurações avançadas"
            • Quando o botão for clicado,
              • O sistema deverá tornar o campo "Consulta" não-editável
              • O sistema deverá exibir novos campos, sendo eles:
                • "Base de dados": Campo de seleção (Drop-down), cujas opções selecionáveis serão resultado da consulta a seguir:
                    • Bloco de código
                      /* select idconexao as chave, descricao as valor from conexao where idnativo = 1 */
                  • O campo deverá ser persistido no campo campo.idconexao
                • "Consulta SQL": text-area obrigatório
                  • O campo somente será obrigatório caso esteja visível
                  • Ao lado do campo, deverá ser exibido novo botão de label "Confirmar", de cor azul.
                    • Ao clicar em "Confirmar", o sistema deverá executar a select cadastrada no campo "Consulta SQL" e caso haja algum erro de sintaxe, o sistema deverá retornar a mensagem de erro do banco de dados em tela, em mensagem toast.
                      • Caso a consulta for executada com sucesso, o sistema deverá validar se os campos "chave" e "valor" foram campos resultantes da consulta acima,
                        • Caso não forem,
                          • O sistema deverá retornar a mensagem toast de erro: "Os campos chave e valor devem ser declarados na consulta"
                        • Caso forem
                          • O sistema deverá retornar mensagem toast de sucesso: "A consulta foi executada com sucesso"
                  • O campo deverá ser persistido no campo campo.sql

Cadastro de formulário

  • Na Web, Na tela de cadastro de formulários,
    • Na aba "Formulário"
      • Na seção de "Cadastro de perguntas"
        • No campo "Tipo da pergunta",
          • O sistema deverá adicionar nova opção selecionável de label "Campo adicional" e valor "ADIC" que deve ser persistido no campo pesquisapergunta.sglcomponente
        • Quando selecionado campo "Tipo da pergunta" = "Campo adicional",
          • O sistema deverá exibir campo de label "Campo adicional", campo drop down, cujas opções selecionáveis é o resultado da consulta a seguir:
            • Bloco de código
              select idcampo as chave, descricao as valor from campo where sglentidade = 'FORM' and idnativo = 1 and idcampotipo = (select idcampotipo from campotipo where sglcampotipo = 'PESENT')
            • O campo deverá ser persistido no campo pesquisapergunta.idcampo

Responder formulário

  • Na web, na tela de responder formulários
    • O sistema deverá implementar os novos tipos de pergunta do tipo "Campo adicional"
      • Para campos adicionais do tipo "PESENT" (Pesquisa em entidade), o sistema deverá mostrar o campo como campo de pesquisa (Chave e valor)
        • As opções selecionáveis serão o resultado da consulta persistida no campo campo.idconsulta > sql associado ao campo adicional do campo pesquisapergunta.idcampo
          • Caso não tenha valor cadastrado no campo acima, será resultado da consulta cadastrada no campo campo.sql
          • A grid de seleção dos registros deverá mostrar duas colunas "Chave" e "Valor" referentes aos campos da consulta chave e valor, respectivamente
  • No Android, na tela de responder formulários
    • O sistema deverá implementar os novos tipos de pergunta do tipo "Campo adicional"
      • Para campos adicionais do tipo "PESENT" (Pesquisa em entidade), o sistema deverá mostrar o campo como campo de pesquisa (Chave e valor)
        • Especificamente no Android, visto que não é possível fazer consultas com sintaxe SQL no contexto offline
          • No momento da sincronização de dados
            • O sistema deverá preparar view ventidadegenerica com as seguintes colunas:
                • idcampo
                  • Referência do campo adicional do tipo "Pesquisa entidade" com consulta "Entidade genérica"
                • chave
                  • Será resultado do campo chave da consulta cadastrada no campo campo.idconsulta > sql
                    • Caso não tenha valor cadastrado no campo acima, será resultado do campo chave da consulta cadastrada no campo campo.sql
                • valor
                  • Será resultado do campo chave da consulta cadastrada no campo campo.idconsulta > sql
                    • Caso não tenha valor cadastrado no campo acima, será resultado do campo chave da consulta cadastrada no campo campo.sql
              • Dessa forma, o sistema já carregará previamente as opções selecionáveis de todos os campos adicionais de formulários, para que o contexto offline continue funcional
        • As opções selecionáveis serão o resultado da consulta da view ventidadegenerica, associada ao campo ventidadegenerica.idcampo
          • A grid de seleção dos registros deverá mostrar duas colunas "Chave" e "Valor" referentes aos campos da consulta chave e valor, respectivamente
  • A opção selecionada na pergunta deverá ser persistida na tabela pesquisapergresulopcao, segundo a lógica
    • "Chave": pesquisapergresulopcao.respostacodigo
    • "Valor": pesquisapergresulopcao.respostadescricao

Visualizar formulário

...