{"id":1864,"date":"2026-05-28T17:33:03","date_gmt":"2026-05-28T20:33:03","guid":{"rendered":"https:\/\/utfpr.curitiba.br\/neabi\/?page_id=1864"},"modified":"2026-06-03T13:35:41","modified_gmt":"2026-06-03T16:35:41","slug":"biblioteca-2","status":"publish","type":"page","link":"https:\/\/utfpr.curitiba.br\/neabi\/biblioteca-2\/","title":{"rendered":"Biblioteca"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"1864\" class=\"elementor elementor-1864\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-bb97dea elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"bb97dea\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-4259558\" data-id=\"4259558\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-aaf652a elementor-widget elementor-widget-html\" data-id=\"aaf652a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\r\n    :root {\r\n        --neabi-green: #2d955c; --neabi-red: #e31b23; --neabi-dark: #1a1a1a;\r\n        --neabi-light-green: rgba(45, 149, 92, 0.1); --bg: transparent; --card-bg: #ffffff;\r\n        --transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\r\n    }\r\n    * { box-sizing: border-box; }\r\n    .grid { display: grid; grid-template-columns: 1fr 2fr; gap: 25px; margin-bottom: 30px; align-items: stretch; }\r\n    .biblioteca-container { font-family: 'Inter', sans-serif; color: var(--neabi-dark); margin: 0; padding: 20px; max-width: 1200px; margin: 0 auto; }\r\n    .biblioteca-container header { text-align: center; margin-bottom: 30px; padding: 40px 20px; background: white; border-bottom: 6px solid var(--neabi-red); border-radius: 24px; box-shadow: 0 10px 25px rgba(0,0,0,0.05); }\r\n    .logo-container img { width: 100%; max-width: 600px; height: auto; object-fit: contain; }\r\n    .biblioteca-container header p { margin-top: 15px; color: var(--neabi-green); font-weight: 800; letter-spacing: 3px; font-size: 0.85rem; text-transform: uppercase; }\r\n    .link-header { text-decoration: none; display: block; }\r\n    .link-header header { cursor: pointer; transition: var(--transition); }\r\n    .link-header:hover header { transform: translateY(-5px); box-shadow: 0 15px 35px rgba(0,0,0,0.1); }\r\n    .grid { display: grid; grid-template-columns: 1fr 2fr; gap: 25px; margin-bottom: 25px; align-items: stretch; }\r\n    @media (max-width: 850px) { .grid { grid-template-columns: 1fr; } }\r\n    .card { background: var(--card-bg); padding: 30px; border-radius: 20px; box-shadow: 0 10px 25px rgba(0,0,0,0.05); border: none; transition: var(--transition); }\r\n    .card h2 { font-size: 1.1rem; color: var(--neabi-dark); display: flex; align-items: center; gap: 12px; margin-top: 0; padding-bottom: 15px; border-bottom: 2px solid #f0f2f5; }\r\n    .scroll-historico { max-height: 350px; overflow-y: auto; padding-right: 5px; }\r\n    .scroll-historico::-webkit-scrollbar { width: 6px; }\r\n    .scroll-historico::-webkit-scrollbar-thumb { background: #ddd; border-radius: 10px; }\r\n    .input-group label { font-weight: 700; font-size: 0.8rem; margin-bottom: 8px; color: #666; display: block; }\r\n    .input-group input { width: 100%; padding: 14px; border: 2px solid #eee; border-radius: 12px; font-size: 1rem; box-sizing: border-box; }\r\n    .input-group input:focus { outline: none; border-color: var(--neabi-green); box-shadow: 0 0 0 4px var(--neabi-light-green); }\r\n    .biblioteca-container button { padding: 12px 20px; border: none; border-radius: 12px; cursor: pointer; font-weight: 700; transition: var(--transition); display: inline-flex; align-items: center; justify-content: center; gap: 8px; }\r\n    .btn-main { background: var(--neabi-dark); color: white; width: 100%; margin-top: 10px; }\r\n    .btn-main:hover { background: var(--neabi-green); }\r\n    .btn-return { background: white; color: var(--neabi-red); border: 2px solid var(--neabi-red); font-size: 0.75rem; padding: 6px 12px; }\r\n    .btn-return:hover { background: var(--neabi-red); color: white; }\r\n    .biblioteca-container table { width: 100%; border-collapse: separate; border-spacing: 0 8px; }\r\n    .biblioteca-container th { text-align: left; padding: 10px 15px; color: #888; font-size: 0.7rem; text-transform: uppercase; }\r\n    .biblioteca-container td { padding: 12px 15px; background: #fdfdfd; border-top: 1px solid #f1f1f1; border-bottom: 1px solid #f1f1f1; font-size: 0.85rem; }\r\n    .biblioteca-container td:first-child { border-left: 1px solid #f1f1f1; border-radius: 10px 0 0 10px; }\r\n    .biblioteca-container td:last-child { border-right: 1px solid #f1f1f1; border-radius: 0 10px 10px 0; }\r\n    .badge { padding: 4px 10px; border-radius: 6px; font-weight: 800; font-size: 0.65rem; }\r\n    .status-ativo { background: var(--neabi-light-green); color: var(--neabi-green); }\r\n    .status-finalizado { background: #eee; color: #777; }\r\n    .pagination-container { display: flex; justify-content: center; align-items: center; gap: 15px; margin-top: 20px; padding-top: 15px; border-top: 2px solid #f0f2f5; }\r\n    .page-btn { background: white; border: 1px solid #ddd; color: var(--neabi-dark); padding: 8px 16px; border-radius: 8px; }\r\n    .page-btn:disabled { opacity: 0.4; cursor: not-allowed; }\r\n    .page-btn:not(:disabled):hover { border-color: var(--neabi-green); color: var(--neabi-green); }\r\n    #msg { margin-top: 15px; padding: 10px; border-radius: 10px; text-align: center; display: none; font-size: 0.85rem; }\r\n    .card-header-flex { display: flex; justify-content: space-between; align-items: center; border-bottom: 2px solid #f0f2f5; padding-bottom: 15px; margin-bottom: 15px; }\r\n    .card-header-flex h2 { border-bottom: none; padding-bottom: 0; margin-bottom: 0; }\r\n    .btn-export { background-color: var(--neabi-green); color: white; padding: 8px 16px; font-size: 0.8rem; border-radius: 8px; border: none; cursor: pointer; transition: var(--transition); font-weight: bold; display: flex; gap: 8px; align-items: center; }\r\n    .btn-export:hover { background-color: var(--neabi-dark); transform: translateY(-2px); }\r\n    @media (max-width: 768px) { .grid { grid-template-columns: 1fr; } .card-header-flex { flex-direction: column; align-items: flex-start; gap: 10px; } .btn-export { align-self: flex-start; } td, th { padding: 10px 8px; font-size: 0.85rem; } }\r\n    .modal-overlay { display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0,0,0,0.6); z-index: 9999; justify-content: center; align-items: center; }\r\n    .modal-box { background: white; padding: 25px; border-radius: 12px; max-width: 400px; width: 90%; box-shadow: 0 10px 30px rgba(0,0,0,0.3); text-align: center; }\r\n    .modal-box h3 { color: var(--neabi-dark); margin-top: 0; }\r\n    .modal-info { background: #f8f9fa; padding: 15px; border-radius: 8px; margin: 15px 0; text-align: left; font-size: 0.9rem; }\r\n    .biblioteca-container .btn-cancel { background: #ccc; color: #333; padding: 10px 15px; border: none; border-radius: 6px; cursor: pointer; }\r\n    .biblioteca-container .btn-confirm { background: var(--neabi-green); color: white; padding: 10px 15px; border: none; border-radius: 6px; cursor: pointer; margin-left: 10px; }\r\n    .admin-only { display: none; }\r\n\r\n\r\n<div class=\"biblioteca-container\">\r\n    <a href=\"https:\/\/utfpr.curitiba.br\/neabi\/\" target=\"_blank\" class=\"link-header\">\r\n        <header>\r\n            <div class=\"logo-container\"><img decoding=\"async\" src=\"\/neabi\/wp-content\/plugins\/biblioteca-meunucleo\/logo-neabi.png\" alt=\"NEABI-CT\"><\/div>\r\n            <p>Sistema de Gest\u00e3o Bibliogr\u00e1fica<\/p>\r\n        <\/header>\r\n    <\/a>\r\n\r\n    <div class=\"grid\">\r\n        <div class=\"card\" style=\"border-top: 5px solid var(--neabi-green)\">\r\n            <h2><i class=\"fas fa-edit\"><\/i> Retirada<\/h2>\r\n            <div class=\"input-group\">\r\n                <label>Matr\u00edcula (7 d\u00edgitos)<\/label>\r\n                \r\n                <div id=\"nomeIdentificado\" style=\"margin-top: 8px;font-size: 0.8rem;font-weight: 800;min-height: 1.2rem\"><\/div>\r\n            <\/div>\r\n            <div class=\"input-group\">\r\n                <label>C\u00f3digo do Livro (ID)<\/label>\r\n                \r\n            <\/div>\r\n            <button class=\"btn-main\"><i class=\"fas fa-check-circle\"><\/i> Confirmar<\/button>\r\n            <div id=\"msg\"><\/div>\r\n        <\/div>\r\n\r\n        <div class=\"card\" style=\"border-top: 5px solid var(--neabi-red)\">\r\n            <div class=\"card-header-flex\">\r\n                <h2>\r\n                    <i class=\"fas fa-history\"><\/i> Atividades Recentes \r\n                    <span style=\"cursor:pointer;font-size:1rem;color:#aaa\" title=\"Acesso Admin\">\ud83d\udd12<\/span>\r\n                <\/h2>\r\n                <button id=\"btnExportar\" class=\"btn-export admin-only\">\r\n                    <i class=\"fas fa-file-excel\"><\/i> Exportar Dados\r\n                <\/button>\r\n            <\/div>\r\n            <div class=\"table-container scroll-historico\">\r\n                <table id=\"tabelaEmprestimos\">\r\n                    <thead><tr><th>Pessoa<\/th><th>T\u00edtulo<\/th><th>Status<\/th><th>A\u00e7\u00e3o<\/th><\/tr><\/thead>\r\n                    <tbody><\/tbody>\r\n                <\/table>\r\n            <\/div>\r\n        <\/div>\r\n    <\/div> \r\n    \r\n    <div class=\"card\" style=\"margin-bottom: 25px\">\r\n        <h2><i class=\"fas fa-book\"><\/i> Acervo Neabi Diva<\/h2>\r\n        <div class=\"input-group\" style=\"margin-bottom: 20px\">\r\n            \r\n        <\/div>\r\n        <div class=\"table-container\">\r\n            <table id=\"tabelaAcervo\">\r\n                <thead><tr><th>C\u00f3d<\/th><th>T\u00edtulo \/ Autoria<\/th><th>Editora<\/th><th>ISBN<\/th><th>Qtd<\/th><\/tr><\/thead>\r\n                <tbody><\/tbody>\r\n            <\/table>\r\n        <\/div>\r\n        <div class=\"pagination-container\">\r\n            <button id=\"prevBtn\" class=\"page-btn\"><i class=\"fas fa-chevron-left\"><\/i> Anterior<\/button>\r\n            <span id=\"pageInfo\" style=\"font-weight: 700;font-size: 0.9rem\">P\u00e1gina 1<\/span>\r\n            <button id=\"nextBtn\" class=\"page-btn\">Pr\u00f3xima <i class=\"fas fa-chevron-right\"><\/i><\/button>\r\n        <\/div>\r\n    <\/div>\r\n\r\n    <div class=\"card\" style=\"border-top: 5px solid var(--neabi-dark)\">\r\n        <h2><i class=\"fas fa-book-open\"><\/i> Consulta Local (N\u00e3o Circulante)<\/h2>\r\n        <p style=\"font-size: 0.85rem;color: #666;margin-top: -5px;margin-bottom: 15px\">\r\n            *Estes exemplares s\u00e3o de uso exclusivo nas depend\u00eancias do NEABI-CT e n\u00e3o podem ser retirados.\r\n        <\/p>\r\n        <div class=\"input-group\" style=\"margin-bottom: 20px\">\r\n            \r\n        <\/div>\r\n        <div class=\"table-container\">\r\n            <table id=\"tabelaConsulta\">\r\n                <thead>\r\n                    <tr><th>C\u00f3d<\/th><th>T\u00edtulo \/ Autoria<\/th><th>Categoria<\/th><\/tr>\r\n                <\/thead>\r\n                <tbody><\/tbody>\r\n            <\/table>\r\n        <\/div>\r\n        <div class=\"pagination-container\">\r\n            <button id=\"prevBtnConsulta\" class=\"page-btn\"><i class=\"fas fa-chevron-left\"><\/i> Anterior<\/button>\r\n            <span id=\"pageInfoConsulta\" style=\"font-weight: 700;font-size: 0.9rem\">P\u00e1gina 1<\/span>\r\n            <button id=\"nextBtnConsulta\" class=\"page-btn\">Pr\u00f3xima <i class=\"fas fa-chevron-right\"><\/i><\/button>\r\n        <\/div>\r\n    <\/div>\r\n\r\n    <div id=\"modalEmprestimo\" class=\"modal-overlay\">\r\n        <div class=\"modal-box\">\r\n            <h3>Confirmar Retirada?<\/h3>\r\n            <div class=\"modal-info\" id=\"resumoEmprestimo\"><\/div>\r\n            <button class=\"btn-cancel\">Cancelar<\/button>\r\n            <button class=\"btn-confirm\"><i class=\"fas fa-check\"><\/i> Sim, Emprestar<\/button>\r\n        <\/div>\r\n    <\/div>\r\n\r\n    <div id=\"modalErro\" class=\"modal-overlay\">\r\n        <div class=\"modal-box\" style=\"border-top: 5px solid var(--neabi-red)\">\r\n            <h3 style=\"color: var(--neabi-red);margin-bottom: 10px\">\r\n                <i class=\"fas fa-exclamation-triangle\"><\/i> A\u00e7\u00e3o Bloqueada\r\n            <\/h3>\r\n            <div class=\"modal-info\" id=\"textoErro\" style=\"text-align: center;font-size: 1rem;font-weight: bold;background: #fff0f0;color: var(--neabi-red)\"><\/div>\r\n            <button class=\"btn-cancel\" style=\"width: 100%;margin: 0;background-color: #f1f3f5\">Entendi<\/button>\r\n        <\/div>\r\n    <\/div>\r\n<\/div>\r\n\r\n\r\n    let isAdmin = false;\r\n    let acervoCompleto = [];\r\n    let paginaAtual = 1;\r\n    const itensPorPagina = 8;\r\n    let acervoConsultaCompleto = [];\r\n    let paginaAtualConsulta = 1;\r\n    const itensPorPaginaConsulta = 8;\r\n\r\n    function atualizarTudo() { \r\n        carregarEmprestimos(); \r\n        carregarAcervo(); \r\n        carregarConsultaLocal();\r\n    }\r\n\r\n    async function identificarFuncionario() {\r\n        const matricula = document.getElementById('matricula').value;\r\n        const labelNome = document.getElementById('nomeIdentificado');\r\n        if (matricula.length === 7) {\r\n            try {\r\n                const res = await fetch(`\/neabi\/wp-json\/biblioteca\/v1\/funcionarios\/${matricula}`);\r\n                const func = res.ok ? await res.json() : null;\r\n                if (func &amp;&amp; func.nome) {\r\n                    labelNome.innerText = `\ud83d\udc64 ${func.nome}`;\r\n                    labelNome.style.color = \"var(--neabi-green)\";\r\n                } else {\r\n                    labelNome.innerText = \"\u274c Usu\u00e1rio n\u00e3o encontrado ou n\u00e3o cadastrado\";\r\n                    labelNome.style.color = \"var(--neabi-red)\";\r\n                }\r\n            } catch (e) { labelNome.innerText = \"\u274c Erro na consulta\"; }\r\n        } else { labelNome.innerText = \"\"; }\r\n    }\r\n\r\n    async function enviarEmprestimo() {\r\n        const m = document.getElementById('matricula').value;\r\n        const l = parseInt(document.getElementById('livroId').value);\r\n        if (!m || !l) { mostrarMensagem(\"\u26a0\ufe0f Preencha os campos!\", \"orange\"); return; }\r\n        \r\n        try {\r\n            const res = await fetch('\/neabi\/wp-json\/biblioteca\/v1\/emprestimos\/realizar', {\r\n                method: 'POST',\r\n                headers: { 'Content-Type': 'application\/json' },\r\n                body: JSON.stringify({ matricula: m, livroId: l })\r\n            });\r\n            const texto = await res.text();\r\n            \r\n            fecharModal('modalEmprestimo');\r\n            mostrarMensagem(texto, texto.includes(\"Erro\") ? \"var(--neabi-red)\" : \"var(--neabi-green)\");\r\n            \r\n            if(!texto.includes(\"Erro\")) { \r\n                document.getElementById('matricula').value = \"\"; \r\n                document.getElementById('livroId').value = \"\";\r\n                document.getElementById('nomeIdentificado').innerText = \"\";\r\n            }\r\n            atualizarTudo();\r\n        } catch (e) { \r\n            fecharModal('modalEmprestimo');\r\n            mostrarMensagem(\"\u274c Erro de conex\u00e3o\", \"red\"); \r\n        }\r\n    }\r\n\r\n    async function carregarEmprestimos() {\r\n        try {\r\n            const res = await fetch('\/neabi\/wp-json\/biblioteca\/v1\/emprestimos\/todos');\r\n            const dados = await res.json();\r\n            const corpo = document.querySelector('#tabelaEmprestimos tbody');\r\n            const cabecalho = document.querySelector('#tabelaEmprestimos thead tr');\r\n            corpo.innerHTML = \"\";\r\n            \r\n            cabecalho.innerHTML = (isAdmin ? `<th>Pessoa<\/th>` : ``) + `<th>T\u00edtulo<\/th><th>Status<\/th><th>A\u00e7\u00e3o<\/th>`;\r\n            const dataHoje = new Date(); dataHoje.setHours(0, 0, 0, 0);\r\n\r\n            dados.reverse().forEach(emp =&gt; {\r\n                const isAtivo = emp.status === 'ATIVO';\r\n                let statusBadge = isAtivo ? `<span class=\"badge status-ativo\">ATIVO<\/span>` : `<span class=\"badge status-finalizado\">FINALIZADO<\/span>`;\r\n                let estiloLinha = '';\r\n\r\n                if (isAtivo &amp;&amp; dataHoje &gt; new Date(emp.dataDevolucaoPrevista + \"T00:00:00\")) {\r\n                    statusBadge = `<span class=\"badge\" style=\"background: var(--neabi-red);color: white\"><i class=\"fas fa-exclamation-triangle\"><\/i> ATRASADO<\/span>`;\r\n                    estiloLinha = `style=\"background-color: #fff0f0;\"`;\r\n                }\r\n\r\n                const colunaPessoa = isAdmin ? `<td><strong>${emp.funcionarioNome}<\/strong><br><small style=\"color: #888\">Retirado: ${emp.dataRetirada.split('-').reverse().join('\/')}<\/small><\/td>` : ``;\r\n\r\n                corpo.innerHTML += `\r\n                    <tr>\r\n                        ${colunaPessoa}\r\n                        <td>${emp.livroTitulo}<br><small>Vence: ${emp.dataDevolucaoPrevista.split('-').reverse().join('\/')}<\/small><\/td>\r\n                        <td>${statusBadge}<\/td>\r\n                        <td>${isAtivo ? `<button class=\"btn-return\">Devolver<\/button>` : '---'}<\/td>\r\n                    <\/tr>`;\r\n            });\r\n        } catch (e) { console.error(e); }\r\n    }\r\n\r\n    function desbloquearAdmin() {\r\n        const senha = prompt(\"Digite a chave de acesso para visualizar detalhes:\");\r\n        if (senha === \"40028922\") { \r\n            isAdmin = true;\r\n            document.getElementById('btnExportar').classList.remove('admin-only');\r\n            carregarEmprestimos();\r\n        } else {\r\n            alert(\"Acesso negado.\");\r\n        }\r\n    }\r\n\r\n    async function carregarAcervo() {\r\n        try {\r\n            const res = await fetch('\/neabi\/wp-json\/biblioteca\/v1\/livros\/circulantes');\r\n            acervoCompleto = await res.json();\r\n            acervoCompleto.sort((a, b) =&gt; a.titulo.localeCompare(b.titulo));\r\n            paginaAtual = 1;\r\n            renderizarAcervo();\r\n        } catch (e) { console.error(e); }\r\n    }\r\n\r\n    async function carregarConsultaLocal() {\r\n        try {\r\n            const res = await fetch('\/neabi\/wp-json\/biblioteca\/v1\/livros\/consulta-local');\r\n            acervoConsultaCompleto = await res.json();\r\n            acervoConsultaCompleto.sort((a, b) =&gt; a.titulo.localeCompare(b.titulo));\r\n            paginaAtualConsulta = 1;\r\n            renderizarConsultaLocal();\r\n        } catch (e) { console.error(e); }\r\n    }\r\n\r\n    function renderizarConsultaLocal() {\r\n        const inicio = (paginaAtualConsulta - 1) * itensPorPaginaConsulta;\r\n        const fim = inicio + itensPorPaginaConsulta;\r\n        const itensPagina = acervoConsultaCompleto.slice(inicio, fim);\r\n        \r\n        const corpo = document.querySelector('#tabelaConsulta tbody');\r\n        if(!corpo) return;\r\n        corpo.innerHTML = \"\";\r\n        \r\n        itensPagina.forEach(livro =&gt; {\r\n            corpo.innerHTML += `\r\n                <tr>\r\n                    <td><b style=\"color:#777\">#${livro.id}<\/b><\/td>\r\n                    <td><strong>${livro.titulo}<\/strong><br><small style=\"color:#666\">${livro.autores || '-'}<\/small><\/td>\r\n                    <td><span class=\"badge\" style=\"background: var(--neabi-dark);color: white\">${livro.categoria}<\/span><\/td>\r\n                <\/tr>`;\r\n        });\r\n\r\n        const totalPaginas = Math.ceil(acervoConsultaCompleto.length \/ itensPorPaginaConsulta) || 1;\r\n        document.getElementById('pageInfoConsulta').innerText = `P\u00e1gina ${paginaAtualConsulta} de ${totalPaginas}`;\r\n        document.getElementById('prevBtnConsulta').disabled = paginaAtualConsulta === 1;\r\n        document.getElementById('nextBtnConsulta').disabled = paginaAtualConsulta &gt;= totalPaginas;\r\n    }\r\n\r\n    function mudarPaginaConsulta(direcao) {\r\n        paginaAtualConsulta += direcao;\r\n        renderizarConsultaLocal();\r\n    }\r\n\r\n    async function filtrarConsultaLocal() {\r\n        const termo = document.getElementById('buscaConsulta').value;\r\n        if (termo.length  a.titulo.localeCompare(b.titulo));\r\n            paginaAtualConsulta = 1;\r\n            renderizarConsultaLocal();\r\n        } catch (e) { console.error(e); }\r\n    }\r\n\r\n    function renderizarAcervo() {\r\n        const inicio = (paginaAtual - 1) * itensPorPagina;\r\n        const fim = inicio + itensPorPagina;\r\n        const itensPagina = acervoCompleto.slice(inicio, fim);\r\n        \r\n        const corpo = document.querySelector('#tabelaAcervo tbody');\r\n        corpo.innerHTML = \"\";\r\n        itensPagina.forEach(livro =&gt; {\r\n            corpo.innerHTML += `<tr><td><b style=\"color:#777\">#${livro.id}<\/b><\/td>\r\n            <td><strong>${livro.titulo}<\/strong><br><small style=\"color:#666\">${livro.autores || '-'}<\/small><\/td>\r\n            <td>${livro.editora || '-'}<\/td><td><small>${livro.isbn || '-'}<\/small><\/td>\r\n            <td><span> 0 ? 'status-ativo' : 'status-finalizado'}\"&gt;${livro.quantidadeDisponivel}<\/span><\/td><\/tr>`;\r\n        });\r\n\r\n        document.getElementById('pageInfo').innerText = `P\u00e1gina ${paginaAtual} de ${Math.ceil(acervoCompleto.length \/ itensPorPagina)}`;\r\n        document.getElementById('prevBtn').disabled = paginaAtual === 1;\r\n        document.getElementById('nextBtn').disabled = paginaAtual &gt;= Math.ceil(acervoCompleto.length \/ itensPorPagina);\r\n    }\r\n\r\n    function mudarPagina(direcao) {\r\n        paginaAtual += direcao;\r\n        renderizarAcervo();\r\n    }\r\n\r\n    async function filtrarAcervo() {\r\n        const termo = document.getElementById('buscaLivro').value;\r\n        if (termo.length  a.titulo.localeCompare(b.titulo));\r\n            paginaAtual = 1;\r\n            renderizarAcervo();\r\n        } catch (e) { console.error(e); }\r\n    }\r\n\r\n    function mostrarMensagem(t, c) {\r\n        const m = document.getElementById('msg');\r\n        m.style.display = \"block\"; m.style.color = \"white\"; m.style.backgroundColor = c; m.innerText = t;\r\n        setTimeout(() =&gt; m.style.display = \"none\", 5000);\r\n    }\r\n\r\n    async function exportarRelatorio() {\r\n        try {\r\n            const res = await fetch('\/neabi\/wp-json\/biblioteca\/v1\/emprestimos\/todos');\r\n            const dados = await res.json();\r\n\r\n            if (dados.length === 0) {\r\n                alert(\"N\u00e3o h\u00e1 dados para exportar.\");\r\n                return;\r\n            }\r\n\r\n            let csvContent = \"ID;Estudante\/Servidor;T\u00edtulo;Data Retirada;Devolu\u00e7\u00e3o Prevista;Status\\n\";\r\n\r\n            dados.forEach(emp =&gt; {\r\n                const nome = `\"${emp.funcionarioNome || ''}\"`;\r\n                const titulo = `\"${emp.livroTitulo || ''}\"`;\r\n                const dataRet = `\"${emp.dataRetirada || ''}\"`;\r\n                const dataDev = `\"${emp.dataDevolucaoPrevista || ''}\"`;\r\n                const status = `\"${emp.status || ''}\"`;\r\n\r\n                csvContent += `${emp.id};${nome};${titulo};${dataRet};${dataDev};${status}\\n`;\r\n            });\r\n\r\n            const blob = new Blob([\"\\uFEFF\" + csvContent], { type: 'text\/csv;charset=utf-8;' });\r\n            const link = document.createElement(\"a\");\r\n            const url = URL.createObjectURL(blob);\r\n            \r\n            const dataHoje = new Date().toISOString().slice(0, 10);\r\n            \r\n            link.setAttribute(\"href\", url);\r\n            link.setAttribute(\"download\", `relatorio_neabi_${dataHoje}.csv`);\r\n            link.style.visibility = 'hidden';\r\n            \r\n            document.body.appendChild(link);\r\n            link.click();\r\n            document.body.removeChild(link);\r\n\r\n        } catch (e) {\r\n            console.error(\"Erro ao exportar:\", e);\r\n            alert(\"Erro ao gerar o relat\u00f3rio. Verifique a conex\u00e3o.\");\r\n        }\r\n    }\r\n\r\n    function fecharModal(id) { document.getElementById(id).style.display = 'none'; }\r\n\r\n    function mostrarErro(mensagem) {\r\n        document.getElementById('textoErro').innerHTML = mensagem;\r\n        document.getElementById('modalErro').style.display = 'flex';\r\n    }\r\n\r\n    function prepararEmprestimo() {\r\n        const matricula = document.getElementById('matricula').value;\r\n        const livroId = document.getElementById('livroId').value;\r\n        const nomeStr = document.getElementById('nomeIdentificado').innerText.trim();\r\n        \r\n        if (!matricula || !livroId) { \r\n            mostrarErro(\"Por favor, preencha a Matr\u00edcula e o C\u00f3digo do Livro!\"); \r\n            return; \r\n        }\r\n\r\n        if (!nomeStr || nomeStr.toLowerCase().includes(\"n\u00e3o encontrado\") || nomeStr.toLowerCase().includes(\"erro\")) {\r\n            mostrarErro(\"O RA\/Matr\u00edcula digitado n\u00e3o pertence a um usu\u00e1rio cadastrado.\"); \r\n            return;\r\n        }\r\n\r\n        const livro = acervoCompleto.find(l =&gt; l.id == livroId) || acervoConsultaCompleto.find(l =&gt; l.id == livroId);\r\n        const tituloLivro = livro ? livro.titulo : \"Livro #\" + livroId;\r\n\r\n        const hoje = new Date();\r\n        const devolucao = new Date(); devolucao.setDate(hoje.getDate() + 14); \r\n\r\n        document.getElementById('resumoEmprestimo').innerHTML = `\r\n            <b>Usu\u00e1rio:<\/b> ${nomeStr} <br>\r\n            <b>Livro:<\/b> ${tituloLivro} <br><hr style=\"border-top:1px solid #ddd;margin:10px 0\">\r\n            <b>Retirada:<\/b> ${hoje.toLocaleDateString('pt-BR')} <br>\r\n            <b>Devolu\u00e7\u00e3o:<\/b> <span style=\"color:var(--neabi-red);font-weight:bold\">${devolucao.toLocaleDateString('pt-BR')}<\/span>\r\n        `;\r\n        document.getElementById('modalEmprestimo').style.display = 'flex';\r\n    }\r\n\r\n    async function solicitarDevolucao(idEmprestimo) {\r\n        const matriculaConfirmacao = prompt(\"Para confirmar a devolu\u00e7\u00e3o, digite a sua Matr\u00edcula (RA):\");\r\n        if (!matriculaConfirmacao) return;\r\n\r\n        try {\r\n            const res = await fetch(`\/neabi\/wp-json\/biblioteca\/v1\/emprestimos\/devolver\/${idEmprestimo}?matricula=${matriculaConfirmacao}`, { method: 'POST' });\r\n            const texto = await res.text();\r\n            \r\n            if (texto.startsWith(\"Erro\")) {\r\n                mostrarErro(texto);\r\n            } else {\r\n                alert(\"\u2705 \" + texto); \r\n                atualizarTudo();\r\n            }\r\n        } catch (e) { mostrarErro(\"Erro de conex\u00e3o com o servidor.\"); }\r\n    }\r\n    \r\n    \/\/ Inicia o carregamento das tabelas\r\n    atualizarTudo();\r\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>:root { &#8211;neabi-green: #2d955c; &#8211;neabi-red: #e31b23; &#8211;neabi-dark: #1a1a1a; &#8211;neabi-light-green: rgba(45, 149, 92, 0.1); &#8211;bg: transparent; &#8211;card-bg: #ffffff; &#8211;transition: all 0.3s [&hellip;]<\/p>\n","protected":false},"author":437,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-1864","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/utfpr.curitiba.br\/neabi\/wp-json\/wp\/v2\/pages\/1864","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/utfpr.curitiba.br\/neabi\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/utfpr.curitiba.br\/neabi\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/utfpr.curitiba.br\/neabi\/wp-json\/wp\/v2\/users\/437"}],"replies":[{"embeddable":true,"href":"https:\/\/utfpr.curitiba.br\/neabi\/wp-json\/wp\/v2\/comments?post=1864"}],"version-history":[{"count":8,"href":"https:\/\/utfpr.curitiba.br\/neabi\/wp-json\/wp\/v2\/pages\/1864\/revisions"}],"predecessor-version":[{"id":1876,"href":"https:\/\/utfpr.curitiba.br\/neabi\/wp-json\/wp\/v2\/pages\/1864\/revisions\/1876"}],"wp:attachment":[{"href":"https:\/\/utfpr.curitiba.br\/neabi\/wp-json\/wp\/v2\/media?parent=1864"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}