Á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"> 
                
        

        CONFIGURAÇÃO: ANEXAR ARQUIVOS EM PEDIDOS FINALIZADOS </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>Configuração - Sincronização > Dispositivos
            </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-2452 - DTSFAPD-2453 </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">
        A melhoria aprimora a segurança e o gerenciamento de dispositivos no ambiente mobile. Com esta atualização, é possível controlar quais dispositivos têm permissão para acessar a aplicação, permitindo bloqueios e gerenciamento detalhado de cada dispositivo.

        
      </p>
<br>

    <h2 class="custom-heading">
      <i class="fa-solid fa-rocket"></i>&nbsp &nbsp OBJETIVO
    </h2>
    <p class="justificado">
      O principal objetivo é oferecer aos administradores de acesso a capacidade de gerenciar e controlar quais dispositivos podem sincronizar com o sistema. Isso inclui a possibilidade de bloquear dispositivos já cadastrados e gerenciar o acesso de novos dispositivos.
    </p>

  <!-- ... (seu conteúdo existente) ... -->
  <h2 class="custom-heading">
    <i class="fa-solid fa-book"></i> &nbsp ANTES DE COMEÇAR
</h2>
<h3>Requisitos</h3>
<p>A funcionalidade afeta o gerenciamento de dispositivos no TOTVS CRM SFA.</p>
<p>Parâmetro disponível sob a seção de sincronização de dispositivos.</p> 
                          
          </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>Controle de acesso para novos dispositivos baseado no parâmetro "sim3g.dispositivo.bloqueio.novo"</li>
                <li>Possibilidade de bloquear dispositivos e impedir novas sincronizações.</li>
                <li>Use a opção "Bloqueio permanente" para controlar o acesso dos dispositivos.</li>
                <li>Integração com o cadastro de profissionais para sugerir bloqueio de dispositivos ao inativar um usuário.</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><strong>Configuração do Parâmetro para Novos Dispositivos:</strong></p><ul><li>Ajuste o parâmetro "sim3g.dispositivo.bloqueio.novo" para controlar automaticamente o acesso de novos dispositivos que se conectam ao sistema pela primeira vez.</li></ul></li><li><p><strong>Gerenciamento de Dispositivos no Cadastro Geral:</strong></p><ul><li>Acesse a tela "Cadastro > Geral > Dispositivo" no TOTVS CRM SFA. Aqui, você pode visualizar e gerenciar tanto os dispositivos novos quanto os já existentes.</li></ul></li><li><p><strong>Uso da Opção 'Bloqueio Permanente':</strong></p><ul><li>Utilize o campo "Bloqueio permanente" disponível para cada dispositivo listado para controlar o acesso de dispositivos específicos. Marque como "Sim" para bloquear ou "Não" para permitir o acesso.</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>Dificuldade em controlar e gerenciar o acesso de dispositivos específicos ao sistema TOTVS CRM SFA.
                
                </p>
              
              <br>
              
              <b>Solução Atualizada:</b>
              <p>Com a nova funcionalidade, os administradores podem agora gerenciar de forma eficiente o acesso dos dispositivos, oferecendo maior segurança e controle sobre a utilização da aplicação.
                </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>

<ol><li><p><b>Banco de Dados</b></p>
  <ul><li><strong>• Tools, Opção 3</strong>: No sistema, adicionar na tabela 'wssynclog' a coluna 'iddispositivo', que é uma FK para a tabela 'dispositivo', e pode ser nula.</li>
    <li><strong>• Tools, Opção 5</strong>: Criar um novo registro na tabela 'parâmetro' seguindo o especificado no changeSet fornecido, detalhando as características do novo parâmetro relacionado ao bloqueio de dispositivos.</li></ul></li>
  <br>
  <div style="background-color: #2d2d2d; padding: 10px; border-radius: 5px;">
    <pre style="margin: 0; overflow-x: auto;"><code class="language-xml" style="color: #f8f8f2; font-family: 'Courier New', Courier, monospace;"> 

<changeSet author="systemScript" failOnError="false" id="" runOnChange="true">
    <insert tableName="parametro">
        <column name="idparametro" valueSequenceNext="SEQPKPARAMETRO"/>
        <column name="idnativo" valueComputed="1"/>
        <column name="idnespecializa" valueComputed="0"/>
        <column name="idnpermitealteracao" valueComputed="0"/>
        <column name="chave" valueComputed="'sim3g.dispositivo.bloqueio.novo'"/>
        <column name="descricao" valueComputed="'Parâmetro que define se novos dispositivos devem ser bloqueados de sincronizar, por padrão.'/>
        <column name="observacao" valueComputed="'Valores aceitáveis: 0 para liberar a sincronização de novos dispositivos. 1 para bloquear a sincronização de novos dispositivos'"/>
        <column name="valor" valueComputed="'0'"/>
        <column name="valorminimo" valueComputed="'0'"/>
        <column name="valormaximo" valueComputed="'0'"/>
        <column name="sglcontexto" valueComputed="'dispositivo'"/>
        <column name="sglmodulo" valueComputed="'Geral'"/>
        <column name="sglambiente" valueComputed="'Todos'"/>
        <column name="sglorigem" valueComputed="'XML'"/>
        <column name="codigoerp" valueComputed="null"/>
        <column name="wsversao" valueComputed="null"/>
    </insert>
    <comment></comment>
</changeSet>
     </code></pre>
</div> <br>
  

  <li><p><b>Banco de DadosRefatoração de tela de cadastro dispositivo</b></p>
   <ul><li><b>• A tela "Cadastro > Geral > Dispositivo" deverá possuir grid com as seguintes especificações:</b>
     <li>◦ "Descrição": Campo textual, editável, default vazio. Persistência no campo dispositivo.descricao</li>
          <li>◦ "Marca": Campo textual, não editável, inserido pela sincronização persistindo a informação da marca do dispositivo. Persistência no campo dispositivo.marca</li>
          <li>◦ "Modelo": Campo textual, não editável, inserido pela sincronização persistindo a informação do modelo do dispositivo. Persistência no campo dispositivo.modelo</li>
          <li>◦ "ID": Campo textual, não editável, inserido pela sincronização persistindo a informação do "AndroidId" do dispositivo. Persistência no campo dispositivo.identificador</li>
          <li>◦ "Telefone": Campo numérico, editável, máscara de telefone. Persistência no campo dispositivo.numero</li>
          <li>◦ "Profissional": Campo pesquisa, não editável, exibindo nome do usuário associado ao dispositivo. Dispositivos que não autenticaram corretamente com um usuário, não devem ser cadastrados. A intenção é que esse campo nunca seja vazio. Persistência no campo dispositivo.idusuario</li>
          <li>◦ "Veículo": Campo pesquisa, editável, buscando a entidade veiculo, exibindo somente registros ativos. Persistência no campo dispositivo.idveiculo</li>
          <li>◦ "Última transmissão": Campo textual, não editável, exibindo data/hora da última sincronização associada ao dispositivo. Persistência no campo dispositivo.ultimatransmissao</li>
          <li>◦ "Situação": Campo check-box, editável, opções Sim/Não. Ao sincronizar, caso o dispositivo estiver inativado o dispositivo será atualizado para ativo. O bloqueio do dispositivo deverá acontecer somente pelo campo "Bloqueado". Persistência no campo dispositivo.idnativo</li>
          <li>◦ "Sistema Operacional": Campo textual, não editável, inserido pela sincronização persistindo a informação do SO do dispositivo. Persistência no campo dispositivo.sistemaoperacional</li>
          <li>◦ "Versão": Campo textual, não editável, inserido pela sincronização persistindo a informação do número da versão do SO do dispositivo. Persistência no campo dispositivo.versaoso</li>
          <li>◦ "Bloqueado": Campo check-box, editável, opções Sim/Não. Persistência no campo dispositivo.idnbloqueiopermanente</li>
      </ul></ul>
  </li>
  <ul><li>• <b>A tela deverá receber os seguintes novos filtros avançados:</b>
     
          <li>◦ "Usuário": campo de pesquisa, múltipla escolha, exibindo usuarios ativos. Ao selecionado, fará filtragem pelo campo dispositivo.idusuario</li>
          <li>◦ "Situação": Checkbox, com opções: "Ativo" e "Inativo". Somente a opção Ativo deve vir marcada por padrão. Ao carregar a tela, somente deverão ser exibidos registros de dispositivos ativos. Ao selecionado, fará filtragem pelo campo dispositivo.idnativo</li>
          <li>◦ "Bloqueado": Checkbox, com opções "Sim" e "Não". As duas opções devem vir marcadas por padrão. Ao selecionado, fará filtragem pelo campo dispositivo.idnbloqueiopermanente</li>
      </ul>
 
      <ul><li>• <b> Ao sincronizar, caso a combinação dos campos dispositivo.identificador + dispositivo.idusuario não esteja cadastrada no sistema, o sistema deverá adicionar novo registro na tabela dispositivo. Caso a combinação dos campos dispositivo.identificador + dispositivo.idusuario esteja cadastrada no sistema, o sistema deverá atualizar o registro de dispositivo.</b></li>
    <li>◦ Em ambos os casos, os seguintes campos deverão ser atualizados:</li>
      <ul>
          <li>◦ Marca</li>
          <li>◦ Modelo</li>
          <li>◦ Última transmissão</li>
          <li>◦ Situação</li>
          <li>◦ Sistema Operacional</li>
          <li>◦ Versão</li>
      </ul>
  </li>
</ul>
<br>
<li><p><b>• Vinculação de dispositivos com controle de sincronização (wssynclog)</b></p>
  <ul><li>◦  Ao sincronizar, autenticando com sucesso, ao persistir o registro de log na tabela wssynclog, o sistema deverá popular a coluna wsynclog.iddispositivo, buscando o iddispositivo pela consulta a seguir:</li>
  </ul>

  <div style="background-color: #2d2d2d; padding: 10px; border-radius: 5px;">
    <pre style="margin: 0; overflow-x: auto;"><code class="language-xml" style="color: #f8f8f2; font-family: 'Courier New', Courier, monospace;"> 
      /* 
      select iddispositivo from dispositivo where identificador = ${AndroidID} and idusuario = ${wssynclog.idusuario}
      */ 
    </code></pre>
  </div> <br>

  <ul><li>◦  Caso não seja encontrado, um novo dispositivo deverá ser persistido na tabela dispositivo.</li>
  </ul>
  <ul><li>◦  Caso o parâmetro "sim3g.dispositivo.bloqueio.novo" estiver com valor 1,</li>
  </ul>
  <ul><li>◦  O campo dispositivo.idnbloqueiopermanente deverá ser persistido como 1.</li>
</ul>
Caso contrário,
<ul><li>◦  O campo dispositivo.idnbloqueiopermanente deverá ser persistido como 0.</li>
</ul>
<br>
<li><p><b>Sugestão de bloqueio de usuários inativados</b></p>
  <ul><li><p><b>• Na tela de cadastro de profissionais,</li></p> </b></ul>
  <ul><li>◦  Ao inativar um profissional e clicar em gravar,</li>
  </ul>
  <ul><li>◦  O sistema deverá consultar se existem dispositivos ativos ("Bloqueio permanente" = "Não") associados a ele, através da consulta a seguir:</li>
  </ul>

  <div style="background-color: #2d2d2d; padding: 10px; border-radius: 5px;">
    <pre style="margin: 0; overflow-x: auto;"><code class="language-xml" style="color: #f8f8f2; font-family: 'Courier New', Courier, monospace;"> 
  /* select iddispositivo from dispositivo where idusuario = ? and idnbloqueiopermanente = 0 */
  </code></pre>
  </div> <br>

  <ul><li><p><b>• Se retornarem registros , o sistema deverá exibir pop-up de confirmação (Sim/Não), com a pergunta: "O profissional foi inativado, deseja bloquear os seus dispositivos associados?".</li></p> </b></ul>
  <ul><li>◦  Caso selecionado "Sim", o sistema deverá atualizar a tabela de dispositivos do usuário, marcando o campo como "Bloqueio permanente" = "Sim"</li>
  </ul>
  <div style="background-color: #2d2d2d; padding: 10px; border-radius: 5px;">
    <pre style="margin: 0; overflow-x: auto;"><code class="language-xml" style="color: #f8f8f2; font-family: 'Courier New', Courier, monospace;"> 
  /* update dispositivo set idnbloqueiopermanente = 1 where idusuario = ? */
</code></pre>
</div> <br>

<li><p><b>Implementação de bloqueio de dispositivos</b></p>
  <ul><li><p><b>• Ao sincronizar, autenticando com sucesso,</li></p> </b></ul>
  <ul><li>◦  Caso o aparelho contenha dados,</li>
  </ul>
  <ul><li><p><b>• Caso o dispositivo associado à sincronização (Ponto 3) possua o campo dispositivo.idnbloqueiopermanente = 1,</li></p> </b></ul>
  <ul><li>◦  O sistema deverá receber os dados do aparelho (Aparelho > Servidor), porém, na etapa de receber dados (Servidor > Aparelho), o sistema deverá notificar o usuário com a seguinte mensagem: "O aparelho foi bloqueado para utilização do sistema e terá seus dados removidos".</li>
  </ul>
  <ul><li>◦  Após a mensagem, o sistema deverá ter excluido todos os dados (DATS) do aparelho, encaminhando o usuário para a tela de login.</li>
  </ul>
  <ul><li>◦  Caso contrário,</li>
  </ul>
  <ul><li>◦  O sistema deverá executar a sincronização normalmente, sem bloqueios.</li>
  </ul>
  <ul><li><p><b>• Caso o aparelho não contenha dados,</li></p> </b></ul>
  <ul><li>◦  Caso o dispositivo associado à sincronização (Ponto 3) possua o campo dispositivo.idnbloqueiopermanente = 1,</li>
  </ul>
  <ul><li>◦  O sistema deverá cancelar a sincronização após a autenticação, e notificar o usuário com a seguinte mensagem: "O aparelho está bloqueado para utilização do sistema. Solicite liberação ao responsável, informando o código do dispositivo a seguir: ${AndroidID com opção para copiar o conteúdo para a clipboard}".</li>
</ul>
<ul><li><p><b>• Caso contrário,</li></p> </b></ul>
<ul><li>◦  O sistema deverá executar a sincronização normalmente, sem bloqueios.</li>
</ul>

</ol>
    


<!-- 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>Posso desbloquear um dispositivo depois de marcá-lo como permanentemente bloqueado?</div>
                    <div class="collapsible-body"><span>Sim, você pode alterar o status de "Bloqueio Permanente" para "Não" para permitir novamente a sincronização do dispositivo.
                      </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 SFA

...

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

02. ESCOPO FUNCIONAL

O sistema deverá fornecer possibilidade de que profissional de perfil interno controle quais são os aparelhos que podem sincronizar no sistema.

Para isso, deverá implementar edição no campo "Bloqueio permanente" para ser marcado como Sim/Não.

Para dispositivos cadastrados no sistema, marcados com "Bloqueio permanente" = "Sim", o sistema permitirá que o aparelho envie dados ao servidor, porém, não permitirá que o aparelho receba dados do servidor, e além disso, fará a exclusão dos dados do aparelho, para que não seja possível realizar novas sincronizações, exibindo mensagem: "O aparelho foi bloqueado para utilização do sistema e terá seus dados removidos", enviando o usuário para tela de login. Sem dados, ao sincronizar nessa condição de bloqueio, o sistema não deverá permitir a sincronização, retornando mensagem: "O aparelho está bloqueado para utilização do sistema. Solicite liberação ao responsável, informando o código do dispositivo a seguir: ${HASH com opção para copiar}" 

Para dispositivos não cadastrados no sistema, ao sincronizarem pela primeira vez, deverão respeitar parâmetro configurável "sim3g.dispositivo.bloqueio.novo" para definição de se novos aparelhos não cadastrados deverão ser bloqueados ou liberados por padrão,

Caso o parâmetro "sim3g.dispositivo.bloqueio.novo" estiver configurado com valor "1" (Sim), os novos dispositivos serão cadastrado com o campo "Bloqueio permanente" = "Sim"

A tela de "Cadastro > Geral > Dispositivo" deverá receber filtro avançado de usuário.

Na tela de cadastro de profissionais, ao inativar um profissional e clicar em gravar, o sistema deverá consultar se existem dispositivos ativos ("Bloqueio permanente" = "Não") associados a ele e, se sim, exibir pop-up de confirmação (Sim/Não), com a pergunta: "O profissional foi inativado, deseja bloquear os seus dispositivos associados?". Caso selecionado "Sim", o sistema deverá atualizar a tabela de dispositivos do usuário, marcando o campo como "Bloqueio permanente" = "Sim"

03. ESCOPO TÉCNICO

1. Banco de dados

  • Pelo tools, opção 3, o sistema deverá criar a seguinte coluna na tabela wssynclog:
    • iddispositivo: FK para tabela dispositivo, nullable.
  • Pelo tools, opção 5, o sistema deverá criar o seguinte registro na tabela parâmetro:
    • Bloco de código
      <changeSet author="systemScript" failOnError="false" id="" runOnChange="true">
              <insert tableName="parametro">
                  <column name="idparametro" valueSequenceNext="SEQPKPARAMETRO"/>
                  <column name="idnativo" valueComputed="1"/>
                  <column name="idnespecializa" valueComputed="0"/>
                  <column name="idnpermitealteracao" valueComputed="0"/>
                  <column name="chave" valueComputed="'sim3g.dispositivo.bloqueio.novo'"/>
                  <column name="descricao" valueComputed="'Parâmetro que define se novos dispositivos devem ser bloqueados de sincronizar, por padrão.'"/>
                  <column name="observacao" valueComputed="'Valores aceitáveis: 0 para liberar a sincronização de novos dispositivos. 1 para bloquear a sincronização de novos dispositivos'"/>
                  <column name="valor" valueComputed="'0'"/>
                  <column name="valorminimo" valueComputed="'0'"/>
                  <column name="valormaximo" valueComputed="'0'"/>
                  <column name="sglcontexto" valueComputed="'dispositivo'"/>
                  <column name="sglmodulo" valueComputed="'Geral'"/>
                  <column name="sglambiente" valueComputed="'Todos'"/>
                  <column name="sglorigem" valueComputed="'XML'"/>
                  <column name="codigoerp" valueComputed="null"/>
                  <column name="wsversao" valueComputed="null"/>
              </insert>
              <comment></comment>
          </changeSet>

2. Refatoração de tela de cadastro dispositivo

  • A tela "Cadastro > Geral > Dispositivo" deverá possuir grid com as seguintes especificações:
      • Persistência no campo dispositivo.descricao
      • Persistência no campo dispositivo.marca
      • Persistência no campo dispositivo.modelo
    • "ID":
      • Persistência no campo dispositivo.identificador
      • Persistência no campo dispositivo.numero
      • Dispositivos que não autenticaram corretamente com um usuário, não devem ser cadastrados. A intenção é que esse campo nunca seja vazio.
      • Persistência no campo dispositivo.idusuario
      • Persistência no campo dispositivo.idveiculo
      • Persistência no campo dispositivo.ultimatransmissao
      • Ao sincronizar, caso o dispositivo estiver inativado o dispositivo será atualizado para ativo. O bloqueio do dispositivo deverá acontecer somente pelo campo "Bloqueado"
      • Persistência no campo dispositivo.idnativo

      • Persistência no campo dispositivo.sistemaoperacional
      • Persistência no campo dispositivo.versaoso
    • "Bloqueado": Campo
      • Persistência no campo dispositivo.idnbloqueiopermanente
  • A tela deverá receber os seguintes novos filtros avançados:
    • "Usuário": campo de pesquisa, múltipla escolha, exibindo usuarios ativos.
      • Ao selecionado, fará filtragem pelo campo dispositivo.idusuario
    • "Situação": Checkbox, com opções: "Ativo" e "Inativo"
      • Somente a opção Ativo deve vir marcada por padrão. Ao carregar a tela, somente deverão ser exibidos registros de dispositivos ativos.
      • Ao selecionado, fará filtragem pelo campo dispositivo.idnativo
    • "Bloqueado": Checkbox, com opções "Sim" e "Não"
      • As duas opções devem vir marcadas por padrão.
      • Ao selecionado, fará filtragem pelo campo dispositivo.idnbloqueiopermanente
  • Ao sincronizar, caso a combinação dos campos dispositivo.identificador + dispositivo.idusuario não esteja cadastrada no sistema, o sistema deverá adicionar novo registro na tabela dispositivo. caso a combinação dos campos dispositivo.identificador + dispositivo.idusuario esteja cadastrada no sistema, o sistema deverá atualizar o registro de dispositivo.
    • Em ambos os casos, os seguintes campos deverão ser atualizados:

3. Vinculação de dispositivos com controle de sincronização (wssynclog)

  • Ao sincronizar, autenticando com sucesso, ao persistir o registro de log na tabela wssynclog, o sistema deverá popular a coluna wsynclog.iddispositivo, buscando o iddispositivo pela consulta a seguir:
    • Bloco de código
      /* 
      select iddispositivo from dispositivo where identificador = ${AndroidID} and idusuario = ${wssynclog.idusuario}
      */ 
    • Caso não seja encontrado, um novo dispositivo deverá ser persistido na tabela dispositivo.
      • Caso o parâmetro "sim3g.dispositivo.bloqueio.novo" estiver com valor 1,
        • O campo dispositivo.idnbloqueiopermanente deverá ser persistido como 1.
      • Caso contrário,
        • O campo dispositivo.idnbloqueiopermanente deverá ser persistido como 0.

4. Sugestão de bloqueio de usuários inativados

  • Na tela de cadastro de profissionais,
    • Ao inativar um profissional e clicar em gravar,
      • O sistema deverá consultar se existem dispositivos ativos ("Bloqueio permanente" = "Não") associados a ele, através da consulta a seguir:
        • Bloco de código
          /* select iddispositivo from dispositivo where idusuario = ? and idnbloqueiopermanente = 0 */
      • Se retornarem registros , o sistema deverá exibir pop-up de confirmação (Sim/Não), com a pergunta: "O profissional foi inativado, deseja bloquear os seus dispositivos associados?".
        • Caso selecionado "Sim", o sistema deverá atualizar a tabela de dispositivos do usuário, marcando o campo como "Bloqueio permanente" = "Sim"
          • Bloco de código
            /* update dispositivo set idnbloqueiopermanente = 1 where idusuario = ? */

5. Implementação de bloqueio de dispositivos

...

  • Caso o dispositivo associado à sincronização (Ponto 3) possua o campo dispositivo.idnbloqueiopermanente = 1,
    • O sistema deverá receber os dados do aparelho (Aparelho > Servidor), porém, na etapa de receber dados (Servidor > Aparelho), o sistema deverá notificar o usuário com a seguinte mensagem: "O aparelho foi bloqueado para utilização do sistema e terá seus dados removidos".
      • Após a mensagem, o sistema deverá ter excluido todos os dados (DATS) do aparelho, encaminhando o usuário para a tela de login.
  • Caso contrário,
    • O sistema deverá executar a sincronização normalmente, sem bloqueios.

...

  • O sistema deverá cancelar a sincronização após a autenticação, e notificar o usuário com a seguinte mensagem: "O aparelho está bloqueado para utilização do sistema. Solicite liberação ao responsável, informando o código do dispositivo a seguir: ${AndroidID com opção para copiar o conteúdo para a clipboard}".

...