Agregar Días Hábiles


Hace un par de meses, en el trabajo se requirio un calendario que al llenarlo automáticamente llenara otro calendario, sumando 45 días habiles a la fecha del primero. Todo esto sería mostrado en una página web, por qué la fecha del segundo calendario debía cumplir la regla de los 45 días por default, pero también debía estar abierto a que se editara independientemente; el sistema esta con servlets planos y JSP así que javascript era la opción. Dada que dicha funcionalidad era para "ayer" lo primero que hice fue buscar algún código que ya lo hiciera en lugar de hacerlo yo. Esto fue lo que encontre:

Number.prototype.mod = function(n) {
return ((this%n)+n)%n;
}
Date.prototype.addBusDays = function(dd) {
var wks = Math.floor(dd/5);
var dys = dd.mod(5);
var dy = this.getDay();
if (dy === 6 && dys > -1) {
if (dys === 0) {dys-=2; dy+=2;}
dys++; dy -= 6;}
if (dy === 0 && dys < 1) {
if (dys === 0) {dys+=2; dy-=2;}
dys--; dy += 6;}
if (dy + dys > 5) dys += 2;
if (dy + dys < 1) dys -= 2;
if(this.getDay()===0 && dd.mod(5)===0){
dys-=3;
}
this.setDate(this.getDate()+wks*7+dys);
}

Lo único que hice fue realizar unas pruebas y a agregar ese último if, ya que tenía problemas cuando el día era Domingo y sumabas multiplos de cinco a la fecha.

Ya entregado el requerimiento, me di tiempo para arreglar el código, lo que tenía planeado era revisarlo y refactorizarlo. Lo primero que note fue que (this%n)+n)%n) no tenía sentido ya que (((x mod n) + n) mod n) es lo mismo que (x mod n). Después de esto, y de contar el número de condiciones en el código, cambie de plan y decidí hacer uno propio. Un rato después termine con esto:


Date.prototype.addBizDays = function(n){
var day = this.getDay();
var d = new Date();
var wkn = (n < 0 ? -2 : 2);
d.setDate(this.getDate()+n+(day === 6 ? 2 : +!day) +(Math.floor((Math.abs(n)/5))*wkn));
return d;
}


Lo único que rescate del código anterior fué el Date.prototype que te permite usar la función de la siguente manera

var date = new Date();
date.addBizDays(10);

La suma, o resta, de días esta descompuesta de la siguiente manera:

n número de días hábiles requeridos.

(day ===6 ? 2:+!day) Si el día es Lunes, Martes, Miercoles, Jueves o Viernes no se suman ningún día adicional. Si el día es Sábado se suman dos días, es decir se recorre hasta el Lunes. Si es Domingo se agrega un día.

(Math.floor((Math.abs(n)/5))*wkn) Agregar los fines de semana que se atraviesen, es decir suma o resta dos días más por cada fin de semana que se atraviese.

Hasta el momento la función se ha comportado bien, comentarios y refactorizaciones son bienvenidos.