let LAST_EXCEL = null; // { blob: Blob, filename: string }

// 🔧 Nomi ufficiali come da sheet "checklist" del Verbale di Istruttoria
// 👉 QUI devi mettere ESATTAMENTE i nomi che hai nella checklist Excel
const NOMI_FILE_CHECKLIST = {
  // Modulo domanda / Verbale
  modulo_richiesta: "01_Modulo_Richiesta.pdf",
  excel_verbale: "02_Verbale_Istruttoria.xlsx",
  privacy_policy: "03_Informativa_Privacy.pdf",

  // Documentazione punteggio (sezione punteggio)
  doc_ps_terr: "P01_Estratto_Carte_Tematiche_SIAS.pdf",
  doc_giovane: "P02_Documento_Eta_Anagrafica.pdf",
  doc_iap_cd: "P03_Autocertificazione_IAP_CD.pdf",
  doc_prima_partecipazione: "P04_Autocert_Prima_Partecipazione.pdf",
  doc_pst: "P05_Scheda_Relazione_PST.pdf",
  doc_invaso: "P06_Computo_Capacita_Invaso.pdf",
  doc_cantierabili: "P07_Autorizzazioni_Cantierabilita.pdf",

  // Allegati progetto – metti i nomi della checklist
  doc_identita: "A01_Documento_Identita.pdf",
  autorizzazione_proprietario: "A02_Autorizzazione_Proprietario.pdf",
  scheda_autovalutazione: "A03_Scheda_Autovalutazione.pdf",
  doc_convalida_punteggio: "A04_Convalida_Punteggio.pdf",
  relazione_agronomica: "A05_Relazione_Agronomica.pdf",
  computo_metrico: "A06_Computo_Metrico.pdf",
  planimetria_catastale: "A07_Planimetria_Catastale.pdf",
  disegni_opere: "A08_Disegni_Opere.pdf",
  perizia_congruita: "A09_Perizia_Congruita.pdf",
  valutazione_indipendente: "A10_Valutazione_Indipendente.pdf",
  analisi_prezzi: "A11_Analisi_Prezzi.pdf",
  contratto_professionista: "A12_Contratto_Professionista.pdf",
  autorizzazioni_pareri: "A13_Autorizzazioni_Pareri.pdf",
  contratti_affitto_comodato: "A14_Contratti_Affitto_Comodato.pdf",
  autocert_conoscenza_obblighi: "A15_Autocert_Conoscenza_Obblighi.pdf",
  autocert_iscrizioni_antimafia: "A16_Autocert_Iscrizioni_Antimafia.pdf",
  autocert_no_doppie_agevolazioni: "A17_Autocert_No_Doppie_Agevolazioni.pdf",
  cert_destinazione_urbanistica: "A18_Cert_Destinazione_Urbanistica.pdf",
  dich_no_altri_aiuti: "A19_Dichiarazione_No_Altri_Aiuti.pdf",

  // Extra per società
  atto_costitutivo_statuto: "S01_Atto_Costitutivo_Statuto.pdf",
  elenco_soci: "S02_Elenco_Soci.pdf",
  delibera_organo_competente: "S03_Delibera_Organo_Competente.pdf",
};


$(document).on("click", ".crea-files", async function () {
  var errori_totali = 0;
  var errori_sezione_anagrafica = check_sezione_anagrafica();
  var errori_sezione_dati_bancari = check_sezione_dati_bancari();
  var errori_sezione_localizzazione_investimento = check_sezione_localizzazione_investimento();
  var errori_sezione_tecnico_competente = check_sezione_tecnico_competente();
  var errori_sezione_piano_degli_investimenti = check_sezione_piano_degli_investimenti();
  var errori_sezione_allegati_progetto = check_sezione_allegati_progetto();
  var errori_sezione_punteggio = check_sezione_punteggio();
  var errori_sezione_privacy = check_sezione_privacy();
  var errori_firma = check_errori_firma();
  errori_totali = errori_sezione_anagrafica * 1 + errori_sezione_dati_bancari * 1 + errori_sezione_localizzazione_investimento * 1 + errori_sezione_tecnico_competente * 1 + errori_sezione_piano_degli_investimenti * 1 + errori_sezione_allegati_progetto * 1 + errori_sezione_punteggio * 1 + errori_sezione_privacy * 1 + errori_firma * 1;

  //errori_totali = 0;
  if (errori_totali == 0) {
    const partita_iva = $("#cuua").val();
    await crea_excel(partita_iva);
    await crea_zip_completo(partita_iva);

  }
  else {
    $('html, body').animate({
      scrollTop: $('.invalid-feedback:first').offset().top
    }, 500);
  }
});
function check_sezione_punteggio() {
  let errori = 0;
  let punti = 0;

  /* ===== Helpers UI ===== */
  function setInvalid($el, msg) {
    $el.addClass("is-invalid");
    if (!$el.next(".invalid-feedback").length) {
      $el.after(`<div class="invalid-feedback d-block">${msg}</div>`);
    } else {
      $el.next(".invalid-feedback").text(msg).removeClass("d-none").addClass("d-block");
    }
  }
  function clearInvalid($el) {
    $el.removeClass("is-invalid");
    $el.next(".invalid-feedback").addClass("d-none").removeClass("d-block").text("");
  }
  function setGroupInvalid($checks, msg, id) {
    if (!$checks.length) return;
    const $td = $checks.first().closest("td");
    let $err = $td.find(`#${id}`);
    if (!$err.length) {
      $err = $(`<div id="${id}" class="invalid-feedback d-block small"></div>`);
      $td.append($err);
    }
    $checks.addClass("is-invalid");
    $err.text(msg).removeClass("d-none").addClass("d-block");
  }
  function clearGroupInvalid($checks, id) {
    $checks.removeClass("is-invalid");
    $checks.first().closest("td").find(`#${id}`).addClass("d-none").removeClass("d-block").text("");
  }

  /* ===== 1) GRUPPI E PUNTEGGI ===== */

  // Principi territoriali (mutuamente esclusivi)
  (function () {
    const map = { "steppa-semiarido": 10, "temperato-caldo": 7, "temperato-umido": 5 };
    const $checks = $(`input[name='ps_terr[]']`);
    const $sel = $checks.filter(":checked");
    clearGroupInvalid($checks, "err_ps_terr");

    if ($sel.length > 1) {
      setGroupInvalid($checks, "Puoi selezionare una sola opzione per “Principi di selezione territoriali”.", "err_ps_terr");
      errori++;
    } else if ($sel.length === 1) {
      punti += map[$sel.val()] ?? 0;
    }
  })();

  // Caratteristiche soggetto richiedente (cumulabili)
  if ($(`input[name='sogg_char[]'][value='giovane']`).is(":checked")) punti += 5;
  if ($(`input[name='sogg_char[]'][value='iap-cd']`).is(":checked")) punti += 5;

  // Prima partecipazione (singolo)
  if ($(`input[name='prima_partecipazione']`).is(":checked")) punti += 10;

  // Dimensione economica PST (mutuamente esclusivi)
  (function () {
    const map = { "gt-80000": 10, "btw-40000-80000": 7, "lt-40000": 5 };
    const $checks = $(`input[name='pst_dim']`);
    const $sel = $checks.filter(":checked");
    clearGroupInvalid($checks, "err_pst_dim");

    if ($sel.length > 1) {
      setGroupInvalid($checks, "Puoi selezionare una sola opzione per “Dimensione economica aziendale (PST)”.", "err_pst_dim");
      errori++;
    } else if ($sel.length === 1) {
      punti += map[$sel.val()] ?? 0;
    }
  })();

  // Capacità invaso (mutuamente esclusivi)
  (function () {
    const map = { "0-5000": 4, "5001-7500": 6, "7501-10000": 8, "gt-10000": 10 };
    const $checks = $(`input[name='capacita_invaso']`);
    const $sel = $checks.filter(":checked");
    clearGroupInvalid($checks, "err_cap_invaso");

    if ($sel.length > 1) {
      setGroupInvalid($checks, "Puoi selezionare una sola opzione per “Capacità totale di invaso”.", "err_cap_invaso");
      errori++;
    } else if ($sel.length === 1) {
      punti += map[$sel.val()] ?? 0;
    }
  })();

  // Cantierabilità (singolo)
  if ($(`input[name='cantierabili']`).is(":checked")) punti += 10;

  /* ===== 2) FILE OBBLIGATORI SE SELEZIONATI ===== */
  function validaPdfInput($file, label) {
    const input = $file.get(0);
    const MAX = 5 * 1024 * 1024;
    if (!input || !input.files || input.files.length === 0) {
      setInvalid($file, `Carica il file (${label}) in formato PDF (max 5 MB).`);
      return false;
    }
    const f = input.files[0];
    if (!/\.pdf$/i.test(f.name)) {
      setInvalid($file, `${label}: caricare un file PDF.`);
      return false;
    }
    if (f.size > MAX) {
      setInvalid($file, `${label}: il file supera 5 MB.`);
      return false;
    }
    clearInvalid($file);
    return true;
  }

  const regoleFile = [
    { type: "groupAny", group: "ps_terr[]", file: "doc_ps_terr", label: "Estratto carte tematiche SIAS" },
    { type: "groupValue", group: "sogg_char[]", value: "giovane", file: "doc_giovane", label: "Documento età anagrafica" },
    { type: "groupValue", group: "sogg_char[]", value: "iap-cd", file: "doc_iap_cd", label: "Autocertificazione IAP/CD" },
    { type: "single", name: "prima_partecipazione", file: "doc_prima_partecipazione", label: "Autocertificazione prima partecipazione" },
    { type: "groupAny", group: "pst_dim", file: "doc_pst", label: "Scheda/Relazione PST" },
    { type: "groupAny", group: "capacita_invaso", file: "doc_invaso", label: "Computo/Allegati capacità invaso" },
    { type: "single", name: "cantierabili", file: "doc_cantierabili", label: "Autorizzazioni/nullaosta per cantierabilità" }
  ];

  regoleFile.forEach(r => {
    let richiesto = false;
    if (r.type === "groupAny") {
      richiesto = $(`input[name='${r.group}']:checked`).length > 0;
    } else if (r.type === "groupValue") {
      richiesto = $(`input[name='${r.group}'][value='${r.value}']:checked`).length > 0;
    } else if (r.type === "single") {
      richiesto = $(`input[name='${r.name}']:checked`).length > 0;
    }
    const $file = $(`input[name='${r.file}']`);
    if (!$file.length) return;
    if (richiesto && !validaPdfInput($file, r.label)) errori++;
    else if (!richiesto) clearInvalid($file);
  });

  /* ===== 3) VINCOLI SUL TOTALE ===== */
  const $tot = $("#totale_punteggio");
  $tot.text(punti);
  $tot.removeClass("text-danger");

  // Superiore a 60 → errore bloccante
  if (punti > 60) {
    $tot.addClass("text-danger fw-bold");
    errori++;
  }

  // Inferiore a 30 → solo messaggio rosso (non blocca)
  let $msgMin = $("#msg_min_30");
  if (punti < 30 && punti > 0) {
    if (!$msgMin.length) {
      $msgMin = $('<div id="msg_min_30" class="invalid-feedback d-block mt-2 text-danger">Il punteggio totale è inferiore a 30 punti.</div>');
      $tot.closest("tr").after($("<tr><td colspan='5'></td></tr>").find("td").append($msgMin).end());
    } else {
      $msgMin.removeClass("d-none").addClass("d-block");
    }
  } else {
    $msgMin.remove();
  }

  /* ===== 4) BADGE / HEADER ===== */
  const $btn = $("#sezione-punteggio .accordion-header button");
  let $badge = $("#validazione_sezione_punteggio");
  if (!$badge.length) {
    $badge = $('<span id="validazione_sezione_punteggio" class="ms-2"></span>');
    $btn.append(" ").append($badge);
  }

  $btn.removeClass("background-color-success-accordion background-color-error-accordion");
  $badge.removeClass("badge text-bg-success text-bg-error").text("");

  if (errori === 0) {
    $btn.addClass("background-color-success-accordion");
    $badge.addClass("badge text-bg-success").text("Sezione Compilata Correttamente");
  } else {
    const sErr = errori === 1 ? " errore" : " errori";
    const sVerb = errori === 1 ? " è " : " sono ";
    $btn.addClass("background-color-error-accordion");
    $badge.addClass("badge text-bg-error").text("Vi " + sVerb + errori + sErr);
  }

  return errori;
}
function check_errori_firma() {
  var errori_firma = 0;
  var reg_luogo_nascita_residenza = /^[A-Za-zàèéìòùÀÈÉÌÒÙ\s\-']{2,}$/;
  var luogoFirma = $("#luogo_per_firma").val();
  if (luogoFirma.length == 0) {
    $("#luogo_per_firma").addClass("is-invalid");
    $("#errore_luogo_per_firma").addClass("invalid-feedback d-block");
    $("#errore_luogo_per_firma").text("Luogo obbligatorio.");
    errori_firma++;
  }
  else if (!reg_luogo_nascita_residenza.test(luogoFirma)) {
    $("#luogo_per_firma").addClass("is-invalid");
    $("#errore_luogo_per_firma").addClass("invalid-feedback d-block");
    $("#errore_luogo_per_firma").text("Luogo non valido.");
    errori_firma++;
  }
  else {
    $("#luogo_per_firma").removeClass("is-invalid");
    $("#errore_luogo_per_firma").removeClass("invalid-feedback");
    $("#errore_luogo_per_firma").text("");
  }

  var dataFirma = $("#data_per_firma").val();
  const array_data = dataFirma.split("-");
  var anno = array_data[0];
  if (dataFirma == "") {
    $("#data_per_firma").addClass("is-invalid");
    $("#errore_data_per_firma").addClass("invalid-feedback d-block");
    $("#errore_data_per_firma").text("Data firma obbligatoria.");
    errori_firma++;
  }
  else if (anno < 1900 || anno > 2026) {
    $("#data_per_firma").addClass("is-invalid");
    $("#errore_data_per_firma").addClass("invalid-feedback d-block");
    $("#errore_data_per_firma").text("Data firma non valida.");
    errori_firma++;
  }
  else {
    $("#data_per_firma").removeClass("is-invalid");
    $("#errore_data_per_firma").removeClass("invalid-feedback");
    $("#errore_data_per_firma").text("");
  }
  return errori_firma;
}


/*==== FUNZIONE CHECK PROVINCIA ISPETTORATO ====*/

/*==== FUNZIONE CHECK ANAGRAFICA ====*/
function check_sezione_anagrafica() {
  var reg_nome_cognome = /^[a-zA-ZàèéìòùÀÈÉÌÒÙ\-_ ’'‘ÆÐƎƏƐƔĲŊŒẞÞǷȜæðǝəɛɣĳŋœĸſßþƿȝĄƁÇĐƊĘĦĮƘŁØƠŞȘŢȚŦŲƯY̨Ƴąɓçđɗęħįƙłøơşșţțŧųưy̨ƴÁÀÂÄǍĂĀÃÅǺĄÆǼǢƁĆĊĈČÇĎḌĐƊÐÉÈĖÊËĚĔĒĘẸƎƏƐĠĜǦĞĢƔáàâäǎăāãåǻąæǽǣɓćċĉčçďḍđɗðéèėêëěĕēęẹǝəɛġĝǧğģɣĤḤĦIÍÌİÎÏǏĬĪĨĮỊĲĴĶƘĹĻŁĽĿʼNŃN̈ŇÑŅŊÓÒÔÖǑŎŌÕŐỌØǾƠŒĥḥħıíìiîïǐĭīĩįịĳĵķƙĸĺļłľŀŉńn̈ňñņŋóòôöǒŏōõőọøǿơœŔŘŖŚŜŠŞȘṢẞŤŢṬŦÞÚÙÛÜǓŬŪŨŰŮŲỤƯẂẀŴẄǷÝỲŶŸȲỸƳŹŻŽẒŕřŗſśŝšşșṣßťţṭŧþúùûüǔŭūũűůųụưẃẁŵẅƿýỳŷÿȳỹƴźżžẓ]*$/;
  var reg_luogo_nascita_residenza = /^[A-Za-zàèéìòùÀÈÉÌÒÙ\s\-']{2,}$/;
  var reg_indirizzo = /^[A-Za-z0-9àèéìòùÀÈÉÌÒÙ\s\-\.,']{3,}$/;
  var reg_rea = /^[A-Z]{2} ?\d{1,7}$/;
  var reg_inps = /^\d{10}$/;
  var reg_civico = /^\d+(\/[a-zA-Z])?$/;

  function valida_mail(email) {
    var email_reg =
      /^[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}$/;
    return email_reg.test(email);
  }

  var errori_anagrafica = 0
  var nome = $("#nome").val();
  if (nome.length == 0) {
    $("#nome").addClass("is-invalid");
    $("#errore_nome").addClass("invalid-feedback");
    $("#errore_nome").text("Nome obbligatorio.");
    errori_anagrafica++;
  }
  else if (nome.length < 2) {
    $("#nome").addClass("is-invalid");
    $("#errore_nome").addClass("invalid-feedback");
    $("#errore_nome").text("Il nome deve avere almeno due caratteri.");
    errori_anagrafica++;
  }
  else {
    if (!reg_nome_cognome.test(nome)) {
      $("#nome").addClass("is-invalid");
      $("#errore_nome").addClass("invalid-feedback");
      $("#errore_nome").text("Hai inserito caratteri non consentiti.");
      errori_anagrafica++;
    } else {
      $("#nome").removeClass("is-invalid");
      $("#errore_nome").removeClass("invalid-feedback");
      $("#errore_nome").text("");
    }
  }

  var cognome = $("#cognome").val();
  if (cognome.length == 0) {
    $("#cognome").addClass("is-invalid");
    $("#errore_cognome").addClass("invalid-feedback");
    $("#errore_cognome").text("Cognome obbligatorio.");
    errori_anagrafica++;
  }
  else if (cognome.length < 2) {
    $("#cognome").addClass("is-invalid");
    $("#errore_cognome").addClass("invalid-feedback");
    $("#errore_cognome").text("Il cognome deve avere almeno due caratteri.");
    errori_anagrafica++;
  }
  else {
    if (!reg_nome_cognome.test(cognome)) {
      $("#cognome").addClass("is-invalid");
      $("#errore_cognome").addClass("invalid-feedback");
      $("#errore_cognome").text("Hai inserito caratteri non consentiti.");
      errori_anagrafica++;
    } else {
      $("#cognome").removeClass("is-invalid");
      $("#errore_cognome").removeClass("invalid-feedback");
      $("#errore_cognome").text("");
    }
  }

  var dataNascita = $("#data-nascita").val();
  const array_data = dataNascita.split("-");
  var anno = array_data[0];
  if (dataNascita == "") {
    $("#data-nascita").addClass("is-invalid");
    $("#errore_data_nascita").addClass("invalid-feedback");
    $("#errore_data_nascita").text("Data di nascita obbligatoria.");
    errori_anagrafica++;
  }
  else if (anno < 1900 || anno > 2026) {
    $("#data-nascita").addClass("is-invalid");
    $("#errore_data_nascita").addClass("invalid-feedback");
    $("#errore_data_nascita").text("Data di nascita non valida.");
    errori_anagrafica++;
  }
  else {
    $("#data_nascita").removeClass("is-invalid");
    $("#errore_data_nascita").removeClass("invalid-feedback");
    $("#errore_data_nascita").text("");
  }

  var luogoNascita = $("#luogo-nascita").val();
  if (luogoNascita.length == 0) {
    $("#luogo-nascita").addClass("is-invalid");
    $("#errore_luogo_nascita").addClass("invalid-feedback");
    $("#errore_luogo_nascita").text("Luogo di nascita obbligatorio.");
    errori_anagrafica++;
  }
  else if (!reg_luogo_nascita_residenza.test(luogoNascita)) {
    $("#luogo-nascita").addClass("is-invalid");
    $("#errore_luogo_nascita").addClass("invalid-feedback");
    $("#errore_luogo_nascita").text("Luogo di nascita non valido.");
    errori_anagrafica++;
  }
  else {
    $("#luogo-nascita").removeClass("is-invalid");
    $("#errore_luogo_nascita").removeClass("invalid-feedback");
    $("#errore_luogo_nascita").text("");
  }

  var qualifica = $("input[name='qualifica']:checked").val();
  if ($('input[name=qualifica]:checked').length > 0) {
    $("#errore_qualifica").removeClass("invalid-feedback d-block");
    $("#errore_qualifica").text("");
  }
  else {
    $("#errore_qualifica").addClass("invalid-feedback d-block");
    $("#errore_qualifica").text("Seleziona la qualifica.");
    errori_anagrafica++;
  }

  var provinciaNascita = $("#provincia-nascita").val();
  if (provinciaNascita.length == 0) {
    $("#provincia-nascita").addClass("is-invalid");
    $("#errore_provincia_nascita").addClass("invalid-feedback");
    $("#errore_provincia_nascita").text("Provincia di nascita obbligatoria.");
    errori_anagrafica++;
  } else if (!reg_luogo_nascita_residenza.test(provinciaNascita)) {
    $("#provincia-nascita").addClass("is-invalid");
    $("#errore_provincia_nascita").addClass("invalid-feedback");
    $("#errore_provincia_nascita").text("Provincia di nascita non valida.");
    errori_anagrafica++;
  }
  else {
    $("#provincia-nascita").removeClass("is-invalid");
    $("#errore_provincia_nascita").removeClass("invalid-feedback");
    $("#errore_provincia_nascita").text("");
  }

  var cuua = $("#cuua").val();
  if (cuua.length == 0) {
    $("#cuua").addClass("is-invalid");
    $("#errore_cuua").addClass("invalid-feedback");
    $("#errore_cuua").text("Codice CUAA obbligatorio.");
    errori_anagrafica++;
  } else if (!controllaCFPIVA(cuua)) {
    $("#cuua").addClass("is-invalid");
    $("#errore_cuua").addClass("invalid-feedback");
    $("#errore_cuua").text("Codice CUAA errato: inserire in formato corretto e in maiuscolo.");
    errori_anagrafica++;
  }
  else {
    $("#cuua").removeClass("is-invalid");
    $("#errore_cuua").removeClass("invalid-feedback");
    $("#errore_cuua").text("");
  }

  var residenza = $("#residenza").val();
  if (residenza.length == 0) {
    $("#residenza").addClass("is-invalid");
    $("#errore_residenza").addClass("invalid-feedback");
    $("#errore_residenza").text("Comune di residenza obbligatorio.");
    errori_anagrafica++;
  } else if (!reg_luogo_nascita_residenza.test(residenza)) {
    $("#residenza").addClass("is-invalid");
    $("#errore_residenza").addClass("invalid-feedback");
    $("#errore_residenza").text("Comune di residenza non valido.");
    errori_anagrafica++;
  } else {
    $("#residenza").removeClass("is-invalid");
    $("#errore_residenza").removeClass("invalid-feedback");
    $("#errore_residenza").text("");
  }

  var provincia = $("#provincia").val();
  if (provincia.length == 0) {
    $("#provincia").addClass("is-invalid");
    $("#errore_provincia").addClass("invalid-feedback");
    $("#errore_provincia").text("Provincia obbligatoria.");
    errori_anagrafica++;
  } else if (!reg_luogo_nascita_residenza.test(provincia)) {
    $("#provincia-").addClass("is-invalid");
    $("#errore_provincia").addClass("invalid-feedback");
    $("#errore_provincia").text("Provincia non valida.");
    errori_anagrafica++;
  }
  else {
    $("#provincia").removeClass("is-invalid");
    $("#errore_provincia").removeClass("invalid-feedback");
    $("#errore_provincia").text("");
  }

  var indirizzo = $("#indirizzo").val();
  if (indirizzo.length == 0) {
    $("#indirizzo").addClass("is-invalid");
    $("#errore_indirizzo").addClass("invalid-feedback");
    $("#errore_indirizzo").text("Indirizzo obbligatorio.");
    errori_anagrafica++;
  } else if (!reg_indirizzo.test(indirizzo)) {
    $("#indirizzo").addClass("is-invalid");
    $("#errore_indirizzo").addClass("invalid-feedback");
    $("#errore_indirizzo").text("Indirizzo non valido.");
    errori_anagrafica++;
  } else {
    $("#indirizzo").removeClass("is-invalid");
    $("#errore_indirizzo").removeClass("invalid-feedback");
    $("#errore_indirizzo").text("");
  }

  var civico = $("#civico").val();
  if (civico.length == 0) {
    $("#civico").addClass("is-invalid");
    $("#errore_civico").addClass("invalid-feedback");
    $("#errore_civico").text("Numero civico obbligatorio.");
    errori_anagrafica++;
  } else {
    $("#civico").removeClass("is-invalid");
    $("#errore_civico").removeClass("invalid-feedback");
    $("#errore_civico").text("");
  }

  var pec = $("#pec").val();
  if (pec.length == 0) {
    $("#pec").addClass("is-invalid");
    $("#errore_pec").addClass("invalid-feedback");
    $("#errore_pec").text("Indirizzo PEC obbligatorio.");
    errori_anagrafica++;
  } else {
    if (pec.includes("@")) {
      var pec_check = pec.split("@");
      if (pec_check[1].length == 0) {
        $("#pec").addClass("is-invalid");
        $("#errore_pec").addClass("invalid-feedback");
        $("#errore_pec").text("Formato PEC errato.");
        errori_anagrafica++;
      }
      else {
        if (!valida_mail(pec)) {
          $("#pec").addClass("is-invalid");
          $("#errore_pec").addClass("invalid-feedback");
          $("#errore_pec").text("Formato PEC errato.");
          errori_anagrafica++;
        } else {
          $("#pec").removeClass("is-invalid");
          $("#errore_pec").removeClass("invalid-feedback");
          $("#errore_pec").text("");
        }
      }
    } else {
      if (!valida_mail(pec)) {
        $("#pec").addClass("is-invalid");
        $("#errore_pec").addClass("invalid-feedback");
        $("#errore_pec").text("Formato PEC errato.");
        errori_anagrafica++;
      } else {
        $("#pec").removeClass("is-invalid");
        $("#errore_pec").removeClass("invalid-feedback");
        $("#errore_pec").text("");
      }
    }
  }

  var email_aziendale = $("#email_aziendale").val();
  if (email_aziendale.length == 0) {
    $("#email_aziendale").addClass("is-invalid");
    $("#errore_email_aziendale").addClass("invalid-feedback");
    $("#errore_email_aziendale").text("Indirizzo Email obbligatorio.");
    errori_anagrafica++;
  } else {
    if (email_aziendale.includes("@")) {
      var email_aziendale_check = email_aziendale.split("@");
      if (email_aziendale_check[1].length == 0) {
        $("#email_aziendale").addClass("is-invalid");
        $("#errore_email_aziendale").addClass("invalid-feedback");
        $("#errore_email_aziendale").text("Formato Email errato.");
        errori_anagrafica++;
      }
      else {
        if (!valida_mail(email_aziendale)) {
          $("#email_aziendale").addClass("is-invalid");
          $("#errore_email_aziendale").addClass("invalid-feedback");
          $("#errore_email_aziendale").text("Formato Email errato.");
          errori_anagrafica++;
        } else {
          $("#email_aziendale").removeClass("is-invalid");
          $("#errore_email_aziendale").removeClass("invalid-feedback");
          $("#errore_email_aziendale").text("");
        }
      }
    } else {
      if (!valida_mail(email_aziendale)) {
        $("#email_aziendale").addClass("is-invalid");
        $("#errore_email_aziendale").addClass("invalid-feedback");
        $("#errore_email_aziendale").text("Formato Email errato.");
        errori_anagrafica++;
      } else {
        $("#email_aziendale").removeClass("is-invalid");
        $("#errore_email_aziendale").removeClass("invalid-feedback");
        $("#errore_email_aziendale").text("");
      }
    }
  }

  var telefono = $("#telefono").val().trim();
  if (telefono.length === 0) {
    $("#telefono").addClass("is-invalid");
    $("#errore_telefono").addClass("invalid-feedback");
    $("#errore_telefono").text("Recapito obbligatorio.");
    errori_anagrafica++;
  }
  else if (!/^\+?\d+$/.test(telefono)) {
    $("#telefono").addClass("is-invalid");
    $("#errore_telefono").addClass("invalid-feedback");
    $("#errore_telefono").text("Inserire solo numeri.");
    errori_anagrafica++;
  }
  else {
    $("#telefono").removeClass("is-invalid");
    $("#errore_telefono").removeClass("invalid-feedback");
    $("#errore_telefono").text("");
  }

  var denominazione = $("#denominazione").val();
  if (denominazione.length == 0) {
    $("#denominazione").addClass("is-invalid");
    $("#errore_denominazione").addClass("invalid-feedback");
    $("#errore_denominazione").text("Nome dell'impresa obbligatorio.");
    errori_anagrafica++;
  }
  else {
    $("#denominazione").removeClass("is-invalid");
    $("#errore_denominazione").removeClass("invalid-feedback");
    $("#errore_denominazione").text("");
  }

  var sede = $("#sede").val();
  if (sede.length == 0) {
    $("#sede").addClass("is-invalid");
    $("#errore_sede").addClass("invalid-feedback");
    $("#errore_sede").text("Sede legale dell'impresa obbligatoria.");
    errori_anagrafica++;
  }
  else {
    $("#sede").removeClass("is-invalid");
    $("#errore_sede").removeClass("invalid-feedback");
    $("#errore_sede").text("");
  }

  var sede_indirizzo = $("#sede_indirizzo").val();
  if (sede_indirizzo.length == 0) {
    $("#sede_indirizzo").addClass("is-invalid");
    $("#errore_sede_indirizzo").addClass("invalid-feedback");
    $("#errore_sede_indirizzo").text("Indirizzo della sede legale obbligatorio.");
    errori_anagrafica++;
  }
  else if (!reg_indirizzo.test(sede_indirizzo)) {
    $("#sede_indirizzo").addClass("is-invalid");
    $("#errore_sede_indirizzo").addClass("invalid-feedback");
    $("#errore_sede_indirizzo").text("Indirizzo non valido.");
    errori_anagrafica++;
  }
  else {
    $("#sede_indirizzo").removeClass("is-invalid");
    $("#errore_sede_indirizzo").removeClass("invalid-feedback");
    $("#errore_sede_indirizzo").text("");
  }

  var civico_sede = $("#civico_sede").val();
  if (civico_sede.length == 0) {
    $("#civico_sede").addClass("is-invalid");
    $("#errore_civico_sede").addClass("invalid-feedback");
    $("#errore_civico_sede").text("Numero civico obbligatorio.");
    errori_anagrafica++;
  } else {
    $("#civico_sede").removeClass("is-invalid");
    $("#errore_civico_sede").removeClass("invalid-feedback");
    $("#errore_civico_sede").text("");
  }

  var cciaRiferimento = $("#ccia-riferimento").val();
  if (cciaRiferimento.length == 0) {
    $("#ccia-riferimento").addClass("is-invalid");
    $("#errore_ccia_riferimento").addClass("invalid-feedback");
    $("#errore_ccia_riferimento").text("Provincia di riferimento della CCIA obbligatoria.");
    errori_anagrafica++;
  } else if (!reg_luogo_nascita_residenza.test(cciaRiferimento)) {
    $("#ccia-riferimento").addClass("is-invalid");
    $("#errore_ccia_riferimento").addClass("invalid-feedback");
    $("#errore_ccia_riferimento").text("Provincia della CCIA non valida.");
    errori_anagrafica++;
  } else {
    $("#ccia-riferimento").removeClass("is-invalid");
    $("#errore_ccia_riferimento").removeClass("invalid-feedback");
    $("#errore_ccia_riferimento").text("");
  }

  var numeroREA = $("#numero-rea").val();
  if (numeroREA.length == 0) {
    $("#numero-rea").addClass("is-invalid");
    $("#errore_numero_rea").addClass("invalid-feedback");
    $("#errore_numero_rea").text("Numero REA obbligatorio.");
    errori_anagrafica++;
  } else if (!reg_rea.test(numeroREA)) {
    $("#numero-rea").addClass("is-invalid");
    $("#errore_numero_rea").addClass("invalid-feedback");
    $("#errore_numero_rea").text("Numero REA non valido. (es. MI123456)");
    errori_anagrafica++;
  } else {
    $("#numero-rea").removeClass("is-invalid");
    $("#errore_numero_rea").removeClass("invalid-feedback");
    $("#errore_numero_rea").text("");
  }

  /*
  var numeroINPS = $("#numero-inps").val();
  if (numeroINPS.length == 0) {
      $("#numero-inps").addClass("is-invalid");
      $("#errore_numero_inps").addClass("invalid-feedback");
      $("#errore_numero_inps").text("Numero INPS obbligatorio.");
      errori_anagrafica++;
  } else if (!reg_inps.test(numeroINPS)){
      $("#numero-inps").addClass("is-invalid");
      $("#errore_numero_inps").addClass("invalid-feedback");
      $("#errore_numero_inps").text("Numero INPS non valido. (es. 876543219999)");
      errori_anagrafica++;
  } else {
      $("#numero-inps").removeClass("is-invalid");
      $("#errore_numero_inps").removeClass("invalid-feedback");
      $("#errore_numero_inps").text("");
  }
  */

  /*
  var pIva = $("#p-iva").val();
  if (pIva.length == 0) {
      $("#p-iva").addClass("is-invalid");
      $("#errore_p_iva").addClass("invalid-feedback");
      $("#errore_p_iva").text("Partita IVA dell'impresa obbligatoria.");
      errori_anagrafica++;
  }else if(!controllaCFPIVA(pIva)){
      $("#p-iva").addClass("is-invalid");
      $("#errore_p_iva").addClass("invalid-feedback");
      $("#errore_p_iva").text("Partita IVA errata.");
      errori_anagrafica++;
  } 
  else {
      $("#p-iva").removeClass("is-invalid");
      $("#errore_p_iva").removeClass("invalid-feedback");
      $("#errore_p_iva").text("");
  }
  */

  if ($('input[name=antimafia]:checked').length > 0) {
    $("#errore_antimafia").removeClass("invalid-feedback d-block");
    $("#errore_antimafia").text("");
  }
  else {
    $("#errore_antimafia").addClass("invalid-feedback d-block");
    $("#errore_antimafia").text("Seleziona lo stato della certificazione antimafia.");
    errori_anagrafica++;
  }


  var allowedExtensions = /(\.pdf)$/i;
  var maxSize = 5 * 1024 * 1024;


  var string_errori = " errore";
  var string_verbo = " è ";
  if (errori_anagrafica > 1) {
    string_errori = " errori";
    string_verbo = " sono "
  }
  $("#validazione_sezione_anagrafica").removeClass("badge text-bg-success");
  $("#validazione_sezione_anagrafica").removeClass("badge text-bg-error");
  $("#anagrafica .accordion-header button").removeClass("background-color-success-accordion");
  $("#anagrafica .accordion-header button").removeClass("background-color-error-accordion");
  if (errori_anagrafica == 0) {
    $("#validazione_sezione_anagrafica").text("Sezione Compilata Correttamente");
    $("#validazione_sezione_anagrafica").addClass("badge text-bg-success");
    $("#anagrafica .accordion-header button").addClass("background-color-success-accordion");
  }
  else {
    $("#validazione_sezione_anagrafica").text("Vi " + string_verbo + errori_anagrafica + string_errori);
    $("#validazione_sezione_anagrafica").addClass("badge text-bg-error");
    $("#anagrafica .accordion-header button").addClass("background-color-error-accordion");
  }
  return errori_anagrafica;
}
/*==== FUNZIONE CHECK ANAGRAFICA ====*/

/*==== FUNZIONE CHECK DATI BANCARI ====*/
function check_sezione_dati_bancari() {
  let errori_dati_bancari = 0;

  // === VALIDAZIONE IBAN ===
  const reg_iban_IT = /^IT\d{2}[A-Z]\d{5}\d{5}[0-9A-Z]{12}$/; // regex aggiornata
  const ibanRaw = $("#iban").val() || "";
  const iban = ibanRaw.replace(/\s+/g, "").toUpperCase();
  const $lbl = $("label[for='iban']");
  if (!$lbl.data("originale")) $lbl.data("originale", $lbl.text());

  if (iban.length === 0) {
    $("#iban").addClass("is-invalid");
    $("#errore_iban").addClass("invalid-feedback").text("IBAN obbligatorio.");
    $lbl.text($lbl.data("originale") + " (obbligatorio)").css("color", "red");
    errori_dati_bancari++;
  }
  else if (!reg_iban_IT.test(iban)) {
    $("#iban").addClass("is-invalid");
    $("#errore_iban").addClass("invalid-feedback")
      .text("IBAN non valido. Esempio: IT60X0542811101000000123456");
    $lbl.text($lbl.data("originale") + " (formato errato)").css("color", "red");
    errori_dati_bancari++;
  }
  else {
    $("#iban").removeClass("is-invalid");
    $("#errore_iban").removeClass("invalid-feedback").text("");
    $lbl.text($lbl.data("originale")).css("color", "");
  }

  var istitutoCredito = $("#istituto-credito").val();
  if (istitutoCredito.length == 0) {
    $("#istituto-credito").addClass("is-invalid");
    $("#errore_istituto_credito").addClass("invalid-feedback");
    $("#errore_istituto_credito").text("Istituto di credito obbligatorio.");
    errori_dati_bancari++;
  }
  else {
    $("#istituto-credito").removeClass("is-invalid");
    $("#errore_istituto_credito").removeClass("invalid-feedback");
    $("#errore_istituto_credito").text("");
  }

  var agenzia_banca = $("#agenzia_banca").val();
  if (agenzia_banca.length == 0) {
    $("#agenzia_banca").addClass("is-invalid");
    $("#errore_agenzia_banca").addClass("invalid-feedback");
    $("#errore_agenzia_banca").text("Agenzia obbligatoria.");
    errori_dati_bancari++;
  }
  else {
    $("#agenzia_banca").removeClass("is-invalid");
    $("#errore_agenzia_banca").removeClass("invalid-feedback");
    $("#errore_agenzia_banca").text("");
  }

  /*
  var file = document.getElementById("scansione-dati-bancari").files[0];
  var allowedExtensions = /(\.pdf)$/i;
  var maxSize = 5 * 1024 * 1024;
  if (!file) {
      $("#scansione-dati-bancari").addClass("is-invalid");
      $("#errore_scansione_dati_bancari").addClass("invalid-feedback");
      $("#errore_scansione_dati_bancari").text("Scansione dei dati bancari obbligatoria.");
      errori_dati_bancari++;
  } 
  else if (!allowedExtensions.test(file.name)) {
      $("#scansione-dati-bancari").addClass("is-invalid");
      $("#errore_scansione_dati_bancari").addClass("invalid-feedback");
      $("#errore_scansione_dati_bancari").text("Formato non valido. Caricare solo file .pdf.");
      errori_dati_bancari++;
  } 
  else if (file.size > maxSize) {
    $("#scansione-dati-bancari").addClass("is-invalid");
    $("#errore_scansione_dati_bancari").addClass("invalid-feedback");
    $("#errore_scansione_dati_bancari").text("Il file deve essere inferiore a 5MB.");
    errori_dati_bancari++;
  } 
  else {
      $("#scansione-dati-bancari").removeClass("is-invalid");
      $("#errore_scansione_dati_bancari").removeClass("invalid-feedback");
      $("#errore_scansione_dati_bancari").text("");
  }
  */

  var string_errori = " errore";
  var string_verbo = " è ";
  if (errori_dati_bancari > 1) {
    string_errori = " errori";
    string_verbo = " sono "
  }

  $("#validazione_sezione_dati_bancari").removeClass("badge text-bg-success");
  $("#validazione_sezione_dati_bancari").removeClass("badge text-bg-error");
  $("#dati-bancari .accordion-header button").removeClass("background-color-success-accordion");
  $("#dati-bancari .accordion-header button").removeClass("background-color-error-accordion");

  if (errori_dati_bancari == 0) {
    $("#validazione_sezione_dati_bancari").text("Sezione Compilata Correttamente");
    $("#validazione_sezione_dati_bancari").addClass("badge text-bg-success");
    $("#dati-bancari .accordion-header button").addClass("background-color-success-accordion");
  }
  else {
    $("#validazione_sezione_dati_bancari").text("Vi " + string_verbo + errori_dati_bancari + string_errori);
    $("#validazione_sezione_dati_bancari").addClass("badge text-bg-error");
    $("#dati-bancari .accordion-header button").addClass("background-color-error-accordion");
  }
  return errori_dati_bancari;
}
/*==== FUNZIONE CHECK DATI BANCARI ====*/

function check_sezione_localizzazione_investimento() {
  var reg_foglio = /^\d{1,4}$/;
  var reg_particella = /^[a-zA-Z0-9]{1,5}(, ?[a-zA-Z0-9]{1,5})*$/;
  var errori_localizzazione_investimento = 0;

  // Provincia
  var provinciaLocalizzazione = $("#provincia-localizzazione").val();
  if (!provinciaLocalizzazione) {
    $("#provincia-localizzazione").addClass("is-invalid");
    $("#errore_provincia_localizzazione").addClass("invalid-feedback").text("Provincia di localizzazione obbligatoria.");
    errori_localizzazione_investimento++;
  } else {
    $("#provincia-localizzazione").removeClass("is-invalid");
    $("#errore_provincia_localizzazione").removeClass("invalid-feedback").text("");
  }

  // Comuni
  $("[id^=comune-localizzazione]").each(function () {
    var comune = $(this).val();
    var id = $(this).attr("id");
    var suffix = id.substring("comune-localizzazione".length);
    var erroreComune = $("#errore_comune_localizzazione" + suffix);

    if ($(this).find("option").length === 0) {
      $(this).addClass("is-invalid");
      erroreComune.addClass("invalid-feedback").text("Seleziona prima la provincia.");
      errori_localizzazione_investimento++;
    } else if (!comune || comune.length === 0) {
      $(this).addClass("is-invalid");
      erroreComune.addClass("invalid-feedback").text("Comune di localizzazione obbligatorio.");
      errori_localizzazione_investimento++;
    } else {
      $(this).removeClass("is-invalid");
      erroreComune.removeClass("invalid-feedback").text("");
    }
  });

  // Fogli
  $("[id^=foglio]").each(function () {
    var foglio = $(this).val();
    var id = $(this).attr("id");
    var suffix = id.substring("foglio".length);
    var erroreFoglio = $("#errore_foglio" + suffix);

    if (!foglio) {
      $(this).addClass("is-invalid");
      erroreFoglio.addClass("invalid-feedback").text("Foglio di riferimento dell'immobile obbligatorio.");
      errori_localizzazione_investimento++;
    } else if (!reg_foglio.test(foglio)) {
      $(this).addClass("is-invalid");
      erroreFoglio.addClass("invalid-feedback").text("Foglio di riferimento non valido.");
      errori_localizzazione_investimento++;
    } else {
      $(this).removeClass("is-invalid");
      erroreFoglio.removeClass("invalid-feedback").text("");
    }
  });

  // Particelle
  $("[id^=particella]").each(function () {
    var particella = $(this).val();
    var id = $(this).attr("id");
    var suffix = id.substring("particella".length);
    var erroreParticella = $("#errore_particella" + suffix);

    if (!particella) {
      $(this).addClass("is-invalid");
      erroreParticella.addClass("invalid-feedback").text("Particella di riferimento dell'immobile obbligatoria.");
      errori_localizzazione_investimento++;
    } else if (!reg_particella.test(particella)) {
      $(this).addClass("is-invalid");
      erroreParticella.addClass("invalid-feedback").text("Particella di riferimento non valida.");
      errori_localizzazione_investimento++;
    } else {
      $(this).removeClass("is-invalid");
      erroreParticella.removeClass("invalid-feedback").text("");
    }
  });

  // Aggiorna badge e colore header
  var string_errori = errori_localizzazione_investimento === 1 ? " errore" : " errori";
  var string_verbo = errori_localizzazione_investimento === 1 ? " è " : " sono ";

  $("#validazione_sezione_localizzazione_investimento").removeClass("badge text-bg-success text-bg-error");
  $("#localizzazione-investimento .accordion-header button").removeClass("background-color-success-accordion background-color-error-accordion");

  if (errori_localizzazione_investimento === 0) {
    $("#validazione_sezione_localizzazione_investimento").text("Sezione Compilata Correttamente").addClass("badge text-bg-success");
    $("#localizzazione-investimento .accordion-header button").addClass("background-color-success-accordion");
  } else {
    $("#validazione_sezione_localizzazione_investimento").text("Vi " + string_verbo + errori_localizzazione_investimento + string_errori).addClass("badge text-bg-error");
    $("#localizzazione-investimento .accordion-header button").addClass("background-color-error-accordion");
  }

  return errori_localizzazione_investimento;
}
/*==== FUNZIONE CHECK LOCALIZZAZIONE INVESTIMENTO ====*/

/*==== FUNZIONE CHECK TECNICO COMPETENTE ====*/
function check_sezione_tecnico_competente() {
  var reg_nome_cognome = /^[a-zA-ZàèéìòùÀÈÉÌÒÙ\-_ ’'‘ÆÐƎƏƐƔĲŊŒẞÞǷȜæðǝəɛɣĳŋœĸſßþƿȝĄƁÇĐƊĘĦĮƘŁØƠŞȘŢȚŦŲƯY̨Ƴąɓçđɗęħįƙłøơşșţțŧųưy̨ƴÁÀÂÄǍĂĀÃÅǺĄÆǼǢƁĆĊĈČÇĎḌĐƊÐÉÈĖÊËĚĔĒĘẸƎƏƐĠĜǦĞĢƔáàâäǎăāãåǻąæǽǣɓćċĉčçďḍđɗðéèėêëěĕēęẹǝəɛġĝǧğģɣĤḤĦIÍÌİÎÏǏĬĪĨĮỊĲĴĶƘĹĻŁĽĿʼNŃN̈ŇÑŅŊÓÒÔÖǑŎŌÕŐỌØǾƠŒĥḥħıíìiîïǐĭīĩįịĳĵķƙĸĺļłľŀŉńn̈ňñņŋóòôöǒŏōõőọøǿơœŔŘŖŚŜŠŞȘṢẞŤŢṬŦÞÚÙÛÜǓŬŪŨŰŮŲỤƯẂẀŴẄǷÝỲŶŸȲỸƳŹŻŽẒŕřŗſśŝšşșṣßťţṭŧþúùûüǔŭūũűůųụưẃẁŵẅƿýỳŷÿȳỹƴźżžẓ]*$/;
  var reg_luogo_nascita_residenza = /^[A-Za-zàèéìòùÀÈÉÌÒÙ\s\-']{2,}$/;
  var reg_indirizzo = /^[A-Za-z0-9àèéìòùÀÈÉÌÒÙ\s\-\.,']{3,}$/;
  var reg_iscrizione_ordine = /^[A-Z]{2}\d{1,6}$/;
  var reg_civico = /^\d+(\/[a-zA-Z])?$/;
  function valida_mail(email) {
    var email_reg =
      /^[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}$/;
    return email_reg.test(email);
  }

  var errori_tecnico_competente = 0;
  var nomeTecnico = $("#nome-tecnico").val();
  if (nomeTecnico.length == 0) {
    $("#nome-tecnico").addClass("is-invalid");
    $("#errore_nome_tecnico").addClass("invalid-feedback");
    $("#errore_nome_tecnico").text("Nome del tecnico incaricato obbligatorio.");
    errori_tecnico_competente++;
  } else if (nomeTecnico.length < 2) {
    $("#nome-tecnico").addClass("is-invalid");
    $("#errore_nome_tecnico").addClass("invalid-feedback");
    $("#errore_nome_tecnico").text("Il nome deve avere almeno due caratteri.");
    errori_tecnico_competente++;
  } else {
    if (!reg_nome_cognome.test(nomeTecnico)) {
      $("#nome-tecnico").addClass("is-invalid");
      $("#errore_nome_tecnico").addClass("invalid-feedback");
      $("#errore_nome_tecnico").text("Hai inserito caratteri non consentiti.");
      errori_tecnico_competente++;
    } else {
      $("#nome-tecnico").removeClass("is-invalid");
      $("#errore_nome_tecnico").removeClass("invalid-feedback");
      $("#errore_nome_tecnico").text("");
    }
  }

  var cognomeTecnico = $("#cognome-tecnico").val();
  if (cognomeTecnico.length == 0) {
    $("#cognome-tecnico").addClass("is-invalid");
    $("#errore_cognome_tecnico").addClass("invalid-feedback");
    $("#errore_cognome_tecnico").text("Cognome del tecnico incaricato obbligatorio.");
    errori_tecnico_competente++;
  } else if (cognomeTecnico.length < 2) {
    $("#cognome-tecnico").addClass("is-invalid");
    $("#errore_cognome_tecnico").addClass("invalid-feedback");
    $("#errore_cognome_tecnico").text("Il cognome deve avere almeno due caratteri.");
    errori_tecnico_competente++;
  } else {
    if (!reg_nome_cognome.test(cognomeTecnico)) {
      $("#cognome-tecnico").addClass("is-invalid");
      $("#errore_cognome_tecnico").addClass("invalid-feedback");
      $("#errore_cognome_tecnico").text("Hai inserito caratteri non consentiti.");
      errori_tecnico_competente++;
    } else {
      $("#cognome-tecnico").removeClass("is-invalid");
      $("#errore_cognome_tecnico").removeClass("invalid-feedback");
      $("#errore_cognome_tecnico").text("");
    }
  }

  var comuneStudioProfessionale = $("#comune-studio-professionale").val();
  if (comuneStudioProfessionale.length == 0) {
    $("#comune-studio-professionale").addClass("is-invalid");
    $("#errore_comune_studio_professionale").addClass("invalid-feedback");
    $("#errore_comune_studio_professionale").text("Comune studio professionale obbligatorio.");
    errori_tecnico_competente++;
  } else if (!reg_luogo_nascita_residenza.test(comuneStudioProfessionale)) {
    $("#comune-studio-professionale").addClass("is-invalid");
    $("#errore_comune_studio_professionale").addClass("invalid-feedback");
    $("#errore_comune_studio_professionale").text("Comune studio professionale non valido.");
    errori_tecnico_competente++;
  } else {
    $("#comune-studio-professionale").removeClass("is-invalid");
    $("#errore_comune_studio_professionale").removeClass("invalid-feedback");
    $("#errore_comune_studio_professionale").text("");
  }

  var provinciaStudioProfessionale = $("#provincia-studio-professionale").val();
  if (provinciaStudioProfessionale.length == 0) {
    $("#provincia-studio-professionale").addClass("is-invalid");
    $("#errore_provincia_studio_professionale").addClass("invalid-feedback");
    $("#errore_provincia_studio_professionale").text("Provincia studio professionale obbligatoria.");
    errori_tecnico_competente++;
  } else if (!reg_luogo_nascita_residenza.test(provinciaStudioProfessionale)) {
    $("#provincia-studio-professionale").addClass("is-invalid");
    $("#errore_provincia_studio_professionale").addClass("invalid-feedback");
    $("#errore_provincia_studio_professionale").text("Provincia studio professionale non valida.");
    errori_tecnico_competente++;
  } else {
    $("#provincia-studio-professionale").removeClass("is-invalid");
    $("#errore_provincia_studio_professionale").removeClass("invalid-feedback");
    $("#errore_provincia_studio_professionale").text("");
  }

  var indirizzoStudioProfessionale = $("#indirizzo-studio-professionale").val();
  if (indirizzoStudioProfessionale.length == 0) {
    $("#indirizzo-studio-professionale").addClass("is-invalid");
    $("#errore_indirizzo_studio_professionale").addClass("invalid-feedback");
    $("#errore_indirizzo_studio_professionale").text("Indirizzo studio professionale obbligatorio.");
    errori_tecnico_competente++;
  } else if (!reg_indirizzo.test(indirizzoStudioProfessionale)) {
    $("#indirizzo-studio-professionale").addClass("is-invalid");
    $("#errore_indirizzo_studio_professionale").addClass("invalid-feedback");
    $("#errore_indirizzo_studio_professionale").text("Indirizzo studio professionale non valido.");
    errori_tecnico_competente++;
  } else {
    $("#indirizzo-studio-professionale").removeClass("is-invalid");
    $("#errore_indirizzo_studio_professionale").removeClass("invalid-feedback");
    $("#errore_indirizzo_studio_professionale").text("");
  }

  var civico_studio_tecnico = $("#civico-studio-professionale").val();
  if (civico_studio_tecnico.length == 0) {
    $("#civico-studio-professionale").addClass("is-invalid");
    $("#errore_civico_studio_professionale").addClass("invalid-feedback");
    $("#errore_civico_studio_professionale").text("Numero civico obbligatorio.");
    errori_tecnico_competente++;
  }
  else {
    $("#civico-studio-professionale").removeClass("is-invalid");
    $("#errore_civico_studio_professionale").removeClass("invalid-feedback");
    $("#errore_civico_studio_professionale").text("");
  }

  var recapitoTecnico = $("#recapito-tecnico").val().trim();
  if (recapitoTecnico.length === 0) {
    $("#recapito-tecnico").addClass("is-invalid");
    $("#errore_recapito_tecnico").addClass("invalid-feedback");
    $("#errore_recapito_tecnico").text("Recapito tecnico obbligatorio.");
    errori_tecnico_competente++;
  }
  else if (!/^\+?\d+$/.test(recapitoTecnico)) {
    $("#recapito-tecnico").addClass("is-invalid");
    $("#errore_recapito_tecnico").addClass("invalid-feedback");
    $("#errore_recapito_tecnico").text("Inserire solo numeri.");
    errori_tecnico_competente++;
  }
  else {
    $("#recapito-tecnico").removeClass("is-invalid");
    $("#errore_recapito_tecnico").removeClass("invalid-feedback");
    $("#errore_recapito_tecnico").text("");
  }

  var pecTecnico = $("#pec-tecnico").val();
  if (pecTecnico.length == 0) {
    $("#pec-tecnico").addClass("is-invalid");
    $("#errore_pec_tecnico").addClass("invalid-feedback");
    $("#errore_pec_tecnico").text("Indirizzo PEC obbligatorio.");
    errori_tecnico_competente++;
  } else {
    if (pecTecnico.includes("@")) {
      var pec_check = pecTecnico.split("@");
      if (pec_check[1].length == 0) {
        $("#pec-tecnico").addClass("is-invalid");
        $("#errore_pec_tecnico").addClass("invalid-feedback");
        $("#errore_pec_tecnico").text("Formato PEC errato.");
        errori_tecnico_competente++;
      }
      else {
        if (!valida_mail(pecTecnico)) {
          $("#pec-tecnico").addClass("is-invalid");
          $("#errore_pec_tecnico").addClass("invalid-feedback");
          $("#errore_pec_tecnico").text("Formato PEC errato.");
          errori_tecnico_competente++;
        } else {
          $("#pec-tecnico").removeClass("is-invalid");
          $("#errore_pec_tecnico").removeClass("invalid-feedback");
          $("#errore_pec_tecnico").text("");
        }
      }
    } else {
      if (!valida_mail(pecTecnico)) {
        $("#pec-tecnico").addClass("is-invalid");
        $("#errore_pec_tecnico").addClass("invalid-feedback");
        $("#errore_pec_tecnico").text("Formato PEC errato.");
        errori_tecnico_competente++;
      } else {
        $("#pec-tecnico").removeClass("is-invalid");
        $("#errore_pec_tecnico").removeClass("invalid-feedback");
        $("#errore_pec_tecnico").text("");
      }
    }
  }

  var mailTecnico = $("#mail-tecnico").val();
  if (mailTecnico.length == 0) {
    $("#mail-tecnico").addClass("is-invalid");
    $("#errore_mail_tecnico").addClass("invalid-feedback");
    $("#errore_mail_tecnico").text("Indirizzo mail obbligatorio.");
    errori_tecnico_competente++;
  } else {
    if (mailTecnico.includes("@")) {
      var pec_check = mailTecnico.split("@");
      if (pec_check[1].length == 0) {
        $("#mail-tecnico").addClass("is-invalid");
        $("#errore_mail_tecnico").addClass("invalid-feedback");
        $("#errore_mail_tecnico").text("Formato mail errato.");
        errori_tecnico_competente++;
      }
      else {
        if (!valida_mail(mailTecnico)) {
          $("#mail-tecnico").addClass("is-invalid");
          $("#errore_mail_tecnico").addClass("invalid-feedback");
          $("#errore_mail_tecnico").text("Formato mail errato.");
          errori_tecnico_competente++;
        } else {
          $("#mail-tecnico").removeClass("is-invalid");
          $("#errore_mail_tecnico").removeClass("invalid-feedback");
          $("#errore_mail_tecnico").text("");
        }
      }
    } else {
      if (!valida_mail(mailTecnico)) {
        $("#mail-tecnico").addClass("is-invalid");
        $("#errore_mail_tecnico").addClass("invalid-feedback");
        $("#errore_mail_tecnico").text("Formato mail errato.");
        errori_tecnico_competente++;
      } else {
        $("#mail-tecnico").removeClass("is-invalid");
        $("#errore_mail_tecnico").removeClass("invalid-feedback");
        $("#errore_mail_tecnico").text("");
      }
    }
  }

  var provinciaTecnico = $("#provincia-ordine-tecnico").val();
  if (provinciaTecnico.length == 0) {
    $("#provincia-ordine-tecnico").addClass("is-invalid");
    $("#errore_provincia_ordine_tecnico").addClass("invalid-feedback");
    $("#errore_provincia_ordine_tecnico").text("Provincia/Sezione/Regione di iscrizione obbligatoria.");
    errori_tecnico_competente++;
  } else if (!reg_luogo_nascita_residenza.test(provinciaTecnico)) {
    $("#provincia-ordine-tecnico").addClass("is-invalid");
    $("#errore_provincia_ordine_tecnico").addClass("invalid-feedback");
    $("#errore_provincia_ordine_tecnico").text("Provincia/Sezione/Regione di iscrizione non valida.");
    errori_tecnico_competente++;
  } else {
    $("#provincia-ordine-tecnico").removeClass("is-invalid");
    $("#errore_provincia_ordine_tecnico").removeClass("invalid-feedback");
    $("#errore_provincia_ordine_tecnico").text("");
  }

  var ordineTecnico = $("#ordine-tecnico").val();
  if (ordineTecnico.length == 0) {
    $("#ordine-tecnico").addClass("is-invalid");
    $("#errore_ordine_tecnico").addClass("invalid-feedback");
    $("#errore_ordine_tecnico").text("Ordine di appartenenza obbligatorio.");
    errori_tecnico_competente++;
  } else if (!reg_nome_cognome.test(ordineTecnico)) {
    $("#ordine-tecnico").addClass("is-invalid");
    $("#errore_ordine_tecnico").addClass("invalid-feedback");
    $("#errore_ordine_tecnico").text("Ordine di appartenenza non valido.");
    errori_tecnico_competente++;
  } else {
    $("#ordine-tecnico").removeClass("is-invalid");
    $("#errore_ordine_tecnico").removeClass("invalid-feedback");
    $("#errore_ordine_tecnico").text("");
  }

  var numeroIscrizioneTecnico = $("#numero-iscrizione-ordine-tecnico").val();
  if (numeroIscrizioneTecnico.length == 0) {
    $("#numero-iscrizione-ordine-tecnico").addClass("is-invalid");
    $("#errore_numero_iscrizione_ordine_tecnico").addClass("invalid-feedback");
    $("#errore_numero_iscrizione_ordine_tecnico").text("Numero di iscrizione obbligatorio.");
    errori_tecnico_competente++;
  }
  /*
  else if (!reg_iscrizione_ordine.test(numeroIscrizioneTecnico)) {
      $("#numero-iscrizione-ordine-tecnico").addClass("is-invalid");
      $("#errore_numero_iscrizione_ordine_tecnico").addClass("invalid-feedback");
      $("#errore_numero_iscrizione_ordine_tecnico").text("Numero di iscrizione non valido.");
      errori_tecnico_competente++;
  } 
  */
  else {
    $("#numero-iscrizione-ordine-tecnico").removeClass("is-invalid");
    $("#errore_numero_iscrizione_ordine_tecnico").removeClass("invalid-feedback");
    $("#errore_numero_iscrizione_ordine_tecnico").text("");
  }

  var string_errori = " errore";
  var string_verbo = " è ";
  if (errori_tecnico_competente > 1) {
    string_errori = " errori";
    string_verbo = " sono "
  }
  $("#validazione_sezione_tecnico_competente").removeClass("badge text-bg-success");
  $("#validazione_sezione_tecnico_competente").removeClass("badge text-bg-error");
  $("#tecnico-competente .accordion-header button").removeClass("background-color-success-accordion");
  $("#tecnico-competente .accordion-header button").removeClass("background-color-error-accordion");
  if (errori_tecnico_competente == 0) {
    $("#validazione_sezione_tecnico_competente").text("Sezione Compilata Correttamente");
    $("#validazione_sezione_tecnico_competente").addClass("badge text-bg-success");
    $("#tecnico-competente .accordion-header button").addClass("background-color-success-accordion");
  }
  else {
    $("#validazione_sezione_tecnico_competente").text("Vi " + string_verbo + errori_tecnico_competente + string_errori);
    $("#validazione_sezione_tecnico_competente").addClass("badge text-bg-error");
    $("#tecnico-competente .accordion-header button").addClass("background-color-error-accordion");
  }
  return errori_tecnico_competente;
}
/*==== FUNZIONE CHECK TECNICO COMPETENTE ====*/

/*==== FUNZIONE CHECK PIANO DEGLI INVESTIMENTI ====*/
function check_sezione_piano_degli_investimenti() {
  var regex = /^\d+([.,]\d{1,2})?$/;       // accetta 12, 12.3, 12,34
  var regex_solo_numeri = /^[0-9]*$/;
  var reg_mesi_due_cifre = /^\d{1,2}$/;
  var errori_piano_degli_investimenti = 0;

  /* 1) Tempo realizzazione */
  var mesi_realizzazione = $("#tempo_realizzazione_investimenti").val();
  if (mesi_realizzazione.length == 0) {
    $("#tempo_realizzazione_investimenti").addClass("is-invalid");
    $("#errore_tempo_realizzazione_investimenti").addClass("invalid-feedback")
      .text("Numero mesi obbligatorio.");
    errori_piano_degli_investimenti++;
  } else if (!reg_mesi_due_cifre.test(mesi_realizzazione)) {
    $("#tempo_realizzazione_investimenti").addClass("is-invalid");
    $("#errore_tempo_realizzazione_investimenti").addClass("invalid-feedback")
      .text("Numero mesi non valido. (1-99)");
    errori_piano_degli_investimenti++;
  } else {
    $("#tempo_realizzazione_investimenti").removeClass("is-invalid");
    $("#errore_tempo_realizzazione_investimenti").removeClass("invalid-feedback").text("");
  }

  /* 2) Tabella 1 – Piano investimenti */
  $("select[name=categoria_interventi]").each(function () {
    var valore_categoria = $(this).val();
    var errore_categoria = $(this).next('.error_categoria_interventi');
    if (valore_categoria == "") {
      $(this).addClass("is-invalid");
      errore_categoria.addClass("invalid-feedback").text("Seleziona la categoria di intervento.");
      errori_piano_degli_investimenti++;
    } else {
      $(this).removeClass("is-invalid");
      errore_categoria.removeClass("invalid-feedback").text("");
    }
  });

  $("textarea[name=descrizione_interventi]").each(function () {
    var valore_descrizione = $(this).val();
    var errore_descrizione = $(this).next('.error_descrizione_interventi');
    if (!valore_descrizione) {
      $(this).addClass("is-invalid");
      errore_descrizione.addClass("invalid-feedback").text("Inserisci una breve descrizione per l'intervento.");
      errori_piano_degli_investimenti++;
    } else {
      $(this).removeClass("is-invalid");
      errore_descrizione.removeClass("invalid-feedback").text("");
    }
  });

  $("input[name=importo_previsto_imponibile]").each(function () {
    var v = $(this).val();
    var err = $(this).next('.error_importo_previsto_imponibile');
    if (!v) {
      $(this).addClass("is-invalid"); err.addClass("invalid-feedback").text("Inserisci l'importo.");
      errori_piano_degli_investimenti++;
    } else if (!regex.test(v)) {
      $(this).addClass("is-invalid"); err.addClass("invalid-feedback").text("Importo non valido.");
      errori_piano_degli_investimenti++;
    } else {
      $(this).removeClass("is-invalid"); err.removeClass("invalid-feedback").text("");
    }
  });

  $("input[name=aliquota_contributo]").each(function () {
    var v = $(this).val();
    var err = $(this).next('.error_aliquota_contributo');
    if (!v) {
      $(this).addClass("is-invalid"); err.addClass("invalid-feedback").text("Inserisci l'aliquota.");
      errori_piano_degli_investimenti++;
    } else if (!regex.test(v)) {
      $(this).addClass("is-invalid"); err.addClass("invalid-feedback").text("Importo non valido.");
      errori_piano_degli_investimenti++;
    } else {
      $(this).removeClass("is-invalid"); err.removeClass("invalid-feedback").text("");
    }
  });

  $("input[name=contributo_richiesto]").each(function () {
    var v = $(this).val();
    var err = $(this).next('.error_contributo_richiesto');
    if (!v) {
      $(this).addClass("is-invalid"); err.addClass("invalid-feedback").text("Inserisci l'importo.");
      errori_piano_degli_investimenti++;
    } else if (!regex.test(v)) {
      $(this).addClass("is-invalid"); err.addClass("invalid-feedback").text("Importo non valido.");
      errori_piano_degli_investimenti++;
    } else {
      $(this).removeClass("is-invalid"); err.removeClass("invalid-feedback").text("");
    }
  });

  /* 3) Tabella 2 – PST */
  var regexEuro = /^\d+(\.\d{1,2})?$/;
  function parseEuro(val) {
    if (typeof val !== "string") return NaN;
    val = val.replace(/\./g, "");
    const n = Number(val);
    return isNaN(n) ? NaN : n;
  }
  var pstCol = $("#pst_colture").val() ? $("#pst_colture").val().trim() : "";
  var pstAz = $("#pst_aziendale").val() ? $("#pst_aziendale").val().trim() : "";
  var vCol = parseEuro(pstCol);
  var vAz = parseEuro(pstAz);

  if (!pstCol || !regexEuro.test(pstCol) || vCol < 0) {
    $("#pst_colture").addClass("is-invalid");
    $("#err_pst_colture").text("Inserisci un importo valido.").removeClass("d-none");
    errori_piano_degli_investimenti++;
  } else {
    $("#pst_colture").removeClass("is-invalid");
    $("#err_pst_colture").addClass("d-none").text("");
  }

  if (!pstAz || !regexEuro.test(pstAz) || vAz < 0) {
    $("#pst_aziendale").addClass("is-invalid");
    $("#err_pst_aziendale").text("Inserisci un importo valido.").removeClass("d-none");
    errori_piano_degli_investimenti++;
  } else if (!isNaN(vCol) && !isNaN(vAz) && vAz < vCol) {
    $("#pst_aziendale").addClass("is-invalid");
    $("#err_pst_aziendale").text("Il PST aziendale non può essere inferiore al PST colture.")
      .removeClass("d-none");
    errori_piano_degli_investimenti++;
  } else {
    $("#pst_aziendale").removeClass("is-invalid");
    $("#err_pst_aziendale").addClass("d-none").text("");
  }

  /* 4) Fascicolo aziendale */
  var fasc = $("#numero_fascicolo").val();
  if (!fasc || Number(fasc) < 1 || !/^\d+$/.test(fasc)) {
    $("#numero_fascicolo").addClass("is-invalid");
    $("#err_numero_fascicolo").text("Inserisci un numero valido.").removeClass("d-none");
    errori_piano_degli_investimenti++;
  } else {
    $("#numero_fascicolo").removeClass("is-invalid");
    $("#err_numero_fascicolo").addClass("d-none").text("");
  }
  /*
    // === ALIQUOTA GLOBALE SU TOTALE IMPONIBILE + CAP 30.000 ===
    const MAX_CONTRIBUTO = 30000;
    const $msgCap = $("#msg_cap_30000");
    $msgCap.addClass("d-none");    // reset visibilità
  
    // accetta sia 12.34 che 12,34
    const parseNum = (s) =>
      Number(String(s || "").replace(/\./g, "").replace(",", "."));
    const fmt2 = (n) => (isNaN(n) ? "" : n.toFixed(2));
  
    // 1) Sommo l’imponibile di tutte le righe valide
    let totImponibile = 0;
    $('#investimenti tbody tr[id^="categoria_interventi_"]').each(function () {
      const imp = parseNum($(this).find('input[name="importo_previsto_imponibile"]').val() || "");
      if (!isNaN(imp) && imp > 0) totImponibile += imp;
    });
  
    // ✅ Aliquota FISSA al 50%
    const aliquotaReale = 50;
  
    // 3) Applico SEMPRE il 50% alle righe
    let totaleContributo = 0;
    $('#investimenti tbody tr[id^="categoria_interventi_"]').each(function () {
      const $row = $(this);
      const $imp = $row.find('input[name="importo_previsto_imponibile"]');
      const $aliq = $row.find('input[name="aliquota_contributo"]');     // campo Aliquota
      const $contr = $row.find('input[name="contributo_richiesto"]');
  
      const imp = parseNum($imp.val() || "");
      if (!isNaN(imp) && imp > 0) {
        // imposto 50,00 sull’aliquota
        $aliq.val(fmt2(aliquotaReale)).removeClass("is-invalid");
        $row.find(".error_aliquota_contributo").removeClass("invalid-feedback").text("");
  
        const contr = imp * (aliquotaReale / 100);
        $contr.val(fmt2(contr))
          .attr("title", `${fmt2(aliquotaReale)}% di ${fmt2(imp)}`)
          .removeClass("is-invalid");
        $row.find(".error_contributo_richiesto").removeClass("invalid-feedback").text("");
  
        totaleContributo += contr;
      }
    });
  
    // 4) Aggiorno il totale in basso
    $("#contributo_richiesto")
      .attr("valore", totaleContributo)
      .text(fmt2(totaleContributo));
  
    $("#aliquota_contributo")
      .attr("valore", aliquotaReale)
      .text(fmt2(aliquotaReale));
  
    // 5) Controllo solo il CAP a 30.000 € (60000 * 50%)
    if (totImponibile > 60000) {
      $msgCap.removeClass("d-none");
     // errori_piano_degli_investimenti++;
    }
     */
  /* 5) Badge sezione */
  var string_errori = (errori_piano_degli_investimenti == 1) ? " errore" : " errori";
  var string_verbo = (errori_piano_degli_investimenti == 1) ? " è " : " sono ";

  $("#piano-investimenti .accordion-header button")
    .removeClass("background-color-success-accordion background-color-error-accordion");
  $("#validazione_sezione_piano_investimenti").removeClass("badge text-bg-error text-bg-success");

  if (errori_piano_degli_investimenti == 0) {
    $("#validazione_sezione_piano_investimenti").text("Sezione Compilata Correttamente")
      .addClass("badge text-bg-success");
    $("#piano-investimenti .accordion-header button").addClass("background-color-success-accordion");
  } else {
    $("#validazione_sezione_piano_investimenti")
      .text("Vi " + string_verbo + errori_piano_degli_investimenti + string_errori)
      .addClass("badge text-bg-error");
    $("#piano-investimenti .accordion-header button").addClass("background-color-error-accordion");
  }

  return errori_piano_degli_investimenti;
}
/*==== FUNZIONE CHECK PIANO DEGLI INVESTIMENTI ====*/

function calcola_totale_opzionale_crea_files() {
  var importo_previsto_imponibile = $("input[name=importo_previsto_imponibile_opzionale]");
  var valore_importo_previsto_imponibile_totale = 0;
  importo_previsto_imponibile.each(function () {
    var valore_importo_previsto_imponibile_singolo = $(this).val();
    valore_importo_previsto_imponibile_totale += valore_importo_previsto_imponibile_singolo * 1;
  });

  var aliquota_contributo = $("input[name=aliquota_contributo_opzionale]");
  var valore_aliquota_contributo_totale = 0;
  aliquota_contributo.each(function () {
    var valore_aliquota_contributo_singolo = $(this).val();
    valore_aliquota_contributo_totale = valore_aliquota_contributo_singolo * 1;
  });

  /*
  var aliquota_contributiva_iva = $("input[name=aliquota_contributiva_iva_opzionale]");
  var valore_aliquota_contributiva_iva_totale = 0;
  aliquota_contributiva_iva.each(function(){
      var valore_aliquota_contributiva_iva_singolo = $(this).val();
      valore_aliquota_contributiva_iva_totale += valore_aliquota_contributiva_iva_singolo*1;
  });
  */

  var contributo_richiesto = $("input[name=contributo_richiesto_opzionale]");
  var valore_contributo_richiesto_totale = 0;
  contributo_richiesto.each(function () {
    var valore_contributo_richiesto_singolo = $(this).val();
    valore_contributo_richiesto_totale += valore_contributo_richiesto_singolo * 1;
  });

  if ((Math.round(valore_aliquota_contributo_totale * 100) / 100) >= ((Math.round(1.25 * valore_contributo_richiesto_totale * 100) / 100))) {
    $("#importo_previsto_totale_condizionale").attr("valore", (Math.round(valore_importo_previsto_imponibile_totale * 100) / 100).toFixed(2));
    $("#importo_previsto_totale_condizionale").text((Math.round(valore_importo_previsto_imponibile_totale * 100) / 100).toFixed(2));
    $("#aliquota_contributo_condizionale").attr("valore", (Math.round(valore_aliquota_contributo_totale * 100) / 100).toFixed(2));
    $("#aliquota_contributo_condizionale").text((Math.round(valore_aliquota_contributo_totale * 100) / 100).toFixed(2));
    /*
    $("#aliquota_contributiva_condizionale").attr("valore", valore_aliquota_contributiva_iva_totale);
    $("#aliquota_contributiva_condizionale").text(valore_aliquota_contributiva_iva_totale);
    */
    $("#contributo_richiesto_condizionale").attr("valore", (Math.round(valore_contributo_richiesto_totale * 100) / 100).toFixed(2));
    $("#contributo_richiesto_condizionale").text((Math.round(valore_contributo_richiesto_totale * 100) / 100).toFixed(2));
    return 'corretto';
  }
  else {
    return 'errato';
  }
}

// Attiva/disattiva "required" in base alla tipologia selezionata
$(document).on("change", "input[name=tipo_richiedente]", function () {
  var tipo = $("input[name=tipo_richiedente]:checked").val(); // "ditta" | "societa"
  // di base: mostra ditta e nasconde societa' (come nel tuo HTML)
  if (tipo === "ditta") {
    $("#allegati_base").removeClass("d-none");
    $("#allegati_societa").addClass("d-none");
  } else {
    $("#allegati_base").removeClass("d-none");
    $("#allegati_societa").removeClass("d-none");
  }
});

/*==== FUNZIONE CHECK ALLEGATI PROGETTO ====*/
function check_sezione_allegati_progetto() {
  var errori = 0;
  var maxSize = 5 * 1024 * 1024;
  var allowedExtensions = /(\.pdf)$/i;
  var tipo = $("input[name=tipo_richiedente]:checked").val() || "ditta";

  function $byName(name) {
    return $('input[name="' + name + '"]');
  }
  function clearErr($inp) {
    $inp.removeClass("is-invalid");
    var $fb = $inp.siblings(".invalid-feedback");
    if ($fb.length) $fb.text("").removeClass("d-block");
  }
  function showErr($inp, msg) {
    $inp.addClass("is-invalid");
    var $fb = $inp.siblings(".invalid-feedback");
    if (!$fb.length) {
      $fb = $('<div class="invalid-feedback"></div>');
      $inp.after($fb);
    }
    $fb.text(msg).addClass("d-block");
  }
  function validaPdf(name, required) {
    var $inp = $byName(name);
    if (!$inp.length) return 0; // campo non esiste nel DOM
    clearErr($inp);
    var file = $inp[0].files ? $inp[0].files[0] : null;

    if (!file) {
      if (required) {
        showErr($inp, "Documento obbligatorio (PDF, max 5MB).");
        return 1;
      }
      return 0;
    }
    if (!allowedExtensions.test(file.name)) {
      showErr($inp, "Formato non valido. Caricare solo file .pdf.");
      return 1;
    }
    if (file.size > maxSize) {
      showErr($inp, "Il file deve essere inferiore a 5MB.");
      return 1;
    }
    return 0;
  }

  // === DITTA INDIVIDUALE: campi e obbligatorietà come da testo ===
  var campiDitta = [
    ["doc_identita", true],
    ["autorizzazione_proprietario", false],
    ["scheda_autovalutazione", true],
    ["doc_convalida_punteggio", true],
    ["relazione_agronomica", true],
    ["computo_metrico", true],
    ["planimetria_catastale", true],
    ["disegni_opere", true],
    ["perizia_congruita", false],
    ["valutazione_indipendente", false],
    ["analisi_prezzi", false],
    ["contratto_professionista", true],
    ["autorizzazioni_pareri", true],
    ["contratti_affitto_comodato", false],
    ["autocert_conoscenza_obblighi", true],
    ["autocert_iscrizioni_antimafia", true],
    ["autocert_no_doppie_agevolazioni", true],
    ["cert_destinazione_urbanistica", false],
    ["dich_no_altri_aiuti", true]
  ];

  // === SOCIETÀ/ASSOCIAZIONE/COOPERATIVA: 3 allegati aggiuntivi (obblig.) ===
  var campiSocieta = [
    ["atto_costitutivo_statuto", true],
    ["elenco_soci", true],
    ["delibera_organo_competente", true]
  ];

  // valida ditta (sempre visibile/valida)
  campiDitta.forEach(function (c) { errori += validaPdf(c[0], c[1]); });

  // valida anche i 3 extra se è selezionata "societa"
  if (tipo === "societa") {
    campiSocieta.forEach(function (c) { errori += validaPdf(c[0], c[1]); });
  } else {
    // se NON società, pulisci eventuali errori residui
    campiSocieta.forEach(function (c) { clearErr($byName(c[0])); });
  }

  // Aggiorna badge + header accordion
  var $badge = $("#validazione_allegati_progetto");
  var $headerBtn = $("#allegati-progetto .accordion-header button");

  $badge.removeClass("badge text-bg-success text-bg-error text-bg-danger");
  $headerBtn.removeClass("background-color-success-accordion background-color-error-accordion");

  if (errori === 0) {
    $badge.text("Sezione Compilata Correttamente").addClass("badge text-bg-success");
    $headerBtn.addClass("background-color-success-accordion");
  } else {
    var et = errori === 1 ? " errore" : " errori";
    var verbo = errori === 1 ? " è " : " sono ";
    $badge.text("Vi" + verbo + errori + et).addClass("badge text-bg-error");  // <-- usa text-bg-error
    $headerBtn.addClass("background-color-error-accordion");
  }

  return errori;
}
/*==== FUNZIONE CHECK ALLEGATI PROGETTO ====*/

/*==== FUNZIONE CHECK PRIVACY ====*/
function check_sezione_privacy() {
  var errori_privacy = 0;
  var valore = $("input[name=checkbox-policy]").val();
  if (valore == 1) {
    $(this).removeClass("is-invalid");
    $("#errore_accettazione_privacy").removeClass("invalid-feedback d-block");
    $("#errore_accettazione_privacy").text("");
  } else {
    $(this).addClass("is-invalid");
    $("#errore_accettazione_privacy").addClass("invalid-feedback d-block");
    $("#errore_accettazione_privacy").text("Devi accettare obbligatoriamente la privacy policy.");
    errori_privacy++;
  }
  var string_errori = " errore";
  var string_verbo = " è ";
  if (errori_privacy > 1) {
    string_errori = " errori";
    string_verbo = " sono "
  }

  $("#validazione_sezione_privacy_policy").removeClass("badge text-bg-error");
  $("#validazione_sezione_privacy_policy").removeClass("badge text-bg-success");
  $("#privacy-policy .accordion-header button").removeClass("background-color-error-accordion");
  $("#privacy-policy .accordion-header button").removeClass("background-color-success-accordion");
  if (errori_privacy == 0) {
    $("#validazione_sezione_privacy_policy").text("Sezione Compilata Correttamente");
    $("#validazione_sezione_privacy_policy").addClass("badge text-bg-success");
    $("#privacy-policy .accordion-header button").addClass("background-color-success-accordion");
  }
  else {
    $("#validazione_sezione_privacy_policy").text("Vi " + string_verbo + errori_privacy + string_errori);
    $("#validazione_sezione_privacy_policy").addClass("badge text-bg-error");
    $("#privacy-policy .accordion-header button").addClass("background-color-error-accordion");
  }

  return errori_privacy;
}
/*==== FUNZIONE CHECK PRIVACY ====*/

function getFormattedDate(date) {
  var date = date.split("-");
  var anno = date[0];
  var mese = date[1];
  var giorno = date[2];

  return giorno + '/' + mese + '/' + anno;
}

async function crea_file_pdf_blob() {

  function footer() {
    doc.setFont('PTSans', 'italic');
    if ($("#luogo_per_firma").val() !== "") {
      var luogo_firma = $("#luogo_per_firma").val();
      var data_firma = getFormattedDate($("#data_per_firma").val());
      doc.text(13, 220, 'Li ' + luogo_firma + '     Data ' + data_firma);
    }
    else {
      doc.text(13, 220, 'Li ___________________     Data ___________________');
    }
    doc.text(30, 240, 'Firma del Tecnico*');
    doc.text(120, 240, 'Firma del Beneficiario');
    doc.text(13, 270, '*Nella certezza di avere applicato al meglio le mie capacità professionali nella redazione della presente perizia,');
    doc.text(13, 275, 'confermo, sotto la mia responsabilità, l’autenticità e la certezza dei contenuti della relazione.');
  }

  function footer_prima_pagina() {
    //doc.text(13, 290, 'Pagina 1');
    doc.text(160, 290, 'Modello di domanda v.' + $("#versione").val());
  }

  function footer_seconda_pagina() {
    //doc.text(13, 290, 'Pagina 2');
    doc.text(160, 290, 'Modello di domanda v.' + $("#versione").val());
  }
  function footer_terza_pagina() {
    //doc.text(13, 290, 'Pagina 3');
    doc.text(160, 290, 'Modello di domanda v.' + $("#versione").val());
  }
  function footer_quarta_pagina() {
    //doc.text(13, 290, 'Pagina 4');
    doc.text(160, 290, 'Modello di domanda v.' + $("#versione").val());
  }
  function footer_quinta_pagina() {
    //doc.text(13, 290, 'Pagina 5');
    doc.text(160, 290, 'Modello di domanda v.' + $("#versione").val());
  }
  function footer_sesta_pagina() {
    //doc.text(13, 290, 'Pagina 6');
    doc.text(160, 290, 'Modello di domanda v.' + $("#versione").val());
  }

  var nome = $("#nome").val();
  var cognome = $("#cognome").val();
  var dataNascita = $("#data-nascita").val();
  var luogoNascita = $("#luogo-nascita").val();
  var provinciaNascita = $("#provincia-nascita").val();
  var cuua = $("input[name='cuua']").val();
  var residenza = $("#residenza").val();
  var provincia = $("#provincia").val();
  var indirizzo = $("#indirizzo").val();
  var civico = $("#civico").val();
  var pec = $("#pec").val();
  var email_aziendale = $("#email_aziendale").val();
  var telefono = $("#telefono").val();
  var qualifica = $("input[name='qualifica']:checked").val();
  var denominazione = $("#denominazione").val();
  var sede = $("#sede").val();
  var sede_indirizzo = $("#sede_indirizzo").val();
  var sede_civico = $("#civico_sede").val();
  var dipartimento_nome = $("#dipartimento_nome").text().trim();
  var dipartimento_email = $("#dipartimento_email").text().trim();
  var iban = $("#iban").val();
  var istitutoCredito = $("#istituto-credito").val();
  var agenzia_banca = $("#agenzia_banca").val();

  var numeroLocalizzazioni = $("#numero_localizzazioni_investimenti").val();
  var comuniLocalizzazioni = [$("#comune-localizzazione").val()];
  var provinciaLocalizzazione = [$("#provincia-localizzazione option:selected").text()];
  var fogli = [$("#foglio").val()];
  var particelle = [$("#particella").val()];
  for (let i = 2; i <= numeroLocalizzazioni; i++) {
    comuniLocalizzazioni.push($("#comune-localizzazione_" + i).val());
    fogli.push($("#foglio_" + i).val());
    particelle.push($("#particella_" + i).val());
  }

  var cciaRiferimento = $("#ccia-riferimento").val();
  var numeroRea = $("#numero-rea").val();
  var numeroInps = $("#numero-inps").val();
  var mesi_realizzazione = $("#tempo_realizzazione_investimenti").val();

  var antimafia = $("input[name='antimafia']:checked").val();

  var nomeTecnico = $("#nome-tecnico").val();
  var cognomeTecnico = $("#cognome-tecnico").val();
  var comuneStudio = $("#comune-studio-professionale").val();
  var provinciaStudio = $("#provincia-studio-professionale").val();
  var indirizzoStudio = $("#indirizzo-studio-professionale").val();
  var civicoStudio = $("#civico-studio-professionale").val();
  var recapitoTecnico = $("#recapito-tecnico").val();
  var pecTecnico = $("#pec-tecnico").val();
  var mailTecnico = $("#mail-tecnico").val();
  var provinciaOrdineTecnico = $("#provincia-ordine-tecnico").val();
  var ordineTecnico = $("#ordine-tecnico").val();
  var numeroIscrizioneOrdine = $("#numero-iscrizione-ordine-tecnico").val();
  var relazioneMotivazioni = "";

  var righe_investimenti = [];
  var righe_tabella = $("#investimenti tbody tr");
  var counter = 0;

  var header = [
    "Categoria Interventi",
    "Descrizione Interventi",
    "Importo Imponibile preventivato/computato",
    "Aliquota del contributo (max 50%)",
    "Contributo Richiesto"
  ];
  righe_tabella.each(function () {
    var id = $(this).attr("id");
    if (counter == 0) {
      righe_investimenti.push(header);
    }
    if (id.substring(0, 21) == "categoria_interventi_") {
      var categoria = $(this).find("td:eq(0) select option:selected");
      var descrizione_interventi = $(this).find("td:eq(1) textarea");
      var importo_previsto_imponibile = $(this).find("td:eq(2) input");
      var aliquota_contributo = $(this).find("td:eq(3) input");
      var contributo_richiesto = $(this).find("td:eq(4) input");
      righe_investimenti.push([
        categoria.text(), descrizione_interventi.val(), importo_previsto_imponibile.val(), aliquota_contributo.val(), contributo_richiesto.val()
      ]);
    }
    if (id == "totale_spdi") {
      var importo_previsto_imponibile_totale = $("#importo_previsto_totale").attr("valore");
      var aliquota_contributo_totale = $("#aliquota_contributo").attr("valore");
      var contributo_richiesto_totale = $("#contributo_richiesto").attr("valore");
      righe_investimenti.push([
        "Totale", "", importo_previsto_imponibile_totale, aliquota_contributo_totale, contributo_richiesto_totale,
      ]);
    }
    counter++;
  });

  //var numero_repertorio = $("#numero_di_repertorio").val();
  //var data_repertorio = getFormattedDate($("#data_di_repertorio").val());

  const { jsPDF } = window.jspdf;
  const doc = new jsPDF();
  var img = new Image()
  img = $("#png_regione_siciliana").attr("src");
  doc.addImage(img, 'png', 93, 5, 24, 30);
  doc.setFontSize('12');
  doc.setFont('PTSans', 'italic');
  doc.text("Regione Siciliana", 105, 38, 'center', '');

  function ensureY(doc, y, step = 7) {
    if (y + step > 280) { doc.addPage(); return 20; }
    return y;
  }
  // --- raccoglie gli allegati caricati nella sezione #allegati-progetto
  function getAllegatiProgetto() {
    // Se vuoi, puoi usare anche $('#collapseSix')
    const $sec = $('#allegati-progetto');
    const allegati = [];

    $sec.find('input[type="file"].file-pdf').each(function () {
      const el = this;
      const hasFile = el.files && el.files.length > 0;
      const isDisabled = $(this).prop('disabled');

      if (hasFile && !isDisabled) {
        const $label = $(this).closest('.mb-3').find('label.form-label').first();
        let titolo = ($label.text() || '').trim().replace(/\s+/g, ' ');
        if (titolo.endsWith('*')) titolo = titolo.slice(0, -1).trim();
        allegati.push({ titolo }); // niente filename
      }
    });

    return allegati;
  }

  // --- stampa l’elenco degli allegati caricati (solo titoli)
  function stampaAllegatiProgetto(doc, x, y) {
    const allegati = getAllegatiProgetto();

    doc.setFont('PTSans', 'bold');
    doc.setFontSize(12);
    y = ensureY(doc, y + 10);
    doc.text("ELENCO ALLEGATI CARICATI", x, y);

    doc.setFont('PTSans', 'normal');
    doc.setFontSize(11);

    if (allegati.length === 0) {
      y = ensureY(doc, y + 7);
      doc.text("— Nessun allegato caricato in questa sezione —", x, y);
      return y;
    }

    allegati.forEach((a, i) => {
      const righe = doc.splitTextToSize(`${i + 1}. ${a.titolo}`, 170);
      righe.forEach(r => { y = ensureY(doc, y + 6, 6); doc.text(r, x, y); });
      y = ensureY(doc, y + 3, 3);
    });
    return y;
  }

  /*==== PRIMA PAGINA ====*/
  var titolo_nuovo_prima_riga = "ASSESSORATO REGIONALE DELL’AGRICOLTURA, DELLO SVILUPPO";
  var titolo_nuovo_seconda_riga = "RURALE E DELLA PESCA MEDITERRANEA";
  var titolo_nuovo_terza_riga = "DIPARTIMENTO REGIONALE DELL’AGRICOLTURA";
  doc.text(titolo_nuovo_prima_riga, 104, 45, 'center', '');
  doc.text(titolo_nuovo_seconda_riga, 104, 50, 'center');
  doc.text(titolo_nuovo_terza_riga, 104, 55, 'center');

  var titolo_prima_riga = "Avviso per la realizzazione di progetti di investimento destinati a garantire la gestione sostenibile del ciclo integrato delle acque in attuazione";
  var titolo_seconda_riga = " dell’asse 2 azione POC 2_3_02_01 del Piano Operativo Complementare POC 2014/2020. (Avviso 2025)";
  doc.setFont('PTSans', 'normal');
  doc.setFontSize('12');
  doc.text(titolo_prima_riga, 20, 65);
  doc.text(titolo_seconda_riga, 11, 70);

  doc.setFont('PTSans', 'bold');
  doc.setFontSize('12')
  doc.text("FORMAT PRESENTAZIONE DOMANDA DI SOSTEGNO", 104, 80, 'center', '');
  doc.text(dipartimento_nome.toUpperCase(), 100, 90, 'left');
  doc.text(dipartimento_email, 99, 95, 'left');
  var currentY = 105;
  var sumY = 7;
  var x = 13;
  doc.text("SEZIONE ANAGRAFICA", 104, currentY, 'center', '');
  doc.setFont('PTSans', 'normal');
  doc.setFontSize('12');
  doc.text("Il/La sottoscritto/a:", x, (currentY += sumY) * 1);
  doc.text("Nome:  " + nome, x, (currentY += sumY) * 1);
  doc.text("Cognome:  " + cognome, 75, currentY);
  doc.text("Data di nascita:  " + getFormattedDate(dataNascita), x, (currentY += sumY) * 1);
  doc.text("Luogo di nascita:  " + luogoNascita + " (" + provinciaNascita + ")", x, (currentY += sumY) * 1);
  doc.text("CUAA:  " + cuua, x, (currentY += sumY) * 1);
  doc.text("residente a:  " + residenza + " (" + provincia + ")", x, (currentY += sumY) * 1);
  doc.text("Indirizzo:  " + indirizzo + " n." + civico, x, (currentY += sumY) * 1);
  doc.text("Email Aziendale:  " + email_aziendale, x, (currentY += sumY) * 1);
  doc.text("PEC Aziendale:  " + pec, x, (currentY += sumY) * 1);
  doc.text("Telefono/Cellulare:  " + telefono, x, (currentY += sumY) * 1);
  doc.text("Qualifica:  " + qualifica, x, (currentY += sumY) * 1);
  doc.text("Denominazione:  " + denominazione, x, (currentY += sumY) * 1);
  doc.text("Sede Legale in:  " + sede + ", " + sede_indirizzo + " n. " + sede_civico, x, (currentY += sumY) * 1);
  doc.text("Impresa agricola iscritta alla Camera di Commercio, Industria, Artigianato e Agricoltura(CCIAA), ", x, (currentY += sumY) * 1);
  doc.text("di " + cciaRiferimento + " al numero REA " + numeroRea + ";", x, (currentY += sumY) * 1);
  doc.text("impresa iscritta all'INPS al numero " + numeroInps + ";", x, (currentY += sumY) * 1);
  doc.setFont('PTSans', 'bold');
  doc.setFontSize('12');
  doc.setFont('PTSans', 'normal');
  doc.text("IBAN:  " + iban, x, (currentY += sumY) * 1);
  doc.text("Istituto di Credito:  " + istitutoCredito, x, (currentY += sumY) * 1);
  doc.text("Agenzia:  " + agenzia_banca, x, (currentY += sumY) * 1);
  doc.setFont('PTSans', 'italic');
  footer_prima_pagina();
  // === NUOVA SEZIONE "DICHIARA" ===

  doc.addPage();
  var currentY = 20;
  var sumY = 7;
  var x = 13;
  doc.setFont('PTSans', 'bold');
  doc.text("DICHIARA", 104, (currentY += sumY) * 1, 'center', '');
  doc.setFont('PTSans', 'normal');
  doc.setFontSize('12');
  // elenco dichiarazioni punto per punto
  const dichiarazioni = [
    "di essere piccola e media impresa (PMI) attiva nel settore della produzione agricola primaria;",
    "di non essere destinataria di un ordine di recupero pendente a seguito di una precedente decisione della Commissione europea che dichiara gli aiuti illegittimi e incompatibili con il mercato interno;",
    "di essere titolare di partita IVA con codice di attività agricola, essere iscritto ai registri della C.C.I.A.A., nella sezione speciale aziende agricole, essere iscritto all’INPS ed avere un titolo di piena disponibilità dei beni su cui realizzare gli investimenti;",
    "di essere in regola con la normativa antimafia;",
    "di possedere la capacità di contrarre con la pubblica amministrazione, nel senso che nei confronti del Beneficiario non sia stata applicata la sanzione interdittiva di cui all’art. 9, comma 2, lett. c), del decreto legislativo 8 giugno 2001 n. 231 e ss.mm.ii., o altra sanzione che comporti il divieto di contrarre con la pubblica amministrazione;",
    "di avere sede o unità produttiva locale destinataria dell’intervento nel territorio regionale. Per le imprese prive di sede o unità operativa in Sicilia al momento della domanda, detto requisito deve sussistere al momento del pagamento dell’aiuto concesso;",
    "di essere regolarmente iscritto, nei casi previsti dalla legge, nel registro delle imprese della C.C.I.A.A. territorialmente competente;",
    "di non trovarsi in una delle condizioni di difficoltà così come definite all’art. 2, punto 18, lett. da a) ad e) del Reg. (UE) 651/2014;",
    "di non essere stato destinatario, nei 3 anni precedenti alla data di pubblicazione dell’Avviso, di procedimenti amministrativi connessi ad atti di revoca per violazione del divieto di distrazione dei beni, per mancato mantenimento dell’unità produttiva localizzata in Sicilia, per accertata grave negligenza nella realizzazione dell’investimento o nel mancato raggiungimento degli obiettivi prefissati dall’iniziativa, per carenza dei requisiti essenziali, per irregolarità della documentazione prodotta imputabile al soggetto beneficiario e non sanabile, nonché nei casi di indebita percezione accertata con provvedimento giudiziale, e, in caso di aiuti rimborsabili, per mancato rispetto del piano di rientro;",
    "di possedere capacità di contrarre ovvero non essere stato destinatario di sanzione interdittiva o altra sanzione che comporti il divieto di contrarre con la pubblica amministrazione;",
    "di non essere stato destinatario di provvedimenti di sospensione dell’attività imprenditoriale o di provvedimenti interdittivi, intervenuti nell’ultimo biennio, alla contrattazione con le pubbliche amministrazioni o alla partecipazione a gare pubbliche;",
    "di non essere stato condannato con sentenza passata in giudicato o destinatario di decreto penale di condanna divenuto irrevocabile o sentenza di applicazione della pena su richiesta ai sensi dell’art. 444 c.p.p., per reati gravi in danno dello Stato o della Comunità che incidono sulla moralità professionale del legale rappresentante;",
    "di non avere in precedenza usufruito di altri finanziamenti pubblici finalizzati alla realizzazione, anche parziale, delle stesse attività previste nel progetto;",
    "di essere impresa attiva già al momento della presentazione della domanda."
  ];
  // stampa elenco puntato nel PDF
  doc.setFontSize(11);
  dichiarazioni.forEach(dich => {
    const lines = doc.splitTextToSize("- " + dich, 180);
    lines.forEach(linea => {
      doc.text(linea, x, (currentY += sumY) * 1);
    });
  });

  // spaziatura finale e campo "ALLEGA DOCUMENTO..."
  currentY += 3;
  doc.setFont('PTSans', 'bold');
  doc.text("ALLEGA DOCUMENTO DI RICONOSCIMENTO", 18, (currentY += sumY) * 1);
  doc.setFont('PTSans', 'normal');
  var checkBox = new jspdf.AcroFormCheckBox();
  checkBox.maxFontSize = 9;
  checkBox.readOnly = true;
  checkBox.height = 3;
  checkBox.width = 3;
  checkBox.x = x;
  checkBox.y = (currentY += sumY) * 1 - 3;
  doc.addField(checkBox);
  doc.setFontSize('12')
  doc.setFont('PTSans', 'bold');
  doc.text("ALLEGA DOCUMENTO DI RICONOSCIMENTO", 18, (currentY += sumY) * 1 - 7);

  doc.setFont('PTSans', 'italic');
  footer_prima_pagina();
  /*==== PRIMA PAGINA ====*/

  /*==== SECONDA PAGINA ====         doc.setFont('PTSans', 'bold');
      doc.setFontSize('12')
      doc.text("LOCALIZZAZIONE INVESTIMENTO", 104, (currentY+=sumY)*1, 'center', '');
      doc.setFont('PTSans', 'normal');
      doc.text("Investimento localizzato nel comune di " + comuneLocalizzazione + "(" + provinciaLocalizzazione + "),", x, (currentY+=sumY)*1);
      */
  doc.addPage();
  var currentY = 20;
  var sumY = 7;
  var x = 13;
  doc.setFont('PTSans', 'bold');
  doc.text("SEZIONE PIANO DEGLI INVESTIMENTI", 104, (currentY += sumY) * 1, 'center', '');
  doc.setFont('PTSans', 'normal');
  var stringa_sezione_piano_degli_investimenti = "Il tecnico " + nomeTecnico + " " + cognomeTecnico + ", con studio professionale nel comune di ";
  stringa_sezione_piano_degli_investimenti += comuneStudio + " (" + provinciaStudio + "), " + indirizzoStudio + " n." + civicoStudio;
  stringa_sezione_piano_degli_investimenti += ", telefono/cellulare " + recapitoTecnico + ", pec " + pecTecnico + ", " + " mail " + mailTecnico;
  stringa_sezione_piano_degli_investimenti += ", iscritto all’Ordine/Albo degli/dei " + ordineTecnico + " di " + provinciaOrdineTecnico + " al n. " + numeroIscrizioneOrdine;
  stringa_sezione_piano_degli_investimenti += " in esecuzione dell’incarico conferito dalla ditta di cui sopra, redige la presente perizia tecnico economica redatta nella forma di perizia asseverata ";
  stringa_sezione_piano_degli_investimenti += " bando per la realizzazione di progetti di investimento destinati a garantire la gestione sostenibile del ciclo integrato delle acque ";
  stringa_sezione_piano_degli_investimenti += " in attuazione dell’asse 2 azione POC 2_3_02_01 del Piano Operativo Complementare POC 2014/2020. (Avviso 2025).";
  var testo_suddiviso = doc.splitTextToSize(stringa_sezione_piano_degli_investimenti, 180);
  doc.text(testo_suddiviso, x, (currentY += sumY) * 1);
  doc.setFont('PTSans', 'bold');
  sumY = 45;
  doc.text("DICHIARA", 104, (currentY += sumY) * 1, 'center', '');
  sumY = 7;
  doc.setFont('PTSans', 'normal');

  for (let i = 0; i < numeroLocalizzazioni; i++) {
    doc.text("- che l’investimento previsto sarà localizzato nel comune di " + comuniLocalizzazioni[i] + " (" + provinciaLocalizzazione + "),", x, (currentY += sumY) * 1);
    doc.text("  foglio " + fogli[i] + " particelle " + particelle[i] + ".", x, (currentY += sumY) * 1);
  }

  doc.text("- che il tempo di realizzazione degli investimenti in sede di presentazione della domanda di sostegno", x, (currentY += sumY) * 1);
  doc.text("  è fissato in mesi " + mesi_realizzazione, x, (currentY += sumY) * 1);
  doc.text("- che gli interventi previsti sono stati i seguenti: ", x, (currentY += sumY) * 1);
  /*
  currentY = 110;
  doc.text("DICHIARA", 104, (currentY+=sumY)*1, 'center', '');
  doc.setFont('PTSans', 'normal');
  */
  doc.setFont('PTSans', 'bold');
  doc.text("Tab.1 - Piano degli investimenti", x, (currentY += sumY + 2) * 1);
  doc.setFont('PTSans', 'normal');
  doc.autoTable({
    startY: (currentY += sumY) * 1 - 5 * 1,
    body: righe_investimenti,
  });
  let finalY = doc.lastAutoTable.finalY + 5;
  var currentY = finalY;

  /*
  doc.text("  compilare sia nel caso in cui gli interventi previsti in fase di realizzazione definitiva siano uguali", x, (currentY+=sumY)*1);
  doc.text("  a quelli riportati nella tab.1 (in questo caso ricopiare i valori di tab.1) che nel caso in cui gli", x, (currentY+=sumY)*1);
  doc.text("  stessi siano oggetto di rimodulazione, riduzione, modifica o sostituzione in forza di quanto previsto", x, (currentY+=sumY)*1);
  doc.text("  dall’art. 6 del decreto di concessione del finanziamento.", x, (currentY+=sumY)*1);
  doc.text("  In tutti i casi sarà necessario caricare i documenti previsti nelle successive sezioni (computo metrico, ", x, (currentY+=sumY)*1);
  doc.text("  planimetria, preventivi, etc.).", x, (currentY+=sumY)*1);
  */
  footer_seconda_pagina();
  /*==== SECONDA PAGINA ====*/

  /*==== TERZA PAGINA ====*/
  doc.addPage();
  var currentY = 20;
  var sumY = 7;
  var x = 13;
  doc.setFont('PTSans', 'bold');
  doc.text("Tab.2 - Produzione Standard Totale dell’azienda", x, (currentY += sumY) * 1);
  doc.setFont('PTSans', 'normal');
  doc.setFontSize('12');

  // --- helper per formattazione importi ---
  // --- helper per formattazione importi ---
  const parseEuro = (s) => {
    if (s == null) return 0;
    let v = String(s).trim().replace(/\s/g, "");
    if (!v) return 0;

    const hasDot = v.includes(".");
    const hasComma = v.includes(",");

    if (hasDot && hasComma) {
      // es: 68.018,58 → 68018.58
      v = v.replace(/\./g, "").replace(",", ".");
    } else if (hasComma) {
      // es: 68018,58 → 68018.58
      v = v.replace(",", ".");
    } else if (hasDot) {
      // solo punti → migliaia o decimali
      const parts = v.split(".");
      if (parts.length > 2) {
        const last = parts.pop();
        v = parts.join("") + "." + last;
      } else if (parts[1].length === 3) {
        // es: 68.018 → 68018
        v = parts.join("");
      }
      // es: 68018.58 → lasciamo così
    }

    const n = Number(v);
    return isNaN(n) ? 0 : n;
  };

  const formatEuro = (n) =>
    new Intl.NumberFormat('it-IT', { minimumFractionDigits: 2, maximumFractionDigits: 2 }).format(n);


  // --- leggi i valori dalla tabella 2 HTML ---
  const pstColtureRaw = $("#pst_colture").val();
  const pstAziendaleRaw = $("#pst_aziendale").val();
  const numeroFascicolo = $("#numero_fascicolo").val();

  const pstColture = parseEuro(pstColtureRaw);
  const pstAziendale = parseEuro(pstAziendaleRaw);

  // --- dati tabella PST ---
  const produzioneStandardData = [
    ["Voce", "Importo (€)"],
    ["Produzione Standard Totale (colture e allevamenti)", formatEuro(pstColture)],
    ["Produzione Standard Totale Aziendale - PST", formatEuro(pstAziendale)],
  ];

  // --- stampa tabella ---
  doc.autoTable({
    startY: (currentY += sumY) * 1,
    body: produzioneStandardData,
  });

  finalY = doc.lastAutoTable.finalY + 7;
  currentY = finalY;

  // --- fascicolo aziendale ---
  if (numeroFascicolo && ("" + numeroFascicolo).trim().length > 0) {
    doc.text(
      "Dati desunti da fascicolo aziendale numero: " + numeroFascicolo,
      x, (currentY += sumY) * 1
    );
  }

  doc.setFont('PTSans', 'italic');
  footer_terza_pagina();
  /*==== TERZA PAGINA ====*/

  /*==== QUARTA PAGINA ====*/
  doc.addPage();
  var currentY = 20, sumY = 7, x = 13;
  doc.setFont('PTSans', 'bold');
  doc.setFontSize('12');
  doc.text("SEZIONE PUNTEGGIO", 104, (currentY += sumY), 'center', '');
  doc.setFont('PTSans', 'normal');
  const res = printPunteggiTable(doc, 'table.table-tight', {
    titolo: "Tab.3 — Criteri di selezione e punteggi",
    startX: x,
    startY: currentY
  });
  currentY = res.currentY + 5;
  footer_quarta_pagina();
  /*==== QUARTA PAGINA ====*/

  /*==== QUINTA PAGINA====*/
  doc.addPage();
  var currentY = 20;
  var sumY = 7;
  var x = 13;
  doc.setFont('PTSans', 'bold');
  doc.setFontSize('12');
  doc.text("SEZIONE ALLEGATI", 104, (currentY += sumY) * 1, 'center', '');
  doc.setFont('PTSans', 'normal');
  currentY = stampaAllegatiProgetto(doc, x, currentY);


  // doc.text("- Si allega alla presente copia dei titoli abilitativi.", x, (currentY+=sumY)*1);    
  var checkBox = new jspdf.AcroFormCheckBox();
  checkBox.maxFontSize = 9;
  checkBox.readOnly = true;
  checkBox.height = 3;
  checkBox.width = 3;
  checkBox.x = x;
  checkBox.y = (currentY += sumY) * 1 - 3;
  doc.addField(checkBox);
  doc.setFont('PTSans', 'bold');
  doc.text("Dichiaro di aver letto e compreso la Privacy Policy", 18, (currentY += sumY) * 1 - 7);
  doc.setFont('PTSans', 'bold');
  doc.setFont('PTSans', 'italic');
  footer_quinta_pagina();
  /*==== QUINTA PAGINA ====*/

  /*==== SESTA PAGINA ====
  doc.addPage();
  var currentY = 20;
  var sumY = 7;
  var x = 13;
  doc.setFont('PTSans', 'bold');
  doc.setFontSize('12')
  doc.text("SEZIONE ALLEGATI", 104, (currentY+=sumY)*1, 'center', '');

  doc.setFont('PTSans', 'italic');
  footer_sesta_pagina();
  /*==== SESTA PAGINA ====*/

  /*==== ULTIMA  PAGINA ====*/
  doc.addPage();
  var currentY = 20;
  var sumY = 8;
  var x = 13;
  doc.setFont('PTSans', 'bold');
  doc.setFontSize('12');
  footer();
  doc.setFont('PTSans', 'italic');
  /*==== ULTIMA PAGINA ====*/
  const versioneSan = ($("#versione").val() || "1").replace(".", "_");
  const basePdfName = NOMI_FILE_CHECKLIST.modulo_richiesta || "01_Modulo_Richiesta.pdf";

  // es: CUAA_01_Modulo_Richiesta_v1_0.pdf
  const filename = `${cuua}_${basePdfName.replace('.pdf', `_${versioneSan}.pdf`)}`;

  const blob = doc.output('blob');
  return { blob, filename };
}

function printPunteggiTable(doc, tableSelector, opts) {
  opts = opts || {};
  const $ = window.jQuery;

  const titolo = opts.titolo || "Tab.3 — Criteri di selezione e punteggi";
  const left = opts.startX == null ? (typeof x === "number" ? x : 13) : opts.startX;
  const right = 13;
  let y = opts.startY == null ? (typeof currentY === "number" ? currentY + (typeof sumY === "number" ? sumY : 7) : 27) : opts.startY;
  const onlySelected = !!opts.onlySelected;

  const pageW = doc.internal.pageSize.getWidth();
  const pageH = doc.internal.pageSize.getHeight();
  const availW = pageW - left - right;

  const widths = [0.20, 0.20, 0.20, 0.20, 0.20].map(p => +(availW * p).toFixed(2));

  const _ensureY = (docObj, y0, step = 7) => {
    const limit = pageH - 20;
    if (typeof ensureY === "function") return ensureY(docObj, y0, step);
    if (y0 + step > limit) { docObj.addPage(); return 20; }
    return y0;
  };

  // ---- helper pulizia e parsing ----
  const cleanText = ($td) => {
    if (!$td || !$td.length) return "";
    const c = $td.clone();
    // sostituisci <a> con testo/href per mantenere i link leggibili
    c.find('a').each(function () {
      const $a = $(this);
      const t = ($a.text() || $a.attr('href') || '').trim();
      $a.replaceWith(t);
    });
    c.find('input,div.form-file-hint').remove();
    return c.text().replace(/\s+\n/g, " ").replace(/\s+/g, " ").trim();
  };
  const getPointsFromCell = ($td) => {
    const c = $td.clone(); c.children().remove();
    const m = c.text().match(/(-?\d+)(?:[^\d]|$)/);
    return m ? parseInt(m[1], 10) : 0;
  };
  /*
  const listFilesInCell = ($td) => {
    const out = [];
    if (!$td || !$td.length) return out;
    $td.find('input[type="file"]').each(function(){
      const el = this;
      if (el.files && el.files.length) for (const f of el.files) out.push(f.name);
    });
    return out;
  };
  */

  const listFilesInCell = ($td) => {
    const out = [];
    if (!$td || !$td.length) return out;
    $td.find('input[type="file"]').each(function () {
      const el = this;
      if (el.files && el.files.length) for (const f of el.files) out.push(f.name);
    });
    return out;
  };

  const makeRow = () => Array.from({ length: 5 }, () => ({ content: "" }));

  const $table = $(tableSelector);
  if (!$table.length) return { currentY: y };

  // head
  const head = [[
    "Principi\ndi\nselezione",
    "Criterio di valutazione",
    "Descrizione",
    "Segna\nPunteggio",
    "Documentazione per il riconoscimento del\npunteggio"
  ]];

  const body = [];

  // contatori *residui* per simulare i rowspan dell'HTML
  // (quante righe successive appartengono ancora allo stesso blocco)
  let leftC1 = 0, leftC2 = 0, leftC5 = 0;

  const trs = $table.find("tbody > tr").toArray();

  for (let r = 0; r < trs.length; r++) {
    const $tr = $(trs[r]);
    const $tds = $tr.children("td");
    if (!$tds.length) continue;

    // riga Totale (ha il #totale_punteggio)
    const isTot = $tr.hasClass("table-light") || $tr.find("#totale_punteggio").length > 0;
    if (isTot) {
      const labelTotale = cleanText($tr.find('td').eq(0));
      const totaleHtml = ($("#totale_punteggio").text() || "0").trim();
      body.push([
        { content: labelTotale, colSpan: 3, styles: { fontStyle: 'bold' } },
        { content: totaleHtml, styles: { halign: 'center', fontStyle: 'bold' } },
        { content: "" }
      ]);
      continue;
    }

    // colonna punteggio = td che contiene una checkbox
    const idxP = $tds.toArray().findIndex(td => $(td).find('input[type="checkbox"]').length > 0);
    if (idxP === -1) continue;

    const $tdP = $tds.eq(idxP);
    const $tdDescr = $tds.eq(idxP - 1);
    const before = $tds.slice(0, idxP - 1);
    const after = ($tds.length > idxP + 1) ? $tds.eq(idxP + 1) : null;

    let $tdC1 = null, $tdC2 = null;
    if (before.length === 2) { $tdC1 = before.eq(0); $tdC2 = before.eq(1); }
    else if (before.length === 1) {
      $tdC1 = before.eq(0).is('.vertical-td') ? before.eq(0) : null;
      $tdC2 = $tdC1 ? null : before.eq(0);
    }

    const row = makeRow();

    // --- Col 0: Principi (SIMULAZIONE ROWSPAN: nessun rowSpan reale) ---
    if ($tdC1 && $tdC1.length) {
      const rs = parseInt($tdC1.attr('rowspan') || "1", 10);
      const content = cleanText($tdC1);
      // testo verticale solo sulla PRIMA riga del blocco
      row[0] = (rs > 1)
        ? { content, custom: { vertical: true } }
        : { content };
      leftC1 = Math.max(0, rs - 1);
    } else {
      // se siamo dentro al blocco, lascia vuoto; altrimenti vuoto
      row[0] = (leftC1 > 0) ? { content: "" } : { content: "" };
    }

    // --- Col 1: Criterio (SIMULAZIONE ROWSPAN) ---
    if ($tdC2 && $tdC2.length) {
      const rs = parseInt($tdC2.attr('rowspan') || "1", 10);
      const content = cleanText($tdC2);
      row[1] = { content }; // prima riga del blocco
      leftC2 = Math.max(0, rs - 1);
    } else {
      row[1] = (leftC2 > 0) ? { content: "" } : { content: "" };
    }

    // --- Col 2: Descrizione (sempre presente) ---
    row[2] = { content: cleanText($tdDescr) };

    // --- Col 3: Punteggio numerico ---
    const points = getPointsFromCell($tdP);
    const checked = $tdP.find('input[type="checkbox"]').is(':checked');
    if (onlySelected && !checked) {
      // aggiornare i residui quando si salta la riga
      if (leftC1 > 0) leftC1--;
      if (leftC2 > 0) leftC2--;
      if (leftC5 > 0) leftC5--;
      continue;
    }
    row[3] = { content: checked ? String(points) : "0", styles: { halign: 'center' } };

    // --- Col 4: Documentazione (SIMULAZIONE ROWSPAN) ---
    const $tdDoc = after;
    // INSERT CONDITION FOR CONSIDERING ONLY CHECKS BEFORE INSERTING FILES and ALLEGA ...
    if ($tdDoc && $tdDoc.length) {
      const rs = parseInt($tdDoc.attr('rowspan') || "1", 10);
      const base = cleanText($tdDoc);
      const files = listFilesInCell($tdDoc);
      const content = files.length ? (base ? base + "\n— " : "— ") + files.join("\n— ") : base;
      row[4] = { content }; // prima riga del blocco
      leftC5 = Math.max(0, rs - 1);
    } else {
      row[4] = (leftC5 > 0) ? { content: "" } : { content: "" };
    }

    body.push(row);

    // decrementa i residui dei blocchi
    if (leftC1 > 0) leftC1--;
    if (leftC2 > 0) leftC2--;
    if (leftC5 > 0) leftC5--;
  }

  // ---- stampa ----
  y = _ensureY(doc, y, 10); y += 10;
  doc.setFont('PTSans', 'bold');
  doc.text(titolo, left, y);
  doc.setFont('PTSans', 'normal');
  doc.setFontSize('12');

  doc.autoTable({
    startY: y + 4,
    margin: { left, right },
    tableWidth: availW,
    head, body,
    theme: 'grid',
    styles: { valign: 'top', overflow: 'linebreak', cellPadding: 3, minCellHeight: 6 },
    headStyles: { halign: 'left' },
    bodyStyles: { fontSize: 9 },
    columnStyles: {
      0: { cellWidth: widths[0], halign: 'center', valign: 'middle' },
      1: { cellWidth: widths[1] },
      2: { cellWidth: widths[2] },
      3: { cellWidth: widths[3], halign: 'center' },
      4: { cellWidth: widths[4] }
    },
    rowPageBreak: 'auto',
    didParseCell: function (data) {
      // riga "Totale"
      if (Array.isArray(data.row.raw) && data.row.raw[0] && data.row.raw[0].colSpan === 3) {
        data.cell.styles.fillColor = [245, 245, 245];
        data.cell.styles.fontStyle = 'bold';
      }
    },
    didDrawCell: function (data) {
      // disegna verticale la colonna 0 quando richiesto
      const raw = data.cell && data.cell.raw;
      if (raw && raw.custom && raw.custom.vertical) {
        const text = String(raw.content || "");
        if (text) {
          const cx = data.cell.x + data.cell.width / 2;
          const cy = data.cell.y + data.cell.height / 2;
          doc.text(text, cx, cy, { angle: 90, align: 'center' });
          data.cell.text = []; // evita il testo orizzontale
        }
      }
    }
  });

  const finalY = (doc.lastAutoTable && doc.lastAutoTable.finalY) ? doc.lastAutoTable.finalY : y;
  if (typeof currentY === "number") currentY = finalY;
  return { currentY: finalY };
}

async function crea_excel(codice) {
  return await riempi(codice);
}

// helper per nomi e buffer
const safeFileName = (s) => (s || "file").toString().trim().replace(/\s+/g, "_");
const fileToArrayBuffer = (f) => f.arrayBuffer ? f.arrayBuffer() : new Promise((res, rej) => {
  const r = new FileReader(); r.onload = () => res(r.result); r.onerror = rej; r.readAsArrayBuffer(f);
});

async function download_allegati_punteggio(codice, opts = {}) {
  const versione = ($("#versione").val() || "1").replace(".", "_");

  const nomiFilePunteggio = [
    "doc_ps_terr", "doc_giovane", "doc_iap_cd",
    "doc_prima_partecipazione", "doc_pst", "doc_invaso", "doc_cantierabili"
  ];

  const possibiliWrapper = ["#sezione-punteggio", "#sezione_punteggio", "[data-area='punteggio']"];
  let inputs = [];
  for (const wrap of possibiliWrapper) {
    const list = document.querySelectorAll(`${wrap} input[type="file"]`);
    if (list.length) { inputs = Array.from(list); break; }
  }
  if (!inputs.length) {
    nomiFilePunteggio.forEach((name) => {
      document.querySelectorAll(`input[name="${name}"]`).forEach(el => inputs.push(el));
    });
  }
  if (!inputs.length) { console.warn("Nessun file della sezione punteggio trovato."); return; }

  for (const input of inputs) {
    if (!input.files || !input.files.length) continue;
    const f = input.files[0];
    const key = input.name; // es. "doc_ps_terr"
    const base = NOMI_FILE_CHECKLIST[key] || (safeFileName(key) + ".pdf");

    const nome = `${codice}_${base.replace('.pdf', `_${versione}.pdf`)}`;
    // se mi passi uno zip, aggiungo al folder; altrimenti scarico singolo
    if (opts.zip) {
      const folder = opts.zip.folder(opts.folderName || "documentazione_punteggio");
      folder.file(nome, await fileToArrayBuffer(f));
    } else {
      saveAs(new File([f], nome, { type: f.type || "application/pdf" }));
    }
  }
}

async function download_allegati_progetto(codice, opts = {}) {
  const inputs = document.querySelectorAll('input[type="file"]');
  const versione = ($("#versione").val() || "1").replace(".", "_");
  if (!inputs.length) { console.warn("Nessun campo file trovato."); return; }

  // evita di duplicare i file di punteggio nello stesso ZIP
  const exclude = new Set(opts.excludeNames || [
    "doc_ps_terr", "doc_giovane", "doc_iap_cd",
    "doc_prima_partecipazione", "doc_pst", "doc_invaso", "doc_cantierabili"
  ]);

  for (const input of inputs) {
    if (!input.files || !input.files.length) continue;
    if (opts.zip && exclude.has(input.name)) continue; // saltali nello ZIP degli "allegati_progetto"

    const file = input.files[0];
    const key = input.name || "file";
    const base = NOMI_FILE_CHECKLIST[key] || (safeFileName(key) + ".pdf");

    const nomeFile = `${codice}_${base.replace('.pdf', `_${versione}.pdf`)}`;

    if (opts.zip) {
      const folder = opts.zip.folder(opts.folderName || "allegati_progetto");
      folder.file(nomeFile, await fileToArrayBuffer(file));
    } else {
      const blob = file.slice(0, file.size, file.type);
      const newFile = new File([blob], nomeFile, { type: file.type });
      saveAs(newFile);
    }
  }
}


async function crea_zip_completo(codice) {
  const zip = new JSZip();
  const versione = ($("#versione").val() || "1").replace(".", "_");

  // 1) cartella "documentazione_punteggio"
  await download_allegati_punteggio(codice, { zip, folderName: "documentazione_punteggio" });

  // 2) cartella "allegati_progetto" (senza duplicare i file punteggio)
  await download_allegati_progetto(codice, { zip, folderName: "allegati_progetto" });

  // 2.5) Modulo_Richiesta (dal blob) – in ROOT
  try {
    const res = await crea_file_pdf_blob();
    if (!res || !res.blob) {
      console.warn("⚠️ Modulo_Richiesta non generato: crea_file_pdf_blob() non ha restituito blob.");
    } else {
      const pdfName = res.filename || "Modulo_Richiesta.pdf";
      const ab = res.blob.arrayBuffer ? await res.blob.arrayBuffer() : await fileToArrayBuffer(res.blob);
      zip.file(pdfName, ab);
      console.log("✅ Modulo_Richiesta aggiunto allo ZIP:", pdfName);
    }
  } catch (e) {
    console.error("❌ Errore creando il Modulo_Richiesta:", e);
  }


  // Se hai un <a id="pdf_privacy_policy" href="includes/Informativa_Privacy.pdf">
  const a = document.getElementById("pdf_privacy_policy");
  if (a && a.href) {
    try {
      // Provo a leggere il PDF via fetch
      const resp = await fetch(a.href);
      if (resp.ok) {
        const buf = await resp.arrayBuffer();
        const basePrivacy = NOMI_FILE_CHECKLIST.privacy_policy || "03_Informativa_Privacy.pdf";
        const privacyName = `${codice}_${basePrivacy.replace('.pdf', `_${versione}.pdf`)}`;
        zip.file(privacyName, buf);
      } else {
        console.warn("⚠️ Privacy non trovata:", a.href);
      }
    } catch (e) {
      console.warn("⚠️ Non posso leggere la Privacy (probabilmente pagina offline):", e);
    }
  } else {
    console.warn("⚠️ Link privacy non trovato o senza href");
  }
  // Excel generato in root dello ZIP, con nome allineato alla checklist
  if (LAST_EXCEL && LAST_EXCEL.blob) {
    const ab = LAST_EXCEL.blob.arrayBuffer
      ? await LAST_EXCEL.blob.arrayBuffer()
      : await fileToArrayBuffer(LAST_EXCEL.blob);

    const baseExcel = NOMI_FILE_CHECKLIST.excel_verbale || "02_Verbale_Istruttoria.xlsx";
    const excelName = `${codice}_${baseExcel.replace('.xlsx', `_${versione}.xlsx`)}`;

    zip.file(excelName, ab);
    console.log("✅ Excel aggiunto allo ZIP:", excelName);
  } else {
    console.warn("⚠️ Excel non trovato. Hai fatto await su crea_excel()?");
  }

  const blob = await zip.generateAsync({ type: "blob" });
  saveAs(blob, `${codice}_Documentazione_POC_${versione}.zip`);
}

$(document).ready(function () {

  // Definizione dei gruppi mutuamente esclusivi
  const gruppiEsclusivi = ["ps_terr[]", "pst_dim", "capacita_invaso"];

  gruppiEsclusivi.forEach((name) => {
    const $checks = $(`input[name='${name}']`);

    // Ogni volta che clicco una spunta nel gruppo
    $checks.on("change", function () {
      if ($(this).is(":checked")) {
        // Disabilita tutte le altre
        $checks.not(this).prop("disabled", true);
      } else {
        // Se deseleziono, riattiva tutte
        $checks.prop("disabled", false);
      }
    });
  });

});