templates/index/metas_fluxos.html.twig line 1
<!DOCTYPE html><html lang="pt-br"><head><meta charset="UTF-8"><title>Painel de Fluxos Abertos</title><title>ArquivosGED</title><link rel="shortcut icon" href="{{ asset('./img/icon.png') }}"><meta http-equiv="refresh" content="120"><meta name="viewport" content="width=device-width, initial-scale=1.0"><link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-sRIl4kxILFvY47J16cr9ZwB07vP4J8+LH7qKQnuqkuIAvNWLzeN8tE5YBujZqJLB" crossorigin="anonymous"></head><style>.topo {position: absolute;top: 22px;left: 0;width: 100%;display: flex;align-items: flex-start; /* frase fica acima */padding: 0 40px;box-sizing: border-box;pointer-events: none;}/* animação de piscar suave */@keyframes piscarSuave {0% { opacity: 1; }50% { opacity: 0.35; }100% { opacity: 1; }}/* aplica no logo */.logo-area img {max-height: 110px;animation: piscarSuave 5s ease-in-out infinite;}/* aplica na frase */.frase {max-width: 150vw;font-size: clamp(5rem, 5vw, 5rem);font-weight: bold;letter-spacing: 0.8px;line-height: 1.25;text-align: center;}/* FRASE */.frase-area {flex: 1;margin-left: 26px;}.frase-centro {position: absolute;inset: 0; /* ocupa a tela inteira */display: flex;align-items: center; /* vertical */justify-content: center; /* horizontal */}/* animação elegante */@keyframes fadeSlide {from {opacity: 0;transform: translateY(6px);}to {opacity: 1;transform: translateY(0);}}thead i {font-size: 4rem;opacity: 0.85;stroke-width: 1.5;}* {box-sizing: border-box;font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;letter-spacing: 0.02em;line-height: 1.6;}@keyframes gradient {0% { background-position: 0% 50%; }50% { background-position: 100% 50%; }100% { background-position: 0% 50%; }}body {margin: 0;padding: 0;height: 100vh;background: #f1f1f1;background-size: 400% 400%;animation: gradient 6s ease infinite;color: #245DAC;}/* TABELA */table {width: 100%;border-collapse: collapse;margin-top: 140px;}/* Mantém cabeçalho fixo no topo */thead th {position: sticky;top: 0;background: #0e84ce38; /* mesma cor que já usa */z-index: 2;}/* Mantém rodapé fixo no fim */tfoot th {position: sticky;bottom: 0;background: #0e84ce38; /* mesma cor que já usa */z-index: 2;}/* Faz o corpo da tabela rolar */tbody {display: block;max-height: 400px; /* altura visível, ajuste conforme necessidade */overflow-y: auto;}/* Garante alinhamento das colunas */thead, tfoot, tbody tr {display: table;width: 100%;table-layout: fixed;}th {padding: 26px 30px;font-size: 1.7rem;text-align: left;letter-spacing: 1px;}td {padding: 10px;font-size: 1.5rem;text-shadow: 1px 1px 2px rgb(238, 238, 238);}.centro {text-align: center;}tr{border-bottom: #a7a7a7 solid 1px;font-weight: bold;box-shadow: inset}/* STATUS LINHA INTEIRA */tr.ok {}tr.alerta {background: rgb(255, 204, 0);}tr.vencido {background: rgb(248, 45, 22);}</style></head><body><script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/js/bootstrap.bundle.min.js" integrity="sha384-FKyoEForCGlyvwx9Hj09JcYn3nv7wiPVlz7YYwJrWVcXK/BmnVDxM+D2scQbITxI" crossorigin="anonymous"></script><div class="topo"><div class="logo-area"><img src="{{ asset('./img/logo_menu.png') }}" alt="Logo"></div><div class="frase-centro"><div id="frase" class="frase"></div></div></div><table><thead><tr><th class="centro"><svg xmlns="http://www.w3.org/2000/svg" width="70" height="70" fill="currentColor" class="bi bi-clock-fill" viewBox="0 0 16 16"><path d="M16 8A8 8 0 1 1 0 8a8 8 0 0 1 16 0M8 3.5a.5.5 0 0 0-1 0V9a.5.5 0 0 0 .252.434l3.5 2a.5.5 0 0 0 .496-.868L8 8.71z"/></svg></th><th class="centro"><svg xmlns="http://www.w3.org/2000/svg" width="70" height="70" fill="currentColor" class="bi bi-stack-overflow" viewBox="0 0 16 16"><path d="M12.412 14.572V10.29h1.428V16H1v-5.71h1.428v4.282z"/><path d="M3.857 13.145h7.137v-1.428H3.857zM10.254 0 9.108.852l4.26 5.727 1.146-.852zm-3.54 3.377 5.484 4.567.913-1.097L7.627 2.28l-.914 1.097zM4.922 6.55l6.47 3.013.603-1.294-6.47-3.013zm-.925 3.344 6.985 1.469.294-1.398-6.985-1.468z"/></svg></th> <!-- Fluxo --><th class="centro"><svg xmlns="http://www.w3.org/2000/svg" width="70" height="70" fill="currentColor" class="bi bi-cash-coin" viewBox="0 0 16 16"><path fill-rule="evenodd" d="M11 15a4 4 0 1 0 0-8 4 4 0 0 0 0 8zm5-4a5 5 0 1 1-10 0 5 5 0 0 1 10 0z"/><path d="M9.438 11.944c.047.596.518 1.06 1.363 1.116v.44h.375v-.443c.875-.061 1.386-.529 1.386-1.207 0-.618-.39-.936-1.09-1.1l-.296-.07v-1.2c.376.043.614.248.671.532h.658c-.047-.575-.54-1.024-1.329-1.073V8.5h-.375v.45c-.747.073-1.255.522-1.255 1.158 0 .562.378.92 1.007 1.066l.248.061v1.272c-.384-.058-.639-.27-.696-.563h-.668zm1.36-1.354c-.369-.085-.569-.26-.569-.522 0-.294.216-.514.572-.578v1.1h-.003zm.432.746c.449.104.655.272.655.569 0 .339-.257.571-.709.614v-1.195l.054.012z"/><path d="M1 0a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h4.083c.058-.344.145-.678.258-1H3a2 2 0 0 0-2-2V3a2 2 0 0 0 2-2h10a2 2 0 0 0 2 2v3.528c.38.34.717.728 1 1.154V1a1 1 0 0 0-1-1H1z"/><path d="M9.998 5.083 10 5a2 2 0 1 0-3.132 1.65 5.982 5.982 0 0 1 3.13-1.567z"/></svg></th><th class="centro"><svg xmlns="http://www.w3.org/2000/svg" width="70" height="70" fill="currentColor" class="bi bi-image-fill" viewBox="0 0 16 16"><path d="M.002 3a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2h-12a2 2 0 0 1-2-2zm1 9v1a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1V9.5l-3.777-1.947a.5.5 0 0 0-.577.093l-3.71 3.71-2.66-1.772a.5.5 0 0 0-.63.062zm5-6.5a1.5 1.5 0 1 0-3 0 1.5 1.5 0 0 0 3 0"/></svg></th><th class="centro"><svg xmlns="http://www.w3.org/2000/svg" width="70" height="70" fill="currentColor" class="bi bi-file-earmark-text-fill" viewBox="0 0 16 16"><path d="M9.293 0H4a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2V4.707A1 1 0 0 0 13.707 4L10 .293A1 1 0 0 0 9.293 0M9.5 3.5v-2l3 3h-2a1 1 0 0 1-1-1M4.5 9a.5.5 0 0 1 0-1h7a.5.5 0 0 1 0 1zM4 10.5a.5.5 0 0 1 .5-.5h7a.5.5 0 0 1 0 1h-7a.5.5 0 0 1-.5-.5m.5 2.5a.5.5 0 0 1 0-1h4a.5.5 0 0 1 0 1z"/></svg></th> <!-- Docs --><th class="centro"><svg xmlns="http://www.w3.org/2000/svg" width="70" height="70" fill="currentColor" class="bi bi-box-fill" viewBox="0 0 16 16"><path fill-rule="evenodd" d="M15.528 2.973a.75.75 0 0 1 .472.696v8.662a.75.75 0 0 1-.472.696l-7.25 2.9a.75.75 0 0 1-.557 0l-7.25-2.9A.75.75 0 0 1 0 12.331V3.669a.75.75 0 0 1 .471-.696L7.443.184l.004-.001.274-.11a.75.75 0 0 1 .558 0l.274.11.004.001zm-1.374.527L8 5.962 1.846 3.5 1 3.839v.4l6.5 2.6v7.922l.5.2.5-.2V6.84l6.5-2.6v-.4l-.846-.339Z"/></svg></th> <!-- Img --><!-- Prazo --></tr></thead><tbody>{% for item in data %}{% set hoje = "now"|date("Y-m-d") %}{% set prazo = item.prazo|date("Y-m-d") %}{% set dias = (prazo|date("U") - hoje|date("U")) / 86400 %}{% if dias < 0 %}{% set status = 'vencido' %}{% elseif dias <= 2 %}{% set status = 'alerta' %}{% else %}{% set status = 'ok' %}{% endif %}<tr class="{{ status }}"><td class="centro">{{ item.prazo|date("d/m/Y") }}</td><td class="centro">{{ item.fluxo }}</td><td class="centro">{{ item.cliente|upper }}</td><td class="centro">{{ item.imagens| number_format(0, ',', '.') }}</td><td class="centro">{{ item.documentos| number_format(0, ',', '.') }}</td><td class="centro">{{ item.caixas| number_format(0, ',', '.') }}</td></tr>{% endfor %}</tbody><tfoot><tr><th class="centro">{{ resumo.nomeMes}}</th><th class="centro">{{ resumo.fluxos| number_format(0, ',', '.') }}</th><th class="centro">{{ resumo.clientes| number_format(0, ',', '.') }}</th><th class="centro">{{ resumo.imagens| number_format(0, ',', '.') }}</th><th class="centro">{{ resumo.documentos| number_format(0, ',', '.') }}</th><th class="centro">{{ resumo.caixas| number_format(0, ',', '.') }}</th></tr></tfoot></table><script>document.addEventListener("DOMContentLoaded", function () {const tbody = document.querySelector("tbody");let velocidade = 100; // quanto menor, mais rápidolet direcao = 1;setInterval(() => {tbody.scrollTop += direcao;// chegou no finalif (tbody.scrollTop + tbody.clientHeight >= tbody.scrollHeight) {direcao = -1;}// voltou ao topoif (tbody.scrollTop <= 0) {direcao = 1;}}, velocidade);});</script><script>fetch('frases.json').then(r => r.json()).then(frases => {const hoje = new Date().toISOString().split('T')[0];let usadas = JSON.parse(localStorage.getItem('frasesUsadas')) || [];let ultimaData = localStorage.getItem('dataFrase');// só troca se for outro diaif (ultimaData !== hoje) {// reinicia se acabouif (usadas.length >= frases.length) {usadas = [];}// disponíveisconst disponiveis = frases.filter(f => !usadas.includes(f));const fraseHoje =disponiveis[Math.floor(Math.random() * disponiveis.length)];usadas.push(fraseHoje);localStorage.setItem('frasesUsadas', JSON.stringify(usadas));localStorage.setItem('fraseHoje', fraseHoje);localStorage.setItem('dataFrase', hoje);}document.getElementById('frase').innerText =localStorage.getItem('fraseHoje');});</script><script>function ajustarFonte() {const frase = document.querySelector('.frase');if (!frase) return;let tamanho = 36; // px inicialfrase.style.fontSize = tamanho + 'px';while (frase.scrollWidth > frase.clientWidth && tamanho > 14) {tamanho--;frase.style.fontSize = tamanho + 'px';}}// chama ao carregar e quando trocar frasewindow.addEventListener('load', ajustarFonte);window.addEventListener('resize', ajustarFonte);</script></body></html>