{"id":7046,"date":"2026-04-07T15:12:34","date_gmt":"2026-04-07T18:12:34","guid":{"rendered":"https:\/\/saudecajati.com.br\/?page_id=7046"},"modified":"2026-04-08T15:36:37","modified_gmt":"2026-04-08T18:36:37","slug":"controle-de-vacinas","status":"publish","type":"page","link":"https:\/\/saudecajati.com.br\/index.php\/controle-de-vacinas\/","title":{"rendered":"Controle de Vacinas"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"7046\" class=\"elementor elementor-7046\">\n\t\t\t\t<div class=\"elementor-element elementor-element-c5a85fc e-grid e-con-boxed e-con e-parent\" data-id=\"c5a85fc\" data-element_type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-fe9b81a elementor-align-center elementor-icon-list--layout-traditional elementor-list-item-link-full_width elementor-invisible elementor-widget elementor-widget-icon-list\" data-id=\"fe9b81a\" data-element_type=\"widget\" data-settings=\"{&quot;_animation&quot;:&quot;slideInDown&quot;}\" data-widget_type=\"icon-list.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<ul class=\"elementor-icon-list-items\">\n\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">Controle de Vacinas<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t<\/ul>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-5757cbd e-flex e-con-boxed e-con e-parent\" data-id=\"5757cbd\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-e1d74cd elementor-widget elementor-widget-html\" data-id=\"e1d74cd\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!DOCTYPE html>\r\n<html lang=\"pt-BR\">\r\n<head>\r\n  <meta charset=\"UTF-8\" \/>\r\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" \/>\r\n  <title>Painel de Temperaturas<\/title>\r\n  <link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\r\n  <link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin>\r\n  <link href=\"https:\/\/fonts.googleapis.com\/css2?family=Inter:wght@400;600;700&display=swap\" rel=\"stylesheet\">\r\n\r\n  <script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/sql.js\/1.10.3\/sql-wasm.js\"><\/script>\r\n\r\n  <style>\r\n    :root {\r\n      --bg-light: #f4f6f8;\r\n      --card-bg: #ffffff;\r\n      --brand-accent: #00A09A;\r\n      --text-primary-dark: #2c3e50;\r\n      --text-secondary-dark: #7f8c8d;\r\n      --border-light: #eef2f5;\r\n      --temp-max: #e74c3c;\r\n      --temp-min: #3498db;\r\n    }\r\n\r\n    @keyframes fadeIn { from { opacity: 0; transform: translateY(15px); } to { opacity: 1; transform: translateY(0); } }\r\n    \r\n    \/* ---- ESTILOS PARA A TELA (COMPUTADOR\/CELULAR) ---- *\/\r\n    html, body {\r\n      margin: 0;\r\n      padding: 0;\r\n      font-family: 'Inter', 'Segoe UI', sans-serif;\r\n      background-color: var(--bg-light);\r\n      color: var(--text-primary-dark);\r\n      width: 100%;\r\n      min-height: 100vh;\r\n      display: flex;\r\n      flex-direction: column;\r\n      overflow-x: hidden;\r\n      overflow-y: auto;\r\n    }\r\n\r\n    .content-area {\r\n      display: flex;\r\n      flex-direction: column;\r\n      justify-content: center;\r\n      align-items: center;\r\n      width: 100%;\r\n      flex-grow: 1;\r\n      padding: 40px;\r\n      gap: 20px;\r\n      box-sizing: border-box;\r\n    }\r\n\r\n    .cards-wrapper {\r\n      display: flex;\r\n      flex-direction: row; \r\n      flex-wrap: nowrap; \r\n      justify-content: center;\r\n      align-items: stretch;\r\n      gap: 30px;\r\n      width: 100%;\r\n      max-width: 1100px;\r\n    }\r\n\r\n    .calendar-card {\r\n      background: var(--card-bg);\r\n      border-radius: 16px;\r\n      box-shadow: 0 8px 25px rgba(0,0,0,0.1);\r\n      width: 100%;\r\n      max-width: 420px;\r\n      padding: 30px;\r\n      animation: fadeIn 0.5s ease-out;\r\n      box-sizing: border-box;\r\n    }\r\n\r\n    .calendar-header {\r\n      display: flex;\r\n      justify-content: space-between;\r\n      align-items: center;\r\n      margin-bottom: 20px;\r\n    }\r\n\r\n    .calendar-header h2 {\r\n      margin: 0;\r\n      color: var(--brand-accent);\r\n      font-size: 1.5em;\r\n    }\r\n\r\n    .calendar-grid {\r\n      display: grid;\r\n      grid-template-columns: repeat(7, 1fr);\r\n      gap: 8px;\r\n      text-align: center;\r\n    }\r\n\r\n    .day-name {\r\n      font-weight: 700;\r\n      color: var(--text-secondary-dark);\r\n      font-size: 0.9em;\r\n      margin-bottom: 10px;\r\n    }\r\n\r\n    .day-cell {\r\n      padding: 10px 0;\r\n      border-radius: 8px;\r\n      font-weight: 600;\r\n      color: #bdc3c7;\r\n      cursor: default;\r\n      transition: all 0.2s;\r\n    }\r\n\r\n    .day-cell.has-data {\r\n      color: var(--text-primary-dark);\r\n      background-color: var(--border-light);\r\n      cursor: pointer;\r\n    }\r\n    .day-cell.has-data:hover { background-color: #d1d8df; }\r\n\r\n    .day-cell.selected {\r\n      background-color: var(--brand-accent);\r\n      color: white;\r\n    }\r\n\r\n    .info-card {\r\n      background: var(--card-bg);\r\n      border-radius: 16px;\r\n      box-shadow: 0 8px 25px rgba(0,0,0,0.1);\r\n      width: 100%;\r\n      max-width: 500px;\r\n      padding: 30px;\r\n      display: flex;\r\n      flex-direction: column;\r\n      align-items: center;\r\n      animation: fadeIn 0.5s ease-out 0.2s backwards;\r\n      box-sizing: border-box;\r\n    }\r\n\r\n    .info-card h2 {\r\n      margin-top: 0;\r\n      color: var(--text-secondary-dark);\r\n      font-size: 1.2em;\r\n      text-align: center;\r\n      margin-bottom: 25px;\r\n    }\r\n\r\n    .temperature-display {\r\n      width: 100%;\r\n      display: flex;\r\n      justify-content: space-around;\r\n      align-items: center;\r\n      flex-grow: 1;\r\n    }\r\n\r\n    .temp-box {\r\n      display: flex;\r\n      flex-direction: column;\r\n      align-items: center;\r\n    }\r\n\r\n    .temp-label {\r\n      font-size: 0.9em;\r\n      font-weight: 600;\r\n      color: var(--text-secondary-dark);\r\n      text-transform: uppercase;\r\n      letter-spacing: 1px;\r\n      margin-bottom: 5px;\r\n    }\r\n\r\n    .temp-value {\r\n      font-size: 2.5em; \r\n      font-weight: 700;\r\n      line-height: 1;\r\n    }\r\n\r\n    .temp-time {\r\n      font-size: 1em;\r\n      font-weight: 600;\r\n      color: #95a5a6;\r\n      margin-top: 8px;\r\n      letter-spacing: 0.5px;\r\n    }\r\n\r\n    .max-box .temp-value { color: var(--temp-max); }\r\n    .min-box .temp-value { color: var(--temp-min); }\r\n\r\n    .divider { width: 2px; height: 70px; background-color: var(--border-light); }\r\n\r\n    .record-count-display {\r\n      font-size: 0.8em;\r\n      color: #aeb6bf;\r\n      margin-top: 30px;\r\n      font-weight: 600;\r\n      letter-spacing: 0.5px;\r\n    }\r\n\r\n    .actions-row {\r\n      display: flex;\r\n      flex-wrap: wrap;\r\n      justify-content: center;\r\n      gap: 15px;\r\n      margin-top: 20px;\r\n    }\r\n\r\n    button#btn-novo-arquivo, button#btn-imprimir-dia, button#btn-imprimir-mes {\r\n      appearance: none !important;\r\n      -webkit-appearance: none !important;\r\n      background-color: #00A09A !important;\r\n      background-image: none !important;\r\n      color: #ffffff !important;\r\n      border: none !important;\r\n      padding: 10px 20px !important;\r\n      border-radius: 6px !important;\r\n      font-size: 15px !important;\r\n      font-family: 'Inter', sans-serif !important;\r\n      font-weight: 600 !important;\r\n      cursor: pointer !important;\r\n      display: inline-block !important;\r\n      text-decoration: none !important;\r\n      box-shadow: 0 4px 10px rgba(0,0,0,0.1) !important;\r\n      line-height: normal !important;\r\n      transition: background-color 0.2s !important;\r\n      text-transform: none !important;\r\n    }\r\n    \r\n    button#btn-novo-arquivo:hover, button#btn-imprimir-dia:hover, button#btn-imprimir-mes:hover {\r\n      background-color: #00827d !important;\r\n    }\r\n\r\n    button#btn-prev, button#btn-next {\r\n      appearance: none !important;\r\n      -webkit-appearance: none !important;\r\n      background: transparent !important;\r\n      border: none !important;\r\n      color: #00A09A !important;\r\n      font-size: 1.5em !important;\r\n      font-weight: bold !important;\r\n      cursor: pointer !important;\r\n      padding: 0 10px !important;\r\n      margin: 0 !important;\r\n      box-shadow: none !important;\r\n    }\r\n    \r\n    button#btn-prev:hover, button#btn-next:hover {\r\n      color: #00827d !important;\r\n    }\r\n  <\/style>\r\n<\/head>\r\n<body>\r\n\r\n  <main class=\"content-area\">\r\n    <div class=\"cards-wrapper\">\r\n        <div class=\"calendar-card\">\r\n            <div class=\"calendar-header\">\r\n                <button id=\"btn-prev\">&lt;<\/button>\r\n                <h2 id=\"month-year-display\">M\u00eas Ano<\/h2>\r\n                <button id=\"btn-next\">&gt;<\/button>\r\n            <\/div>\r\n            <div class=\"calendar-grid\" id=\"calendar-grid\"><\/div>\r\n        <\/div>\r\n\r\n        <div class=\"info-card\">\r\n            <h2 id=\"selected-date-label\">Carregue um arquivo (.db ou .csv)<\/h2>\r\n            <div class=\"temperature-display\">\r\n                <div class=\"temp-box max-box\">\r\n                    <span class=\"temp-label\">M\u00e1xima<\/span>\r\n                    <span class=\"temp-value\" id=\"max-value\">--\u00b0C<\/span>\r\n                    <span class=\"temp-time\" id=\"max-time\">--:--<\/span>\r\n                <\/div>\r\n                <div class=\"divider\"><\/div>\r\n                <div class=\"temp-box min-box\">\r\n                    <span class=\"temp-label\">M\u00ednima<\/span>\r\n                    <span class=\"temp-value\" id=\"min-value\">--\u00b0C<\/span>\r\n                    <span class=\"temp-time\" id=\"min-time\">--:--<\/span>\r\n                <\/div>\r\n            <\/div>\r\n            <div class=\"record-count-display\" id=\"record-count\"><\/div>\r\n        <\/div>\r\n    <\/div>\r\n    \r\n    <div class=\"actions-row\">\r\n        <button id=\"btn-novo-arquivo\">Carregar Arquivo<\/button>\r\n        <button id=\"btn-imprimir-dia\">Imprimir Dia (PDF)<\/button>\r\n        <button id=\"btn-imprimir-mes\">Imprimir M\u00eas (PDF)<\/button>\r\n    <\/div>\r\n  <\/main>\r\n  \r\n  <input type=\"file\" id=\"file-input\" accept=\".csv, .db\" style=\"display: none;\" \/>\r\n\r\n  <script>\r\n    const fileInput = document.getElementById('file-input');\r\n    const maxEl = document.getElementById('max-value');\r\n    const maxTimeEl = document.getElementById('max-time');\r\n    const minEl = document.getElementById('min-value');\r\n    const minTimeEl = document.getElementById('min-time');\r\n    const dateLabelEl = document.getElementById('selected-date-label');\r\n    const monthYearDisplay = document.getElementById('month-year-display');\r\n    const calendarGrid = document.getElementById('calendar-grid');\r\n    const recordCountEl = document.getElementById('record-count');\r\n    \r\n    const btnNovoArquivo = document.getElementById('btn-novo-arquivo');\r\n    const btnImprimirDia = document.getElementById('btn-imprimir-dia');\r\n    const btnImprimirMes = document.getElementById('btn-imprimir-mes');\r\n\r\n    let dailyData = {}; \r\n    let allRecords = []; \r\n    let currentMonth = new Date().getMonth();\r\n    let currentYear = new Date().getFullYear();\r\n    let selectedDateStr = null;\r\n\r\n    const nomesMeses = [\"Janeiro\", \"Fevereiro\", \"Mar\u00e7o\", \"Abril\", \"Maio\", \"Junho\", \"Julho\", \"Agosto\", \"Setembro\", \"Outubro\", \"Novembro\", \"Dezembro\"];\r\n    const diasSemana = [\"Dom\", \"Seg\", \"Ter\", \"Qua\", \"Qui\", \"Sex\", \"S\u00e1b\"];\r\n\r\n    btnNovoArquivo.addEventListener('click', () => { fileInput.value = ''; fileInput.click(); });\r\n\r\n    \/\/ --- L\u00d3GICA DO RELAT\u00d3RIO DI\u00c1RIO EM PDF ---\r\n    btnImprimirDia.addEventListener('click', () => {\r\n        if (allRecords.length === 0) {\r\n            alert(\"Nenhum arquivo carregado.\");\r\n            return;\r\n        }\r\n        if (!selectedDateStr) {\r\n            alert(\"Por favor, selecione um dia no calend\u00e1rio primeiro.\");\r\n            return;\r\n        }\r\n\r\n        const recordsToPrint = allRecords.filter(r => r.dateStr === selectedDateStr);\r\n        if (recordsToPrint.length === 0) {\r\n            alert(\"Nenhum registro encontrado para este dia.\");\r\n            return;\r\n        }\r\n\r\n        \/\/ Pega o nome din\u00e2mico da coluna (Degelo ou Alarme)\r\n        const tituloExtra = recordsToPrint[0].extraLabel || 'Degelo\/Alarme';\r\n        \r\n        const partesData = selectedDateStr.split('-');\r\n        const dataBR = `${partesData[2]}\/${partesData[1]}\/${partesData[0]}`;\r\n        const d = dailyData[selectedDateStr];\r\n\r\n        let linhasTabelaHTML = '';\r\n        recordsToPrint.forEach(r => {\r\n            let horaStr = r.time.split(' ')[1] || r.time;\r\n            horaStr = horaStr.split('.')[0]; \r\n\r\n            linhasTabelaHTML += `<tr>\r\n                <td>${dataBR}<\/td>\r\n                <td>${horaStr}<\/td>\r\n                <td>${r.temp}\u00b0C<\/td>\r\n                <td>${r.extra}<\/td>\r\n                <td>${r.setpoint}<\/td>\r\n                <td>${r.porta}<\/td>\r\n            <\/tr>`;\r\n        });\r\n\r\n        const htmlImpressao = `\r\n            <!DOCTYPE html>\r\n            <html>\r\n            <head>\r\n                <title>Relat\u00f3rio Di\u00e1rio - ${dataBR}<\/title>\r\n                <style>\r\n                    body { font-family: Arial, sans-serif; color: #000; padding: 20px; background: white; }\r\n                    .print-header { display: flex; justify-content: space-between; align-items: center; border-bottom: 2px solid #000; padding-bottom: 10px; margin-bottom: 10px; }\r\n                    .header-logo img { max-height: 60px; } \r\n                    .header-text { text-align: right; }\r\n                    .header-text h1 { margin: 0; font-size: 16px; font-weight: bold; text-transform: uppercase;}\r\n                    .header-text h2 { margin: 2px 0 0 0; font-size: 12px; color: #333; font-weight: normal; }\r\n                    .header-text h3 { margin: 10px 0 2px 0; font-size: 14px; font-weight: bold; }\r\n                    .header-text p { margin: 2px 0 0 0; font-size: 12px; font-weight: bold; }\r\n                    .print-summary { display: flex; justify-content: space-around; background-color: #f2f2f2; padding: 10px; border-radius: 8px; border: 1px solid #ddd; margin-bottom: 15px; font-size: 13px; -webkit-print-color-adjust: exact; print-color-adjust: exact; }\r\n                    .print-summary div { text-align: center; }\r\n                    .print-summary strong { display: block; font-size: 11px; text-transform: uppercase; margin-bottom: 3px; }\r\n                    .print-summary span.val { font-size: 20px; font-weight: bold; color: #000;}\r\n                    .print-summary span.desc { font-size: 11px; }\r\n                    .print-table { width: 100%; border-collapse: collapse; font-size: 12px; margin-bottom: 20px; }\r\n                    .print-table th, .print-table td { border: 1px solid #999; padding: 4px 6px; text-align: center; vertical-align: middle; }\r\n                    .print-table th { background-color: #e0e0e0; font-weight: bold; -webkit-print-color-adjust: exact; print-color-adjust: exact; }\r\n                    .print-table tr { page-break-inside: avoid; }\r\n                    .print-table tbody tr:nth-child(even) { background-color: #f9f9f9; -webkit-print-color-adjust: exact; print-color-adjust: exact; }\r\n                    .print-footer { margin-top: 30px; text-align: center; page-break-inside: avoid; }\r\n                    .print-footer .line { width: 250px; border-bottom: 1px solid #000; margin: 0 auto 5px auto; }\r\n                    .print-footer p { margin: 0; font-size: 11px; text-transform: uppercase;}\r\n                <\/style>\r\n            <\/head>\r\n            <body>\r\n                <div class=\"print-header\">\r\n                    <div class=\"header-logo\">\r\n                        <img decoding=\"async\" src=\"https:\/\/saudecajati.com.br\/wp-content\/uploads\/2024\/10\/LOGO-SAUDEnovo-300x109.png\" alt=\"Logo Secretaria de Sa\u00fade\" \/>\r\n                    <\/div>\r\n                    <div class=\"header-text\">\r\n                        <h1>Secretaria de Sa\u00fade<\/h1>\r\n                        <h2>Rua Teodoro Ferreira Machado, SN - Cajati-SP<\/h2>\r\n                        <h3>Relat\u00f3rio Di\u00e1rio de Temperatura da C\u00e2mara Fria<\/h3>\r\n                        <p>Data de Refer\u00eancia: ${dataBR}<\/p>\r\n                    <\/div>\r\n                <\/div>\r\n\r\n                <div class=\"print-summary\">\r\n                    <div>\r\n                        <strong>M\u00e1xima Di\u00e1ria<\/strong>\r\n                        <span class=\"val\">${d.max.toFixed(1)}\u00b0C<\/span><br>\r\n                        <span class=\"desc\">(Registrado \u00e0s ${d.maxTime})<\/span>\r\n                    <\/div>\r\n                    <div>\r\n                        <strong>M\u00ednima Di\u00e1ria<\/strong>\r\n                        <span class=\"val\">${d.min.toFixed(1)}\u00b0C<\/span><br>\r\n                        <span class=\"desc\">(Registrado \u00e0s ${d.minTime})<\/span>\r\n                    <\/div>\r\n                    <div>\r\n                        <strong>Total de Registros<\/strong>\r\n                        <span class=\"val\">${recordsToPrint.length}<\/span><br>\r\n                        <span class=\"desc\">Leituras no dia<\/span>\r\n                    <\/div>\r\n                <\/div>\r\n\r\n                <table class=\"print-table\">\r\n                    <thead>\r\n                        <tr>\r\n                            <th>Data<\/th>\r\n                            <th>Hora<\/th>\r\n                            <th>Temp. Principal<\/th>\r\n                            <th>${tituloExtra}<\/th>\r\n                            <th>Setpoint<\/th>\r\n                            <th>Porta<\/th>\r\n                        <\/tr>\r\n                    <\/thead>\r\n                    <tbody>\r\n                        ${linhasTabelaHTML}\r\n                    <\/tbody>\r\n                <\/table>\r\n\r\n                <div class=\"print-footer\">\r\n                    <div class=\"line\"><\/div>\r\n                    <p>Assinatura do Respons\u00e1vel T\u00e9cnico<\/p>\r\n                <\/div>\r\n\r\n                <script>\r\n                    window.onload = function() {\r\n                        setTimeout(function() {\r\n                            window.print();\r\n                            window.close();\r\n                        }, 500);\r\n                    };\r\n                <\\\/script>\r\n            <\/body>\r\n            <\/html>\r\n        `;\r\n\r\n        const printWindow = window.open('', '_blank');\r\n        if (printWindow) {\r\n            printWindow.document.open();\r\n            printWindow.document.write(htmlImpressao);\r\n            printWindow.document.close();\r\n        } else {\r\n            alert(\"Por favor, permita pop-ups no seu navegador para poder gerar o PDF.\");\r\n        }\r\n    });\r\n\r\n    \/\/ --- L\u00d3GICA DO RELAT\u00d3RIO MENSAL EM PDF ---\r\n    btnImprimirMes.addEventListener('click', () => {\r\n        if (Object.keys(dailyData).length === 0) {\r\n            alert(\"Nenhum arquivo carregado.\");\r\n            return;\r\n        }\r\n\r\n        const diasComDados = Object.keys(dailyData).filter(dataKey => {\r\n            const partes = dataKey.split('-');\r\n            return parseInt(partes[0]) === currentYear && (parseInt(partes[1]) - 1) === currentMonth;\r\n        }).sort();\r\n\r\n        if (diasComDados.length === 0) {\r\n            alert(\"Nenhum dado encontrado para o m\u00eas selecionado no calend\u00e1rio.\");\r\n            return;\r\n        }\r\n\r\n        let monthlyMax = -Infinity;\r\n        let monthlyMin = Infinity;\r\n        let monthlyMaxDateStr = '';\r\n        let monthlyMinDateStr = '';\r\n\r\n        let linhasTabelaHTML = '';\r\n\r\n        diasComDados.forEach(dataKey => {\r\n            const d = dailyData[dataKey];\r\n            const partes = dataKey.split('-');\r\n            const dataBR = `${partes[2]}\/${partes[1]}\/${partes[0]}`;\r\n            \r\n            if (d.max > monthlyMax) {\r\n                monthlyMax = d.max;\r\n                monthlyMaxDateStr = `${partes[2]}\/${partes[1]} \u00e0s ${d.maxTime}`;\r\n            }\r\n            if (d.min < monthlyMin) {\r\n                monthlyMin = d.min;\r\n                monthlyMinDateStr = `${partes[2]}\/${partes[1]} \u00e0s ${d.minTime}`;\r\n            }\r\n\r\n            linhasTabelaHTML += `<tr>\r\n                <td>${dataBR}<\/td>\r\n                <td>${d.min.toFixed(1)}\u00b0C<\/td>\r\n                <td>${d.minTime}<\/td>\r\n                <td>${d.max.toFixed(1)}\u00b0C<\/td>\r\n                <td>${d.maxTime}<\/td>\r\n            <\/tr>`;\r\n        });\r\n\r\n        const htmlImpressao = `\r\n            <!DOCTYPE html>\r\n            <html>\r\n            <head>\r\n                <title>Relat\u00f3rio Mensal - ${nomesMeses[currentMonth]} ${currentYear}<\/title>\r\n                <style>\r\n                    body { font-family: Arial, sans-serif; color: #000; padding: 20px; background: white; }\r\n                    .print-header { display: flex; justify-content: space-between; align-items: center; border-bottom: 2px solid #000; padding-bottom: 10px; margin-bottom: 10px; }\r\n                    .header-logo img { max-height: 60px; } \r\n                    .header-text { text-align: right; }\r\n                    .header-text h1 { margin: 0; font-size: 16px; font-weight: bold; text-transform: uppercase;}\r\n                    .header-text h2 { margin: 2px 0 0 0; font-size: 12px; color: #333; font-weight: normal; }\r\n                    .header-text h3 { margin: 10px 0 2px 0; font-size: 14px; font-weight: bold; }\r\n                    .header-text p { margin: 2px 0 0 0; font-size: 12px; font-weight: bold; }\r\n                    .print-summary { display: flex; justify-content: space-around; background-color: #f2f2f2; padding: 10px; border-radius: 8px; border: 1px solid #ddd; margin-bottom: 15px; font-size: 13px; -webkit-print-color-adjust: exact; print-color-adjust: exact; }\r\n                    .print-summary div { text-align: center; }\r\n                    .print-summary strong { display: block; font-size: 11px; text-transform: uppercase; margin-bottom: 3px; }\r\n                    .print-summary span.val { font-size: 20px; font-weight: bold; color: #000;}\r\n                    .print-summary span.desc { font-size: 11px; }\r\n                    .print-table { width: 100%; border-collapse: collapse; font-size: 12px; margin-bottom: 20px; }\r\n                    .print-table th, .print-table td { border: 1px solid #999; padding: 4px 6px; text-align: center; vertical-align: middle; }\r\n                    .print-table th { background-color: #e0e0e0; font-weight: bold; -webkit-print-color-adjust: exact; print-color-adjust: exact; }\r\n                    .print-table tr { page-break-inside: avoid; }\r\n                    .print-table tbody tr:nth-child(even) { background-color: #f9f9f9; -webkit-print-color-adjust: exact; print-color-adjust: exact; }\r\n                    .print-footer { margin-top: 30px; text-align: center; page-break-inside: avoid; }\r\n                    .print-footer .line { width: 250px; border-bottom: 1px solid #000; margin: 0 auto 5px auto; }\r\n                    .print-footer p { margin: 0; font-size: 11px; text-transform: uppercase;}\r\n                <\/style>\r\n            <\/head>\r\n            <body>\r\n                <div class=\"print-header\">\r\n                    <div class=\"header-logo\">\r\n                        <img decoding=\"async\" src=\"https:\/\/saudecajati.com.br\/wp-content\/uploads\/2024\/10\/LOGO-SAUDEnovo-300x109.png\" alt=\"Logo Secretaria de Sa\u00fade\" \/>\r\n                    <\/div>\r\n                    <div class=\"header-text\">\r\n                        <h1>Secretaria de Sa\u00fade<\/h1>\r\n                        <h2>Rua Teodoro Ferreira Machado, SN - Cajati-SP<\/h2>\r\n                        <h3>Resumo Mensal de Temperatura da C\u00e2mara Fria<\/h3>\r\n                        <p>M\u00eas de Refer\u00eancia: ${nomesMeses[currentMonth]} \/ ${currentYear}<\/p>\r\n                    <\/div>\r\n                <\/div>\r\n\r\n                <div class=\"print-summary\">\r\n                    <div>\r\n                        <strong>M\u00e1xima Absoluta do M\u00eas<\/strong>\r\n                        <span class=\"val\">${monthlyMax.toFixed(1)}\u00b0C<\/span><br>\r\n                        <span class=\"desc\">(Registrado em ${monthlyMaxDateStr})<\/span>\r\n                    <\/div>\r\n                    <div>\r\n                        <strong>M\u00ednima Absoluta do M\u00eas<\/strong>\r\n                        <span class=\"val\">${monthlyMin.toFixed(1)}\u00b0C<\/span><br>\r\n                        <span class=\"desc\">(Registrado em ${monthlyMinDateStr})<\/span>\r\n                    <\/div>\r\n                <\/div>\r\n\r\n                <table class=\"print-table\">\r\n                    <thead>\r\n                        <tr>\r\n                            <th>Data<\/th>\r\n                            <th>Temp. M\u00ednima<\/th>\r\n                            <th>Hora M\u00ednima<\/th>\r\n                            <th>Temp. M\u00e1xima<\/th>\r\n                            <th>Hora M\u00e1xima<\/th>\r\n                        <\/tr>\r\n                    <\/thead>\r\n                    <tbody>\r\n                        ${linhasTabelaHTML}\r\n                    <\/tbody>\r\n                <\/table>\r\n\r\n                <div class=\"print-footer\">\r\n                    <div class=\"line\"><\/div>\r\n                    <p>Assinatura do Respons\u00e1vel T\u00e9cnico<\/p>\r\n                <\/div>\r\n\r\n                <script>\r\n                    window.onload = function() {\r\n                        setTimeout(function() {\r\n                            window.print();\r\n                            window.close();\r\n                        }, 500);\r\n                    };\r\n                <\\\/script>\r\n            <\/body>\r\n            <\/html>\r\n        `;\r\n\r\n        const printWindow = window.open('', '_blank');\r\n        if (printWindow) {\r\n            printWindow.document.open();\r\n            printWindow.document.write(htmlImpressao);\r\n            printWindow.document.close();\r\n        } else {\r\n            alert(\"Por favor, permita pop-ups no seu navegador para poder gerar o PDF.\");\r\n        }\r\n    });\r\n\r\n    \/\/ --- LEITURA DE ARQUIVO E PROCESSAMENTO ---\r\n    fileInput.addEventListener('change', function(event) {\r\n        const file = event.target.files[0];\r\n        if (!file) return;\r\n        const reader = new FileReader();\r\n        const extension = file.name.split('.').pop().toLowerCase();\r\n        if (extension === 'db') {\r\n            reader.onload = function(e) { processarDadosDB(e.target.result); };\r\n            reader.readAsArrayBuffer(file);\r\n        } else {\r\n            reader.onload = function(e) { processarDadosCSV(e.target.result); };\r\n            reader.readAsText(file);\r\n        }\r\n    });\r\n\r\n    async function processarDadosDB(arrayBuffer) {\r\n        try {\r\n            const SQL = await initSqlJs({ locateFile: file => `https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/sql.js\/1.10.3\/${file}` });\r\n            const db = new SQL.Database(new Uint8Array(arrayBuffer));\r\n            \r\n            const res = db.exec(\"SELECT * FROM DataGrpData\");\r\n            if (res.length === 0) throw new Error(\"Tabela vazia.\");\r\n            \r\n            const columns = res[0].columns;\r\n            const colTime = columns.indexOf('CollectTime');\r\n            const colTemp = columns.indexOf('Tprincipal');\r\n            const colSet = columns.indexOf('Setpoint');\r\n            const colPorta = columns.findIndex(c => c.includes('Porta'));\r\n\r\n            \/\/ Descobrir dinamicamente se a tabela usa 'Degelo' ou 'Alarme'\r\n            let colExtra = columns.indexOf('Degelo');\r\n            let nomeExtra = 'Degelo';\r\n            if (colExtra === -1) {\r\n                colExtra = columns.indexOf('Alarme');\r\n                nomeExtra = 'Alarme';\r\n            }\r\n\r\n            const rows = res[0].values;\r\n            dailyData = {};\r\n            allRecords = []; \r\n            let achou = false;\r\n\r\n            rows.forEach(row => {\r\n                const timestamp = row[colTime]; \r\n                const temperatura = parseFloat(row[colTemp]);\r\n                const setpoint = colSet !== -1 ? row[colSet] : 4.5;\r\n                const porta = colPorta !== -1 ? row[colPorta] : 0;\r\n                const extraVal = colExtra !== -1 ? row[colExtra] : \"0\";\r\n\r\n                if (!isNaN(temperatura)) {\r\n                    const dateObj = new Date(timestamp);\r\n                    \r\n                    const ano = dateObj.getFullYear();\r\n                    const mes = String(dateObj.getMonth() + 1).padStart(2, '0');\r\n                    const dia = String(dateObj.getDate()).padStart(2, '0');\r\n                    const hh = String(dateObj.getHours()).padStart(2, '0');\r\n                    const mm = String(dateObj.getMinutes()).padStart(2, '0');\r\n                    const ss = String(dateObj.getSeconds()).padStart(2, '0');\r\n                    \r\n                    const dataHoraCompleta = `${ano}-${mes}-${dia} ${hh}:${mm}:${ss}.000`;\r\n                    const apenasData = `${ano}-${mes}-${dia}`;\r\n                    const apenasHoraStr = `${hh}:${mm}h`;\r\n\r\n                    allRecords.push({\r\n                        time: dataHoraCompleta,\r\n                        temp: temperatura.toFixed(1),\r\n                        setpoint: parseFloat(setpoint).toFixed(1),\r\n                        extra: extraVal,\r\n                        extraLabel: nomeExtra, \/\/ Salva o nome correto da coluna lida\r\n                        porta: porta,\r\n                        dateStr: apenasData,\r\n                        source: 'db'\r\n                    });\r\n\r\n                    if (!dailyData[apenasData]) dailyData[apenasData] = { max: -Infinity, maxTime: '--:--', min: Infinity, minTime: '--:--' };\r\n                    if (temperatura > dailyData[apenasData].max) { dailyData[apenasData].max = temperatura; dailyData[apenasData].maxTime = apenasHoraStr; }\r\n                    if (temperatura < dailyData[apenasData].min) { dailyData[apenasData].min = temperatura; dailyData[apenasData].minTime = apenasHoraStr; }\r\n                    \r\n                    if (!achou) { currentYear = ano; currentMonth = dateObj.getMonth(); achou = true; }\r\n                }\r\n            });\r\n            finalizarProcessamento(allRecords.length);\r\n        } catch (err) { alert(\"Erro ao ler .db\"); }\r\n    }\r\n\r\n    function processarDadosCSV(textoCSV) {\r\n        const linhas = textoCSV.trim().split('\\n');\r\n        dailyData = {}; \r\n        allRecords = [];\r\n        let achou = false;\r\n        \r\n        if (linhas.length <= 1) return;\r\n        \r\n        const header = linhas[0].split(',').map(s => s.replace(\/\"\/g, '').trim().toLowerCase());\r\n        const colTime = header.indexOf('collecttime') !== -1 ? header.indexOf('collecttime') : 1;\r\n        const colTemp = header.indexOf('tprincipal') !== -1 ? header.indexOf('tprincipal') : 2;\r\n        const colSet = header.indexOf('setpoint') !== -1 ? header.indexOf('setpoint') : 4; \r\n        \r\n        \/\/ Identifica no CSV se chama Degelo ou Alarme\r\n        let colExtra = header.indexOf('degelo');\r\n        let nomeExtra = 'Degelo';\r\n        if (colExtra === -1) {\r\n            colExtra = header.indexOf('alarme');\r\n            nomeExtra = 'Alarme';\r\n        }\r\n        \r\n        const colPorta = header.findIndex(s => s.includes('porta')) !== -1 ? header.findIndex(s => s.includes('porta')) : 5;\r\n\r\n        for (let i = 1; i < linhas.length; i++) {\r\n            if (linhas[i].trim() === '') continue;\r\n            const colunas = linhas[i].split(','); \r\n            \r\n            if (colunas.length > colTemp) {\r\n                let timeRaw = colunas[colTime].replace(\/\"\/g, '').trim(); \r\n                let tempStr = colunas[colTemp].replace(\/\"\/g, '').replace(',', '.').trim();\r\n                let temperatura = parseFloat(tempStr);\r\n                \r\n                let setpRaw = (colSet !== -1 && colunas[colSet]) ? parseFloat(colunas[colSet].replace(\/\"\/g, '').replace(',', '.')) : 4.5;\r\n                let extraRaw = (colExtra !== -1 && colunas[colExtra]) ? colunas[colExtra].replace(\/\"\/g, '').trim() : \"0\";\r\n                let portaRaw = (colPorta !== -1 && colunas[colPorta]) ? colunas[colPorta].replace(\/\"\/g, '').trim() : \"0\";\r\n\r\n                if (!isNaN(temperatura) && timeRaw) {\r\n                    let partes = timeRaw.split(' ');\r\n                    let apenasData = partes[0];\r\n                    let apenasHoraStr = '--:--';\r\n                    \r\n                    if (partes.length > 1) {\r\n                        let t = partes[1].split('.')[0].split(':');\r\n                        if(t.length >= 2) apenasHoraStr = t[0] + ':' + t[1] + 'h';\r\n                    }\r\n\r\n                    let ano, mes, dia;\r\n                    if (apenasData.includes('-')) {\r\n                        let p = apenasData.split('-');\r\n                        ano = p[0]; mes = p[1]; dia = p[2];\r\n                    } else if (apenasData.includes('\/')) {\r\n                        let p = apenasData.split('\/');\r\n                        if (p[0].length === 4) { ano = p[0]; mes = p[1]; dia = p[2]; } \r\n                        else { dia = p[0]; mes = p[1]; ano = p[2]; }\r\n                    }\r\n\r\n                    let dataFormatadaParaBusca = apenasData;\r\n                    if (ano && mes && dia) {\r\n                        dataFormatadaParaBusca = `${ano}-${mes.padStart(2, '0')}-${dia.padStart(2, '0')}`;\r\n                    }\r\n                    \r\n                    allRecords.push({\r\n                        time: timeRaw,\r\n                        temp: temperatura.toFixed(1),\r\n                        setpoint: isNaN(setpRaw) ? \"4.5\" : setpRaw.toFixed(1),\r\n                        extra: extraRaw, \r\n                        extraLabel: nomeExtra, \/\/ Salva o nome correto da coluna\r\n                        porta: portaRaw,\r\n                        dateStr: dataFormatadaParaBusca,\r\n                        source: 'csv'\r\n                    });\r\n\r\n                    if (!dailyData[dataFormatadaParaBusca]) dailyData[dataFormatadaParaBusca] = { max: -Infinity, maxTime: '--:--', min: Infinity, minTime: '--:--' };\r\n                    if (temperatura > dailyData[dataFormatadaParaBusca].max) { dailyData[dataFormatadaParaBusca].max = temperatura; dailyData[dataFormatadaParaBusca].maxTime = apenasHoraStr; }\r\n                    if (temperatura < dailyData[dataFormatadaParaBusca].min) { dailyData[dataFormatadaParaBusca].min = temperatura; dailyData[dataFormatadaParaBusca].minTime = apenasHoraStr; }\r\n                    \r\n                    if (!achou) {\r\n                        currentYear = parseInt(ano); \r\n                        currentMonth = parseInt(mes) - 1; \r\n                        achou = true;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        finalizarProcessamento(allRecords.length);\r\n    }\r\n\r\n    function finalizarProcessamento(total) {\r\n        recordCountEl.textContent = `REGISTROS CARREGADOS: ${total}`;\r\n        dateLabelEl.textContent = \"Selecione um dia no calend\u00e1rio\";\r\n        maxEl.textContent = \"--\u00b0C\"; minEl.textContent = \"--\u00b0C\";\r\n        maxTimeEl.textContent = \"--:--\"; minTimeEl.textContent = \"--:--\";\r\n        selectedDateStr = null;\r\n        renderizarCalendario();\r\n    }\r\n\r\n    function renderizarCalendario() {\r\n        calendarGrid.innerHTML = ''; \r\n        monthYearDisplay.textContent = `${nomesMeses[currentMonth]} ${currentYear}`;\r\n        diasSemana.forEach(dia => { const el = document.createElement('div'); el.className = 'day-name'; el.textContent = dia; calendarGrid.appendChild(el); });\r\n        const primeiro = new Date(currentYear, currentMonth, 1).getDay();\r\n        const diasMes = new Date(currentYear, currentMonth + 1, 0).getDate();\r\n        for (let i = 0; i < primeiro; i++) calendarGrid.appendChild(document.createElement('div'));\r\n        for (let dia = 1; dia <= diasMes; dia++) {\r\n            const cell = document.createElement('div');\r\n            cell.className = 'day-cell'; cell.textContent = dia;\r\n            const dataStr = `${currentYear}-${String(currentMonth + 1).padStart(2, '0')}-${String(dia).padStart(2, '0')}`;\r\n            if (dailyData[dataStr]) {\r\n                cell.classList.add('has-data');\r\n                if (dataStr === selectedDateStr) cell.classList.add('selected');\r\n\r\n                cell.onclick = () => {\r\n                    document.querySelectorAll('.day-cell.selected').forEach(el => el.classList.remove('selected'));\r\n                    cell.classList.add('selected');\r\n                    selectedDateStr = dataStr;\r\n                    \r\n                    const d = dailyData[dataStr];\r\n                    dateLabelEl.textContent = `Leituras de ${dia}\/${String(currentMonth + 1).padStart(2, '0')}\/${currentYear}`;\r\n                    maxEl.textContent = d.max.toFixed(1) + '\u00b0C'; maxTimeEl.textContent = d.maxTime;\r\n                    minEl.textContent = d.min.toFixed(1) + '\u00b0C'; minTimeEl.textContent = d.minTime;\r\n                    \r\n                    const registrosDoDia = allRecords.filter(r => r.dateStr === dataStr).length;\r\n                    recordCountEl.textContent = `REGISTROS DESTE DIA: ${registrosDoDia}`;\r\n                };\r\n            }\r\n            calendarGrid.appendChild(cell);\r\n        }\r\n    }\r\n\r\n    document.getElementById('btn-prev').onclick = () => { currentMonth--; if(currentMonth<0){currentMonth=11;currentYear--;} renderizarCalendario(); };\r\n    document.getElementById('btn-next').onclick = () => { currentMonth++; if(currentMonth>11){currentMonth=0;currentYear++;} renderizarCalendario(); };\r\n    renderizarCalendario();\r\n  <\/script>\r\n<\/body>\r\n<\/html>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Controle de Vacinas Painel de Temperaturas &lt; M\u00eas Ano &gt; Carregue um arquivo (.db ou .csv) M\u00e1xima &#8211;\u00b0C &#8211;:&#8211; M\u00ednima &#8211;\u00b0C &#8211;:&#8211; Carregar Arquivo Imprimir Dia (PDF) Imprimir M\u00eas (PDF)<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"inline_featured_image":false,"footnotes":""},"class_list":["post-7046","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/saudecajati.com.br\/index.php\/wp-json\/wp\/v2\/pages\/7046","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/saudecajati.com.br\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/saudecajati.com.br\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/saudecajati.com.br\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/saudecajati.com.br\/index.php\/wp-json\/wp\/v2\/comments?post=7046"}],"version-history":[{"count":88,"href":"https:\/\/saudecajati.com.br\/index.php\/wp-json\/wp\/v2\/pages\/7046\/revisions"}],"predecessor-version":[{"id":7146,"href":"https:\/\/saudecajati.com.br\/index.php\/wp-json\/wp\/v2\/pages\/7046\/revisions\/7146"}],"wp:attachment":[{"href":"https:\/\/saudecajati.com.br\/index.php\/wp-json\/wp\/v2\/media?parent=7046"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}