caelum-stella icon indicating copy to clipboard operation
caelum-stella copied to clipboard

Calcular e listar os feriados brasileiros

Open mariofts opened this issue 10 years ago • 12 comments

Algum projeto para identificar e calcular os feriados nacionais, municipais e estaduais.

Algumas datas são fixas, como Natal, algumas precisam ser calculadas, como carnaval.

Deve permitir extensão simples, para incluir novos feriados sem necessidade de recompilar tudo.

mariofts avatar Oct 17 '14 16:10 mariofts

Parece interessante! Irei dar uma estudada nas soluções.

erickrar avatar Oct 21 '14 17:10 erickrar

Seria muito boa essa funcionalidade!!!

Atualmente estou utilizando um framework chamado jollyday mas é um projeto que pelo visto está descontinuado e tem poucos feriados municipais e estaduais mapeados nele ... além de não ter suporte a nova api de datas do Java 8, ficando restrito meu projeto a usar o Joda Time ou a antiga api.

http://jollyday.sourceforge.net/ https://github.com/Nephtys/jollyday/blob/master/src/main/resources/holidays/Holidays_br.xml

Acho que esse projeto pode ajudar vocês a começarem algo.

peruzzo avatar Oct 21 '14 17:10 peruzzo

@peruzzo Só me assusta o tamanho e a quantidade de XML's, mas pelo que vi essa é a API mais famosinha.

Trabalhei pouco com datas, nunca usei nada além do Calendar. Se tiverem alguma recomendação para uso(calendar mesmo, joda-time etc), posso começar essa semana a trabalhar nisso.

erickrar avatar Oct 27 '14 23:10 erickrar

:+1:

renatoargh avatar Oct 30 '14 20:10 renatoargh

@mariofts Fiz um pull request apenas para ver se está indo no caminho certo. um exemplo de uso:

int ano = 2017;
    System.out.println("Lista de feriados nacionais do ano de " +ano+ ":");
            for(Feriado f: FeriadosNacionais.doAno(ano)){
                System.out.println(f);
            }

            for(Feriado f: new FeriadoControle().feriadosNacionais(2020).feriadosEstaduais(Lugares.RJ).listarFeriados()){
                System.out.println(f);
            }

Falta adicionar muita coisa(Exceções, métodos funcionais etc) e eu to pensando em trocar o nome do feriado por key, e o nome ficaria em um arquivo .properties.

Só gostaria de um feedback mesmo para saber se estou indo no caminho certo. :)

erickrar avatar Nov 06 '14 17:11 erickrar

Oi @erickrar, vo dar uma olhada no seu código e te dou um feedback sim.

Vou pegar alguns exemplos de outras linguagens pra ver como resolvem isso, talvez possamos usar algumas idéias pra deixar mais simples de usar.

Abraços

mariofts avatar Nov 18 '14 18:11 mariofts

Cara, a API mais simples e completa que eu conheço é desse site aqui (devolve em XML):

http://www.calendario.com.br/api_feriados_municipais_estaduais_nacionais.php

Tem os feriados nacionais, estaduais e municipais do Brasil. Eu gosto bastante.

valdineyap avatar Nov 30 '16 04:11 valdineyap

Hey @mariofts Você pode explicar melhor a sua ideia? Fiquei confuso pois ela parece muito com o stella-feriado.

angeliski avatar Sep 24 '18 16:09 angeliski

@angeliski foi esta issue q deu origem ao Stela-feriado 🙂.

Acho que vocês poderia olhar as apis feitas em java e tentar trazer pro século atual, já tem muita coisa mas tudo muito velho, verboso, configurado em xml, sem suporte a Java.time ou lambda. Acho q essa era a idéia

mariofts avatar Sep 25 '18 10:09 mariofts

Agora tudo faz sentido @mariofts! hasuhasuhsa Realmente, as questões de feriados são complexas. Vou deixar essa Issue aberta até conseguir abrir uma sobre a atualização do stella-feriado. Muito obrigado pelo apoio

angeliski avatar Sep 25 '18 11:09 angeliski

Cara, a API mais simples e completa que eu conheço é desse site aqui (devolve em XML):

http://www.calendario.com.br/api_feriados_municipais_estaduais_nacionais.php

Tem os feriados nacionais, estaduais e municipais do Brasil. Eu gosto bastante.

Acho surpreendente que ninguém comentou nisso aqui. Essa API dos caras do calendario.com.br é sensacionível.

edgarfroes avatar Oct 31 '18 21:10 edgarfroes

Sem utilizar API, apenas cálculo matemático e a biblioteca Moment.js

function easterDay(y) {
    var c = Math.floor(y / 100);
    var n = y - 19 * Math.floor(y / 19);
    var k = Math.floor((c - 17) / 25);
    var i = c - Math.floor(c / 4) - Math.floor((c - k) / 3) + 19 * n + 15;
    i = i - 30 * Math.floor((i / 30));
    i = i - Math.floor(i / 28) * (1 - Math.floor(i / 28) * Math.floor(29 / (i + 1)) * Math.floor((21 - n) / 11));
    var j = y + Math.floor(y / 4) + i + 2 - c + Math.floor(c / 4);
    j = j - 7 * Math.floor(j / 7);
    var l = i - j;
    var m = 3 + Math.floor((l + 40) / 44);
    var d = l + 28 - 31 * Math.floor(m / 4);
    return moment([y, (m - 1), d]);
};

function getHolidaysBr(y) {
    var anoNovo = moment("01/01/"+y,"DD/MM/YYYY");
    var carnaval1 = easterDay(y).add(-48, "d");
    var carnaval2 = easterDay(y).add(-47, "d");
    var paixaoCristo = easterDay(y).add(-2, "d");
    var pascoa = easterDay(y);
    var tiradentes = moment("21/04/"+y,"DD/MM/YYYY");
    var corpusChristi =  easterDay(y).add(60, "d");
    var diaTrabalho = moment("01/05/"+y,"DD/MM/YYYY");
    var diaIndependencia = moment("07/09/"+y,"DD/MM/YYYY");
    var nossaSenhora = moment("12/10/"+y,"DD/MM/YYYY");
    var finados = moment("02/11/"+y,"DD/MM/YYYY");
    var proclamaRepublica = moment("15/11/"+y,"DD/MM/YYYY");
    var natal = moment("25/12/"+y,"DD/MM/YYYY");
    return [
        {m: anoNovo, dia: "Ano Novo", d: anoNovo.format("DD/MM/YYYY") },
        {m: carnaval1, dia: "Carnaval", d: carnaval1.format("DD/MM/YYYY") },
        {m: carnaval2, dia: "Carnaval", d: carnaval2.format("DD/MM/YYYY") },
        {m: paixaoCristo, dia: "Paix\u00E3o de Cristo", d: paixaoCristo.format("DD/MM/YYYY") },
        {m: pascoa, dia: "P\u00E1scoa", d: pascoa.format("DD/MM/YYYY") },
        {m: tiradentes, dia: "Tiradentes", d: tiradentes.format("DD/MM/YYYY") },
        {m: corpusChristi, dia: "Corpus Christi", d: corpusChristi.format("DD/MM/YYYY") },
        {m: diaTrabalho, dia: "Dia do Trabalho", d: diaTrabalho.format("DD/MM/YYYY") },
        {m: diaIndependencia, dia: "Dia da Independ\u00EAncia do Brasil", d: diaIndependencia.format("DD/MM/YYYY") },
        {m: nossaSenhora, dia: "Nossa Senhora Aparecida", d: nossaSenhora.format("DD/MM/YYYY") },
        {m: finados, dia: "Finados", d: finados.format("DD/MM/YYYY") },
        {m: proclamaRepublica, dia: "Proclama\u00E7\u00E3o da Rep\u00FAblica", d: proclamaRepublica.format("DD/MM/YYYY") },
        {m: natal, dia: "Natal", d: natal.format("DD/MM/YYYY") }
    ];
}
function getHolidayBetweenDates(date, dateTo){
    var dateStart = moment(date,"YYYY-MM-DD");
    var dateEnd = moment(dateTo,"YYYY-MM-DD");
    var datesHoliday = [];

    while (dateEnd > dateStart || dateStart.format("Y") === dateEnd.format("Y")) {
       $.merge(datesHoliday,getHolidaysBr(parseInt(dateStart.format("YYYY"))));
       dateStart.add(1,"year");
    }
    return datesHoliday;
}

var hollidays = getHolidayBetweenDates("2016-01-01","2020-01-01");

opedrosoares avatar Dec 28 '20 14:12 opedrosoares