Somar dias úteis a partir de uma data (ruby)

Hoje tive que fazer um código interessante. Dada uma data e um número inteiro, deveria somá-lo para uma nova data, porém deveria considerar apenas dias úteis.

Ex: Supor que hoje é Segunda-feira (01/01/2019) e o número inteiro é 7. Ao somar a data deve ser 10/01/2019, pois desconsideramos o dia 6 e 7. Como trabalho com ruby, a gente acaba ficando preguiçoso, no sentido de “deixa eu ver se tem uma gem pra isso”. E tem. Mas trocando idéia com uns amigos, ficamos brincando com o algoritmo e apareceu uma solução bem simples e boa.

Além disso eu pude aprender sobre Enumerator::Lazy que eu não conhecia e achei bem legal. A idéia era implementar para poder usar os métodos next, take, peek e etc.

Você pode conferir nesse gist aqui ou no código abaixo.

class Integer 
  def business_days_from(date = Date.today)
    days = self
    (date..(date + (2**(0.size * 8 -2) -1))).lazy.reject { |x| x.cwday == 7 || x.cwday == 6 }.drop(days).first
  end
end

Note que eu inseri o método dentro da classe Integer. Caso você não trabalhe com Ruby, isso serve para poder fazer a chamada da seguinte forma

5.business_days_from(someDate)

2.6.0 (main):0 > someDate = Date.new(2019,1,1)
=> Tue, 01 Jan 2019
2.6.0 (main):0 > 7.business_days_from(someDate)
=> Thu, 10 Jan 2019

Achou maneiro o código ou tem uma sugestão, comenta lá no gist para os outros verem.

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *