HTML |
---|
<style>
/* Início estilo banner */
.compositiondani-banner {
position: relative;
min-height: 320px;
border-radius: 5px;
margin-bottom: 5px;
overflow: hidden;
}
.compositiondani-banner-image {
background-image: url("https://totvscrm.com/wp-content/uploads/2023/08/bannert.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%;
transform: translate(-50%, -50%);
}
.compositiondani-banner-logo {
width: 400px;
height: 150px;
background-image: url("https://totvscrm.com/wp-content/uploads/2023/08/logos.png");
background-size: contain;
background-repeat: no-repeat;
}
.compositiondani-banner-title {
margin-bottom: 10px !important;
padding: 10px !important;
background: rgba(0, 0, 0, 0.7) !important;
display: flex !important;
justify-content: center !important;
align-items: center !important;
font-size: 14px !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: 190px !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 */ </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">PREVISÃO DE REPOSIÇÃO DE ESTOQUE COMO ESTOQUE VÁLIDO</h1>
</div>
</div>
</header>
|
-
table"> <table class="striped custom-grey"> <thead> <tr> <th>MasterSALES</th> <th></th> <th>Obrigatório</th> </tr> </thead> <tbody> <tr> <td>DESCRIÇÃO</td> <td>Consulta Ordens de produção ativas no ERP</td> <td>SIM</td> </tr> <tr> <td>CÓDIGO</td> <td>ORDEM_PRODUCAO</td> <td>SIM</td> </tr> <tr> <td>IMAGEM</td> <td> <img src="https://totvscrm.com/wp-content/uploads/2023/08/iconesfa.png" alt="Ícone" style="width: 3dvh; height: auto;"></td> <td>SIM</td> </tr> <tr> <td>SGLCONTEXTO</td> <td>PRODUTO</td> <td>SIM</td> </tr> <tr> <td>IDNATIVO</td> <td>0</td> <td>SIM</td> </tr> <tr> <td>IDNFIXO</td> <td>1</td> <td>SIM</td> </tr> </tbody> </table> </div> <br> <ul class="browser-default"> <li> <p> Acrescente a coluna <b>"Ícone Fixo?"</b> na tela de cadastro de ícones, que estará vinculada ao campo <b>[ICONE.IDNFIXO]</b>. </p> </li> <li> <p> Caso <b>[ICONE.IDNFIXO]</b> tenha o valor 1, permita a edição apenas da coluna <b>"DESCRICAO"</b>. Os outros campos devem permanecer não editáveis. </p> </li> </ul> <h3>3. EXIBIÇÃO NA COLUNA CATEGORIA</h3> <b>Comportamento:</b> <ul class="browser-default"> <li> <p> Ao iniciar a criação de um pedido, o sistema deve verificar se o ícone <b>ORDEM_PRODUCAO</b> está habilitado na tabela <b>ICONE</b>. </p> </li> <li> <p>Caso este ícone esteja <b>ATIVO</b>:</p> <ul class="browser-default"> <li> Utilizando as configurações de busca detalhadas no tópico "Busca Padrão", um novo ícone deve ser exibido na coluna <b>CATEGORIA</b> na tela de pesquisa de produtos. Isso deve ser refletido tanto no grid de produtos da interface WEB quanto na interface mobile. </li> <li>Este ícone representará as ordens de compra ativas.</li> </ul> </li> <br> <img src="https://totvscrm.com/wp-content/uploads/2023/08/consulta_produtos.png" alt="Minha Imagem" class="imagem-responsiva"> <img src="https://totvscrm.com/wp-content/uploads/2023/08/grid_produtos.png" alt="Minha Imagem" class="imagem-responsiva"> <img src="https://totvscrm.com/wp-content/uploads/2023/08/card_produtos.png" alt="Minha Imagem" class="imagem-responsiva"> <br> <br> <li> <p>Quando este ícone for clicado pelo usuário:</p> <ul class="browser-default"> <li> Uma janela pop-up deve ser aberta, apresentando a lista de ordens de compra ativas no momento. </li> </ul> </li> </ul> <img src="https://totvscrm.com/wp-content/uploads/2023/08/nova_lista_ordens.png" alt="Minha Imagem" class="imagem-responsiva"> <h1>4. EXIBIÇÃO NO GRID/CARRINHO</h1> <h3>Comportamento:</h3> <ul class="browser-default"> <li>No grid de produtos da interface WEB e nas respectivas telas do aplicativo mobile (Card, Carrinho e Negociação), deve ser exibido um campo para mostrar a "Quantidade Prevista" dos produtos.</li> <li>Esta "Quantidade Prevista" corresponde ao total acumulado das quantidades nas ordens de compra associadas ao produto que foi adicionado ao carrinho.</li> <li>A lógica para obter esta quantidade total se baseia na configuração de busca descrita no tópico acima.</li> <li>O filtro de busca, que consiste na condição <b>(datafimordem >= CURRENT_DATE AND idnativo=1)</b>, é uma constante e não deve ser alterado, independente de qualquer configuração em <code>pedidoengine</code>.</li> <li>Na eventualidade de não existir uma configuração de busca, pode-se recorrer à seguinte consulta para obter a 'Quantidade Prevista':</li> </ul> <br> <pre><code class="language-sql"> SELECT idproduto, Sum(quantidade) AS "quantidade prevista" FROM ordemproducao o WHERE idproduto=:produto_no_carrinho AND idlocalfilial = :filial_do_pedido AND datafimordem >= CURRENT_DATE AND idnativo=1 GROUP BY idproduto ; </code> </pre> <p>Os campos que irão exibir estas quantidades nas diferentes interfaces são:</p> <br> <ul class="browser-default"> <li><b>WEB_GRID_QUANTIDADE_PREVISTA_ENTRADA</b></li> <li><b>ANDROID_CARD_QUANTIDADE_PREVISTA_ENTRADA</b></li> <li><b>ANDROID_CARRINHO_QUANTIDADE_PREVISTA_ENTRADA</b></li> <li><b>ANDROID_NEGOCIACAO_QUANTIDADE_PREVISTA_ENTRADA</b></li> </ul> <h3>VALIDAÇÃO PARÂMETRO</h3> <br> <ul class="browser-default"> <li>Se o parâmetro <code>HABILITAR_VALIDACAO_ESTOQUE = ATIVO</code>, prosseguir com a seguinte verificação: <ul class="browser-default"> <li>Validar se o parâmetro <code>sim3g.pedido.qtde.prevista.idnValidaQtdePrevista = ATIVO</code>.</li> <li>Se ambos os parâmetros forem ativos, calcular a <strong>QUANTIDADE TOTAL DISPONÍVEL</strong> (considerando ESTOQUE ATUAL + QUANTIDADE PREVISTA).</li> </ul> </li> <li>A <strong>QUANTIDADE PREVISTA</strong> é calculada a partir das ordens de produção definidas na configuração de busca do produto > ORDEM_PRODUCAO.</li> </ul> <br> <pre><code class="language-sql"> SELECT e.idproduto, e.quantidade + (SELECT Sum(quantidade) FROM ordemproducao o WHERE o.idproduto = e.idproduto AND o.idlocalfilial = e.idlocalfilial AND o.idtipoestoque = e.idtipoestoque AND o.idnativo = 1 AND o.datafimordem >= CURRENT_DATE) AS quantidade_disponível FROM estoque e WHERE e.idproduto = :produto_no_carrinho AND e.idlocalfilial = :filial_cabecalho AND e.idtipoestoque = :tipo_estoque_item_carrinho; </code> </pre> <ul class="browser-default"> <li>Após validar os parâmetros e determinar a quantidade total disponível, essa será a referência para validar o estoque, ou seja: <ul class="browser-default"> <li>Se <strong>QUANTIDADE VENDIDA</strong> for maior que a <strong>QUANTIDADE TOTAL DISPONÍVEL</strong>, a venda desse produto será bloqueada.</li> </ul> </li> <li>Caso o usuário tente inserir uma quantidade maior que a disponível, uma mensagem será exibida: <blockquote>‘Quantidade não permitida, pois é superior à quantidade total disponível. Quantidade total disponível (estoque + quantidade prevista = XXX)’</blockquote> </li> </ul> <div class="note"> Abaixo, segue o fluxograma da regra de validação de estoque. (O fluxograma real deverá ser inserido aqui). </div> <br> <img src="https://totvscrm.com/wp-content/uploads/2023/08/qtd_total.png" alt="Minha Imagem" class="imagem-responsiva"> <h3>CRIAÇÃO DE NOVO CAMPO NO BANCO</h3> <ul class="browser-default"> <li>Modificação na tabela <b>ordemproducao</b> para adicionar uma nova coluna referente ao tipo de estoque. </li> </ul> <pre><code class="language-sql"> ALTER TABLE ordemproducao ADD COLUMN idtipoestoque INT8 REFERENCES tipoestoque (idtipoestoque); </code> </pre> </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>O que acontece se eu tentar vender uma quantidade de produto maior do que a disponível?</div> <div class="collapsible-body"><span>Se a quantidade vendida for maior do que a quantidade total disponível (estoque atual + quantidade prevista), a venda daquele produto será bloqueada e você receberá um aviso. </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> <!-- ... (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>