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/0908/logo-com-descricao-totvsgc.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"> PROCESSAMENTO DE MOVIMENTOS DE LIMITE DE CRÉDITO POR INTEGRAÇÃO </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>Vendas - Limite de Crédito</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> DTSFAPD-2755 </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 funcionalidade recentemente implementada permite o processamento automatizado dos movimentos de limite de crédito por integração. Esse processo garante que os limites de crédito definidos sejam respeitados ao finalizar pedidos, reforçando o controle financeiro nas transações. </p> <br> <h2 class="custom-heading"> <i class="fa-solid fa-rocket"></i>    OBJETIVO </h2> <p class="justificado"> O objetivo desta funcionalidade é automatizar o controle de limites de crédito durante transações de venda, assegurando que os pedidos não excedam os limites pré-estabelecidos para cada cliente. Isso ajuda a prevenir riscos financeiros e melhora a gestão de crédito. </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> <ul> <li> <p><strong>Validação de Limite de Crédito na Finalização do Pedido:</strong> Ao finalizar um pedido, o sistema automaticamente verifica se o limite de crédito disponível para o cliente cobre o valor do pedido. Isso é feito para assegurar que todas as transações estejam dentro do limite de crédito aprovado para cada cliente, evitando exposições financeiras indesejadas.</p> </li> <li> <p><strong>Bloqueio ou Permissão de Finalização Baseado no Limite de Crédito:</strong> Se o pedido exceder o limite de crédito disponível, o sistema bloqueia a finalização do pedido e alerta o usuário sobre a insuficiência de crédito. Isso impede que vendas sejam processadas sem a devida autorização, mantendo a integridade financeira da operação.</p> </li> <li> <p><strong>Reversão Automática de Movimentos de Crédito em Cancelamentos:</strong> Se um pedido previamente aprovado e que consumiu parte do limite de crédito for cancelado, o sistema automaticamente restaura o valor ao limite de crédito do cliente. Essa funcionalidade assegura que o limite de crédito seja sempre atualizado e correto, refletindo apenas as transações ativas.</p> </li> </ul> <img src="https://totvscrm.com/wp-content/uploads/2024/08/MOCKUP-TDN-RELEASE-COMPONENTESSESPACO-Recuperado.png" alt="Visualização Android" title="Visualização Android" style="width: 100%; height: auto; max-width: 100%; display: block;"> </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>Configuração de Tipos de Limite de Crédito:</strong></p> <ul> <li style="list-style-type: disc; margin-left: 15px;">Navegue até a configuração de tipos de limite no módulo de vendas.</li> <li style="list-style-type: disc; margin-left: 15px;">Defina quais tipos de limite de crédito serão utilizados (por exemplo, limite diário, mensal, por pedido).</li> </ul> </li> <li> <p><strong>Aplicação dos Limites ao Cadastro de Clientes:</strong></p> <ul> <li style="list-style-type: disc; margin-left: 15px;">No cadastro de cada cliente, especifique o tipo e o valor do limite de crédito aplicável.</li> <li style="list-style-type: disc; margin-left: 15px;">Esses limites ajudarão a controlar automaticamente as permissões de venda para cada cliente.</li> </ul> </li> <li> <p><strong>Monitoramento e Ajuste de Limites de Crédito:</strong></p> <ul> <li style="list-style-type: disc; margin-left: 15px;">Regularmente, revise os limites de crédito atribuídos para garantir que estão alinhados com a política de crédito da empresa e a capacidade de pagamento do cliente.</li> <li style="list-style-type: disc; margin-left: 15px;">Ajuste os limites conforme necessário para acomodar mudanças nas relações de negócio ou na situação financeira do cliente.</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-20240812-173953.mp4" type="video/mp4"> </video> </p> </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> Gerenciar manualmente os limites de crédito para cada cliente, o que era suscetível a erros e demorado. </p> <br> <b>Solução Atualizada:</b> <p>Com a nova funcionalidade, o sistema processa automaticamente as verificações de limite de crédito conforme os pedidos são finalizados, garantindo que as operações comerciais respeitem os limites financeiros dos clientes e reduzindo o risco de crédito.</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> <p>Agora, a integração deverá processar movimentos de <code>limitecredito</code> para que possa liberar a reserva de <code>limitecredito</code> gerada pela aplicação.</p> <p>Sendo assim:</p> <ul> <li> Inserir na tabela <code>wsconfigintegracao</code>: <ul> <li style="list-style-type: disc; margin-left: 15px;"> <code>INSERT INTO public.wsconfigintegracao (erp,contexto,descricao,tabela,campo,valor,idnativo)<br/> VALUES ('COMUM','LIMITECREDITO','Parâmetro que define os status de pedidos que terão seus movimentos de limitecredito processados pela integração automaticamente. Valores podem ser separados por vírgula','processamovimento','sgltiposituacaopedido','PF',1);</code> </li> <li style="list-style-type: disc; margin-left: 15px;"> <code>INSERT INTO public.wsconfigintegracao (erp,contexto,descricao,tabela,campo,valor,idnativo)<br/> VALUES ('COMUM','LIMITECREDITO','Parâmetro que define os status de pedidos que terão seus movimentos de limitecredito inativados pela integração automaticamente. Valores podem ser separados por vírgula','inativamovimento','sgltiposituacaopedido','PC',1);</code> </li> <li style="list-style-type: disc; margin-left: 15px;"> <code>INSERT INTO public.wsconfigintegracao (erp,contexto,descricao,tabela,campo,valor,idnativo)<br/> VALUES ('COMUM','LIMITECREDITO','Parâmetro que define se o saldo de limitecredito será atualizado após processamento de flex. Valores podem ser: 1(sim) e 0(não)','apos_processamento','alterasaldo','0',1);</code> </li> </ul> </li> <li> O serviço de processamento de <code>limitecredito</code> deverá: <ul> <li style="list-style-type: disc; margin-left: 15px;"> Consultar quais são as movimentações de <code>limitecredito</code> ativas e não processadas de pedidos que possuem status dentro do definido pelo parâmetro <code>processamovimento</code>. <ul> <li style="list-style-type: disc; margin-left: 15px;"> <code>// consulta 1<br/> select * from limitecreditomovimento lcm<br/> inner join pedido p on p.idpedido = lcm.idpedido<br/> where p.idtiposituacaopedido in (select idtiposituacaopedido from tiposituacaopedido where sgltiposituacaopedido in (${parâmetro processamovimento})) and lcm.idnativo = 1 and lcm.idnprocessado = 0</code> </li> </ul> </li> <li style="list-style-type: disc; margin-left: 15px;"> Com esses movimentos no fluxo, a integração deverá processar o movimento, com o seguinte update: <ul> <li style="list-style-type: disc; margin-left: 15px;"> <code>update limitecreditomovimento set idnprocessado = 1 where idcontrolelimitecreditomovimento in (${consulta 1})</code> </li> </ul> </li> <li style="list-style-type: disc; margin-left: 15px;"> Após o processamento das <code>limitecreditos</code> acima, a integração deverá atualizar o saldo <code>limitecredito</code> com o valor que foi recém processado, segundo: <ul> <li style="list-style-type: disc; margin-left: 15px;"> <code>update limitecredito set saldodisponível = saldodisponivel + ${movimento processado}</code> <ul> <li style="list-style-type: disc; margin-left: 15px;"> Essa atualização somente deve acontecer quando o parâmetro <code>${parametro alterasaldo}</code> estiver marcado com valor 1. </li> </ul> </li> </ul> </li> </ul> </li> <li> O serviço de inativação de <code>limitecredito</code> deverá: <ul> <li style="list-style-type: disc; margin-left: 15px;"> Consultar quais são as movimentações de <code>limitecredito</code> não processadas de pedidos que possuem status dentro do definido pelo parâmetro <code>inativamovimento</code>. <ul> <li style="list-style-type: disc; margin-left: 15px;"> <code>// consulta 2<br/> select * from limitecreditomovimento lcm<br/> inner join pedido p on p.idpedido = lcm.idpedido<br/> where p.idtiposituacaopedido in (select idtiposituacaopedido from tiposituacaopedido where sgltiposituacaopedido in (${parâmetro inativamovimento})) and lcm.idnativo = 1 and lcm.idnprocessado = 0</code> </li> </ul> </li> <li style="list-style-type: disc; margin-left: 15px;"> Com esses movimentos no fluxo, a integração deverá processar o movimento, com o seguinte update: <ul> <li style="list-style-type: disc; margin-left: 15px;"> <code>update limitecreditomovimento set idnativo = 0 where idcontrolelimitecreditomovimento in (${consulta 2})</code> </li> </ul> </li> </ul> </li> </ul> <!-- // .deck --> <!-- 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 se um pedido exceder o limite de crédito do cliente? </div> <div class="collapsible-body"><span>Se um pedido exceder o limite de crédito disponível, o sistema bloqueará a finalização do pedido e notificará o usuário que o limite de crédito foi ultrapassado. O pedido não poderá ser concluído até que o limite seja ajustado ou o pedido modificado para se adequar ao limite existente. </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> |