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>    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>    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>  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>  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>  EXEMPLO 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>  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>
|
...
TOTVS CRM Automação da Força de Vendas
...
Linha TOTVS CRM SFA
...
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.
...
Alterar via Tools opção 3, a tabela PEDIDOPAGAMENTO:
Bloco de código | ||||
---|---|---|---|---|
| ||||
alter table pedidopagamento add column dataexpiracao timestamp; |
...
Bloco de código | ||
---|---|---|
| ||
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} |
...
...
Bloco de código | ||||
---|---|---|---|---|
| ||||
select cast(valor as integer) from pluginintconfig
where sglcampo ='TPI_EXPIRATIONDATE' and codigoelemento ='TPI') |
...
Bloco de código | ||||
---|---|---|---|---|
| ||||
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') |
...