# == Configuração dos Feriados # # Os feriados são configurados através de arquivos YML que deverão estar na pasta feriados dentro da pasta config da sua aplicação. # # Você pode ver exemplos desses YML dentro do diretório samples/feriado. # class Feriado attr_accessor :dia attr_accessor :mes attr_accessor :nome # Construtor um feriado. # # Exemplo: # Feriado.new("nome", "01", "01") def initialize(nome, dia, mes) valida_dia(dia) valida_mes(mes) self.nome = nome self.dia = dia.to_i self.mes = mes.to_i end # Compara dois feriados. Dois feriados são iguais se acontecem na mesma data. def ==(outro_feriado) self.mes == outro_feriado.mes && self.dia == outro_feriado.dia end private def valida_dia(dia) raise FeriadoDiaInvalidoError unless (1..31).include?(dia.to_i) end def valida_mes(mes) raise FeriadoMesInvalidoError unless (1..12).include?(mes.to_i) end end class Date FERIADOS = [] FERIADOS_METODOS = [] # Retorna a true se a data for um feriado # # Exemplo: # data = Date.new(2007, 12, 25) # data.feriado? ==> true def feriado? return true if FERIADOS.include?(Feriado.new("novo_feriado", self.day, self.month)) FERIADOS_METODOS.each do |metodo| return true if self == send(metodo) end false end # Retorna a pascoa no ano da data atual # # Exemplo: # data = Date.new(2007, 12, 25) # data.pascoa ==> "2007-4-8" def pascoa g = self.year % 19 c = (self.year / 100).floor h = (c - ( c / 4 ).floor - ((8 * c) / 25).floor + 19 * g + 15) % 30 i = h - (h / 28).floor * (1 - (h / 28).floor * (29 / (h + 1)).floor * ((21 - g) / 11).floor) j = (self.year + (self.year/ 4).floor + i + 2 - c + (c / 4).floor) % 7 l = i - j month = 3 + ((l + 40) / 44).floor day = l + 28 - (31 * (month / 4 ).floor) Date.parse("#{self.year}-#{month}-#{day}") end # Retorna a corpus_christi no ano da data atual # # Exemplo: # data = Date.new(2007, 12, 25) # data.corpus_christi ==> "2007-06-07" def corpus_christi Date.parse((pascoa.to_time + 60.days).to_date.to_s) end end