{"id":667,"date":"2025-07-17T14:40:50","date_gmt":"2025-07-17T17:40:50","guid":{"rendered":"https:\/\/wp.ufpel.edu.br\/cppad\/?page_id=667"},"modified":"2025-07-17T14:40:50","modified_gmt":"2025-07-17T17:40:50","slug":"calculadora-de-prazos-processuais","status":"publish","type":"page","link":"https:\/\/wp.ufpel.edu.br\/cppad\/calculadora-de-prazos-processuais\/","title":{"rendered":"CALCULADORA DE PRAZOS PROCESSUAIS"},"content":{"rendered":"\n<!DOCTYPE html>\n<html lang=\"pt-BR\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>Calculadora de Prazos Processuais<\/title>\n    <script src=\"https:\/\/cdn.tailwindcss.com\"><\/script>\n    <link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\n    <link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin>\n    <link href=\"https:\/\/fonts.googleapis.com\/css2?family=Inter:wght@400;500;600;700&#038;display=swap\" rel=\"stylesheet\">\n    <style>\n        body {\n            font-family: 'Inter', sans-serif;\n        }\n        \/* Custom styles for better date input appearance *\/\n        input[type=\"date\"]::-webkit-calendar-picker-indicator {\n            cursor: pointer;\n            opacity: 0.6;\n            transition: opacity 0.2s;\n        }\n        input[type=\"date\"]::-webkit-calendar-picker-indicator:hover {\n            opacity: 1;\n        }\n    <\/style>\n<\/head>\n<body class=\"bg-gray-50 flex items-center justify-center min-h-screen p-4\">\n\n    <div class=\"w-full max-w-2xl bg-white rounded-2xl shadow-lg p-6 md:p-8\">\n        \n        <div class=\"text-center mb-6\">\n            <h1 class=\"text-2xl md:text-3xl font-bold text-gray-800\">Calculadora de Prazos Processuais<\/h1>\n            <p class=\"text-gray-500 mt-2\">Calcule prazos em dias \u00fateis ou corridos, conforme a Lei n\u00ba 9.784\/99.<\/p>\n        <\/div>\n\n        <form id=\"prazo-form\" class=\"space-y-6\">\n            <div class=\"grid grid-cols-1 md:grid-cols-2 gap-6\">\n                <!-- Data da Ci\u00eancia -->\n                <div>\n                    <label for=\"start-date\" class=\"block text-sm font-medium text-gray-700 mb-1\">Data da Ci\u00eancia\/Intima\u00e7\u00e3o<\/label>\n                    <input type=\"date\" id=\"start-date\" name=\"start-date\" required class=\"w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition\">\n                    <p class=\"text-xs text-gray-500 mt-1\">O dia em que a parte foi notificada oficialmente.<\/p>\n                <\/div>\n\n                <!-- Prazo em Dias -->\n                <div>\n                    <label for=\"prazo-dias\" class=\"block text-sm font-medium text-gray-700 mb-1\">Prazo em Dias<\/label>\n                    <input type=\"number\" id=\"prazo-dias\" name=\"prazo-dias\" min=\"1\" required class=\"w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition\" placeholder=\"Ex: 15\">\n                    <p class=\"text-xs text-gray-500 mt-1\">A quantidade de dias do prazo.<\/p>\n                <\/div>\n            <\/div>\n\n            <!-- Tipo de Contagem -->\n            <fieldset>\n                <legend class=\"block text-sm font-medium text-gray-700 mb-2\">Tipo de Contagem do Prazo<\/legend>\n                <div class=\"flex flex-col sm:flex-row gap-4\">\n                    <div class=\"flex-1\">\n                        <input type=\"radio\" id=\"dias-uteis\" name=\"tipo-contagem\" value=\"uteis\" checked class=\"hidden peer\">\n                        <label for=\"dias-uteis\" class=\"block w-full text-center p-4 border border-gray-300 rounded-lg cursor-pointer peer-checked:border-blue-600 peer-checked:bg-blue-50 peer-checked:text-blue-700 transition hover:bg-gray-50\">\n                            <span class=\"font-semibold\">Dias \u00dateis<\/span>\n                            <span class=\"block text-xs\">Exclui fins de semana e feriados.<\/span>\n                        <\/label>\n                    <\/div>\n                    <div class=\"flex-1\">\n                        <input type=\"radio\" id=\"dias-corridos\" name=\"tipo-contagem\" value=\"corridos\" class=\"hidden peer\">\n                        <label for=\"dias-corridos\" class=\"block w-full text-center p-4 border border-gray-300 rounded-lg cursor-pointer peer-checked:border-blue-600 peer-checked:bg-blue-50 peer-checked:text-blue-700 transition hover:bg-gray-50\">\n                            <span class=\"font-semibold\">Dias Corridos<\/span>\n                             <span class=\"block text-xs\">Inclui todos os dias.<\/span>\n                        <\/label>\n                    <\/div>\n                <\/div>\n            <\/fieldset>\n            \n            <!-- Feriados Personalizados -->\n            <div>\n                <label for=\"custom-holidays\" class=\"block text-sm font-medium text-gray-700 mb-1\">Feriados Locais ou Pontos Facultativos (Opcional)<\/label>\n                <textarea id=\"custom-holidays\" name=\"custom-holidays\" rows=\"3\" class=\"w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition\" placeholder=\"Adicione datas no formato AAAA-MM-DD, uma por linha.\"><\/textarea>\n            <\/div>\n\n            <!-- Bot\u00e3o de Calcular -->\n            <button type=\"submit\" class=\"w-full bg-blue-600 text-white font-bold py-3 px-4 rounded-lg hover:bg-blue-700 focus:outline-none focus:ring-4 focus:ring-blue-300 transition-all duration-300 ease-in-out shadow-md hover:shadow-lg\">\n                Calcular Prazo Final\n            <\/button>\n        <\/form>\n\n        <!-- \u00c1rea de Resultado -->\n        <div id=\"result-container\" class=\"mt-8 pt-6 border-t border-gray-200 hidden\">\n            <h2 class=\"text-xl font-bold text-gray-800 mb-4\">Resultado do C\u00e1lculo<\/h2>\n            <div class=\"bg-gray-100 p-6 rounded-lg space-y-4\">\n                <div>\n                    <p class=\"text-sm text-gray-600\">O prazo final para o ato processual \u00e9:<\/p>\n                    <p id=\"final-date\" class=\"text-2xl font-bold text-blue-700\"><\/p>\n                <\/div>\n                <div id=\"calculation-details\">\n                    <h3 class=\"text-sm font-semibold text-gray-700\">Mem\u00f3ria de C\u00e1lculo:<\/h3>\n                    <ul class=\"list-disc list-inside text-sm text-gray-600 space-y-1 mt-2\">\n                        <li id=\"detail-start\"><\/li>\n                        <li id=\"detail-prazo\"><\/li>\n                        <li id=\"detail-tipo\"><\/li>\n                        <li id=\"detail-inicio-contagem\"><\/li>\n                        <li id=\"detail-fim-bruto\"><\/li>\n                        <li id=\"detail-prorrogacao\" class=\"hidden\"><\/li>\n                    <\/ul>\n                <\/div>\n            <\/div>\n        <\/div>\n\n    <\/div>\n\n    <script>\n        \/\/ --- L\u00d3GICA DA CALCULADORA ---\n\n        const form = document.getElementById('prazo-form');\n        const resultContainer = document.getElementById('result-container');\n\n        \/\/ Fun\u00e7\u00e3o para calcular o domingo de P\u00e1scoa (algoritmo de Gauss)\n        function getEaster(year) {\n            const a = year % 19;\n            const b = Math.floor(year \/ 100);\n            const c = year % 100;\n            const d = Math.floor(b \/ 4);\n            const e = b % 4;\n            const f = Math.floor((b + 8) \/ 25);\n            const g = Math.floor((b - f + 1) \/ 3);\n            const h = (19 * a + b - d - g + 15) % 30;\n            const i = Math.floor(c \/ 4);\n            const k = c % 4;\n            const l = (32 + 2 * e + 2 * i - h - k) % 7;\n            const m = Math.floor((a + 11 * h + 22 * l) \/ 451);\n            const month = Math.floor((h + l - 7 * m + 114) \/ 31);\n            const day = ((h + l - 7 * m + 114) % 31) + 1;\n            return new Date(year, month - 1, day);\n        }\n\n        \/\/ Fun\u00e7\u00e3o para obter a lista de feriados nacionais para um determinado ano\n        function getNationalHolidays(year) {\n            const easter = getEaster(year);\n            const holidays = [\n                \/\/ Feriados Fixos\n                { date: `${year}-01-01`, name: 'Confraterniza\u00e7\u00e3o Universal' },\n                { date: `${year}-04-21`, name: 'Tiradentes' },\n                { date: `${year}-05-01`, name: 'Dia do Trabalho' },\n                { date: `${year}-09-07`, name: 'Independ\u00eancia do Brasil' },\n                { date: `${year}-10-12`, name: 'Nossa Senhora Aparecida' },\n                { date: `${year}-11-02`, name: 'Finados' },\n                { date: `${year}-11-15`, name: 'Proclama\u00e7\u00e3o da Rep\u00fablica' },\n                { date: `${year}-12-25`, name: 'Natal' },\n            ];\n\n            \/\/ Feriados M\u00f3veis baseados na P\u00e1scoa\n            const carnival = new Date(easter);\n            carnival.setDate(easter.getDate() - 47);\n            holidays.push({ date: carnival.toISOString().split('T')[0], name: 'Carnaval' });\n\n            const goodFriday = new Date(easter);\n            goodFriday.setDate(easter.getDate() - 2);\n            holidays.push({ date: goodFriday.toISOString().split('T')[0], name: 'Sexta-feira Santa' });\n            \n            const corpusChristi = new Date(easter);\n            corpusChristi.setDate(easter.getDate() + 60);\n            holidays.push({ date: corpusChristi.toISOString().split('T')[0], name: 'Corpus Christi' });\n\n            return holidays;\n        }\n        \n        \/\/ Normaliza a data para evitar problemas de fuso hor\u00e1rio\n        function normalizeDate(dateString) {\n            const [year, month, day] = dateString.split('-').map(Number);\n            return new Date(year, month - 1, day);\n        }\n\n        form.addEventListener('submit', function(event) {\n            event.preventDefault();\n\n            \/\/ Obter valores do formul\u00e1rio\n            const startDateInput = document.getElementById('start-date').value;\n            const prazoDias = parseInt(document.getElementById('prazo-dias').value, 10);\n            const tipoContagem = document.querySelector('input[name=\"tipo-contagem\"]:checked').value;\n            const customHolidaysInput = document.getElementById('custom-holidays').value;\n            \n            if (!startDateInput || isNaN(prazoDias)) {\n                alert('Por favor, preencha a data de in\u00edcio e o prazo em dias.');\n                return;\n            }\n\n            \/\/ Processar feriados personalizados\n            const customHolidays = customHolidaysInput.split('\\n')\n                .map(line => line.trim())\n                .filter(line => line.match(\/^\\d{4}-\\d{2}-\\d{2}$\/))\n                .map(dateStr => ({ date: dateStr, name: 'Feriado\/Ponto Facultativo Local' }));\n\n            \/\/ --- L\u00d3GICA DE C\u00c1LCULO DO PRAZO ---\n            \n            \/\/ Conforme Art. 66 da Lei 9.784\/99, exclui-se o dia do come\u00e7o.\n            let currentDate = normalizeDate(startDateInput);\n            currentDate.setDate(currentDate.getDate() + 1);\n            \n            const inicioContagemDate = new Date(currentDate.getTime());\n\n            let diasContados = 0;\n            let holidaysInRange = new Set();\n            \n            \/\/ Combina feriados nacionais e personalizados\n            const allHolidays = [...getNationalHolidays(currentDate.getFullYear()), ...customHolidays];\n            \/\/ Se o prazo ultrapassar o ano, adiciona os feriados do pr\u00f3ximo ano tamb\u00e9m\n            if(normalizeDate(startDateInput).getFullYear() !== new Date(currentDate.getTime() + prazoDias * 24 * 60 * 60 * 1000).getFullYear()) {\n                 allHolidays.push(...getNationalHolidays(currentDate.getFullYear() + 1));\n            }\n\n            const holidayMap = new Map(allHolidays.map(h => [h.date, h.name]));\n\n            const isBusinessDay = (date) => {\n                const dayOfWeek = date.getDay();\n                const dateStr = date.toISOString().split('T')[0];\n                \/\/ 0 = Domingo, 6 = S\u00e1bado\n                return dayOfWeek !== 0 && dayOfWeek !== 6 && !holidayMap.has(dateStr);\n            };\n\n            while (diasContados < prazoDias) {\n                if (tipoContagem === 'uteis') {\n                    if (isBusinessDay(currentDate)) {\n                        diasContados++;\n                    }\n                } else { \/\/ dias corridos\n                    diasContados++;\n                }\n\n                \/\/ Se ainda n\u00e3o chegamos ao fim, avan\u00e7amos para o pr\u00f3ximo dia\n                if (diasContados < prazoDias) {\n                    currentDate.setDate(currentDate.getDate() + 1);\n                }\n            }\n            \n            const fimBrutoDate = new Date(currentDate.getTime());\n            let prorrogacaoInfo = '';\n\n            \/\/ Conforme \u00a7 1\u00ba do Art. 66, prorroga-se o vencimento que cair em dia n\u00e3o \u00fatil\n            while (!isBusinessDay(currentDate)) {\n                const dayOfWeek = currentDate.getDay();\n                const dateStr = currentDate.toISOString().split('T')[0];\n                let reason = '';\n                if (dayOfWeek === 0) reason = 'Domingo';\n                else if (dayOfWeek === 6) reason = 'S\u00e1bado';\n                else if (holidayMap.has(dateStr)) reason = `Feriado (${holidayMap.get(dateStr)})`;\n                \n                prorrogacaoInfo = `Prazo final prorrogado pois ${formatDate(currentDate)} (${reason}) n\u00e3o \u00e9 um dia \u00fatil.`;\n                currentDate.setDate(currentDate.getDate() + 1);\n            }\n            \n            const finalDate = currentDate;\n\n            \/\/ --- EXIBIR RESULTADOS ---\n            displayResults({\n                startDateInput,\n                prazoDias,\n                tipoContagem,\n                inicioContagemDate,\n                fimBrutoDate,\n                finalDate,\n                prorrogacaoInfo\n            });\n        });\n\n        function formatDate(date) {\n            return date.toLocaleDateString('pt-BR', {\n                weekday: 'long',\n                year: 'numeric',\n                month: 'long',\n                day: 'numeric',\n            });\n        }\n        \n        function displayResults(data) {\n            document.getElementById('final-date').textContent = formatDate(data.finalDate);\n            \n            \/\/ Detalhes do c\u00e1lculo\n            document.getElementById('detail-start').textContent = `Data da ci\u00eancia: ${formatDate(normalizeDate(data.startDateInput))}`;\n            document.getElementById('detail-prazo').textContent = `Prazo: ${data.prazoDias} dia(s)`;\n            document.getElementById('detail-tipo').textContent = `Tipo de contagem: ${data.tipoContagem === 'uteis' ? 'Dias \u00dateis' : 'Dias Corridos'}`;\n            document.getElementById('detail-inicio-contagem').textContent = `In\u00edcio da contagem (1\u00ba dia): ${formatDate(data.inicioContagemDate)}`;\n            document.getElementById('detail-fim-bruto').textContent = `Data final (antes da prorroga\u00e7\u00e3o): ${formatDate(data.fimBrutoDate)}`;\n\n            const prorrogacaoEl = document.getElementById('detail-prorrogacao');\n            if (data.prorrogacaoInfo) {\n                prorrogacaoEl.textContent = data.prorrogacaoInfo;\n                prorrogacaoEl.classList.remove('hidden');\n            } else {\n                prorrogacaoEl.classList.add('hidden');\n            }\n\n            resultContainer.classList.remove('hidden');\n            resultContainer.scrollIntoView({ behavior: 'smooth' });\n        }\n\n    <\/script>\n<\/body>\n<\/html>\n\n","protected":false},"excerpt":{"rendered":"<p>Calculadora de Prazos Processuais Calculadora de Prazos Processuais Calcule prazos em dias \u00fateis ou corridos, conforme a Lei n\u00ba 9.784\/99. Data da Ci\u00eancia\/Intima\u00e7\u00e3o O dia em que a parte foi notificada oficialmente. Prazo em Dias A quantidade de dias do prazo. Tipo de Contagem do Prazo Dias \u00dateis Exclui fins de semana e feriados. Dias [&hellip;]<\/p>\n","protected":false},"author":285,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-667","page","type-page","status-publish","hentry"],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wp.ufpel.edu.br\/cppad\/wp-json\/wp\/v2\/pages\/667","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wp.ufpel.edu.br\/cppad\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/wp.ufpel.edu.br\/cppad\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/wp.ufpel.edu.br\/cppad\/wp-json\/wp\/v2\/users\/285"}],"replies":[{"embeddable":true,"href":"https:\/\/wp.ufpel.edu.br\/cppad\/wp-json\/wp\/v2\/comments?post=667"}],"version-history":[{"count":1,"href":"https:\/\/wp.ufpel.edu.br\/cppad\/wp-json\/wp\/v2\/pages\/667\/revisions"}],"predecessor-version":[{"id":669,"href":"https:\/\/wp.ufpel.edu.br\/cppad\/wp-json\/wp\/v2\/pages\/667\/revisions\/669"}],"wp:attachment":[{"href":"https:\/\/wp.ufpel.edu.br\/cppad\/wp-json\/wp\/v2\/media?parent=667"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}