Ciao a tutt*

Ho scritto un codice con l'obiettivo di calcolare la data esatta dopo n giorni di attesa,
Ho un problema però con il calcolo dei giorni festivi, infatti pur avendo inserito il calendario dei festivi, mi calcola solo escludendo i week end

allego qui il codice

<tr class="text-dark table-dark table-striped"><td style="background-color: #FFBFC1; font-size: 1.1rem; font-weight: bold; text-align: center" colspan="3"> Flussi di lavoro pre-consegna</td></tr>
<tr class="text-primary table-info">
</tr>
<td style="font-weight: bold; text-align: center; background-color: #ffe6cc" ><b>Seleziona la Data di consegna prevista</b></td>
<td style="font-weight: bold; text-align: center; background-color: #ffe6cc"><input type="date" style="text-align: center" id="startDate" name="startDate"></td> <td style="font-weight: bold; text-align: center; background-color: #ffe6cc"><button onclick="calculateDates('startDate', ['datePlus14', 'datePlus30', 'datePlus60'], [14, 30, 60])">Calcola date</button><button onclick="clearResults(['datePlus14', 'datePlus30', 'datePlus60'], 'startDate')">Cancella date</button></td>
</tr>
<tr>
<th style="font-weight: bold; text-align: left; background-color: #FFEDEE" width="75%"> + 14 GIORNI sarà trascorsa il: </td>
<td style="text-align: center; background-color: #FFEDEE""> <input type="text" style="width: 200px; font-size: 1.1rem; text-align: center" id="datePlus14" readonly> </td>
<td style="text-align: center; background-color: #FFEDEE"" ><button onclick="copyToClipboard('datePlus14')">Copia</button></td>

</tr>
<tr>
<<th style="font-weight: bold; text-align: left; background-color: #FFEDEE" width="75%"> + 30 GIORNI] sarà trascorsa il: </td>
<td style="text-align: center; background-color: #FFEDEE"> <input type="text" style="width: 200px; font-size: 1.1rem; text-align: center" id="datePlus30" readonly> </td>
<td style="text-align: center; background-color: #FFEDEE" ><button onclick="copyToClipboard('datePlus30')">Copia</button></td>
</tr>



<tr class="text-dark table-dark table-striped"><td style="background-color: #FDBE71; font-size: 1.1rem; font-weight: bold; text-align: center" colspan="3"> festivi calcolo </td></tr>
<tr class="text-primary table-info">
<td style="font-weight: bold; text-align: center; background-color: #F9F9F9" ><b>Seleziona la Data di consegna o la data di consegna prevista:</b></td>
<td style="font-weight: bold; text-align: center; background-color: #F9F9F9"><input type="date" style="text-align: center" id="startDate3" name="startDate3"></td>
<td style="font-weight: bold; text-align: center; background-color: #F9F9F9"><button onclick="calculateBusinessDays('startDate3', ['businessDays2', 'businessDays4', 'businessDays6'], [2, 4, 6])">Calcola date</button><button onclick="clearResults(['businessDays2', 'businessDays4', 'businessDays6'], 'startDate3')">Cancella date</button></td>
</tr>

<tr>
<th style="font-weight: bold; text-align: left; background-color: #FFEFDB" width="75%">Consegna in un giorno + 2 gg lavorativi:</td>
<td style="text-align: center; background-color: #FFEFDB"> <input type="text" style="width: 200px; font-size: 1.1rem; text-align: center" id="businessDays2" readonly> </td>
<td style="text-align: center; background-color: #FFEFDB"><button onclick="copyToClipboard('businessDays2')">Copia</button></td>
</tr>
<tr>
<th style="font-weight: bold; text-align: left; background-color: #FFEFDB" width="75%">Consegna + 4 gg lavorativi:</b> </td>
<td style="text-align: center; background-color: #FFEFDB"> <input type="text" style="width: 200px; font-size: 1.1rem; text-align: center" id="businessDays4" readonly> </td>
<td style="text-align: center; background-color: #FFEFDB"><button onclick="copyToClipboard('businessDays4')">Copia</button></td>
</tr>
<tr>
<th style="font-weight: bold; text-align: left; background-color: #FFEFDB" width="75%">Consegna + 6 gg lavorativi:</b> </td>
<td style="text-align: center; background-color: #FFEFDB"> <input type="text" style="width: 200px; font-size: 1.1rem; text-align: center" id="businessDays6" readonly> </td>
<td style="text-align: center; background-color: #FFEFDB"><button onclick="copyToClipboard('businessDays6')">Copia</button></td>

</div>
</div>
</body>
<script>
function calculateDates(startDateId, resultIds, daysToAdd) {
var startDate = document.getElementById(startDateId).value;
if (!startDate) {
alert("Per favore inserisci una data valida.");
return;
}
var date = new Date(startDate);
if (isNaN(date.getTime())) {
alert("La data inserita non è valida.");
return;
}
resultIds.forEach(function(resultId, index) {
var newDate = addDays(date, daysToAdd[index]);
document.getElementById(resultId).value = formatDate(newDate);
});
}

function clearResults(resultIds, startDateId) {
resultIds.forEach(function(resultId) {
document.getElementById(resultId).value = '';
});
document.getElementById(startDateId).value = null; }

function calculateBusinessDays(startDateId, resultIds, daysToAdd) {
var startDate = document.getElementById(startDateId).value;
if (!startDate) {
alert("Per favore inserisci una data valida.");
return;
}
var date = new Date(startDate);
if (isNaN(date.getTime())) {
alert("La data inserita non è valida.");
return;
}
resultIds.forEach(function(resultId, index) {
var newDate = addBusinessDays(date, daysToAdd[index]);
document.getElementById(resultId).value = formatDate(newDate);
});
}

function calculateMixedDates(startDateId, calendarIds, calendarDays, businessDays) {
var startDate = document.getElementById(startDateId).value;
if (!startDate) {
alert("Per favore inserisci una data valida.");
return;
}
var date = new Date(startDate);
if (isNaN(date.getTime())) {
alert("La data inserita non è valida.");
return;
}
if (calendarIds.length) {
var newDate = addDays(date, calendarDays[0]);
document.getElementById(calendarIds[0]).value = formatDate(newDate);
}
if (businessDays.length) {
var newDate = addBusinessDays(date, businessDays[0]);
document.getElementById('businessDays25').value = formatDate(newDate);
}
}

function calculateCustomDays(startDateId, daysId, resultId) {
var startDate = document.getElementById(startDateId).value;
var days = parseInt(document.getElementById(daysId).value, 10);
if (!startDate || isNaN(days)) {
alert("Per favore inserisci una data e un numero di giorni valido.");
return;
}
var date = new Date(startDate);
if (isNaN(date.getTime())) {
alert("La data inserita non è valida.");
return;
}
var newDate = addDays(date, days);
document.getElementById(resultId).value = formatDate(newDate); }

function addDays(date, days) {
var result = new Date(date);
result.setDate(result.getDate() + days);
return result;
}

function addBusinessDays(startDate, days) {
var result = new Date(startDate);
var count = 0;
while (count < days) {
result.setDate(result.getDate() + 1);
if (result.getDay() !== 0 && result.getDay() !== 6 && !isHoliday(result)) {
count++;
}
}
return result;
}

function isHoliday(date) {
const holidays = ['1/1', '6/1', '25/4', '1/5', '2/6', '15/8', '1/11', '8/12', '25/12', '26/12'].map(d => new Date(date.getFullYear() + '/' + d));
return holidays.some(holiday => holiday.getTime() === date.getTime()); }

function formatDate(date) {
const options = { day: 'numeric', month: 'long', year: 'numeric' };
return date.toLocaleDateString('it-IT', options); }

function copyToClipboard(elementId) {
var copyText = document.getElementById(elementId);
copyText.select();
document.execCommand("copy");
}




function resetAllFields() {
document.querySelectorAll('input[type="text"], input[type="number"], input[type="date"]').forEach(input => {
input.value = '';
});
}
</script>

</body></html>


Scusatemi, spero di aver scritto tutto correttamente è il mio primo post
grazie