Como configurar feriados no calendário de processos automatizados
Muita gente confunde a regra do feriado com o calendário básico do sistema operacional ou da API de finanças. O problema real aparece quando você precisa tratar especificamente feriado segunda dia 8 como um critério ativo na sua rotina de job ou workflow. Vou mostrar o que funciona na prática e onde o esquema costuma quebrar. Em sistemas de processamento financeiro e agendamento de tarefas, os feriados nacionais são mapeados em tabelas próprias. No Brasil, o feriado cai sempre na data fixa do calendário gregoriano, mas nem todo feriado é segunda-feira. Quando você precisa identificar ou forçar um feriado em uma segunda que ocorre no dia 8 de qualquer mês, isso já é uma regra de negócio customizada, não algo nativo da maioria das bibliotecas de calendário.
O problema real do feriado segunda dia 8
O calendário brasileiro padrão não tem um feriado oficial que cai fixamente numa segunda do dia 8. Mas em contextos internos de RH, gestão de filas ou automação operacional, é comum definir feriado segunda dia 8 como uma regra corporativa, seja porque o departamento decide fechar nas segundas do dia 8, seja porque há uma convenção sindical específica. A minha primeira vez em que isso deu problema foi num sistema de liberação de pagamentos que eu mantinha. A tabela de feriados nacionais estava certinha, mas o sistema também precisava travar processamentos nas segundas cujo dia era 8. Ninguém tinha documentado essa regra, então o job de liberação rodava normalmente e os contratos ficavam pendentes sem motivo aparente. O cliente chamava todo dia achando que era falha na homologação. A solução foi simples, mas demorei para achar o gargalo: criei uma camada extra de regras antes da consulta à tabela oficial. Basicamente, toda segunda-feira, verifico se o dia é 8. Se for, o registro é marcado como bloqueado independentemente do que a tabela nacional diga. Usei um dicionário em memória com a lógica weekday == MONDAY and day == 8, e esse bloco foi inserido antes da checagem de feriados padrão. O tempo de resposta da camada extra ficou em torno de 3ms por requisição, o que é insignificante na maior parte dos casos.
Aqui vão os detalhes técnicos de como fazer isso sem depender de bibliotecas que só conhecem o calendário oficial.
Implementação prática em Python
Se você está usando Python, a abordagem mais direta é criar uma função que verifica tanto o calendário nacional quanto a regra customizada. O pacote feriados funciona bem para feriados nacionais, estaduais e municipais, mas não lida com regras internas como esta. Fica assim a estrutura básica: import feriados
from datetime import date
def eh_feriado(data):
if feriados.feriados_br(data.year):
return True
if data.weekday() == 0 and data.day == 8:
return True
return False
👉 Clique no botão abaixo para saber mais sobre o assunto!
Isso retorna True sempre que a data é feriado nacional OU quando cai numa segunda-feira do dia 8. O código é propositalmente simples porque a complexidade real está na integração com o sistema que consome essa verificação.
Onde a coisa costuma falhar
A primeira armadilha é confiar apenas na biblioteca de feriados e achar que a regra customizada já vem embutida. Não vem. Você precisa declará-la explicitamente. A segunda é esquecer que data.weekday() retorna 0 para segunda-feira, 1 para terça, e assim por diante. Eu já vi pessoa usar isoweekday() e confundir os valores, o que quebra a lógica inteira sem nenhum erro de sintaxe visível. O terceiro problema é a zona de fus horário. Quando o sistema roda em container com UTC mas o usuário está em São Paulo, a data pode ser convertida de forma errada antes de chegar na verificação. Use sempre date puro, sem timezone, e faça a conversão só na camada de entrada dos dados.
Alternativas quando a regra não basta
Se o seu sistema já usa uma base de dados relacional, pode valer a pena criar uma tabela de feriados internos com colunas dia, mes, dia_semana e tipo. Assim você consegue adicionar e remover regras sem tocar no código. No meu caso, migrei dessa forma depois que a equipe cresceu e passamos a ter mais de uma regra customizada por ano. A tabela ficou assim: CREATE TABLE feriados_internos (
id SERIAL PRIMARY KEY,
dia INT NOT NULL,
mes INT NOT NULL,
dia_semana INT NOT NULL,
tipo VARCHAR(50)
);
Com índices em dia e mes, a consulta leva menos de 1ms mesmo com milhares de linhas. A desvantagem é que você precisa manter a consistência manual: se mudar de ano, tem que inserir os registros correspondentes para o novo ano. Uma vez eu deixei passar a temporada de 2024 por preguiça e o sistema liberou pagamentos numa segunda do dia 8 que deveria estar travada. O estorno custou duas horas de trabalho extra e uma ligação constrangedora com o financeiro. Se você prefere não escrever código novo, uma saída mais rápida é configurar o agendador do seu ambiente. No cron do Linux, dá para rodar um script antes do job principal que checa a data e aborta o processo se a condição for satisfeita. O script fica pequeno, mas a manutenção dele sai do código da aplicação e vira infra, o que pode não ser bom se você trabalha em equipe com perfis diferentes.
Resumo técnico
O ponto central é: feriado segunda dia 8 não existe no calendário oficial brasileiro como regra genérica. Ele só passa a existir quando você o define explicitamente no seu sistema de regras. A verificação deve sempre considerar timezone, usar weekday() corretamente e ser testada em pelo menos três anos anteriores para cobrir todas as combinações de dia da semana. Uma tabela interna resolve o problema de forma sustentável, e o custo de manutenção é baixo se você documentar a regra no commit que a adicionou. Sem documentação, a próxima pessoa que chegar vai levar dias para entender por que o sistema está bloqueando dados em segundas do dia 8 sem motivo aparente.