Á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/2024/04/capa-com-fundo-e-sem-icone-TDN-AZUL2.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 */

      #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"> 
          APRIMORAMENTOS NO GERENCIAMENTO DE EXPIRAÇÃO DE PAGAMENTOS PIX



  </h1>
  </header>
    </div>
  </div>

  <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"/>
  
<!-- Bootstrap CSS -->
<link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet">

<!-- FontAwesome -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta2/css/all.min.css" />

<link href="https://cdn.jsdelivr.net/npm/@mdi/font/css/materialdesignicons.min.css" rel="stylesheet">


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

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

body {
  margin: 0;
  padding: 0;
}

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

a:hover {
 
}

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: 6px;
}

* p {
    margin-bottom: 0 !important;
}

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

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

#content > div.page-metadata > div {
    float: none !important;
    line-height: normal !important;
    width: auto !important;
    display: none !important; /* ou outra propriedade de display que você deseja usar */
    margin: 0 !important; /* ou outra propriedade de margin que você deseja usar */
}

#section2 > ol > li:nth-child(2) > p {
    margin-bottom: 0;
}



.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: #0897E9;
  background-color: transparent;
}

.tabs .tab a:focus {
  background-color: rgba(8, 151, 233, 0.25);
}

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

.tabs .indicator {
  background-color: #0897E9;
}

.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;
}

.label b {
color: #42526e;
}

td th {
color: #42526e;
}

/* ==============================
      =    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;
}





.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: #0897E9;
  color: white;
}

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

.custom-grey th,
.custom-grey td {
  border: 1px solid #086ea8;
  padding: 10px;
  color:#064569
}

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

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

.custom-grey th {
  color: #fff;
  background-color: #0897E9;
}



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

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

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

.custom-alert-warning {
  background-color: #fdf1dc; /* ou qualquer outra cor que preferir */
  color: #5c4225; /* cor do texto */
  border: 1px solid #d6800f; /* adicionando borda da mesma cor que o ícone */
  padding: 10px; /* adicione padding conforme necessário */
 
}

.custom-alert-warning .fas {
  color: #5c4225; /* cor do ícone no alerta de aviso */
  margin-right: 10px; /* espaço extra entre o ícone e o texto */
}

.custom-alert-danger {
  background-color: #ffe7ec; /* ou qualquer outra cor que preferir */
  color: #9e1d3b; /* cor do texto */
  border: 1px solid #eb7893; /* adicionando borda da mesma cor que o ícone */
  padding: 10px; /* adicione padding conforme necessário */
  
}

.custom-alert-danger .fas {
  color: #f34b72; /* cor do ícone no alerta de perigo */
  margin-right: 10px; /* espaço extra entre o ícone e o texto */
}


.alert-secondary-custom {
    background-color: #d9eefa; /* Cor de fundo do alerta */
    color: #094f77; /* Cor do texto */
    border: 1px solid #094f77; /* adicionando borda da mesma cor que o ícone */
  padding: 10px; /* adicione padding conforme necessário */
}

.alert-secondary-custom .fas {
    color: #0897E9; /* Cor dos ícones FontAwesome */
    margin-right: 10px; /* Espaço extra entre o ícone e o texto */
}

.custom-content ul li {
    list-style-type: disc !important; /* Forçando 'bolinhas' */
    padding-left: 30px; /* Espaçamento para alinhar com o texto se necessário */
    margin-bottom: 10px; /* Espaço entre itens da lista se necessário */
}

/* ========== FIM DO ESTILO ========= */

pre {
    border-radius: 5px;
    padding: 10px;
    overflow: auto;
  }

  .copy-button {
    background-color: #4CAF50;
    color: white;
    border: none;
    padding: 5px 10px;
    border-radius: 5px;
    cursor: pointer;
  }

  </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> <b>Produto:</b></td>
              <td>Automação da Força de Vendas</td>
          </tr>
          <tr>
              <td><i class="fas fa-link"></i> <b>Linha de Produto:</b></td>
              <td>TOTVS CRM</td>
          </tr>
          <tr>
              <td><i class="fas fa-chart-pie"></i> <b>Segmento:</b></td>
              <td>Cross Segmentos</td>
          </tr>
          <tr>
              <td><i class="fas fa-desktop"></i> <b>Módulo:</b></td>
              <td>Venda/PIX</td>
          </tr>
          <tr>
              <td><i class="fas fa-globe"></i> <b>Aplicação:</b></td>
              <td>Web/Mobile</td>
          </tr>
          <tr>
              <td><i class="fas fa-hashtag"></i> <b>Identificador:</b></td>
              <td>
                
                TSFAFSWE-3540  </td>
          </tr>
      </table>
      </span>
    </div>
    </div>
 

      <br>

      <h2 class="custom-heading">
        <i class="fa-solid fa-eye"></i>&nbsp &nbsp VISÃO GERAL
      </h2>
      <p class="justificado">
        A melhoria recente no módulo de pagamento via PIX no TOTVS SFA introduz configurações avançadas para gerenciar a expiração de QR Codes PIX e ações automáticas para pedidos não pagos dentro do prazo estipulado. Este recurso garante que os pagamentos sejam efetuados de maneira segura e dentro do tempo adequado, evitando atrasos e gerenciando de forma eficiente as expectativas dos clientes.

      </p>
<br>

    <h2 class="custom-heading">
      <i class="fa-solid fa-rocket"></i>&nbsp &nbsp OBJETIVO
    </h2>
    <p class="justificado">
      O objetivo desta implementação é otimizar o processo de pagamentos via PIX, proporcionando aos usuários maior controle sobre os prazos de validade dos QR Codes e automação nas ações de follow-up para pedidos expirados. A funcionalidade visa minimizar riscos financeiros e melhorar a experiência de pagamento, assegurando que todas as transações sejam concluídas ou adequadamente gerenciadas.

      </p>

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


</section>


       
          </section>

          <section id="section2" style="margin-top: 40px;">
            <h2 class="custom-heading"><i class="fa-solid fa-star"></i>&nbsp DETALHES FUNCIONAIS</h2>
                
              <br>
              <ol start="1">
                <ul>
                  <li>
                    <strong>Interface de Configuração</strong>: Essa configuração é acessível na tela de configuração do plugin de pagamento PIX, onde os usuários podem inserir o tempo desejado de expiração para os QR Codes.
                  </li>
                </ul>
              </ol>

              <ol start="2">
                <li>
                  <p><strong>Ações Automáticas após Expiração</strong>:</p>
                  <ul>
                    <li style="list-style-type: disc; margin-left:15px;">
                      <strong>Opções de Ação Pós-Expiração</strong>: Os usuários têm a opção de configurar automaticamente ações específicas que o sistema deve executar quando o QR Code expira sem recebimento do pagamento. As ações disponíveis incluem:
                      <ul>
                        <li style="list-style-type: disc; margin-left:15px;"><strong>Reabrir o Pedido</strong>: Esta opção permite que o pedido seja reaberto para edição ou para a geração de um novo QR Code, mantendo o pedido ativo.</li>
                        <li style="list-style-type: disc; margin-left:15px;"><strong>Cancelar o Pedido</strong>: Com esta configuração, o pedido é automaticamente cancelado, o que pode ser útil em situações onde a intenção é não prosseguir com a venda sem o pagamento confirmado.</li>
                      </ul>
                    </li>
                  </ul>
                </li>
                <li>
                  <p><strong>Exibição do Tempo de Expiração</strong>:</p>
                  <ul>
                    <li style="list-style-type: disc; margin-left:15px;"><strong>Visibilidade do Prazo de Expiração</strong>: Uma vez que o QR Code é gerado, o sistema exibe a data e a hora exatas de expiração em uma nova coluna dentro da interface de listagem de pedidos. Isso proporciona transparência e ajuda os usuários a gerenciar melhor o tempo de pagamento esperado.</li>
                  </ul>
                </li>
              </ol>
                    <img src="https://totvscrm.com/wp-content/uploads/2024/08/MOCKUP-TDN-RELEASE-COMPONENTES13wwa-SFA2-Recuperado.png" alt="Visualização Android" title="Visualização Android" style="width: 80%; height: auto; max-width: 80%; display: block;"> 
                  
                                     </section>

   

                 
              
        
        </section>
         
      
            <section id="section3" style="margin-top: 40px;">
              <h2 class="custom-heading"><i class="fa-solid fa-shoe-prints"></i>&nbsp COMO USAR?</h2>
             
              <ol>
                <li>
                  <p><strong>Acesse as Configurações do Plugin de Pagamento PIX</strong>:</p>
                  <ul>
                    <li style="list-style-type: disc; margin-left:15px;">Vá até <strong>Configuração > Integração > Plugins de Integração</strong>.</li>
                    <li style="list-style-type: disc; margin-left:15px;">Encontre e selecione o plugin relacionado ao <strong>Pagamento PIX</strong>.</li>
                  </ul>
                </li>
                <li>
                  <p><strong>Defina o Tempo de Expiração</strong>:</p>
                  <ul>
                    <li style="list-style-type: disc; margin-left:15px;">Na tela de configuração do plugin, localize o campo para <strong>"Duração máxima da transação PIX antes de expirar"</strong>.</li>
                    <li style="list-style-type: disc; margin-left:15px;">Insira o tempo desejado para a validade do QR Code, em minutos ou horas.</li>
                  </ul>
                </li>
                <li>
                  <p><strong>Configure Ações Automáticas</strong>:</p>
                  <ul>
                    <li style="list-style-type: disc; margin-left:15px;">
                      Determine o que acontecerá quando o QR Code expirar:
                      <ul>
                        <li style="list-style-type: disc; margin-left:15px;"><strong>Reabrir o Pedido</strong>: para permitir edições ou nova geração de QR Code.</li>
                        <li style="list-style-type: disc; margin-left:15px;"><strong>Cancelar o Pedido</strong>: para cancelar automaticamente o pedido expirado.</li>
                      </ul>
                    </li>
                    <li style="list-style-type: disc; margin-left:15px;">Selecione a opção adequada e salve as configurações.</li>
                  </ul>
                </li>
                <li>
                  <p><strong>Teste as Configurações</strong>:</p>
                  <ul>
                    <li style="list-style-type: disc; margin-left:15px;">Após salvar, faça um teste para garantir que tudo está configurado corretamente.</li>
                  </ul>
                </li>
              </ol>


                <video autoplay loop muted style="width: 100%; height: auto; max-width: 100%; display: block;">
                  <source src="https://totvscrm.com/wp-content/uploads/2024/08/Vid-20240808-101130-1.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>
                         
            <p>
                
                <br>
                
                <b>Desafio Antigo:</b>
                <p> 
                  Gerenciamento ineficiente de pedidos com pagamento via PIX, onde os QR Codes expiravam sem ações claras para resolução, resultando em pedidos pendentes.
                  </p>
                
                <br>
                
                <b>Solução Atualizada:</b>
                <p>Com as novas configurações, os pedidos com QR Codes expirados são automaticamente gerenciados conforme as regras estabelecidas—reabrindo para nova ação do cliente ou cancelando—eliminando a incerteza e otimizando o fluxo de vendas.</p>
                
                <br>
                
                
                </p>
            </section> 
      
         
          </div>
          </div>
        </div>
   
          
            <!-- Tab 30 fim -->

            <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>
      
                  <ul>
                    <li style="list-style-type: disc; margin-left:15px;">
                      <p>Alterar via Tools opção 3, a tabela PEDIDOPAGAMENTO:</p>
                      <div class="code panel pdl conf-macro output-block" style="border-width: 1px;" data-hasbody="true" data-macro-name="code">
                        <div class="codeHeader panelHeader pdl" style="border-bottom-width: 1px;">
                          <b>Alter Table PEDIDOPAGAMENTO</b>
                        </div>
                        <div class="codeContent panelContent pdl">
                          <pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: sql; gutter: false; theme: Confluence" data-theme="Confluence">alter table pedidopagamento add column dataexpiracao timestamp;</pre>
                        </div>
                      </div>
                    </li>
                    <li style="list-style-type: disc; margin-left:15px;">
                      <p>Adicionar na tela do plugin de Pagamento PIX, os campos conforme protótipo abaixo:<br/><br/>
                        <span class="confluence-embedded-file-wrapper confluence-embedded-manual-size">
                          <img class="confluence-embedded-image" draggable="false" height="250" src="/download/attachments/839300596/plugin_novo.png?version=3&modificationDate=1715129138033&api=v2" data-image-src="/download/attachments/839300596/plugin_novo.png?version=3&modificationDate=1715129138033&api=v2" data-unresolved-comment-count="0" data-linked-resource-id="839300634" data-linked-resource-version="3" data-linked-resource-type="attachment" data-linked-resource-default-alias="plugin_novo.png" data-base-url="https://tdn.totvs.com" data-linked-resource-content-type="image/png" data-linked-resource-container-id="839300596" data-linked-resource-container-version="17" alt="">
                        </span>
                      </p>
                      <p><br/></p>
                      <p><br/></p>
                    </li>
                  </ul>
             
                  <div class="code panel pdl conf-macro output-block" style="border-width: 1px;" data-hasbody="true" data-macro-name="code">
                    <div class="codeHeader panelHeader pdl" style="border-bottom-width: 1px;">
                      <b>Novos Campos</b>
                    </div>
                    <div class="codeContent panelContent pdl">
                      <pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: xml; gutter: false; theme: Confluence" data-theme="Confluence">
                        Campo "Duração máxima transação PIX antes de expirar"
                          idpluginintegracao: select idpluginintegracao from pluginintegracao where codigo = 'TPI',
                          codigoelemento: TPI,
                          agrupador: 0,
                          sglcampo: TPI_EXPIRATIONDATE
                          valor: {padrão 1440}
                        Campo "Ação automática sobre o pedido quando o serviço de atualização de status identificar que a transação expirou"
                          idpluginintegracao: select idpluginintegracao from pluginintegracao where codigo = 'TPI',
                          codigoelemento: TPI,
                          agrupador: 0,
                          sglcampo: TPI_OPEN
                          valor: {0 ou 1, padrão 1}
                        
                        Campo "Ação automática sobre o pedido quando o serviço de atualização de status identificar que a transação expirou"
                          idpluginintegracao: select idpluginintegracao from pluginintegracao where codigo = 'TPI',
                          codigoelemento: TPI,
                          agrupador: 0,
                          sglcampo: TPI_CANCEL
                          valor: {0 ou 1, padrão 0}
                      </pre>
                    </div>
                  </div>
                  <p><br/></p>
                  <ul>
                    <li style="list-style-type: disc; margin-left:15px;">
                      <strong>Para o campo referente à ação que deve ser executada, somente uma opção pode estar selecionada pelo usuário.</strong><br/><br/>
                    </li>
                    <li style="list-style-type: disc; margin-left:15px;">
                      O valor retornado na tag DATAEXPIRACAO <span style="color: rgb(23,43,77);">deve ser persistido em PEDIDOPAGAMENTO.DATAEXPIRACAO;<br/><br/></span>
                    </li>
                    <li style="list-style-type: disc; margin-left:15px;">
                      Alterar a tela Pagamentos do Pedido, para incluir a nova coluna referente à data para expirar da transação:<br/><br/>
                      <span class="confluence-embedded-file-wrapper confluence-embedded-manual-size">
                        <img class="confluence-embedded-image" draggable="false" height="250" src="/download/attachments/839300596/data_expirar.png?version=1&modificationDate=1715030903243&api=v2" data-image-src="/download/attachments/839300596/data_expirar.png?version=1&modificationDate=1715030903243&api=v2" data-unresolved-comment-count="0" data-linked-resource-id="842269655" data-linked-resource-version="1" data-linked-resource-type="attachment" data-linked-resource-default-alias="data_expirar.png" data-base-url="https://tdn.totvs.com" data-linked-resource-content-type="image/png" data-linked-resource-container-id="839300596" data-linked-resource-container-version="17" alt="">
                      </span><br/><br/>
                      <ul>
                        <li style="list-style-type: disc; margin-left:15px;">
                          <strong>A informação para essa nova coluna virá de PEDIDOPAGAMENTO.DATAEXPIRACAO.</strong>
                        </li>
                      </ul>
                    </li>
                  </ul>
                  <h3 id="MelhoriasnasregrasdenegóciodepedidoscomPIX-INTEGRAÇÃO"><strong>INTEGRAÇÃO</strong></h3>
                  <ul>
                    <li style="list-style-type: disc; margin-left:15px;">
                      Alterar o Job TPIGENERATEPAYMENT para calcular a data e hora para obter a data para expirar da transação PIX;<br/>
                      <ul>
                        <li style="list-style-type: disc; margin-left:15px;">
                          <p>Utilizar o script abaixo para obter a data e hora para expirar da transação:<br/><br/></p>
                          <div class="code panel pdl conf-macro output-block" style="border-width: 1px;" data-hasbody="true" data-macro-name="code">
                            <div class="codeHeader panelHeader pdl" style="border-bottom-width: 1px;">
                              <b>Busca Tempo</b>
                            </div>
                            <div class="codeContent panelContent pdl">
                              <pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: sql; gutter: false; theme: Confluence" data-theme="Confluence">
                                SELECT current_timestamp +(SELECT cast(valor as integer) FROM pluginintconfig WHERE sglcampo = 'TPI_EXPIRATIONDATE' AND codigoelemento = 'TPI') * interval '1 minute' AS data_expirar;
                              </pre>
                            </div>
                          </div>
                        </li>
                        <li style="list-style-type: disc; margin-left:15px;">
                          Somar a data e hora do momento em que a transação é gerada com o tempo cadastrado pelo cliente, e incluir dentro do JSON de requisição:<br/><br/><strong>"expirationDate": "YYYY-MM-DD HH:MM:SS"</strong><br/><br/>
                        </li>
                        <li style="list-style-type: disc; margin-left:15px;">
                          O retorno se a data e hora foi aceita pela TPI estará na tag "expiresAt" no JSON de RESPONSE;<br/><br/>
                        </li>
                      </ul>
                    </li>
                    <li style="list-style-type: disc; margin-left:15px;">
                      Adicionar no Job TPIUPDATESTATUS, a validação da ação que deve ser tomada automaticamente quando a transação PIX tiver expirado sem a confirmação do pagamento;<br/><br/>
                      <ul>
                        <li style="list-style-type: disc; margin-left:15px;">
                          <p>Usar o script abaixo para obter qual ação foi cadastrada pelo usuário:<br/><br/></p>
                          <div class="code panel pdl conf-macro output-block" style="border-width: 1px;" data-hasbody="true" data-macro-name="code">
                            <div class="codeHeader panelHeader pdl" style="border-bottom-width: 1px;">
                              <b>Busca Ação</b>
                            </div>
                            <div class="codeContent panelContent pdl">
                              <pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: sql; gutter: false; theme: Confluence" data-theme="Confluence">
                                select case when sglcampo ='TPI_OPEN' then valor end as REABRIR, case when sglcampo ='TPI_CANCEL' then valor end as CANCELAR from pluginintconfig p where sglcampo in('TPI_OPEN','TPI_CANCEL')
                              </pre>
                            </div>
                          </div>
                        </li>
                      </ul>
                    </li>
                  </ul>
                    
                    <p><br/></p><ul><li>Se o plugin estiver configurado para REABRIR, pedido cuja transação tenha expirado devem ter a situação alterada para NÃO FINALIZADO - NF;<br/><br/></li><li>Se o plugin estiver configurado para CANCELAR, pedido cuja transação tenha expirado devem ter a situação alterada para CANCELADO - PC;<br/><br/><ul><li><p>Utilizar a consulta abaixo para identificar os pedidos que devem ter a situação atualizada:<br/><br/></p><div class="code panel pdl conf-macro output-block" style="border-width: 1px;" data-hasbody="true" data-macro-name="code"><div class="codeHeader panelHeader pdl" style="border-bottom-width: 1px;"><b>Busca Ação</b></div><div class="codeContent panelContent pdl">
                    <pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: sql; gutter: false; theme: Confluence" data-theme="Confluence">SELECT p.idpedido
                    FROM   pedido p
                           INNER JOIN pedidopagamento pp
                                   ON p.idpedido = pp.idpedido
                           INNER JOIN tiposituacaopagamento t
                                   ON t.idtiposituacaopagamento = pp.idtiposituacaopagamento
                           INNER JOIN tiposituacaopedido tp
                                   ON tp.idtiposituacaopedido = p.idtiposituacaopedido
                    WHERE  t.sgltiposituacaopagamento = 'EXP'
                           AND (SELECT Count(idpedido)
                                FROM   pedidopagamento p2
                                       INNER JOIN tiposituacaopagamento t2
                                               ON
                                       t2.idtiposituacaopagamento = p2.idtiposituacaopagamento
                                WHERE  t2.sgltiposituacaopagamento in ('PEND', 'APR')
                                       AND p2.idpedido = p.idpedido) = 0
                           AND p.idnexportadoerp = 0
                           AND tp.sgltiposituacaopedido = 'PP';</pre>
                    </div></div></li></ul></li></ul></li><li>Se não houver uma configuração definida, o comportamento atual deve ser mantido e a situação do pedido não deve ser alterada.<br/><p><br/></p></li></ul></li></ul>
                    
                                    
                            
                        
                   
                    
      <!-- Second Card -->
      
                 
      
      
                    </div>
      
              </div>
          </div> 
       

     
      <!-- Second Card -->

    

    <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> O que acontece quando o tempo de expiração do QR Code é atingido sem o pagamento ser realizado?
                        </div>
                    <div class="collapsible-body"><span> Dependendo da configuração escolhida, o pedido pode ser automaticamente reaberto para edição e nova tentativa de pagamento, ou cancelado, removendo-o da lista de pedidos ativos.
                      </span></div>
                </li> 
                
                    <!-- Adicione mais perguntas e respostas aqui conforme necessário -->
                  
                       
        

                    <!-- Adicione mais perguntas e respostas aqui conforme necessário -->

                        <!-- Adicione mais perguntas e respostas aqui conforme necessário -->
                </ul>
                
            </div>     </div>

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

      


           
    
<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>
  hljs.highlightAll();

  function copyCode() {
    navigator.clipboard.writeText(document.querySelector('code').innerText)
      .then(() => {
        alert('Código copiado com sucesso!');
      })
      .catch(err => {
        console.error('Erro ao copiar código: ', err);
      });
  }
</script>
  


<script src="scripts.js"></script>

<script>
  document.addEventListener('DOMContentLoaded', function() {
      var elems = document.querySelectorAll('.collapsible');
      var instances = M.Collapsible.init(elems);
  });
</script>

 <!-- ... (conteudo video) ... -->
 <script src="https://www.youtube.com/iframe_api"></script>

 <script>
  var player;
  function onYouTubeIframeAPIReady() {
    player = new YT.Player('player', {
      height: '315',
      width: '560',
      videoId: 'FvsuBOvyyro',
      playerVars: {
        start: 1238, // 20:38 em segundos
        end: 1356   // 22:36 em segundos
      }
    });
  }
</script>







01. DADOS GERAIS

...

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

...

Linha TOTVS CRM SFA

...

02. ESCOPO FUNCIONAL

Novas opções para pedidos com PIX

Atualmente as transações PIX são geradas com o tempo padrão de expiração de 1 hora. Não é possível via SFA, configurar um tempo maior para expiração de cada transação, de acordo com a necessidade de cada cliente.

O SFA também não permite nenhuma ação de edição ou reabertura dos pedidos com PIX cujas transações tenham sido canceladas ou que expiraram.

Com a melhoria proposta neste escopo, será possível configurar o tempo desejado para que cada transação PIX expire caso não haja confirmação do pagamento.

Também será possível configurar qual ação deve ser aplicada automaticamente sobre o pedido, no momento em que o serviço de atualização de status identificar que a transação vinculada a tal pedido expirou ou foi cancelada.

Será permitido optar pela ação de reabrir o pedido e permitir a edição por parte do usuário gerador, ou então a ação de cancelar o pedido obrigando que um novo pedido seja gerado caso uma nova transação tenha que ser gerada.

Image Removed

03. ESCOPO TÉCNICO

APLICAÇÃO

...

Alterar via Tools opção 3, a tabela PEDIDOPAGAMENTO:

Bloco de código
languagesql
titleAlter Table PEDIDOPAGAMENTO
alter table pedidopagamento add column dataexpiracao timestamp;

...

Bloco de código
titleNovos Campos
Campo "Duração máxima transação PIX antes de expirar"
	idpluginintegracao: select idpluginintegracao from pluginintegracao where codigo = 'TPI',
	codigoelemento: TPI,
	agrupador: 0,
	sglcampo: TPI_EXPIRATIONDATE
	valor: {60}
Campo "Ação automática sobre o pedido quando o serviço de atualização de status identificar que a transação expirou"
	idpluginintegracao: select idpluginintegracao from pluginintegracao where codigo = 'TPI',
	codigoelemento: TPI,
	agrupador: 0,
	sglcampo: TPI_OPEN
	valor: {0 ou 1}

Campo "Ação automática sobre o pedido quando o serviço de atualização de status identificar que a transação expirou"
	idpluginintegracao: select idpluginintegracao from pluginintegracao where codigo = 'TPI',
	codigoelemento: TPI,
	agrupador: 0,
	sglcampo: TPI_CANCEL
	valor: {0 ou 1}

...

  • A informação para essa nova coluna virá de PEDIDOPAGAMENTO.DATAEXPIRACAO.

INTEGRAÇÃO

...

Bloco de código
languagesql
titleBusca Tempo
select cast(valor as integer) from pluginintconfig 
	 where sglcampo ='TPI_EXPIRATIONDATE' and codigoelemento ='TPI')

...

Bloco de código
languagesql
titleBusca Ação
select case when sglcampo ='TPI_OPEN' then valor end as REABRIR, case when sglcampo ='TPI_CANCEL' then valor end as CANCELAR from pluginintconfig p where sglcampo in('TPI_OPEN','TPI_CANCEL')

...