Pitch: Dia útil no PowerShell: as decisões por trás de um módulo pequeno
Agendadores (o do Windows, o cron) sabem "todo dia 5", mas não "3º dia útil do mês" nem "último dia útil". No mercado financeiro, onde trabalho, muita rotina vive aí. Escrevemos na Elekto um módulo PowerShell para isso, o ElektoCalendarPosh (MIT), e quero contar algumas decisões, porque o problema parece trivial e não é.
Feriados em arquivo texto
Uma data yyyy-MM-dd por linha, com comentários e descrição. Sem banco, sem API. Cada um mantém o seu (nacional, municipal, de bolsa) e versiona junto com os scripts. Linha mal formada é erro que aponta arquivo e linha: um erro de digitação nunca derruba um feriado em silêncio.
Calendários que tenham semanas que considerem todos os dias úteis (escalara 7x0?) ou alguns dias do meio da semana não úteis (4x3?) são suportados.
Não presumir
Um calendário só responde pelo período que cobre. Perguntar se 2100-03-02 é dia útil, num arquivo que vai até 2099, é erro. A alternativa (tratar como dia útil) é o tipo de bug que aparece num feriado, anos depois.
Vários calendários
-Calendar aceita vários arquivos; o dia é útil só se for útil em todos. É o caso de quem liquida no Brasil e nos EUA.
Contagem
Get-WorkdayDelta usa a convenção financeira usual: inclui o primeiro dia e exclui o último. Assim ela é a inversa de Add-Workday. Somar e contar dias úteis é aritmética, não um laço dia a dia.
O caso de uso
Não rodar algo, cegamente, todo dia, mas apenas em certos dias úteis.
Set-WorkdayCalendar C:\calendarios\br.txt
if ((Get-NthWorkdayInMonth 3) -ne (Get-Date).Date) { exit 0 }
A tarefa roda todo dia e só trabalha no 3º dia útil, por exemplo. Com -1, no último.
Para instalar da galeria:
Install-Module ElektoCalendarPosh
Críticas e sugestões, por favor, aqui ou nas issues.