{"id":192,"date":"2026-01-21T00:23:25","date_gmt":"2026-01-20T23:23:25","guid":{"rendered":"https:\/\/www.comunedicaivano.it\/servizidigitali\/?page_id=192"},"modified":"2026-02-11T23:36:08","modified_gmt":"2026-02-11T22:36:08","slug":"calcolo-costo-del-servizio","status":"publish","type":"page","link":"https:\/\/www.comunedicaivano.it\/servizidigitali\/calcolo-costo-del-servizio\/","title":{"rendered":"TARIFFE CANONE UNICO PATRIMONIALE ANNO 2026"},"content":{"rendered":"\n<div class=\"wp-block-buttons is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-fe48e5de wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link has-bianco-color has-text-color has-link-color has-normal-font-size has-text-align-center has-custom-font-size wp-element-button\" href=\"https:\/\/comune.caivano.na.it\/pagamenti-elettronici-pagopa\/\" style=\"font-style:normal;font-weight:500\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>Clicca per procedere al pagamento elettronico PagoPa del Comune di Caivano<\/strong><\/a><\/div>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<div class=\"wp-block-file\"><a id=\"wp-block-file--media-8925b887-83a0-47b0-b9e5-5eb28d854a94\" href=\"https:\/\/www.comunedicaivano.it\/servizidigitali\/wp-content\/uploads\/2026\/02\/TARIFFE-CUP-2026.pdf\">TARIFFE CUP 2026<\/a><a href=\"https:\/\/www.comunedicaivano.it\/servizidigitali\/wp-content\/uploads\/2026\/02\/TARIFFE-CUP-2026.pdf\" class=\"wp-block-file__button wp-element-button\" download aria-describedby=\"wp-block-file--media-8925b887-83a0-47b0-b9e5-5eb28d854a94\">Download<\/a><\/div>\n\n\n\n<div class=\"wp-block-file\"><a id=\"wp-block-file--media-8f392bb0-6cb6-44b2-8cf3-274af2947089\" href=\"https:\/\/www.comunedicaivano.it\/servizidigitali\/wp-content\/uploads\/2026\/02\/Regolamento-Canone-Unico-Patrimoniale.pdf\">Regolamento Canone Unico Patrimoniale<\/a><a href=\"https:\/\/www.comunedicaivano.it\/servizidigitali\/wp-content\/uploads\/2026\/02\/Regolamento-Canone-Unico-Patrimoniale.pdf\" class=\"wp-block-file__button wp-element-button\" download aria-describedby=\"wp-block-file--media-8f392bb0-6cb6-44b2-8cf3-274af2947089\">Download<\/a><\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<section class=\"container my-5\" id=\"calcolo-bollettino\">\n  <h2 class=\"mb-3\">Calcolo importo bollettino<\/h2>\n  <p class=\"text-muted\">\n    Seleziona il servizio e compila i dati richiesti. Il totale viene calcolato automaticamente.\n  <\/p>\n\n  <div class=\"alert alert-info\">\n    <strong>Totale da pagare:<\/strong> <span id=\"totaleEuro\">\u20ac 0,00<\/span>\n    <div class=\"small text-muted mt-1\" id=\"totaleDettaglio\">\u2014<\/div>\n  <\/div>\n\n  <form class=\"row g-3\" onsubmit=\"return false;\">\n    <!-- SERVIZIO PRINCIPALE -->\n    <div class=\"col-12 col-md-8\">\n      <label class=\"form-label\" for=\"servizio\">Servizio *<\/label>\n      <select class=\"form-select\" id=\"servizio\" required>\n        <option value=\"\" selected disabled>Seleziona\u2026<\/option>\n\n        <!-- Accesso agli atti tariffa fissa -->\n        <option value=\"accesso_atti\">Accesso agli atti &#8211; \u20ac 50,00<\/option>\n\n        <option value=\"cdu\">CDU (Certificato Destinazione Urbanistica) &#8211; \u20ac 120,00 ogni 4 particelle<\/option>\n        <option value=\"lampade_votive\">Lampade votive &#8211; \u20ac 18,30<\/option>\n\n        <option value=\"servizi_cimiteriali\">Servizi cimiteriali (tariffe fisse)<\/option>\n\n        <option value=\"osp_inferiore_anno\">Occupazione suolo pubblico &#8211; inferiore all\u2019anno (CUP 2026)<\/option>\n        <option value=\"osp_superiore_anno\">Occupazione suolo pubblico &#8211; superiore all\u2019anno (CUP 2026)<\/option>\n\n        <option value=\"pubblicita_annuale\">Esposizioni pubblicitarie &#8211; annuale (CUP 2026)<\/option>\n        <option value=\"pubblicita_temporanea\">Esposizioni pubblicitarie &#8211; temporanea (CUP 2026)<\/option>\n\n        <option value=\"affissioni_pubbliche\">Affissioni pubbliche (CUP 2026)<\/option>\n        <option value=\"canone_mercatale\">Canone mercatale (CUP 2026)<\/option>\n      <\/select>\n    <\/div>\n\n    <!-- ========== BLOCCO: ACCESSO AGLI ATTI ========== -->\n    <div class=\"col-12\" id=\"blkAccessoAtti\" style=\"display:none;\">\n      <div class=\"p-3 border rounded\">\n        <h5 class=\"mb-1\">Accesso agli atti<\/h5>\n        <p class=\"text-muted mb-0\">Costo fisso: <strong>\u20ac 50,00<\/strong><\/p>\n      <\/div>\n    <\/div>\n\n    <!-- ========== BLOCCO: CDU ========== -->\n    <div class=\"col-12\" id=\"blkCDU\" style=\"display:none;\">\n      <div class=\"row g-3 p-3 border rounded\">\n        <div class=\"col-12\">\n          <h5 class=\"mb-1\">CDU<\/h5>\n          <p class=\"text-muted mb-0\">\n            Tariffa: <strong>\u20ac 120,00<\/strong> ogni <strong>4 particelle<\/strong> (o frazione).\n          <\/p>\n        <\/div>\n\n        <div class=\"col-12 col-md-4\">\n          <label class=\"form-label\" for=\"cdu_particelle\">Numero particelle catastali *<\/label>\n          <input class=\"form-control\" id=\"cdu_particelle\" type=\"number\" min=\"1\" step=\"1\" value=\"1\">\n          <small class=\"text-muted\">Esempi: 1\u20134 = 120\u20ac; 5\u20138 = 240\u20ac; 9\u201312 = 360\u20ac.<\/small>\n        <\/div>\n\n        <div class=\"col-12\">\n          <div class=\"alert alert-secondary mb-0\">\n            <strong>Dettaglio:<\/strong> <span id=\"cduDettaglio\">\u2014<\/span>\n          <\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <!-- ========== BLOCCO: LAMPADE VOTIVE ========== -->\n    <div class=\"col-12\" id=\"blkLampade\" style=\"display:none;\">\n      <div class=\"p-3 border rounded\">\n        <h5 class=\"mb-1\">Lampade votive<\/h5>\n        <p class=\"text-muted mb-0\">Costo fisso: <strong>\u20ac 18,30<\/strong><\/p>\n      <\/div>\n    <\/div>\n\n    <!-- ========== BLOCCO: SERVIZI CIMITERIALI ========== -->\n    <div class=\"col-12\" id=\"blkCimiteriali\" style=\"display:none;\">\n      <div class=\"row g-3 p-3 border rounded\">\n        <div class=\"col-12\">\n          <h5 class=\"mb-0\">Servizi cimiteriali<\/h5>\n          <small class=\"text-muted\">Importo fisso in base alla tipologia.<\/small>\n        <\/div>\n\n        <div class=\"col-12 col-md-6\">\n          <label class=\"form-label\" for=\"cimTipo\">Tipologia *<\/label>\n          <select class=\"form-select\" id=\"cimTipo\">\n            <option value=\"\" selected disabled>Seleziona\u2026<\/option>\n            <option value=\"INUMAZIONE\">Inumazione (\u20ac 130,80)<\/option>\n            <option value=\"TUMULAZIONE\">Tumulazione (\u20ac 173,94)<\/option>\n            <option value=\"TRASLAZIONE\">Traslazione (\u20ac 127,16)<\/option>\n            <option value=\"ESUMAZIONE\">Esumazione (\u20ac 190,58)<\/option>\n            <option value=\"ESTUMULAZIONE\">Estumulazione (\u20ac 194,00)<\/option>\n            <option value=\"TRASLAZIONE_RESTI\">Traslazione resti mortali (\u20ac 78,52)<\/option>\n            <option value=\"PULIZIA_RESTI\">Pulizia resti mortali (\u20ac 36,87)<\/option>\n            <option value=\"CENERI\">Ceneri (\u20ac 80,00)<\/option>\n          <\/select>\n        <\/div>\n\n        <div class=\"col-12\">\n          <div class=\"alert alert-secondary mb-0\">\n            <strong>Dettaglio:<\/strong> <span id=\"cimDettaglio\">\u2014<\/span>\n          <\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <!-- ========== BLOCCO: OSP INFERIORE ALL\u2019ANNO (ALLEGATO A) ========== -->\n    <div class=\"col-12\" id=\"blkOspA\" style=\"display:none;\">\n      <div class=\"row g-3 p-3 border rounded\">\n        <div class=\"col-12\">\n          <h5 class=\"mb-0\">Occupazione suolo pubblico &#8211; inferiore all\u2019anno<\/h5>\n          <small class=\"text-muted\">\n            Calcolo: tariffa (Cat. strada) \u00d7 mq \u00d7 giorni. Categoria strada: Cat.1 \/ Cat.2 (automatica).\n          <\/small>\n        <\/div>\n\n        <div class=\"col-12 col-md-6\">\n          <label class=\"form-label\" for=\"ospA_strada\">Strada *<\/label>\n          <select class=\"form-select\" id=\"ospA_strada\">\n            <option value=\"\" selected disabled>Seleziona\u2026<\/option>\n            <optgroup label=\"Categoria 1 (strade principali)\">\n              <option>C.SO UMBERTO<\/option>\n              <option>VIA DE GASPERI<\/option>\n              <option>VIA CAMPIGLIONE<\/option>\n              <option>VIA GRAMSCI<\/option>\n              <option>VIA LIBERTINI<\/option>\n              <option>VIA DIAZ<\/option>\n              <option>VIA GARIBALDI<\/option>\n              <option>VIA VISONE<\/option>\n              <option>VIA SANTA BARBARA<\/option>\n              <option>VIA ROMA<\/option>\n              <option>VIA DOMITILLA<\/option>\n              <option>P.ZZA F. PEPE<\/option>\n              <option>P.ZZA C. BATTISTI<\/option>\n              <option>VIA DON MINZONI<\/option>\n              <option>VIA ATELLANA<\/option>\n              <option>VIA IMBRIANI<\/option>\n              <option>VIA BUONFIGLIO<\/option>\n              <option>VIA ROSANO<\/option>\n              <option>VIA MERCADANTE<\/option>\n              <option>VIA ROSSELLI<\/option>\n              <option>VIA DE NICOLA<\/option>\n              <option>VIA MATTEOTTI<\/option>\n            <\/optgroup>\n            <optgroup label=\"Categoria 2 (tutte le altre)\">\n              <option value=\"__ALTRO__\">Altra strada (Categoria 2)<\/option>\n            <\/optgroup>\n          <\/select>\n        <\/div>\n\n        <div class=\"col-12 col-md-6\" id=\"ospA_wrapAltraStrada\" style=\"display:none;\">\n          <label class=\"form-label\" for=\"ospA_altraStrada\">Indica la strada<\/label>\n          <input class=\"form-control\" id=\"ospA_altraStrada\" type=\"text\" placeholder=\"Es. Via \u2026\">\n        <\/div>\n\n        <div class=\"col-12 col-md-6\">\n          <label class=\"form-label\" for=\"ospA_tipologia\">Tipologia *<\/label>\n          <select class=\"form-select\" id=\"ospA_tipologia\">\n            <option value=\"\" selected disabled>Seleziona\u2026<\/option>\n            <option value=\"STANDARD\">Tariffa standard<\/option>\n            <option value=\"PUBBLICI_ESERCIZI\">Pubblici esercizi<\/option>\n            <option value=\"ESERCIZI_COMMERCIALI\">Esercizi commerciali<\/option>\n            <option value=\"EDILI\">Edili<\/option>\n            <option value=\"TENDE\">Tende<\/option>\n            <option value=\"SPETTACOLI\">Spettacoli viaggianti<\/option>\n            <option value=\"PARTITI_ASSOCIAZIONI\">Partiti\/Associazioni (sindacali\/culturali)<\/option>\n          <\/select>\n        <\/div>\n\n        <div class=\"col-12 col-md-6\">\n          <label class=\"form-label\" for=\"ospA_durata\">Durata *<\/label>\n          <select class=\"form-select\" id=\"ospA_durata\">\n            <option value=\"\" selected disabled>Seleziona\u2026<\/option>\n            <option value=\"FINO_30\">Fino a 30 giorni<\/option>\n            <option value=\"OLTRE_30\">Oltre 30 giorni<\/option>\n          <\/select>\n          <small class=\"text-muted\">Per \u201cTariffa standard\u201d la durata non incide.<\/small>\n        <\/div>\n\n        <div class=\"col-12 col-md-4\">\n          <label class=\"form-label\" for=\"ospA_mq\">Metri quadrati (mq) *<\/label>\n          <input class=\"form-control\" id=\"ospA_mq\" type=\"number\" min=\"0\" step=\"0.01\" placeholder=\"Es. 10\">\n        <\/div>\n\n        <div class=\"col-12 col-md-4\">\n          <label class=\"form-label\" for=\"ospA_giorni\">Giorni *<\/label>\n          <input class=\"form-control\" id=\"ospA_giorni\" type=\"number\" min=\"0\" step=\"1\" placeholder=\"Es. 7\">\n        <\/div>\n\n        <div class=\"col-12 col-md-4\">\n          <label class=\"form-label\" for=\"ospA_cat\">Categoria strada (auto)<\/label>\n          <input class=\"form-control\" id=\"ospA_cat\" type=\"text\" value=\"\u2014\" readonly>\n          <small class=\"text-muted\" id=\"ospA_coeffLabel\">\u2014<\/small>\n        <\/div>\n\n        <div class=\"col-12\">\n          <div class=\"alert alert-secondary mb-0\">\n            <strong>Dettaglio:<\/strong> <span id=\"ospA_dettaglio\">\u2014<\/span>\n          <\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <!-- ========== BLOCCO: OSP SUPERIORE ALL\u2019ANNO (ALLEGATO B) ========== -->\n    <div class=\"col-12\" id=\"blkOspB\" style=\"display:none;\">\n      <div class=\"row g-3 p-3 border rounded\">\n        <div class=\"col-12\">\n          <h5 class=\"mb-0\">Occupazione suolo pubblico &#8211; superiore all\u2019anno<\/h5>\n          <small class=\"text-muted\">Tariffe annue per tipologia (Cat.1 \/ Cat.2). Inserire quantit\u00e0\/unit\u00e0 se necessario.<\/small>\n        <\/div>\n\n        <div class=\"col-12 col-md-6\">\n          <label class=\"form-label\" for=\"ospB_tipologia\">Tipologia *<\/label>\n          <select class=\"form-select\" id=\"ospB_tipologia\">\n            <option value=\"\" selected disabled>Seleziona\u2026<\/option>\n            <option value=\"PASSI_CARRABILI\">Passi carrabili<\/option>\n            <option value=\"PASSI_CARRABILI_PROV_COM\">Passi carrabili provinciali o comunali<\/option>\n            <option value=\"PASSI_INUTILIZZATI\">Passi carrabili inutilizzati\/inutilizzabili<\/option>\n            <option value=\"ACCESSI_DIVIETO_SOSTA\">Accessi o passi carrabili con divieto di sosta<\/option>\n            <option value=\"ACCESSI_DISTRIBUTORI\">Accessi a distributori di carburante<\/option>\n            <option value=\"CHIOSCHI_EDICOLE_FIORI\">Chioschi (edicole e vendita fiori)<\/option>\n            <option value=\"CHIOSCHI_ATTIVITA\">Chioschi (attivit\u00e0 produttive\/commerciali\/pubblici esercizi)<\/option>\n            <option value=\"COLONNINE_SCANSARUOTE\">Colonnine scansaruote \/ transenne parapedonali<\/option>\n            <option value=\"FIORIERE\">Fioriere<\/option>\n            <option value=\"VETRINE_SPORGENTI_SUOLO\">Vetrine sporgenti su suolo<\/option>\n            <option value=\"VETRINE_SPORGENTI_SOSPESE\">Vetrine sporgenti sospese dal suolo<\/option>\n            <option value=\"SCALINI_NEGOZI\">Scalini e scalinate per negozi<\/option>\n            <option value=\"GRIGLIE_BOTOLE\">Griglie, botole e feritoie<\/option>\n            <option value=\"TENDE_FISSE\">Tende fisse o retrattili aggettanti su suolo pubblico<\/option>\n            <option value=\"OCCUPAZIONI_VARIE_SUOLO\">Occupazioni varie suolo<\/option>\n            <option value=\"PENSILINE\">Pensiline sovrastanti il suolo<\/option>\n            <option value=\"INSEGNE_SPORGENTI\">Insegne sporgenti<\/option>\n            <option value=\"SOPRASSUOLO_GENERE\">Occupazione soprassuolo in genere<\/option>\n            <option value=\"COLONNE_RICARICHE\">Colonne ricariche elettriche<\/option>\n            <option value=\"CHIOSCHI_DISTRIBUTORI_CARB\">Chioschi distributori di carburante<\/option>\n            <option value=\"SUOLO_AREE_DISTRIBUTORI\">Suolo pubblico aree distributori carburante<\/option>\n            <option value=\"SERBATOI_FIN0_3000\">Serbatoi carburante fino a 3000 litri<\/option>\n            <option value=\"SERBATOI_OLTRE_3000\">Serbatoi carburante oltre 3000 litri (per ogni 1000 litri o frazione)<\/option>\n            <option value=\"DISTRIBUTORI_TABACCHI\">Distributori di tabacchi e altri<\/option>\n            <option value=\"ANTENNE_TELEFONICHE\">Antenne telefoniche<\/option>\n            <option value=\"AREE_RISPETTO_PARCHEGGIO\">Aree di rispetto e riserve di parcheggio<\/option>\n          <\/select>\n        <\/div>\n\n        <div class=\"col-12 col-md-3\">\n          <label class=\"form-label\" for=\"ospB_categoria\">Categoria strada *<\/label>\n          <select class=\"form-select\" id=\"ospB_categoria\">\n            <option value=\"CAT1\">1\u00aa categoria<\/option>\n            <option value=\"CAT2\">2\u00aa categoria<\/option>\n          <\/select>\n        <\/div>\n\n        <div class=\"col-12 col-md-3\" id=\"ospB_wrapQta\">\n          <label class=\"form-label\" for=\"ospB_qta\">Quantit\u00e0 *<\/label>\n          <input class=\"form-control\" id=\"ospB_qta\" type=\"number\" min=\"1\" step=\"1\" value=\"1\">\n          <small class=\"text-muted\">Unit\u00e0\/elementi (default 1).<\/small>\n        <\/div>\n\n        <div class=\"col-12 col-md-6\" id=\"ospB_wrapLitri\" style=\"display:none;\">\n          <label class=\"form-label\" for=\"ospB_litri\">Capacit\u00e0 serbatoio (litri) *<\/label>\n          <input class=\"form-control\" id=\"ospB_litri\" type=\"number\" min=\"0\" step=\"1\" placeholder=\"Es. 4500\">\n          <small class=\"text-muted\">Per \u201coltre 3000 litri\u201d calcolo per ogni 1000 litri o frazione oltre 3000.<\/small>\n        <\/div>\n\n        <div class=\"col-12\">\n          <div class=\"alert alert-secondary mb-0\">\n            <strong>Dettaglio:<\/strong> <span id=\"ospB_dettaglio\">\u2014<\/span>\n          <\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <!-- ========== BLOCCO: PUBBLICIT\u00c0 ANNUALE (ALLEGATO C) ========== -->\n    <div class=\"col-12\" id=\"blkPubAnn\" style=\"display:none;\">\n      <div class=\"row g-3 p-3 border rounded\">\n        <div class=\"col-12\">\n          <h5 class=\"mb-0\">Esposizioni pubblicitarie &#8211; annuale<\/h5>\n          <small class=\"text-muted\">Seleziona la tipologia e inserisci mq o quantit\u00e0, secondo il caso.<\/small>\n        <\/div>\n\n        <div class=\"col-12 col-md-6\">\n          <label class=\"form-label\" for=\"pubAnn_tipo\">Tipologia *<\/label>\n          <select class=\"form-select\" id=\"pubAnn_tipo\">\n            <option value=\"\" selected disabled>Seleziona\u2026<\/option>\n            <option value=\"CARTELLI\">Cartelli\/targhe\/insegne (a scaglioni per mq)<\/option>\n            <option value=\"PANNELLI_CONTO_ALTRUI\">Pannelli luminosi\/display (conto altrui) &#8211; al mq<\/option>\n            <option value=\"PANNELLI_CONTO_PROPRIO\">Pannelli luminosi\/display (conto proprio) &#8211; al mq<\/option>\n            <option value=\"AUTO_SUP_3000\">Autoveicoli portata &gt; 3000 kg &#8211; per n.<\/option>\n            <option value=\"AUTO_SUP_3000_RIM\">Autoveicoli &gt; 3000 kg con rimorchio &#8211; per n.<\/option>\n            <option value=\"AUTO_INF_3000\">Autoveicoli portata &lt; 3000 kg &#8211; per n.<\/option>\n            <option value=\"AUTO_INF_3000_RIM\">Autoveicoli &lt; 3000 kg con rimorchio &#8211; per n.<\/option>\n            <option value=\"MOTO\">Motoveicoli e veicoli diversi &#8211; per n.<\/option>\n            <option value=\"MOTO_RIM\">Motoveicoli e veicoli diversi con rimorchio &#8211; per n.<\/option>\n          <\/select>\n        <\/div>\n\n        <div class=\"col-12 col-md-3\" id=\"pubAnn_wrapOpLum\" style=\"display:none;\">\n          <label class=\"form-label\" for=\"pubAnn_opLum\">Opaca \/ Luminosa *<\/label>\n          <select class=\"form-select\" id=\"pubAnn_opLum\">\n            <option value=\"OPACA\">Opaca<\/option>\n            <option value=\"LUMINOSA\">Luminosa<\/option>\n          <\/select>\n        <\/div>\n\n        <div class=\"col-12 col-md-3\" id=\"pubAnn_wrapScaglione\" style=\"display:none;\">\n          <label class=\"form-label\" for=\"pubAnn_scaglione\">Scaglione mq *<\/label>\n          <select class=\"form-select\" id=\"pubAnn_scaglione\">\n            <option value=\"FINO_1\">Fino a 1 mq<\/option>\n            <option value=\"FINO_5_5\">Fino a 5,5 mq<\/option>\n            <option value=\"FINO_8_5\">Oltre 5,5 fino a 8,5 mq<\/option>\n            <option value=\"OLTRE_8_5\">Oltre 8,5 mq<\/option>\n          <\/select>\n        <\/div>\n\n        <div class=\"col-12 col-md-3\" id=\"pubAnn_wrapMq\" style=\"display:none;\">\n          <label class=\"form-label\" for=\"pubAnn_mq\">Metri quadrati (mq) *<\/label>\n          <input class=\"form-control\" id=\"pubAnn_mq\" type=\"number\" min=\"0\" step=\"0.01\" placeholder=\"Es. 2.5\">\n        <\/div>\n\n        <div class=\"col-12 col-md-3\" id=\"pubAnn_wrapQta\" style=\"display:none;\">\n          <label class=\"form-label\" for=\"pubAnn_qta\">Quantit\u00e0 *<\/label>\n          <input class=\"form-control\" id=\"pubAnn_qta\" type=\"number\" min=\"1\" step=\"1\" value=\"1\">\n        <\/div>\n\n        <div class=\"col-12\">\n          <div class=\"alert alert-secondary mb-0\">\n            <strong>Dettaglio:<\/strong> <span id=\"pubAnn_dettaglio\">\u2014<\/span>\n          <\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <!-- ========== BLOCCO: PUBBLICIT\u00c0 TEMPORANEA (ALLEGATO C) ========== -->\n    <div class=\"col-12\" id=\"blkPubTemp\" style=\"display:none;\">\n      <div class=\"row g-3 p-3 border rounded\">\n        <div class=\"col-12\">\n          <h5 class=\"mb-0\">Esposizioni pubblicitarie &#8211; temporanea<\/h5>\n          <small class=\"text-muted\">Inserisci giorni e mq\/quantit\u00e0 secondo la tipologia.<\/small>\n        <\/div>\n\n        <div class=\"col-12 col-md-6\">\n          <label class=\"form-label\" for=\"pubTemp_tipo\">Tipologia *<\/label>\n          <select class=\"form-select\" id=\"pubTemp_tipo\">\n            <option value=\"\" selected disabled>Seleziona\u2026<\/option>\n            <option value=\"CARTELLI\">Cartelli\/targhe\/insegne (a scaglioni per mq)<\/option>\n            <option value=\"STRISCIONI\">Striscioni trasversali e simili (periodi di 15 gg o frazioni) &#8211; al mq<\/option>\n            <option value=\"PALLONI\">Palloni frenati e simili &#8211; al mq (giorni)<\/option>\n            <option value=\"VOLANTINI\">Distribuzione volantini &#8211; per n. persone al giorno<\/option>\n            <option value=\"SONORA\">Pubblicit\u00e0 sonora &#8211; per postazione al giorno<\/option>\n          <\/select>\n        <\/div>\n\n        <div class=\"col-12 col-md-3\" id=\"pubTemp_wrapOpLum\" style=\"display:none;\">\n          <label class=\"form-label\" for=\"pubTemp_opLum\">Opaca \/ Luminosa *<\/label>\n          <select class=\"form-select\" id=\"pubTemp_opLum\">\n            <option value=\"OPACA\">Opaca<\/option>\n            <option value=\"LUMINOSA\">Luminosa<\/option>\n          <\/select>\n        <\/div>\n\n        <div class=\"col-12 col-md-3\" id=\"pubTemp_wrapScaglione\" style=\"display:none;\">\n          <label class=\"form-label\" for=\"pubTemp_scaglione\">Scaglione mq *<\/label>\n          <select class=\"form-select\" id=\"pubTemp_scaglione\">\n            <option value=\"FINO_1\">Fino a 1 mq<\/option>\n            <option value=\"FINO_5_5\">Fino a 5,5 mq<\/option>\n            <option value=\"FINO_8_5\">Oltre 5,5 fino a 8,5 mq<\/option>\n            <option value=\"OLTRE_8_5\">Oltre 8,5 mq<\/option>\n          <\/select>\n        <\/div>\n\n        <div class=\"col-12 col-md-3\">\n          <label class=\"form-label\" for=\"pubTemp_giorni\">Giorni *<\/label>\n          <input class=\"form-control\" id=\"pubTemp_giorni\" type=\"number\" min=\"0\" step=\"1\" placeholder=\"Es. 7\">\n        <\/div>\n\n        <div class=\"col-12 col-md-3\" id=\"pubTemp_wrapMq\" style=\"display:none;\">\n          <label class=\"form-label\" for=\"pubTemp_mq\">Metri quadrati (mq) *<\/label>\n          <input class=\"form-control\" id=\"pubTemp_mq\" type=\"number\" min=\"0\" step=\"0.01\" placeholder=\"Es. 2.5\">\n        <\/div>\n\n        <div class=\"col-12 col-md-3\" id=\"pubTemp_wrapQta\" style=\"display:none;\">\n          <label class=\"form-label\" for=\"pubTemp_qta\">Quantit\u00e0 *<\/label>\n          <input class=\"form-control\" id=\"pubTemp_qta\" type=\"number\" min=\"1\" step=\"1\" value=\"1\">\n        <\/div>\n\n        <div class=\"col-12\">\n          <div class=\"alert alert-secondary mb-0\">\n            <strong>Dettaglio:<\/strong> <span id=\"pubTemp_dettaglio\">\u2014<\/span>\n          <\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <!-- ========== BLOCCO: AFFISSIONI PUBBLICHE (ALLEGATO D) ========== -->\n    <div class=\"col-12\" id=\"blkAffissioni\" style=\"display:none;\">\n      <div class=\"row g-3 p-3 border rounded\">\n        <div class=\"col-12\">\n          <h5 class=\"mb-0\">Affissioni pubbliche<\/h5>\n          <small class=\"text-muted\">Importo = tariffa a foglio \u00d7 numero fogli + maggiorazioni (cumulabili). Urgenza: 10% min \u20ac 26.<\/small>\n        <\/div>\n\n        <div class=\"col-12 col-md-3\">\n          <label class=\"form-label\" for=\"aff_durata\">Durata *<\/label>\n          <select class=\"form-select\" id=\"aff_durata\">\n            <option value=\"F10\">Fino a 10 gg<\/option>\n            <option value=\"F15\">Fino a 15 gg<\/option>\n            <option value=\"F20\">Fino a 20 gg<\/option>\n            <option value=\"F25\">Fino a 25 gg<\/option>\n            <option value=\"F30\">Fino a 30 gg<\/option>\n          <\/select>\n        <\/div>\n\n        <div class=\"col-12 col-md-3\">\n          <label class=\"form-label\" for=\"aff_categoria\">Categoria strada *<\/label>\n          <select class=\"form-select\" id=\"aff_categoria\">\n            <option value=\"NORMALE\">Cat. Normale<\/option>\n            <option value=\"SPECIALE\">Cat. Speciale<\/option>\n          <\/select>\n        <\/div>\n\n        <div class=\"col-12 col-md-3\">\n          <label class=\"form-label\" for=\"aff_formato\">Formato *<\/label>\n          <select class=\"form-select\" id=\"aff_formato\">\n            <option value=\"70x100\">cm 70\u00d7100<\/option>\n            <option value=\"100x140\">cm 100\u00d7140<\/option>\n          <\/select>\n        <\/div>\n\n        <div class=\"col-12 col-md-3\">\n          <label class=\"form-label\" for=\"aff_fogli\">Numero fogli *<\/label>\n          <input class=\"form-control\" id=\"aff_fogli\" type=\"number\" min=\"1\" step=\"1\" value=\"1\">\n        <\/div>\n\n        <div class=\"col-12\">\n          <div class=\"border rounded p-3\">\n            <div class=\"form-check\">\n              <input class=\"form-check-input\" type=\"checkbox\" id=\"aff_magg_comm50\">\n              <label class=\"form-check-label\" for=\"aff_magg_comm50\">Commissioni inferiori a 50 fogli: +50%<\/label>\n            <\/div>\n            <div class=\"form-check\">\n              <input class=\"form-check-input\" type=\"checkbox\" id=\"aff_magg_8_12\">\n              <label class=\"form-check-label\" for=\"aff_magg_8_12\">Manifesto da 8 a 12 fogli: +50%<\/label>\n            <\/div>\n            <div class=\"form-check\">\n              <input class=\"form-check-input\" type=\"checkbox\" id=\"aff_magg_over12\">\n              <label class=\"form-check-label\" for=\"aff_magg_over12\">Manifesto oltre 12 fogli: +100%<\/label>\n            <\/div>\n            <div class=\"form-check\">\n              <input class=\"form-check-input\" type=\"checkbox\" id=\"aff_magg_spazi\">\n              <label class=\"form-check-label\" for=\"aff_magg_spazi\">Spazi prefissati: +100%<\/label>\n            <\/div>\n            <div class=\"form-check\">\n              <input class=\"form-check-input\" type=\"checkbox\" id=\"aff_magg_urgenza\">\n              <label class=\"form-check-label\" for=\"aff_magg_urgenza\">Diritti di urgenza: +10% (min \u20ac 26,00)<\/label>\n            <\/div>\n          <\/div>\n        <\/div>\n\n        <div class=\"col-12\">\n          <div class=\"alert alert-secondary mb-0\">\n            <strong>Dettaglio:<\/strong> <span id=\"aff_dettaglio\">\u2014<\/span>\n          <\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <!-- ========== BLOCCO: CANONE MERCATALE (ALLEGATO E) ========== -->\n    <div class=\"col-12\" id=\"blkMercato\" style=\"display:none;\">\n      <div class=\"row g-3 p-3 border rounded\">\n        <div class=\"col-12\">\n          <h5 class=\"mb-0\">Canone mercatale<\/h5>\n          <small class=\"text-muted\">Calcolo per mq e per giorni\/ore secondo la tipologia.<\/small>\n        <\/div>\n\n        <div class=\"col-12 col-md-6\">\n          <label class=\"form-label\" for=\"mer_tipo\">Tipologia *<\/label>\n          <select class=\"form-select\" id=\"mer_tipo\">\n            <option value=\"\" selected disabled>Seleziona\u2026<\/option>\n            <option value=\"CONC_NON_ALIM\">Concessionari mercato banchi non alimentari<\/option>\n            <option value=\"CONC_ALIM\">Concessionari mercato banchi alimentari<\/option>\n            <option value=\"SPUN_DUREVOLI\">Spuntisti mercato beni durevoli<\/option>\n            <option value=\"SPUN_ALIM\">Spuntisti mercato beni alimentari<\/option>\n          <\/select>\n        <\/div>\n\n        <div class=\"col-12 col-md-3\">\n          <label class=\"form-label\" for=\"mer_modalita\">Modalit\u00e0 *<\/label>\n          <select class=\"form-select\" id=\"mer_modalita\">\n            <option value=\"GIORNALIERA\">Giornaliera (al mq)<\/option>\n            <option value=\"ORARIA\">Oraria (al mq)<\/option>\n            <option value=\"SEI_ORE\">Tariffa base per n. 6 ore (al mq)<\/option>\n            <option value=\"ORARIA_RICORRENTE\">Oraria ricorrente rid. 40% (al mq) *<\/option>\n          <\/select>\n          <small class=\"text-muted\">(*) disponibile solo per concessionari (nel prospetto).<\/small>\n        <\/div>\n\n        <div class=\"col-12 col-md-3\">\n          <label class=\"form-label\" for=\"mer_mq\">Metri quadrati (mq) *<\/label>\n          <input class=\"form-control\" id=\"mer_mq\" type=\"number\" min=\"0\" step=\"0.01\" placeholder=\"Es. 6\">\n        <\/div>\n\n        <div class=\"col-12 col-md-3\">\n          <label class=\"form-label\" for=\"mer_giorni\">Giorni *<\/label>\n          <input class=\"form-control\" id=\"mer_giorni\" type=\"number\" min=\"1\" step=\"1\" value=\"1\">\n        <\/div>\n\n        <div class=\"col-12 col-md-3\" id=\"mer_wrapOre\" style=\"display:none;\">\n          <label class=\"form-label\" for=\"mer_ore\">Ore (solo modalit\u00e0 ORARIA) *<\/label>\n          <input class=\"form-control\" id=\"mer_ore\" type=\"number\" min=\"1\" step=\"1\" value=\"6\">\n        <\/div>\n\n        <div class=\"col-12\">\n          <div class=\"alert alert-secondary mb-0\">\n            <strong>Dettaglio:<\/strong> <span id=\"mer_dettaglio\">\u2014<\/span>\n          <\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <!-- DIRITTI E AGEVOLAZIONI -->\n    <div class=\"col-12\">\n      <div class=\"card p-3\">\n        <h5 class=\"mb-3\">Diritti e Agevolazioni<\/h5>\n\n        <div class=\"form-check\">\n          <input class=\"form-check-input\" type=\"checkbox\" id=\"dirittiIstruttoria\" checked>\n          <label class=\"form-check-label\" for=\"dirittiIstruttoria\">\n            Diritti di istruttoria (+ \u20ac 50,00)\n          <\/label>\n        <\/div>\n\n        <div class=\"form-check mt-1\">\n          <input class=\"form-check-input\" type=\"checkbox\" id=\"dirittiSegreteria\" checked>\n          <label class=\"form-check-label\" for=\"dirittiSegreteria\">\n            Diritti di segreteria (+ \u20ac 50,00)\n          <\/label>\n        <\/div>\n\n        <div class=\"mt-3\">\n          <label class=\"form-label\" for=\"agevolazione\">Agevolazione (%)<\/label>\n          <input type=\"number\" class=\"form-control\" id=\"agevolazione\" value=\"0\" min=\"0\" max=\"100\" step=\"0.01\">\n          <div class=\"form-text\">Percentuale di riduzione applicata alla tariffa base (prima dei diritti).<\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n\n  <\/form>\n<\/section>\n\n<script>\n(function () {\n  \/\/ =======================\n  \/\/ FORMATTAZIONE NUMERI\n  \/\/ =======================\n  \/\/ Totale da pagare: SEMPRE 2 decimali (valore monetario finale)\n  function formatEuro2(n) {\n    return new Intl.NumberFormat('it-IT', {\n      style: 'currency',\n      currency: 'EUR',\n      minimumFractionDigits: 2,\n      maximumFractionDigits: 2\n    }).format(n || 0);\n  }\n\n  \/\/ Dettagli: mostra \"tutte\" le cifre decimali (fino a maxDec, senza troncare a 2)\n  \/\/ Esempio: 3.456 -> \"3,456 \u20ac\"\n  function formatEuroFull(n, maxDec = 6) {\n    if (n == null || !Number.isFinite(n)) return \"\u2014\";\n    return new Intl.NumberFormat('it-IT', {\n      style: 'currency',\n      currency: 'EUR',\n      minimumFractionDigits: 2,     \/\/ almeno 2 decimali (euro)\n      maximumFractionDigits: maxDec \/\/ fino a 6 (aumenta se serve)\n    }).format(n);\n  }\n\n  \/\/ Numeri non currency (mq, gg, coeff)\n  function formatNumFull(n, maxDec = 6) {\n    if (n == null || !Number.isFinite(n)) return \"\u2014\";\n    return new Intl.NumberFormat('it-IT', {\n      minimumFractionDigits: 0,\n      maximumFractionDigits: maxDec\n    }).format(n);\n  }\n\n  function safeNum(v) {\n    const n = parseFloat(v);\n    return Number.isFinite(n) ? n : null;\n  }\n  function safeInt(v) {\n    const n = parseInt(v, 10);\n    return Number.isFinite(n) ? n : null;\n  }\n  function ceilDiv(a, b) {\n    return Math.ceil(a \/ b);\n  }\n\n  \/\/ =======================\n  \/\/ ELEMENTI DOM\n  \/\/ =======================\n  const servizio = document.getElementById('servizio');\n  const totaleEuro = document.getElementById('totaleEuro');\n  const totaleDettaglio = document.getElementById('totaleDettaglio');\n  const dirittiIstruttoria = document.getElementById('dirittiIstruttoria');\n  const dirittiSegreteria = document.getElementById('dirittiSegreteria');\n  const agevolazione = document.getElementById('agevolazione');\n\n\n  const blkAccessoAtti = document.getElementById('blkAccessoAtti');\n  const blkCDU = document.getElementById('blkCDU');\n  const blkLampade = document.getElementById('blkLampade');\n  const blkCimiteriali = document.getElementById('blkCimiteriali');\n  const blkOspA = document.getElementById('blkOspA');\n  const blkOspB = document.getElementById('blkOspB');\n  const blkPubAnn = document.getElementById('blkPubAnn');\n  const blkPubTemp = document.getElementById('blkPubTemp');\n  const blkAffissioni = document.getElementById('blkAffissioni');\n  const blkMercato = document.getElementById('blkMercato');\n\n  \/\/ Cimiteriali\n  const cimTipo = document.getElementById('cimTipo');\n  const cimDettaglio = document.getElementById('cimDettaglio');\n\n  \/\/ CDU\n  const cdu_particelle = document.getElementById('cdu_particelle');\n  const cduDettaglio = document.getElementById('cduDettaglio');\n\n  \/\/ OSP A\n  const ospA_strada = document.getElementById('ospA_strada');\n  const ospA_wrapAltraStrada = document.getElementById('ospA_wrapAltraStrada');\n  const ospA_altraStrada = document.getElementById('ospA_altraStrada');\n  const ospA_tipologia = document.getElementById('ospA_tipologia');\n  const ospA_durata = document.getElementById('ospA_durata');\n  const ospA_mq = document.getElementById('ospA_mq');\n  const ospA_giorni = document.getElementById('ospA_giorni');\n  const ospA_cat = document.getElementById('ospA_cat');\n  const ospA_coeffLabel = document.getElementById('ospA_coeffLabel');\n  const ospA_dettaglio = document.getElementById('ospA_dettaglio');\n\n  \/\/ OSP B\n  const ospB_tipologia = document.getElementById('ospB_tipologia');\n  const ospB_categoria = document.getElementById('ospB_categoria');\n  const ospB_qta = document.getElementById('ospB_qta');\n  const ospB_wrapLitri = document.getElementById('ospB_wrapLitri');\n  const ospB_litri = document.getElementById('ospB_litri');\n  const ospB_dettaglio = document.getElementById('ospB_dettaglio');\n\n  \/\/ Pubblicit\u00e0 annuale\n  const pubAnn_tipo = document.getElementById('pubAnn_tipo');\n  const pubAnn_wrapOpLum = document.getElementById('pubAnn_wrapOpLum');\n  const pubAnn_opLum = document.getElementById('pubAnn_opLum');\n  const pubAnn_wrapScaglione = document.getElementById('pubAnn_wrapScaglione');\n  const pubAnn_scaglione = document.getElementById('pubAnn_scaglione');\n  const pubAnn_wrapMq = document.getElementById('pubAnn_wrapMq');\n  const pubAnn_mq = document.getElementById('pubAnn_mq');\n  const pubAnn_wrapQta = document.getElementById('pubAnn_wrapQta');\n  const pubAnn_qta = document.getElementById('pubAnn_qta');\n  const pubAnn_dettaglio = document.getElementById('pubAnn_dettaglio');\n\n  \/\/ Pubblicit\u00e0 temporanea\n  const pubTemp_tipo = document.getElementById('pubTemp_tipo');\n  const pubTemp_wrapOpLum = document.getElementById('pubTemp_wrapOpLum');\n  const pubTemp_opLum = document.getElementById('pubTemp_opLum');\n  const pubTemp_wrapScaglione = document.getElementById('pubTemp_wrapScaglione');\n  const pubTemp_scaglione = document.getElementById('pubTemp_scaglione');\n  const pubTemp_giorni = document.getElementById('pubTemp_giorni');\n  const pubTemp_wrapMq = document.getElementById('pubTemp_wrapMq');\n  const pubTemp_mq = document.getElementById('pubTemp_mq');\n  const pubTemp_wrapQta = document.getElementById('pubTemp_wrapQta');\n  const pubTemp_qta = document.getElementById('pubTemp_qta');\n  const pubTemp_dettaglio = document.getElementById('pubTemp_dettaglio');\n\n  \/\/ Affissioni\n  const aff_durata = document.getElementById('aff_durata');\n  const aff_categoria = document.getElementById('aff_categoria');\n  const aff_formato = document.getElementById('aff_formato');\n  const aff_fogli = document.getElementById('aff_fogli');\n  const aff_magg_comm50 = document.getElementById('aff_magg_comm50');\n  const aff_magg_8_12 = document.getElementById('aff_magg_8_12');\n  const aff_magg_over12 = document.getElementById('aff_magg_over12');\n  const aff_magg_spazi = document.getElementById('aff_magg_spazi');\n  const aff_magg_urgenza = document.getElementById('aff_magg_urgenza');\n  const aff_dettaglio = document.getElementById('aff_dettaglio');\n\n  \/\/ Mercato\n  const mer_tipo = document.getElementById('mer_tipo');\n  const mer_modalita = document.getElementById('mer_modalita');\n  const mer_mq = document.getElementById('mer_mq');\n  const mer_giorni = document.getElementById('mer_giorni');\n  const mer_wrapOre = document.getElementById('mer_wrapOre');\n  const mer_ore = document.getElementById('mer_ore');\n  const mer_dettaglio = document.getElementById('mer_dettaglio');\n\n  \/\/ =======================\n  \/\/ DATI TARIFFE\n  \/\/ =======================\n\n  \/\/ Accesso agli atti (tariffa fissa)\n  const TARIFFA_ACCESSO_ATTI = 50.00;\n\n  \/\/ CDU: \u20ac 120,00 ogni 4 particelle (o frazione)\n  const TARIFFA_CDU_SCAGLIONE = 120.00;\n  const CDU_STEP = 4;\n\n  \/\/ Cimiteriali\n  const TARIFFE_CIMITERIALI = {\n    INUMAZIONE: 130.80,\n    TUMULAZIONE: 173.94,\n    TRASLAZIONE: 127.16,\n    ESUMAZIONE: 190.58,\n    ESTUMULAZIONE: 194.00,\n    TRASLAZIONE_RESTI: 78.52,\n    PULIZIA_RESTI: 36.87,\n    CENERI: 80.00\n  };\n\n  \/\/ Strade Cat.1 (tutte le altre = Cat.2)\n  const STRADE_CAT1 = new Set([\n    \"C.SO UMBERTO\",\"VIA DE GASPERI\",\"VIA CAMPIGLIONE\",\"VIA GRAMSCI\",\"VIA LIBERTINI\",\"VIA DIAZ\",\"VIA GARIBALDI\",\n    \"VIA VISONE\",\"VIA SANTA BARBARA\",\"VIA ROMA\",\"VIA DOMITILLA\",\"P.ZZA F. PEPE\",\"P.ZZA C. BATTISTI\",\n    \"VIA DON MINZONI\",\"VIA ATELLANA\",\"VIA IMBRIANI\",\"VIA BUONFIGLIO\",\"VIA ROSANO\",\"VIA MERCADANTE\",\n    \"VIA ROSSELLI\",\"VIA DE NICOLA\",\"VIA MATTEOTTI\"\n  ]);\n\n  \/\/ Allegato A - tariffe giornaliere per categoria\n  const OSP_A_TARIFFE = {\n    STANDARD: {\n      FINO_30: { CAT1: 1.200, CAT2: 0.960 },\n      OLTRE_30:{ CAT1: 1.200, CAT2: 0.960 }\n    },\n    PUBBLICI_ESERCIZI: {\n      FINO_30: { CAT1: 4.320, CAT2: 3.456 },\n      OLTRE_30:{ CAT1: 1.728, CAT2: 1.382 }\n    },\n    ESERCIZI_COMMERCIALI: {\n      FINO_30: { CAT1: 4.320, CAT2: 3.456 },\n      OLTRE_30:{ CAT1: 1.728, CAT2: 1.382 }\n    },\n    EDILI: {\n      FINO_30: { CAT1: 4.320, CAT2: 3.456 },\n      OLTRE_30:{ CAT1: 1.728, CAT2: 1.382 }\n    },\n    TENDE: {\n      FINO_30: { CAT1: 4.320, CAT2: 3.456 },\n      OLTRE_30:{ CAT1: 1.728, CAT2: 1.382 }\n    },\n    SPETTACOLI: {\n      FINO_30: { CAT1: 4.320, CAT2: 3.456 },\n      OLTRE_30:{ CAT1: 1.728, CAT2: 1.382 }\n    },\n    PARTITI_ASSOCIAZIONI: {\n      FINO_30: { CAT1: 4.320, CAT2: 3.456 },\n      OLTRE_30:{ CAT1: 1.728, CAT2: 1.382 }\n    }\n  };\n\n  \/\/ Allegato B - tariffe annue Cat1\/Cat2\n  const OSP_B_TARIFFE = {\n    PASSI_CARRABILI:                 { CAT1: 20.91, CAT2: 16.72, unit: \"unit\u00e0\" },\n    PASSI_CARRABILI_PROV_COM:        { CAT1: 20.91, CAT2: 16.72, unit: \"unit\u00e0\" },\n    PASSI_INUTILIZZATI:              { CAT1: 18.81, CAT2: 15.05, unit: \"unit\u00e0\" },\n    ACCESSI_DIVIETO_SOSTA:           { CAT1: 20.91, CAT2: 16.72, unit: \"unit\u00e0\" },\n    ACCESSI_DISTRIBUTORI:            { CAT1: 14.63, CAT2: 11.70, unit: \"unit\u00e0\" },\n    CHIOSCHI_EDICOLE_FIORI:          { CAT1: 41.83, CAT2: 33.46, unit: \"unit\u00e0\" },\n    CHIOSCHI_ATTIVITA:               { CAT1: 41.83, CAT2: 33.46, unit: \"unit\u00e0\" },\n    COLONNINE_SCANSARUOTE:           { CAT1: 41.83, CAT2: 33.46, unit: \"unit\u00e0\" },\n    FIORIERE:                        { CAT1: 41.83, CAT2: 33.46, unit: \"unit\u00e0\" },\n    VETRINE_SPORGENTI_SUOLO:         { CAT1: 41.83, CAT2: 33.46, unit: \"unit\u00e0\" },\n    VETRINE_SPORGENTI_SOSPESE:       { CAT1: 16.72, CAT2: 13.38, unit: \"unit\u00e0\" },\n    SCALINI_NEGOZI:                  { CAT1: 41.81, CAT2: 33.44, unit: \"unit\u00e0\" },\n    GRIGLIE_BOTOLE:                  { CAT1: 50.00, CAT2: 40.00, unit: \"unit\u00e0\" },\n    TENDE_FISSE:                     { CAT1: 12.50, CAT2: 10.00, unit: \"unit\u00e0\" },\n    OCCUPAZIONI_VARIE_SUOLO:         { CAT1: 41.83, CAT2: 33.46, unit: \"unit\u00e0\" },\n    PENSILINE:                       { CAT1: 16.72, CAT2: 13.38, unit: \"unit\u00e0\" },\n    INSEGNE_SPORGENTI:               { CAT1: 16.72, CAT2: 13.38, unit: \"unit\u00e0\" },\n    SOPRASSUOLO_GENERE:              { CAT1: 16.72, CAT2: 13.38, unit: \"unit\u00e0\" },\n    COLONNE_RICARICHE:               { CAT1: 41.83, CAT2: 33.46, unit: \"unit\u00e0\" },\n    CHIOSCHI_DISTRIBUTORI_CARB:      { CAT1: 41.83, CAT2: 33.46, unit: \"unit\u00e0\" },\n    SUOLO_AREE_DISTRIBUTORI:         { CAT1: 65.00, CAT2: 52.00, unit: \"unit\u00e0\" },\n    SERBATOI_FIN0_3000:              { CAT1: 12.50, CAT2: 10.00, unit: \"serbatoio\" },\n    SERBATOI_OLTRE_3000:             { CAT1: 2.50,  CAT2: 2.00,  unit: \"per 1000L oltre 3000\" },\n    DISTRIBUTORI_TABACCHI:           { CAT1: 23.50, CAT2: 18.80, unit: \"unit\u00e0\" },\n    ANTENNE_TELEFONICHE:             { CAT1: 50.00, CAT2: 40.00, unit: \"unit\u00e0\" },\n    AREE_RISPETTO_PARCHEGGIO:        { CAT1: 41.83, CAT2: 33.46, unit: \"unit\u00e0\" }\n  };\n\n  \/\/ Allegato C - pubblicit\u00e0 annuale\n  const PUB_ANN_CARTELLI = {\n    FINO_1:   { OPACA: 15.50, LUMINOSA: 31.00 },\n    FINO_5_5: { OPACA: 23.50, LUMINOSA: 47.00 },\n    FINO_8_5: { OPACA: 35.25, LUMINOSA: 58.75 },\n    OLTRE_8_5:{ OPACA: 47.00, LUMINOSA: 70.50 }\n  };\n  const PUB_ANN_ALTRI = {\n    PANNELLI_CONTO_ALTRUI: { perMq: 50.00 },\n    PANNELLI_CONTO_PROPRIO:{ perMq: 25.00 },\n    AUTO_SUP_3000:         { perN: 75.00 },\n    AUTO_SUP_3000_RIM:     { perN: 150.00 },\n    AUTO_INF_3000:         { perN: 50.00 },\n    AUTO_INF_3000_RIM:     { perN: 100.00 },\n    MOTO:                  { perN: 25.00 },\n    MOTO_RIM:              { perN: 50.00 }\n  };\n\n  \/\/ Allegato C - pubblicit\u00e0 temporanea\n  const PUB_TEMP_CARTELLI = {\n    FINO_1:   { OPACA: 1.55, LUMINOSA: 3.10 },\n    FINO_5_5: { OPACA: 2.35, LUMINOSA: 4.70 },\n    FINO_8_5: { OPACA: 3.52, LUMINOSA: 5.87 },\n    OLTRE_8_5:{ OPACA: 3.87, LUMINOSA: 6.22 }\n  };\n  const PUB_TEMP_ALTRI = {\n    STRISCIONI: { perMqPer15gg: 15.50 },\n    PALLONI:    { perMqPerGiorno: 37.20 },\n    VOLANTINI:  { perPersonaPerGiorno: 5.00 },\n    SONORA:     { perPostazionePerGiorno: 10.00 }\n  };\n\n  \/\/ Allegato D - affissioni\n  const AFF_TARIFFE = {\n    F10: {\n      NORMALE: { \"70x100\": 1.24, \"100x140\": 1.55 },\n      SPECIALE:{ \"70x100\": 1.86, \"100x140\": 2.33 }\n    },\n    F15: {\n      NORMALE: { \"70x100\": 1.61, \"100x140\": 2.02 },\n      SPECIALE:{ \"70x100\": 2.42, \"100x140\": 3.03 }\n    },\n    F20: {\n      NORMALE: { \"70x100\": 1.98, \"100x140\": 2.49 },\n      SPECIALE:{ \"70x100\": 2.98, \"100x140\": 3.74 }\n    },\n    F25: {\n      NORMALE: { \"70x100\": 2.35, \"100x140\": 2.96 },\n      SPECIALE:{ \"70x100\": 3.53, \"100x140\": 4.45 }\n    },\n    F30: {\n      NORMALE: { \"70x100\": 2.74, \"100x140\": 3.43 },\n      SPECIALE:{ \"70x100\": 4.10, \"100x140\": 5.15 }\n    }\n  };\n\n  \/\/ Allegato E - canone mercatale\n  const MERCATO_TARIFFE = {\n    CONC_NON_ALIM: { giornaliera: 0.90, oraria: 0.038, seiOre: 0.225, orariaRic: 0.135, ricOK: true },\n    CONC_ALIM:     { giornaliera: 1.07, oraria: 0.045, seiOre: 0.267, orariaRic: 0.160, ricOK: true },\n    SPUN_DUREVOLI: { giornaliera: 1.20, oraria: 0.050, seiOre: 0.300, orariaRic: null,  ricOK: false },\n    SPUN_ALIM:     { giornaliera: 1.20, oraria: 0.050, seiOre: 0.300, orariaRic: null,  ricOK: false }\n  };\n\n  \/\/ =======================\n  \/\/ VISIBILIT\u00c0 BLOCCHI\n  \/\/ =======================\n  function hideAll() {\n    [blkAccessoAtti, blkCDU, blkLampade, blkCimiteriali, blkOspA, blkOspB, blkPubAnn, blkPubTemp, blkAffissioni, blkMercato]\n      .forEach(el => el.style.display = \"none\");\n  }\n\n  \/\/ =======================\n  \/\/ HELPERS\n  \/\/ =======================\n  function getCatStradaDaSelect(selVal) {\n    if (!selVal) return null;\n    if (selVal === \"__ALTRO__\") return \"CAT2\";\n    return STRADE_CAT1.has(selVal) ? \"CAT1\" : \"CAT2\";\n  }\n\n  \/\/ =======================\n  \/\/ CALCOLI\n  \/\/ =======================\n  function calcCimiteriali() {\n    const key = cimTipo.value;\n    if (!key || TARIFFE_CIMITERIALI[key] == null) {\n      cimDettaglio.textContent = \"Seleziona una tipologia.\";\n      return { total: 0, detail: \"\u2014\" };\n    }\n    const total = TARIFFE_CIMITERIALI[key];\n    cimDettaglio.textContent = `Importo fisso: ${formatEuro2(total)}`;\n    return { total, detail: `Servizio cimiteriale: ${formatEuro2(total)}` };\n  }\n\n  function calcCDU() {\n    const n = safeInt(cdu_particelle ? cdu_particelle.value : 0);\n\n    if (!n || n <= 0) {\n      const msg = \"Inserisci il numero di particelle (valore > 0).\";\n      if (cduDettaglio) cduDettaglio.textContent = msg;\n      return { total: 0, detail: msg };\n    }\n\n    const scaglioni = ceilDiv(n, CDU_STEP);\n    const total = TARIFFA_CDU_SCAGLIONE * scaglioni;\n\n    const rangeDa = (scaglioni - 1) * CDU_STEP + 1;\n    const rangeA = scaglioni * CDU_STEP;\n\n    const det =\n      `CDU: ${formatEuroFull(TARIFFA_CDU_SCAGLIONE)} \u00d7 ${scaglioni} scaglioni ` +\n      `(particelle ${rangeDa}\u2013${rangeA}) = ${formatEuro2(total)} (n. particelle: ${n})`;\n\n    if (cduDettaglio) cduDettaglio.textContent = det;\n    return { total, detail: det };\n  }\n\n  function calcOspA() {\n    const stradaVal = ospA_strada.value;\n    const cat = getCatStradaDaSelect(stradaVal);\n\n    ospA_wrapAltraStrada.style.display = (stradaVal === \"__ALTRO__\") ? \"block\" : \"none\";\n    if (!cat) {\n      ospA_cat.value = \"\u2014\";\n      ospA_coeffLabel.textContent = \"\u2014\";\n    } else {\n      ospA_cat.value = (cat === \"CAT1\") ? \"Categoria 1\" : \"Categoria 2\";\n      ospA_coeffLabel.textContent = (cat === \"CAT1\") ? \"Tariffe Cat.1\" : \"Tariffe Cat.2\";\n    }\n\n    const tip = ospA_tipologia.value;\n    const dur = ospA_durata.value;\n    const mq = safeNum(ospA_mq.value);\n    const gg = safeInt(ospA_giorni.value);\n\n    if (!cat || !tip) {\n      ospA_dettaglio.textContent = \"Seleziona strada e tipologia.\";\n      return { total: 0, detail: \"\u2014\" };\n    }\n    if (tip !== \"STANDARD\" && !dur) {\n      ospA_dettaglio.textContent = \"Seleziona la durata (fino\/oltre 30 giorni).\";\n      return { total: 0, detail: \"\u2014\" };\n    }\n    if (!mq || mq <= 0 || !gg || gg <= 0) {\n      ospA_dettaglio.textContent = \"Inserisci mq e giorni (valori > 0).\";\n      return { total: 0, detail: \"\u2014\" };\n    }\n\n    const durKey = (tip === \"STANDARD\") ? \"FINO_30\" : dur;\n    const row = OSP_A_TARIFFE[tip] && OSP_A_TARIFFE[tip][durKey];\n    if (!row) {\n      ospA_dettaglio.textContent = \"Tariffa non trovata per la combinazione selezionata.\";\n      return { total: 0, detail: \"\u2014\" };\n    }\n\n    const tariffa = row[cat];\n    const total = tariffa * mq * gg;\n\n    const stradaLabel = (stradaVal === \"__ALTRO__\")\n      ? (ospA_altraStrada.value ? ospA_altraStrada.value : \"Altra strada\")\n      : stradaVal;\n\n    \/\/ Dettaglio: tariffa con tutte le cifre decimali, totale a 2 cifre\n    const det = `${formatEuroFull(tariffa)} \u00d7 ${formatNumFull(mq)} mq \u00d7 ${gg} gg = ${formatEuro2(total)} (${ospA_cat.value}, ${stradaLabel})`;\n    ospA_dettaglio.textContent = det;\n\n    return { total, detail: det };\n  }\n\n  function calcOspB() {\n    const tip = ospB_tipologia.value;\n    const cat = ospB_categoria.value;\n    const qta = safeInt(ospB_qta.value) || 1;\n\n    const isSerbOver = (tip === \"SERBATOI_OLTRE_3000\");\n    ospB_wrapLitri.style.display = isSerbOver ? \"block\" : \"none\";\n\n    if (!tip || !cat) {\n      ospB_dettaglio.textContent = \"Seleziona tipologia e categoria.\";\n      return { total: 0, detail: \"\u2014\" };\n    }\n\n    const tariffRow = OSP_B_TARIFFE[tip];\n    if (!tariffRow) {\n      ospB_dettaglio.textContent = \"Tariffa non trovata per la tipologia selezionata.\";\n      return { total: 0, detail: \"\u2014\" };\n    }\n\n    const tariffa = tariffRow[cat];\n    if (tariffa == null) {\n      ospB_dettaglio.textContent = \"Tariffa non disponibile.\";\n      return { total: 0, detail: \"\u2014\" };\n    }\n\n    let total = 0;\n    let det = \"\";\n\n    if (isSerbOver) {\n      const litri = safeInt(ospB_litri.value);\n      if (!litri || litri <= 3000) {\n        ospB_dettaglio.textContent = \"Inserisci litri > 3000 per il calcolo.\";\n        return { total: 0, detail: \"\u2014\" };\n      }\n      const extra = litri - 3000;\n      const migliaia = ceilDiv(extra, 1000);\n      total = tariffa * migliaia;\n      det = `${formatEuroFull(tariffa)} \u00d7 ${migliaia} (migliaia oltre 3000L) = ${formatEuro2(total)} (${cat})`;\n    } else {\n      total = tariffa * qta;\n      det = `${formatEuroFull(tariffa)} \u00d7 ${qta} ${tariffRow.unit} = ${formatEuro2(total)} (${cat})`;\n    }\n\n    ospB_dettaglio.textContent = det;\n    return { total, detail: det };\n  }\n\n  function updatePubAnnUI() {\n    const t = pubAnn_tipo.value;\n\n    pubAnn_wrapOpLum.style.display = \"none\";\n    pubAnn_wrapScaglione.style.display = \"none\";\n    pubAnn_wrapMq.style.display = \"none\";\n    pubAnn_wrapQta.style.display = \"none\";\n\n    if (!t) return;\n\n    if (t === \"CARTELLI\") {\n      pubAnn_wrapOpLum.style.display = \"block\";\n      pubAnn_wrapScaglione.style.display = \"block\";\n    } else if (t === \"PANNELLI_CONTO_ALTRUI\" || t === \"PANNELLI_CONTO_PROPRIO\") {\n      pubAnn_wrapMq.style.display = \"block\";\n    } else {\n      pubAnn_wrapQta.style.display = \"block\";\n    }\n  }\n\n  function calcPubAnn() {\n    updatePubAnnUI();\n\n    const t = pubAnn_tipo.value;\n    if (!t) {\n      pubAnn_dettaglio.textContent = \"Seleziona una tipologia.\";\n      return { total: 0, detail: \"\u2014\" };\n    }\n\n    let total = 0;\n    let det = \"\";\n\n    if (t === \"CARTELLI\") {\n      const op = pubAnn_opLum.value;\n      const sc = pubAnn_scaglione.value;\n      const val = PUB_ANN_CARTELLI[sc] && PUB_ANN_CARTELLI[sc][op];\n      if (val == null) {\n        pubAnn_dettaglio.textContent = \"Tariffa non trovata per lo scaglione selezionato.\";\n        return { total: 0, detail: \"\u2014\" };\n      }\n      total = val;\n      det = `Cartelli (annuale) - ${op} - ${sc}: ${formatEuroFull(total)}`;\n    } else if (t === \"PANNELLI_CONTO_ALTRUI\" || t === \"PANNELLI_CONTO_PROPRIO\") {\n      const mq = safeNum(pubAnn_mq.value);\n      if (!mq || mq <= 0) {\n        pubAnn_dettaglio.textContent = \"Inserisci mq (valore > 0).\";\n        return { total: 0, detail: \"\u2014\" };\n      }\n      const perMq = PUB_ANN_ALTRI[t].perMq;\n      total = perMq * mq;\n      det = `${formatEuroFull(perMq)} \u00d7 ${formatNumFull(mq)} mq = ${formatEuro2(total)} (annuale)`;\n    } else {\n      const qta = safeInt(pubAnn_qta.value);\n      if (!qta || qta <= 0) {\n        pubAnn_dettaglio.textContent = \"Inserisci quantit\u00e0 (valore > 0).\";\n        return { total: 0, detail: \"\u2014\" };\n      }\n      const perN = PUB_ANN_ALTRI[t].perN;\n      total = perN * qta;\n      det = `${formatEuroFull(perN)} \u00d7 ${qta} = ${formatEuro2(total)} (annuale)`;\n    }\n\n    pubAnn_dettaglio.textContent = det;\n    return { total, detail: det };\n  }\n\n  function updatePubTempUI() {\n    const t = pubTemp_tipo.value;\n    pubTemp_wrapOpLum.style.display = \"none\";\n    pubTemp_wrapScaglione.style.display = \"none\";\n    pubTemp_wrapMq.style.display = \"none\";\n    pubTemp_wrapQta.style.display = \"none\";\n\n    if (!t) return;\n\n    if (t === \"CARTELLI\") {\n      pubTemp_wrapOpLum.style.display = \"block\";\n      pubTemp_wrapScaglione.style.display = \"block\";\n    } else if (t === \"STRISCIONI\" || t === \"PALLONI\") {\n      pubTemp_wrapMq.style.display = \"block\";\n    } else if (t === \"VOLANTINI\" || t === \"SONORA\") {\n      pubTemp_wrapQta.style.display = \"block\";\n    }\n  }\n\n  function calcPubTemp() {\n    updatePubTempUI();\n\n    const t = pubTemp_tipo.value;\n    const gg = safeInt(pubTemp_giorni.value);\n\n    if (!t) {\n      pubTemp_dettaglio.textContent = \"Seleziona una tipologia.\";\n      return { total: 0, detail: \"\u2014\" };\n    }\n    if (!gg || gg <= 0) {\n      pubTemp_dettaglio.textContent = \"Inserisci giorni (valore > 0).\";\n      return { total: 0, detail: \"\u2014\" };\n    }\n\n    let total = 0;\n    let det = \"\";\n\n    if (t === \"CARTELLI\") {\n      const op = pubTemp_opLum.value;\n      const sc = pubTemp_scaglione.value;\n      const perDay = PUB_TEMP_CARTELLI[sc] && PUB_TEMP_CARTELLI[sc][op];\n      if (perDay == null) {\n        pubTemp_dettaglio.textContent = \"Tariffa non trovata per lo scaglione selezionato.\";\n        return { total: 0, detail: \"\u2014\" };\n      }\n      total = perDay * gg;\n      det = `${formatEuroFull(perDay)} \u00d7 ${gg} gg = ${formatEuro2(total)} (cartelli temporanei, ${op}, ${sc})`;\n    }\n    else if (t === \"STRISCIONI\") {\n      const mq = safeNum(pubTemp_mq.value);\n      if (!mq || mq <= 0) {\n        pubTemp_dettaglio.textContent = \"Inserisci mq (valore > 0).\";\n        return { total: 0, detail: \"\u2014\" };\n      }\n      const periodi = ceilDiv(gg, 15);\n      const perMqPerPeriodo = PUB_TEMP_ALTRI.STRISCIONI.perMqPer15gg;\n      total = perMqPerPeriodo * mq * periodi;\n      det = `${formatEuroFull(perMqPerPeriodo)} \u00d7 ${formatNumFull(mq)} mq \u00d7 ${periodi} (periodi da 15 gg) = ${formatEuro2(total)}`;\n    }\n    else if (t === \"PALLONI\") {\n      const mq = safeNum(pubTemp_mq.value);\n      if (!mq || mq <= 0) {\n        pubTemp_dettaglio.textContent = \"Inserisci mq (valore > 0).\";\n        return { total: 0, detail: \"\u2014\" };\n      }\n      const perMqPerG = PUB_TEMP_ALTRI.PALLONI.perMqPerGiorno;\n      total = perMqPerG * mq * gg;\n      det = `${formatEuroFull(perMqPerG)} \u00d7 ${formatNumFull(mq)} mq \u00d7 ${gg} gg = ${formatEuro2(total)}`;\n    }\n    else if (t === \"VOLANTINI\") {\n      const qta = safeInt(pubTemp_qta.value);\n      if (!qta || qta <= 0) {\n        pubTemp_dettaglio.textContent = \"Inserisci numero persone (valore > 0).\";\n        return { total: 0, detail: \"\u2014\" };\n      }\n      const perPers = PUB_TEMP_ALTRI.VOLANTINI.perPersonaPerGiorno;\n      total = perPers * qta * gg;\n      det = `${formatEuroFull(perPers)} \u00d7 ${qta} persone \u00d7 ${gg} gg = ${formatEuro2(total)}`;\n    }\n    else if (t === \"SONORA\") {\n      const qta = safeInt(pubTemp_qta.value);\n      if (!qta || qta <= 0) {\n        pubTemp_dettaglio.textContent = \"Inserisci numero postazioni (valore > 0).\";\n        return { total: 0, detail: \"\u2014\" };\n      }\n      const perPost = PUB_TEMP_ALTRI.SONORA.perPostazionePerGiorno;\n      total = perPost * qta * gg;\n      det = `${formatEuroFull(perPost)} \u00d7 ${qta} postazioni \u00d7 ${gg} gg = ${formatEuro2(total)}`;\n    }\n\n    pubTemp_dettaglio.textContent = det;\n    return { total, detail: det };\n  }\n\n  function calcAffissioni() {\n    const dur = aff_durata.value;\n    const cat = aff_categoria.value;\n    const fmt = aff_formato.value;\n    const fogli = safeInt(aff_fogli.value);\n\n    if (!fogli || fogli <= 0) {\n      aff_dettaglio.textContent = \"Inserisci numero fogli (valore > 0).\";\n      return { total: 0, detail: \"\u2014\" };\n    }\n\n    const tariffaFoglio = AFF_TARIFFE[dur][cat][fmt];\n    let base = tariffaFoglio * fogli;\n\n    let perc = 0;\n    if (aff_magg_comm50.checked) perc += 0.50;\n    if (aff_magg_8_12.checked) perc += 0.50;\n    if (aff_magg_over12.checked) perc += 1.00;\n    if (aff_magg_spazi.checked) perc += 1.00;\n\n    let maggiorazioni = base * perc;\n\n    let urgenza = 0;\n    if (aff_magg_urgenza.checked) {\n      urgenza = base * 0.10;\n      if (urgenza < 26) urgenza = 26;\n    }\n\n    const total = base + maggiorazioni + urgenza;\n\n    const det = `Base: ${formatEuroFull(tariffaFoglio)} \u00d7 ${fogli} = ${formatEuro2(base)}; ` +\n                `Maggiorazioni: ${formatEuro2(maggiorazioni)}; ` +\n                `Urgenza: ${formatEuro2(urgenza)}; ` +\n                `Totale: ${formatEuro2(total)}`;\n\n    aff_dettaglio.textContent = det;\n    return { total, detail: det };\n  }\n\n  function updateMercatoUI() {\n    mer_wrapOre.style.display = (mer_modalita.value === \"ORARIA\") ? \"block\" : \"none\";\n  }\n\n  function calcMercato() {\n    updateMercatoUI();\n\n    const t = mer_tipo.value;\n    const m = MERCATO_TARIFFE[t];\n    const mq = safeNum(mer_mq.value);\n    const gg = safeInt(mer_giorni.value);\n\n    if (!t || !m) {\n      mer_dettaglio.textContent = \"Seleziona tipologia.\";\n      return { total: 0, detail: \"\u2014\" };\n    }\n    if (!mq || mq <= 0 || !gg || gg <= 0) {\n      mer_dettaglio.textContent = \"Inserisci mq e giorni (valori > 0).\";\n      return { total: 0, detail: \"\u2014\" };\n    }\n\n    let total = 0;\n    let det = \"\";\n\n    const mod = mer_modalita.value;\n\n    if (mod === \"GIORNALIERA\") {\n      total = m.giornaliera * mq * gg;\n      det = `${formatEuroFull(m.giornaliera)} \u00d7 ${formatNumFull(mq)} mq \u00d7 ${gg} gg = ${formatEuro2(total)}`;\n    }\n    else if (mod === \"ORARIA\") {\n      const ore = safeInt(mer_ore.value);\n      if (!ore || ore <= 0) {\n        mer_dettaglio.textContent = \"Inserisci ore (valore > 0).\";\n        return { total: 0, detail: \"\u2014\" };\n      }\n      total = m.oraria * mq * ore * gg;\n      det = `${formatEuroFull(m.oraria)} \u00d7 ${formatNumFull(mq)} mq \u00d7 ${ore} ore \u00d7 ${gg} gg = ${formatEuro2(total)}`;\n    }\n    else if (mod === \"SEI_ORE\") {\n      total = m.seiOre * mq * gg;\n      det = `${formatEuroFull(m.seiOre)} \u00d7 ${formatNumFull(mq)} mq \u00d7 ${gg} gg = ${formatEuro2(total)} (tariffa 6 ore)`;\n    }\n    else if (mod === \"ORARIA_RICORRENTE\") {\n      if (!m.ricOK || m.orariaRic == null) {\n        mer_dettaglio.textContent = \"Modalit\u00e0 non disponibile per questa tipologia.\";\n        return { total: 0, detail: \"\u2014\" };\n      }\n      const ore = safeInt(mer_ore.value) || 6;\n      total = m.orariaRic * mq * ore * gg;\n      det = `${formatEuroFull(m.orariaRic)} \u00d7 ${formatNumFull(mq)} mq \u00d7 ${ore} ore \u00d7 ${gg} gg = ${formatEuro2(total)} (oraria ricorrente)`;\n    }\n\n    mer_dettaglio.textContent = det;\n    return { total, detail: det };\n  }\n\n  \/\/ =======================\n  \/\/ ROUTER CALCOLO\n  \/\/ =======================\n  function calcolaTotale() {\n    let out = { total: 0, detail: \"\u2014\" };\n\n    switch (servizio.value) {\n      case \"accesso_atti\":\n        out = { total: TARIFFA_ACCESSO_ATTI, detail: `Accesso agli atti: importo fisso ${formatEuro2(TARIFFA_ACCESSO_ATTI)}` };\n        break;\n\n      case \"cdu\":\n        out = calcCDU();\n        break;\n\n      case \"lampade_votive\":\n        out = { total: 18.30 , detail: \"Lampade votive: importo fisso \u20ac 18,30\" };\n        break;\n\n      case \"servizi_cimiteriali\":\n        out = calcCimiteriali();\n        break;\n\n      case \"osp_inferiore_anno\":\n        out = calcOspA();\n        break;\n\n      case \"osp_superiore_anno\":\n        out = calcOspB();\n        break;\n\n      case \"pubblicita_annuale\":\n        out = calcPubAnn();\n        break;\n\n      case \"pubblicita_temporanea\":\n        out = calcPubTemp();\n        break;\n\n      case \"affissioni_pubbliche\":\n        out = calcAffissioni();\n        break;\n\n      case \"canone_mercatale\":\n        out = calcMercato();\n        break;\n\n      default:\n        out = { total: 0, detail: \"\u2014\" };\n    }\n    \/\/ =======================\n    \/\/ DIRITTI + AGEVOLAZIONI\n    \/\/ =======================\n    const base = Number(out.total) || 0;\n\n    \/\/ Agevolazione % (solo sulla tariffa base)\n    let percAgev = 0;\n    if (agevolazione) {\n      percAgev = parseFloat(String(agevolazione.value).replace(',', '.')) || 0;\n      if (percAgev < 0) percAgev = 0;\n      if (percAgev > 100) percAgev = 100;\n    }\n    const sconto = base * (percAgev \/ 100);\n    const baseScontata = base - sconto;\n\n    \/\/ Diritti (aggiunti dopo l'agevolazione)\n    let diritti = 0;\n    if (dirittiIstruttoria && dirittiIstruttoria.checked) diritti += 50;\n    if (dirittiSegreteria && dirittiSegreteria.checked) diritti += 50;\n\n    const totaleFinale = baseScontata + diritti;\n\n    \/\/ Dettaglio esteso\n    const detBase = out.detail || \"\u2014\";\n    const detAgev = (percAgev > 0)\n      ? ` | Agevolazione ${percAgev.toFixed(2).replace('.', ',')}%: -${formatEuro2(sconto)}`\n      : ` | Agevolazione 0%: ${formatEuro2(0)}`;\n    const detDiritti = ` | Diritti: ${formatEuro2(diritti)}`;\n\n    \/\/ Totale finale: 2 decimali\n    totaleEuro.textContent = formatEuro2(totaleFinale);\n    totaleDettaglio.textContent = detBase + detAgev + detDiritti;\n  }\n\n  \/\/ =======================\n  \/\/ EVENTI UI\n  \/\/ =======================\n  servizio.addEventListener(\"change\", function () {\n    hideAll();\n    totaleDettaglio.textContent = \"\u2014\";\n\n    if (this.value === \"accesso_atti\") blkAccessoAtti.style.display = \"block\";\n    if (this.value === \"cdu\") blkCDU.style.display = \"block\";\n    if (this.value === \"lampade_votive\") blkLampade.style.display = \"block\";\n    if (this.value === \"servizi_cimiteriali\") blkCimiteriali.style.display = \"block\";\n    if (this.value === \"osp_inferiore_anno\") blkOspA.style.display = \"block\";\n    if (this.value === \"osp_superiore_anno\") blkOspB.style.display = \"block\";\n    if (this.value === \"pubblicita_annuale\") blkPubAnn.style.display = \"block\";\n    if (this.value === \"pubblicita_temporanea\") blkPubTemp.style.display = \"block\";\n    if (this.value === \"affissioni_pubbliche\") blkAffissioni.style.display = \"block\";\n    if (this.value === \"canone_mercatale\") blkMercato.style.display = \"block\";\n\n    calcolaTotale();\n  });\n\n  \/\/ Cimiteriali\n  if (cimTipo) cimTipo.addEventListener(\"change\", calcolaTotale);\n\n  \/\/ CDU\n  if (cdu_particelle) {\n    cdu_particelle.addEventListener(\"input\", calcolaTotale);\n    cdu_particelle.addEventListener(\"change\", calcolaTotale);\n  }\n\n\n\n  \/\/ Diritti + Agevolazioni\n  if (dirittiIstruttoria) dirittiIstruttoria.addEventListener(\"change\", calcolaTotale);\n  if (dirittiSegreteria) dirittiSegreteria.addEventListener(\"change\", calcolaTotale);\n  if (agevolazione) {\n    agevolazione.addEventListener(\"input\", calcolaTotale);\n    agevolazione.addEventListener(\"change\", calcolaTotale);\n  }\n\n  \/\/ OSP A\n  [ospA_strada, ospA_altraStrada, ospA_tipologia, ospA_durata, ospA_mq, ospA_giorni].forEach(el => {\n    if (!el) return;\n    el.addEventListener(\"input\", calcolaTotale);\n    el.addEventListener(\"change\", calcolaTotale);\n  });\n\n  \/\/ OSP B\n  [ospB_tipologia, ospB_categoria, ospB_qta, ospB_litri].forEach(el => {\n    if (!el) return;\n    el.addEventListener(\"input\", calcolaTotale);\n    el.addEventListener(\"change\", calcolaTotale);\n  });\n  if (ospB_tipologia) {\n    ospB_tipologia.addEventListener(\"change\", function() {\n      ospB_wrapLitri.style.display = (this.value === \"SERBATOI_OLTRE_3000\") ? \"block\" : \"none\";\n      calcolaTotale();\n    });\n  }\n\n  \/\/ Pubblicit\u00e0 annuale\n  [pubAnn_tipo, pubAnn_opLum, pubAnn_scaglione, pubAnn_mq, pubAnn_qta].forEach(el => {\n    if (!el) return;\n    el.addEventListener(\"input\", calcolaTotale);\n    el.addEventListener(\"change\", calcolaTotale);\n  });\n\n  \/\/ Pubblicit\u00e0 temporanea\n  [pubTemp_tipo, pubTemp_opLum, pubTemp_scaglione, pubTemp_giorni, pubTemp_mq, pubTemp_qta].forEach(el => {\n    if (!el) return;\n    el.addEventListener(\"input\", calcolaTotale);\n    el.addEventListener(\"change\", calcolaTotale);\n  });\n\n  \/\/ Affissioni\n  [aff_durata, aff_categoria, aff_formato, aff_fogli,\n   aff_magg_comm50, aff_magg_8_12, aff_magg_over12, aff_magg_spazi, aff_magg_urgenza].forEach(el => {\n    if (!el) return;\n    el.addEventListener(\"input\", calcolaTotale);\n    el.addEventListener(\"change\", calcolaTotale);\n  });\n\n  \/\/ Mercato\n  [mer_tipo, mer_modalita, mer_mq, mer_giorni, mer_ore].forEach(el => {\n    if (!el) return;\n    el.addEventListener(\"input\", calcolaTotale);\n    el.addEventListener(\"change\", calcolaTotale);\n  });\n  if (mer_modalita) {\n    mer_modalita.addEventListener(\"change\", function() {\n      mer_wrapOre.style.display = (this.value === \"ORARIA\") ? \"block\" : \"none\";\n      calcolaTotale();\n    });\n  }\n\n  \/\/ INIT\n  totaleEuro.textContent = formatEuro2(0);\n  totaleDettaglio.textContent = \"\u2014\";\n})();\n<\/script>\n\n\n\n<section class=\"container my-5\" id=\"servizi-descrizione\">\n  <div class=\"row\">\n    <div class=\"col-12 col-lg-10\">\n\n      <h2 class=\"mb-3\">Descrizione dei servizi<\/h2>\n      <p class=\"text-secondary mb-4\">\n        Di seguito sono riportate le principali tipologie di servizi disponibili nel calcolatore, con una breve descrizione\n        delle finalit\u00e0 e dei criteri generali di determinazione dell\u2019importo.\n      <\/p>\n\n      <h3 class=\"h5 mt-4\">Accesso agli atti<\/h3>\n      <p class=\"mb-3\">\n        Servizio per la richiesta di <strong>visione<\/strong> e\/o <strong>rilascio di copia<\/strong> di atti e documenti amministrativi detenuti dall\u2019Ente.\n        Il calcolatore applica l\u2019eventuale <strong>importo fisso<\/strong> previsto per la gestione della richiesta.\n      <\/p>\n\n      <h3 class=\"h5 mt-4\">CDU \u2013 Certificato di Destinazione Urbanistica<\/h3>\n      <p class=\"mb-3\">\n        Servizio per il rilascio del <strong>Certificato di Destinazione Urbanistica (CDU)<\/strong> relativo a terreni\/particelle.\n        Il calcolatore applica l\u2019<strong>importo fisso<\/strong> previsto per la pratica.\n      <\/p>\n\n      <h3 class=\"h5 mt-4\">Lampade votive<\/h3>\n      <p class=\"mb-3\">\n        Servizio cimiteriale per l\u2019attivazione e\/o gestione dell\u2019<strong>illuminazione votiva<\/strong>.\n        Il calcolatore applica l\u2019<strong>importo fisso<\/strong> previsto.\n      <\/p>\n\n      <h3 class=\"h5 mt-4\">Servizi cimiteriali (tariffe fisse)<\/h3>\n      <p class=\"mb-2\">\n        Servizi legati ad operazioni cimiteriali a tariffa fissa (es. <strong>inumazione<\/strong>, <strong>tumulazione<\/strong>,\n        <strong>traslazione<\/strong>, <strong>esumazione\/estumulazione<\/strong>, <strong>ceneri<\/strong>, ecc.).\n        Selezionando la tipologia, il calcolatore restituisce l\u2019<strong>importo corrispondente<\/strong>.\n      <\/p>\n      <div class=\"alert alert-info my-3\" role=\"alert\">\n        <strong>Nota:<\/strong> le tariffe possono variare in base alla specifica tipologia selezionata.\n      <\/div>\n\n      <h3 class=\"h5 mt-4\">Occupazione suolo pubblico \u2013 inferiore all\u2019anno<\/h3>\n      <p class=\"mb-2\">\n        Richieste di <strong>occupazione temporanea<\/strong> di suolo pubblico (es. cantieri, dehors, attivit\u00e0, iniziative).\n        Il calcolo avviene, in via generale, in base a <strong>tipologia<\/strong>, <strong>categoria strada<\/strong>, <strong>superficie (mq)<\/strong>\n        e <strong>durata (giorni)<\/strong>.\n      <\/p>\n      <ul class=\"mb-3\">\n        <li>Categoria strada: <strong>1\u00aa categoria<\/strong> (strade principali) \/ <strong>2\u00aa categoria<\/strong> (tutte le altre).<\/li>\n        <li>Per alcune tipologie \u00e8 prevista la distinzione tra <strong>fino a 30 giorni<\/strong> e <strong>oltre 30 giorni<\/strong>.<\/li>\n      <\/ul>\n\n      <h3 class=\"h5 mt-4\">Occupazione suolo pubblico \u2013 superiore all\u2019anno<\/h3>\n      <p class=\"mb-2\">\n        Occupazioni <strong>annuali o continuative<\/strong> (es. passi carrabili, chioschi, tende, griglie\/botole, antenne, ecc.).\n        Il calcolo avviene, in via generale, in base a <strong>tipologia<\/strong>, <strong>categoria strada<\/strong> e <strong>quantit\u00e0<\/strong>.\n      <\/p>\n      <ul class=\"mb-3\">\n        <li>Per alcune voci pu\u00f2 essere richiesta una quantit\u00e0 in <strong>unit\u00e0\/elementi<\/strong>.<\/li>\n        <li>Per i <strong>serbatoi oltre 3000 litri<\/strong> il calcolo avviene per <strong>scaglioni di 1000 litri o frazione<\/strong> oltre la soglia.<\/li>\n      <\/ul>\n\n      <h3 class=\"h5 mt-4\">Esposizioni pubblicitarie \u2013 annuale<\/h3>\n      <p class=\"mb-2\">\n        Pubblicit\u00e0 con durata <strong>annuale<\/strong> (cartelli\/insegne, pannelli, pubblicit\u00e0 su veicoli, ecc.).\n        Il calcolo varia in base alla tipologia selezionata.\n      <\/p>\n      <ul class=\"mb-3\">\n        <li><strong>Cartelli\/Insegne:<\/strong> scaglioni in mq e opzione <strong>opaca\/luminosa<\/strong>.<\/li>\n        <li><strong>Pannelli\/Display:<\/strong> importo <strong>al mq<\/strong>.<\/li>\n        <li><strong>Veicoli:<\/strong> importo <strong>per numero di mezzi<\/strong>.<\/li>\n      <\/ul>\n\n      <h3 class=\"h5 mt-4\">Esposizioni pubblicitarie \u2013 temporanea<\/h3>\n      <p class=\"mb-2\">\n        Pubblicit\u00e0 con durata <strong>temporanea<\/strong> (cartelli, striscioni, palloni frenati, volantini, pubblicit\u00e0 sonora).\n        Il calcolo considera i <strong>giorni<\/strong> e, a seconda dei casi, <strong>mq<\/strong> o <strong>quantit\u00e0<\/strong>.\n      <\/p>\n      <ul class=\"mb-3\">\n        <li>Per gli <strong>striscioni<\/strong> \u00e8 previsto il conteggio per <strong>periodi di 15 giorni o frazioni<\/strong>.<\/li>\n      <\/ul>\n\n      <h3 class=\"h5 mt-4\">Affissioni pubbliche<\/h3>\n      <p class=\"mb-2\">\n        Servizio per affissione di manifesti tramite impianti comunali. Il calcolo considera <strong>durata<\/strong>, <strong>categoria<\/strong>,\n        <strong>formato<\/strong> e <strong>numero fogli<\/strong>, oltre ad eventuali <strong>maggiorazioni<\/strong> previste.\n      <\/p>\n      <ul class=\"mb-3\">\n        <li>\u00c8 possibile selezionare opzioni come <strong>urgenza<\/strong> e maggiorazioni secondo tariffario.<\/li>\n      <\/ul>\n\n      <h3 class=\"h5 mt-4\">Canone mercatale<\/h3>\n      <p class=\"mb-2\">\n        Servizio relativo al mercato (concessionari e spuntisti). Il calcolo varia per <strong>tipologia<\/strong> e <strong>modalit\u00e0<\/strong>\n        (giornaliera\/oraria\/6 ore, ecc.) e considera <strong>mq<\/strong>, <strong>giorni<\/strong> ed eventualmente <strong>ore<\/strong>.\n      <\/p>\n\n      <div class=\"alert alert-warning mt-4\" role=\"alert\">\n        <strong>Avvertenze:<\/strong> il calcolatore fornisce una <strong>stima<\/strong> dell\u2019importo in base ai dati inseriti e alle tariffe vigenti.\n        L\u2019importo definitivo pu\u00f2 essere confermato dagli uffici in fase istruttoria.\n      <\/div>\n\n    <\/div>\n  <\/div>\n<\/section>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Calcolo importo bollettino Seleziona il servizio e compila i dati richiesti. Il totale viene calcolato automaticamente. Totale da pagare: \u20ac 0,00 \u2014 Servizio * Seleziona\u2026Accesso &#8230; <\/p>\n","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-192","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.comunedicaivano.it\/servizidigitali\/wp-json\/wp\/v2\/pages\/192","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.comunedicaivano.it\/servizidigitali\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.comunedicaivano.it\/servizidigitali\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.comunedicaivano.it\/servizidigitali\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.comunedicaivano.it\/servizidigitali\/wp-json\/wp\/v2\/comments?post=192"}],"version-history":[{"count":29,"href":"https:\/\/www.comunedicaivano.it\/servizidigitali\/wp-json\/wp\/v2\/pages\/192\/revisions"}],"predecessor-version":[{"id":316,"href":"https:\/\/www.comunedicaivano.it\/servizidigitali\/wp-json\/wp\/v2\/pages\/192\/revisions\/316"}],"wp:attachment":[{"href":"https:\/\/www.comunedicaivano.it\/servizidigitali\/wp-json\/wp\/v2\/media?parent=192"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}