{"id":3685,"date":"2025-11-07T21:43:01","date_gmt":"2025-11-07T21:43:01","guid":{"rendered":"https:\/\/gcomunitats.cat\/?page_id=3685"},"modified":"2025-11-16T07:15:52","modified_gmt":"2025-11-16T07:15:52","slug":"creador-de-pressupostos-per-a-comunitats","status":"publish","type":"page","link":"https:\/\/gcomunitats.cat\/es\/creador-de-pressupostos-per-a-comunitats\/","title":{"rendered":"Creador de Pressupostos per a Comunitats"},"content":{"rendered":"\n<p><strong><strong>Simplifica la gesti\u00f3 econ\u00f2mica de la teva comunitat amb la nostra eina de pressupostos intu\u00eftiva i completa.<\/strong><\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Guia r\u00e0pida<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>1.&nbsp;<strong>Configura les entitats<\/strong><\/li>\n\n\n\n<li>2.&nbsp;<strong>Crea els Grups de Despesa<\/strong><\/li>\n\n\n\n<li>3.&nbsp;<strong>Afegeix els Conceptes<\/strong><\/li>\n\n\n\n<li>4.&nbsp;<strong>Configura la Participaci\u00f3<\/strong><\/li>\n\n\n\n<li>5.&nbsp;<strong>Visualitza i Exporta<\/strong><\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>\ud83d\ude80 <a href=\"#guia\">Gu\u00eda detallada aqu\u00ed<\/a><\/strong><\/h3>\n\n\n<style>.kadence-column3685_fa977a-06 > .kt-inside-inner-col,.kadence-column3685_fa977a-06 > .kt-inside-inner-col:before{border-top-left-radius:0px;border-top-right-radius:0px;border-bottom-right-radius:0px;border-bottom-left-radius:0px;}.kadence-column3685_fa977a-06 > .kt-inside-inner-col{column-gap:var(--global-kb-gap-sm, 1rem);}.kadence-column3685_fa977a-06 > .kt-inside-inner-col{flex-direction:column;}.kadence-column3685_fa977a-06 > .kt-inside-inner-col > .aligncenter{width:100%;}.kadence-column3685_fa977a-06 > .kt-inside-inner-col:before{opacity:0.3;}.kadence-column3685_fa977a-06{position:relative;}@media all and (max-width: 1024px){.kadence-column3685_fa977a-06 > .kt-inside-inner-col{flex-direction:column;justify-content:center;}}@media all and (max-width: 767px){.kadence-column3685_fa977a-06 > .kt-inside-inner-col{flex-direction:column;justify-content:center;}}<\/style>\n<div class=\"wp-block-kadence-column kadence-column3685_fa977a-06\"><div class=\"kt-inside-inner-col\">\n<!DOCTYPE html>\n<html lang=\"ca\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>Creador de Pressupostos per a Comunitats de Propietaris<\/title>\n    <script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/jspdf\/2.5.1\/jspdf.umd.min.js\"><\/script>\n    <script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/jspdf-autotable\/3.5.28\/jspdf.plugin.autotable.min.js\"><\/script>\n    <script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/xlsx\/0.18.5\/xlsx.full.min.js\"><\/script>\n    <style>\n        :root {\n            --primary-color: #2c3e50;\n            --secondary-color: #3498db;\n            --accent-color: #e74c3c;\n            --light-color: #ecf0f1;\n            --dark-color: #34495e;\n            --success-color: #27ae60;\n            --warning-color: #f39c12;\n        }\n        \n        * {\n            box-sizing: border-box;\n            margin: 0;\n            padding: 0;\n            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\n        }\n        \n        .container {\n            max-width: 1200px;\n            margin: 0 auto;\n            padding: 20px;\n        }\n        \n        .tabs {\n            display: flex;\n            background-color: var(--dark-color);\n            border-radius: 5px;\n            overflow: hidden;\n            margin-bottom: 20px;\n        }\n        \n        .tab {\n            padding: 12px 20px;\n            background-color: var(--dark-color);\n            color: white;\n            cursor: pointer;\n            transition: background-color 0.3s;\n            flex: 1;\n            text-align: center;\n        }\n        \n        .tab.active {\n            background-color: var(--secondary-color);\n        }\n        \n        .tab:hover:not(.active) {\n            background-color: #3c5a7a;\n        }\n        \n        .tab-content {\n            display: none;\n            padding: 20px;\n            background-color: white;\n            border-radius: 0 0 8px 8px;\n            box-shadow: 0 2px 10px rgba(0,0,0,0.1);\n        }\n        \n        .tab-content.active {\n            display: block;\n        }\n        \n        .form-group {\n            margin-bottom: 15px;\n        }\n        \n        label {\n            display: block;\n            margin-bottom: 5px;\n            font-weight: bold;\n        }\n        \n        input, select, button {\n            width: 100%;\n            padding: 10px;\n            border: 1px solid #ddd;\n            border-radius: 4px;\n            font-size: 16px;\n        }\n        \n        button {\n            background-color: var(--secondary-color);\n            color: white;\n            border: none;\n            cursor: pointer;\n            transition: background-color 0.3s;\n        }\n        \n        button:hover {\n            background-color: #2980b9;\n        }\n        \n        button.delete {\n            background-color: var(--accent-color);\n        }\n        \n        button.delete:hover {\n            background-color: #c0392b;\n        }\n        \n        button.export {\n            background-color: var(--success-color);\n        }\n        \n        button.export:hover {\n            background-color: #219653;\n        }\n        \n        button.edit {\n            background-color: var(--warning-color);\n        }\n        \n        button.edit:hover {\n            background-color: #e67e22;\n        }\n        \n        table {\n            width: 100%;\n            border-collapse: collapse;\n            margin-bottom: 20px;\n        }\n        \n        th, td {\n            padding: 12px 15px;\n            text-align: left;\n            border-bottom: 1px solid #ddd;\n        }\n        \n        th {\n            background-color: var(--light-color);\n            font-weight: bold;\n        }\n        \n        tr:hover {\n            background-color: #f9f9f9;\n        }\n        \n        .actions {\n            display: flex;\n            gap: 5px;\n        }\n        \n        .actions button {\n            flex: 1;\n            padding: 5px 10px;\n            font-size: 14px;\n        }\n        \n        .checkbox-group {\n            display: flex;\n            flex-wrap: wrap;\n            gap: 10px;\n            margin-top: 10px;\n        }\n        \n        .checkbox-item {\n            display: flex;\n            align-items: center;\n            gap: 5px;\n        }\n        \n        .checkbox-item input {\n            width: auto;\n        }\n        \n        .periodicity-selector {\n            display: flex;\n            gap: 10px;\n            margin-bottom: 20px;\n        }\n        \n        .periodicity-selector select {\n            flex: 1;\n        }\n        \n        .results {\n            background-color: var(--light-color);\n            padding: 15px;\n            border-radius: 5px;\n            margin-top: 20px;\n        }\n        \n        .budget-summary {\n            background-color: white;\n            padding: 15px;\n            border-radius: 5px;\n            margin-bottom: 20px;\n            box-shadow: 0 1px 3px rgba(0,0,0,0.1);\n        }\n        \n        .budget-total {\n            font-size: 1.2em;\n            font-weight: bold;\n            color: var(--primary-color);\n            text-align: right;\n            margin-top: 10px;\n            padding-top: 10px;\n            border-top: 1px solid #ddd;\n        }\n        \n        .export-buttons {\n            display: flex;\n            gap: 10px;\n            margin-top: 20px;\n            justify-content: flex-end;\n        }\n        \n        .export-buttons button {\n            width: auto;\n            padding: 10px 20px;\n        }\n        \n        \/* Estilos espec\u00edficos para TODAS las pesta\u00f1as - texto negro *\/\n#pisos,\n#conceptos,\n#participacion,\n#resultados,\n#pisos .results,\n#conceptos .results,\n#participacion .results,\n#resultados .results,\n#pisos .budget-summary,\n#conceptos .budget-summary,\n#participacion .budget-summary,\n#resultados .budget-summary,\n#pisos table,\n#conceptos table,\n#participacion table,\n#resultados table,\n#pisos th,\n#conceptos th,\n#participacion th,\n#resultados th,\n#pisos td,\n#conceptos td,\n#participacion td,\n#resultados td,\n#pisos .budget-total,\n#conceptos .budget-total,\n#participacion .budget-total,\n#resultados .budget-total,\n#pisos h2,\n#conceptos h2,\n#participacion h2,\n#resultados h2,\n#pisos h3,\n#conceptos h3,\n#participacion h3,\n#resultados h3,\n#pisos h4,\n#conceptos h4,\n#participacion h4,\n#resultados h4,\n#pisos p,\n#conceptos p,\n#participacion p,\n#resultados p {\n    color: #000000 !important;\n}\n        \n        .editable {\n            cursor: pointer;\n            transition: background-color 0.2s;\n        }\n        \n        .editable:hover {\n            background-color: #fff3cd;\n        }\n        \n        .editable-input {\n            width: 100%;\n            padding: 5px;\n            border: 2px solid var(--secondary-color);\n            border-radius: 4px;\n            font-size: 14px;\n        }\n        \n        @media (max-width: 768px) {\n            .tabs {\n                flex-direction: column;\n            }\n            \n            .periodicity-selector {\n                flex-direction: column;\n            }\n            \n            .export-buttons {\n                flex-direction: column;\n            }\n            \n            .actions {\n                flex-direction: column;\n            }\n        }\n    <\/style>\n<\/head>\n<body>\n    <div class=\"container\">\n        <header>\n            <h3>Creador de Pressupostos per a Comunitats<\/h3>\n            <p>Gestiona i distribueix les despeses de la teva comunitat de propietaris<\/p>\n        <\/header>\n        \n        <div class=\"tabs\">\n            <div class=\"tab active\" data-tab=\"pisos\">Entitats i Coeficients<\/div>\n            <div class=\"tab\" data-tab=\"conceptos\">Conceptes i Grups<\/div>\n            <div class=\"tab\" data-tab=\"participacion\">Participaci\u00f3<\/div>\n            <div class=\"tab\" data-tab=\"resultados\">Resultats<\/div>\n        <\/div>\n        \n        <div id=\"pisos\" class=\"tab-content active\">\n            <h2>Gesti\u00f3 d&#8217;Entitats i Coeficients<\/h2>\n            <div class=\"form-group\">\n                <label for=\"piso-numero\">Entitat (pis\/local\/parquing, etc)<\/label>\n                <input type=\"text\" id=\"piso-numero\" placeholder=\"Ex: 1A, 2B, P1, etc.\">\n            <\/div>\n            <div class=\"form-group\">\n                <label for=\"piso-coeficiente\">Coeficient de Participaci\u00f3 (%):<\/label>\n                <input type=\"number\" id=\"piso-coeficiente\" min=\"0\" max=\"100\" step=\"0.01\" placeholder=\"Ex: 5.25\">\n            <\/div>\n            <button id=\"agregar-piso\">Afegir Entitat<\/button>\n            \n            <h3>Llista d&#8217;Entitats<\/h3>\n            <table id=\"tabla-pisos\">\n                <thead>\n                    <tr>\n                        <th>Entitat<\/th>\n                        <th>Coeficient (%)<\/th>\n                        <th>Accions<\/th>\n                    <\/tr>\n                <\/thead>\n                <tbody id=\"lista-pisos\">\n                    <!-- Els pisos s'afegiran aqu\u00ed din\u00e0micament -->\n                <\/tbody>\n            <\/table>\n        <\/div>\n        \n        <div id=\"conceptos\" class=\"tab-content\">\n            <h2>Gesti\u00f3 de Conceptes i Grups<\/h2>\n            <div class=\"form-group\">\n                <label for=\"grupo-nombre\">Nom del Grup:<\/label>\n                <input type=\"text\" id=\"grupo-nombre\" placeholder=\"Ex: Despeses de manteniment\">\n            <\/div>\n            <button id=\"agregar-grupo\">Afegir Grup<\/button>\n            \n            <h3>Llista de Grups<\/h3>\n            <table id=\"tabla-grupos\">\n                <thead>\n                    <tr>\n                        <th>Grup<\/th>\n                        <th>Accions<\/th>\n                    <\/tr>\n                <\/thead>\n                <tbody id=\"lista-grupos\">\n                    <!-- Els grups s'afegiran aqu\u00ed din\u00e0micament -->\n                <\/tbody>\n            <\/table>\n            \n            <h3>Conceptes del Pressupost<\/h3>\n            <div class=\"form-group\">\n                <label for=\"concepto-nombre\">Nom del Concepte:<\/label>\n                <input type=\"text\" id=\"concepto-nombre\" placeholder=\"Ex: Neteja de zones comunes\">\n            <\/div>\n            <div class=\"form-group\">\n                <label for=\"concepto-importe\">Import Anual (\u20ac):<\/label>\n                <input type=\"number\" id=\"concepto-importe\" min=\"0\" step=\"0.01\" placeholder=\"Ex: 1200.50\">\n            <\/div>\n            <div class=\"form-group\">\n                <label for=\"concepto-grupo\">Grup (opcional):<\/label>\n                <select id=\"concepto-grupo\">\n                    <option value=\"\">Sense grup<\/option>\n                    <!-- Els grups s'afegiran aqu\u00ed din\u00e0micament -->\n                <\/select>\n            <\/div>\n            <button id=\"agregar-concepto\">Afegir Concepte<\/button>\n            \n            <h3>Llista de Conceptes<\/h3>\n            <table id=\"tabla-conceptos\">\n                <thead>\n                    <tr>\n                        <th>Concepte<\/th>\n                        <th>Import Anual (\u20ac)<\/th>\n                        <th>Grup<\/th>\n                        <th>Accions<\/th>\n                    <\/tr>\n                <\/thead>\n                <tbody id=\"lista-conceptos\">\n                    <!-- Els conceptes s'afegiran aqu\u00ed din\u00e0micament -->\n                <\/tbody>\n            <\/table>\n            \n            <div class=\"budget-summary\">\n                <h3>Resum del Pressupost<\/h3>\n                <div id=\"resumen-grupos\">\n                    <!-- El resum es generar\u00e0 aqu\u00ed din\u00e0micament -->\n                <\/div>\n                <div class=\"budget-total\">\n                    Total Pressupost Anual: <span id=\"total-presupuesto\">0.00<\/span> \u20ac\n                <\/div>\n            <\/div>\n        <\/div>\n        \n        <div id=\"participacion\" class=\"tab-content\">\n            <h2>Participaci\u00f3 en Grups<\/h2>\n            <p>Selecciona quins pisos participen en cada grup de despeses:<\/p>\n            \n            <div id=\"configuracion-participacion\">\n                <!-- La configuraci\u00f3 de participaci\u00f3 es generar\u00e0 aqu\u00ed din\u00e0micament -->\n            <\/div>\n        <\/div>\n        \n        <div id=\"resultados\" class=\"tab-content\">\n            <h2>Resultats del Repartiment<\/h2>\n            \n            <div class=\"periodicity-selector\">\n                <div class=\"form-group\">\n                    <label for=\"periodicidad\">Periodicitat de les Quotes:<\/label>\n                    <select id=\"periodicidad\">\n                        <option value=\"anual\">Anual<\/option>\n                        <option value=\"semestral\">Semestral<\/option>\n                        <option value=\"trimestral\">Trimestral<\/option>\n                        <option value=\"mensual\" selected>Mensual<\/option>\n                    <\/select>\n                <\/div>\n            <\/div>\n            \n            <div class=\"results\">\n                <h3>Distribuci\u00f3 per Pis<\/h3>\n                <table id=\"tabla-resultados\">\n                    <thead>\n                        <tr>\n                            <th>Pis\/Pla\u00e7a<\/th>\n                            <th>Coeficient (%)<\/th>\n                            <th>Quota Total<\/th>\n                            <th>Quota per Per\u00edode<\/th>\n                        <\/tr>\n                    <\/thead>\n                    <tbody id=\"lista-resultados\">\n                        <!-- Els resultats es mostraran aqu\u00ed din\u00e0micament -->\n                    <\/tbody>\n                <\/table>\n                \n                <div class=\"budget-total\">\n                    Total a Repartir: <span id=\"total-repartir\">0.00<\/span> \u20ac\n                <\/div>\n            <\/div>\n            \n            <div class=\"results\">\n                <h3>Detall per Grups<\/h3>\n                <div id=\"detalle-grupos\">\n                    <!-- El detall per grups es mostrar\u00e0 aqu\u00ed din\u00e0micament -->\n                <\/div>\n            <\/div>\n            \n            <div class=\"export-buttons\">\n                <button class=\"export\" id=\"exportar-excel\">Exportar a Excel<\/button>\n                <button class=\"export\" id=\"exportar-pdf\">Exportar a PDF<\/button>\n            <\/div>\n        <\/div>\n    <\/div>\n\n    <script>\n        \/\/ Variables globals per emmagatzemar les dades\n        let pisos = [];\n        let grupos = [];\n        let conceptos = [];\n        let participacion = {}; \/\/ {grupoId: [pisoIds que participen]}\n        \n        \/\/ Funcions per gestionar les pestanyes\n        document.querySelectorAll('.tab').forEach(tab => {\n            tab.addEventListener('click', () => {\n                const tabId = tab.getAttribute('data-tab');\n                \n                \/\/ Treure classe active de totes les pestanyes i continguts\n                document.querySelectorAll('.tab').forEach(t => t.classList.remove('active'));\n                document.querySelectorAll('.tab-content').forEach(tc => tc.classList.remove('active'));\n                \n                \/\/ Afegir classe active a la pestanya i contingut seleccionats\n                tab.classList.add('active');\n                document.getElementById(tabId).classList.add('active');\n            });\n        });\n        \n        \/\/ Funcions per gestionar pisos\n        document.getElementById('agregar-piso').addEventListener('click', agregarPiso);\n        \n        function agregarPiso() {\n            const numero = document.getElementById('piso-numero').value.trim();\n            const coeficiente = parseFloat(document.getElementById('piso-coeficiente').value);\n            \n            if (!numero || isNaN(coeficiente) || coeficiente <= 0) {\n                alert('Si us plau, introdueix un n\u00famero de pis v\u00e0lid i un coeficient major que 0.');\n                return;\n            }\n            \n            \/\/ Verificar si el pis ja existeix\n            if (pisos.some(p => p.numero === numero)) {\n                alert('Aquest pis ja est\u00e0 registrat.');\n                return;\n            }\n            \n            const piso = {\n                id: Date.now().toString(),\n                numero: numero,\n                coeficiente: coeficiente\n            };\n            \n            pisos.push(piso);\n            actualizarListaPisos();\n            actualizarSelectoresParticipacion();\n            calcularResultados();\n            \n            \/\/ Netejar formulari\n            document.getElementById('piso-numero').value = '';\n            document.getElementById('piso-coeficiente').value = '';\n        }\n        \n        function eliminarPiso(id) {\n            pisos = pisos.filter(p => p.id !== id);\n            actualizarListaPisos();\n            actualizarSelectoresParticipacion();\n            calcularResultados();\n        }\n        \n        function editarCoeficientePiso(id, nuevoCoeficiente) {\n            const piso = pisos.find(p => p.id === id);\n            if (piso) {\n                piso.coeficiente = parseFloat(nuevoCoeficiente);\n                actualizarListaPisos();\n                calcularResultados();\n            }\n        }\n        \n        function actualizarListaPisos() {\n            const lista = document.getElementById('lista-pisos');\n            lista.innerHTML = '';\n            \n            pisos.forEach(piso => {\n                const tr = document.createElement('tr');\n                tr.innerHTML = `\n                    <td>${piso.numero}<\/td>\n                    <td class=\"editable\" onclick=\"iniciarEdicionCoeficiente('${piso.id}', this)\">${piso.coeficiente.toFixed(2)}%<\/td>\n                    <td class=\"actions\">\n                        <button class=\"delete\" onclick=\"eliminarPiso('${piso.id}')\">Eliminar<\/button>\n                    <\/td>\n                `;\n                lista.appendChild(tr);\n            });\n        }\n        \n        \/\/ Funcions per gestionar grups\n        document.getElementById('agregar-grupo').addEventListener('click', agregarGrupo);\n        \n        function agregarGrupo() {\n            const nombre = document.getElementById('grupo-nombre').value.trim();\n            \n            if (!nombre) {\n                alert('Si us plau, introdueix un nom per al grup.');\n                return;\n            }\n            \n            \/\/ Verificar si el grup ja existeix\n            if (grupos.some(g => g.nombre === nombre)) {\n                alert('Aquest grup ja est\u00e0 registrat.');\n                return;\n            }\n            \n            const grupo = {\n                id: Date.now().toString(),\n                nombre: nombre\n            };\n            \n            grupos.push(grupo);\n            actualizarListaGrupos();\n            actualizarSelectorGrupos();\n            actualizarSelectoresParticipacion();\n            \n            \/\/ Netejar formulari\n            document.getElementById('grupo-nombre').value = '';\n        }\n        \n        function eliminarGrupo(id) {\n            \/\/ Eliminar conceptes associats a aquest grup\n            conceptos = conceptos.filter(c => c.grupoId !== id);\n            \n            \/\/ Eliminar el grup\n            grupos = grupos.filter(g => g.id !== id);\n            \n            \/\/ Eliminar la participaci\u00f3 d'aquest grup\n            delete participacion[id];\n            \n            actualizarListaGrupos();\n            actualizarListaConceptos();\n            actualizarSelectorGrupos();\n            actualizarSelectoresParticipacion();\n            actualizarResumenPresupuesto();\n            calcularResultados();\n        }\n        \n        function actualizarListaGrupos() {\n            const lista = document.getElementById('lista-grupos');\n            lista.innerHTML = '';\n            \n            grupos.forEach(grupo => {\n                const tr = document.createElement('tr');\n                tr.innerHTML = `\n                    <td>${grupo.nombre}<\/td>\n                    <td class=\"actions\">\n                        <button class=\"delete\" onclick=\"eliminarGrupo('${grupo.id}')\">Eliminar<\/button>\n                    <\/td>\n                `;\n                lista.appendChild(tr);\n            });\n        }\n        \n        function actualizarSelectorGrupos() {\n            const selector = document.getElementById('concepto-grupo');\n            selector.innerHTML = '<option value=\"\">Sense grup<\/option>';\n            \n            grupos.forEach(grupo => {\n                const option = document.createElement('option');\n                option.value = grupo.id;\n                option.textContent = grupo.nombre;\n                selector.appendChild(option);\n            });\n        }\n        \n        \/\/ Funcions per gestionar conceptes\n        document.getElementById('agregar-concepto').addEventListener('click', agregarConcepto);\n        \n        function agregarConcepto() {\n            const nombre = document.getElementById('concepto-nombre').value.trim();\n            const importe = parseFloat(document.getElementById('concepto-importe').value);\n            const grupoId = document.getElementById('concepto-grupo').value;\n            \n            if (!nombre || isNaN(importe) || importe <= 0) {\n                alert('Si us plau, introdueix un nom v\u00e0lid i un import major que 0.');\n                return;\n            }\n            \n            const concepto = {\n                id: Date.now().toString(),\n                nombre: nombre,\n                importe: importe,\n                grupoId: grupoId || null\n            };\n            \n            conceptos.push(concepto);\n            actualizarListaConceptos();\n            actualizarResumenPresupuesto();\n            calcularResultados();\n            \n            \/\/ Netejar formulari\n            document.getElementById('concepto-nombre').value = '';\n            document.getElementById('concepto-importe').value = '';\n            document.getElementById('concepto-grupo').value = '';\n        }\n        \n        function eliminarConcepto(id) {\n            conceptos = conceptos.filter(c => c.id !== id);\n            actualizarListaConceptos();\n            actualizarResumenPresupuesto();\n            calcularResultados();\n        }\n        \n        function editarImporteConcepto(id, nuevoImporte) {\n            const concepto = conceptos.find(c => c.id === id);\n            if (concepto) {\n                concepto.importe = parseFloat(nuevoImporte);\n                actualizarListaConceptos();\n                actualizarResumenPresupuesto();\n                calcularResultados();\n            }\n        }\n        \n        function actualizarListaConceptos() {\n            const lista = document.getElementById('lista-conceptos');\n            lista.innerHTML = '';\n            \n            conceptos.forEach(concepto => {\n                const grupoNombre = concepto.grupoId \n                    ? grupos.find(g => g.id === concepto.grupoId)?.nombre || 'Grup no trobat'\n                    : 'Sense grup';\n                \n                const tr = document.createElement('tr');\n                tr.innerHTML = `\n                    <td>${concepto.nombre}<\/td>\n                    <td class=\"editable\" onclick=\"iniciarEdicionImporte('${concepto.id}', this)\">${concepto.importe.toFixed(2)} \u20ac<\/td>\n                    <td>${grupoNombre}<\/td>\n                    <td class=\"actions\">\n                        <button class=\"edit\" onclick=\"iniciarEdicionImporte('${concepto.id}', this.parentNode.parentNode.cells[1])\">Editar<\/button>\n                        <button class=\"delete\" onclick=\"eliminarConcepto('${concepto.id}')\">Eliminar<\/button>\n                    <\/td>\n                `;\n                lista.appendChild(tr);\n            });\n        }\n        \n        function actualizarResumenPresupuesto() {\n            const resumen = document.getElementById('resumen-grupos');\n            const totalElement = document.getElementById('total-presupuesto');\n            \n            let total = 0;\n            let html = '';\n            \n            \/\/ Conceptes sense grup\n            const conceptosSinGrupo = conceptos.filter(c => !c.grupoId);\n            if (conceptosSinGrupo.length > 0) {\n                const subtotal = conceptosSinGrupo.reduce((sum, c) => sum + c.importe, 0);\n                total += subtotal;\n                html += `<p><strong>Conceptes sense grup:<\/strong> ${subtotal.toFixed(2)} \u20ac<\/p>`;\n            }\n            \n            \/\/ Conceptes per grup\n            grupos.forEach(grupo => {\n                const conceptosDelGrupo = conceptos.filter(c => c.grupoId === grupo.id);\n                if (conceptosDelGrupo.length > 0) {\n                    const subtotal = conceptosDelGrupo.reduce((sum, c) => sum + c.importe, 0);\n                    total += subtotal;\n                    html += `<p><strong>${grupo.nombre}:<\/strong> ${subtotal.toFixed(2)} \u20ac<\/p>`;\n                }\n            });\n            \n            resumen.innerHTML = html;\n            totalElement.textContent = total.toFixed(2);\n        }\n        \n        \/\/ Funcions per gestionar la participaci\u00f3\n        function actualizarSelectoresParticipacion() {\n            const contenedor = document.getElementById('configuracion-participacion');\n            contenedor.innerHTML = '';\n            \n            grupos.forEach(grupo => {\n                const div = document.createElement('div');\n                div.className = 'budget-summary';\n                div.innerHTML = `\n                    <h4>${grupo.nombre}<\/h4>\n                    <p>Selecciona quins pisos participen en aquest grup de despeses:<\/p>\n                    <div class=\"checkbox-group\" id=\"participacion-${grupo.id}\">\n                        <!-- Les caselles de verificaci\u00f3 s'afegiran aqu\u00ed din\u00e0micament -->\n                    <\/div>\n                `;\n                contenedor.appendChild(div);\n                \n                actualizarCheckboxesParticipacion(grupo.id);\n            });\n        }\n        \n        function actualizarCheckboxesParticipacion(grupoId) {\n            const contenedor = document.getElementById(`participacion-${grupoId}`);\n            contenedor.innerHTML = '';\n            \n            \/\/ Inicialitzar la participaci\u00f3 si no existeix\n            if (!participacion[grupoId]) {\n                participacion[grupoId] = pisos.map(p => p.id); \/\/ Per defecte, tots participen\n            }\n            \n            pisos.forEach(piso => {\n                const div = document.createElement('div');\n                div.className = 'checkbox-item';\n                \n                const checkbox = document.createElement('input');\n                checkbox.type = 'checkbox';\n                checkbox.id = `piso-${piso.id}-grupo-${grupoId}`;\n                checkbox.checked = participacion[grupoId].includes(piso.id);\n                checkbox.addEventListener('change', () => {\n                    if (checkbox.checked) {\n                        if (!participacion[grupoId].includes(piso.id)) {\n                            participacion[grupoId].push(piso.id);\n                        }\n                    } else {\n                        participacion[grupoId] = participacion[grupoId].filter(id => id !== piso.id);\n                    }\n                    calcularResultados();\n                });\n                \n                const label = document.createElement('label');\n                label.htmlFor = `piso-${piso.id}-grupo-${grupoId}`;\n                label.textContent = `${piso.numero} (${piso.coeficiente.toFixed(2)}%)`;\n                \n                div.appendChild(checkbox);\n                div.appendChild(label);\n                contenedor.appendChild(div);\n            });\n        }\n        \n        \/\/ Funcions per calcular resultats\n        function calcularResultados() {\n            const periodicidad = document.getElementById('periodicidad').value;\n            const listaResultados = document.getElementById('lista-resultados');\n            const detalleGrupos = document.getElementById('detalle-grupos');\n            const totalRepartir = document.getElementById('total-repartir');\n            \n            listaResultados.innerHTML = '';\n            detalleGrupos.innerHTML = '';\n            \n            \/\/ Calcular el total del pressupost\n            const totalPresupuesto = conceptos.reduce((sum, c) => sum + c.importe, 0);\n            totalRepartir.textContent = totalPresupuesto.toFixed(2);\n            \n            \/\/ Si no hi ha pisos, no podem calcular el repartiment\n            if (pisos.length === 0) {\n                listaResultados.innerHTML = '<tr><td colspan=\"4\">No hi ha pisos registrats<\/td><\/tr>';\n                return;\n            }\n            \n            \/\/ Calcular coeficient total per a normalitzaci\u00f3\n            const coeficienteTotal = pisos.reduce((sum, p) => sum + p.coeficiente, 0);\n            \n            \/\/ Inicialitzar quotes per pis\n            const cuotasPorPiso = {};\n            pisos.forEach(piso => {\n                cuotasPorPiso[piso.id] = 0;\n            });\n            \n            \/\/ Processar conceptes sense grup (es reparteixen entre tots els pisos)\n            const conceptosSinGrupo = conceptos.filter(c => !c.grupoId);\n            conceptosSinGrupo.forEach(concepto => {\n                pisos.forEach(piso => {\n                    const proporcion = piso.coeficiente \/ coeficienteTotal;\n                    cuotasPorPiso[piso.id] += concepto.importe * proporcion;\n                });\n            });\n            \n            \/\/ Processar conceptes amb grup\n            grupos.forEach(grupo => {\n                const conceptosDelGrupo = conceptos.filter(c => c.grupoId === grupo.id);\n                if (conceptosDelGrupo.length === 0) return;\n                \n                const totalGrupo = conceptosDelGrupo.reduce((sum, c) => sum + c.importe, 0);\n                \n                \/\/ Calcular coeficient total dels pisos que participen en aquest grup\n                const pisosParticipantes = pisos.filter(p => participacion[grupo.id]?.includes(p.id));\n                const coeficienteGrupo = pisosParticipantes.reduce((sum, p) => sum + p.coeficiente, 0);\n                \n                \/\/ Repartir el grup entre els pisos participants\n                pisosParticipantes.forEach(piso => {\n                    const proporcion = piso.coeficiente \/ coeficienteGrupo;\n                    cuotasPorPiso[piso.id] += totalGrupo * proporcion;\n                });\n                \n                \/\/ Afegir detall del grup\n                const divGrupo = document.createElement('div');\n                divGrupo.className = 'budget-summary';\n                divGrupo.innerHTML = `\n                    <h4>${grupo.nombre}<\/h4>\n                    <p>Total del grup: ${totalGrupo.toFixed(2)} \u20ac<\/p>\n                    <p>Pisos participants: ${pisosParticipantes.map(p => p.numero).join(', ')}<\/p>\n                `;\n                detalleGrupos.appendChild(divGrupo);\n            });\n            \n            \/\/ Mostrar resultats per pis\n            pisos.forEach(piso => {\n                const cuotaTotal = cuotasPorPiso[piso.id];\n                let cuotaPeriodo = cuotaTotal;\n                \n                \/\/ Ajustar segons la periodicitat seleccionada\n                switch (periodicidad) {\n                    case 'semestral':\n                        cuotaPeriodo = cuotaTotal \/ 2;\n                        break;\n                    case 'trimestral':\n                        cuotaPeriodo = cuotaTotal \/ 4;\n                        break;\n                    case 'mensual':\n                        cuotaPeriodo = cuotaTotal \/ 12;\n                        break;\n                    \/\/ Per anual, no hi ha canvi\n                }\n                \n                const tr = document.createElement('tr');\n                tr.innerHTML = `\n                    <td>${piso.numero}<\/td>\n                    <td>${piso.coeficiente.toFixed(2)}%<\/td>\n                    <td>${cuotaTotal.toFixed(2)} \u20ac<\/td>\n                    <td>${cuotaPeriodo.toFixed(2)} \u20ac<\/td>\n                `;\n                listaResultados.appendChild(tr);\n            });\n        }\n        \n        \/\/ Funcions per editar valors\n        function iniciarEdicionImporte(conceptoId, elemento) {\n            const concepto = conceptos.find(c => c.id === conceptoId);\n            if (!concepto) return;\n            \n            const originalValue = concepto.importe;\n            \n            const input = document.createElement('input');\n            input.type = 'number';\n            input.className = 'editable-input';\n            input.value = originalValue;\n            input.step = '0.01';\n            input.min = '0';\n            \n            elemento.innerHTML = '';\n            elemento.appendChild(input);\n            input.focus();\n            \n            function guardarCambio() {\n                const nuevoValor = parseFloat(input.value);\n                if (!isNaN(nuevoValor) && nuevoValor >= 0) {\n                    editarImporteConcepto(conceptoId, nuevoValor);\n                } else {\n                    elemento.textContent = originalValue.toFixed(2) + ' \u20ac';\n                }\n            }\n            \n            input.addEventListener('blur', guardarCambio);\n            input.addEventListener('keypress', function(e) {\n                if (e.key === 'Enter') {\n                    guardarCambio();\n                }\n            });\n        }\n        \n        function iniciarEdicionCoeficiente(pisoId, elemento) {\n            const piso = pisos.find(p => p.id === pisoId);\n            if (!piso) return;\n            \n            const originalValue = piso.coeficiente;\n            \n            const input = document.createElement('input');\n            input.type = 'number';\n            input.className = 'editable-input';\n            input.value = originalValue;\n            input.step = '0.01';\n            input.min = '0';\n            input.max = '100';\n            \n            elemento.innerHTML = '';\n            elemento.appendChild(input);\n            input.focus();\n            \n            function guardarCambio() {\n                const nuevoValor = parseFloat(input.value);\n                if (!isNaN(nuevoValor) && nuevoValor >= 0 && nuevoValor <= 100) {\n                    editarCoeficientePiso(pisoId, nuevoValor);\n                } else {\n                    elemento.textContent = originalValue.toFixed(2) + '%';\n                }\n            }\n            \n            input.addEventListener('blur', guardarCambio);\n            input.addEventListener('keypress', function(e) {\n                if (e.key === 'Enter') {\n                    guardarCambio();\n                }\n            });\n        }\n        \n        \/\/ Event listener per canvis en la periodicitat\n        document.getElementById('periodicidad').addEventListener('change', calcularResultados);\n        \n        \/\/ Funcions d'exportaci\u00f3\n        document.getElementById('exportar-excel').addEventListener('click', exportarExcel);\n        document.getElementById('exportar-pdf').addEventListener('click', exportarPDF);\n        \n        function exportarExcel() {\n            \/\/ Crear un llibre de treball\n            const wb = XLSX.utils.book_new();\n            \n            \/\/ Full de pisos\n            const datosPisos = [\n                ['Pis\/Pla\u00e7a', 'Coeficient (%)']\n            ];\n            pisos.forEach(piso => {\n                datosPisos.push([piso.numero, piso.coeficiente]);\n            });\n            const wsPisos = XLSX.utils.aoa_to_sheet(datosPisos);\n            XLSX.utils.book_append_sheet(wb, wsPisos, 'Pisos i Places');\n            \n            \/\/ Full de grups\n            const datosGrupos = [\n                ['Grup', 'Total (\u20ac)', 'Pisos Participants']\n            ];\n            grupos.forEach(grupo => {\n                const conceptosDelGrupo = conceptos.filter(c => c.grupoId === grupo.id);\n                const totalGrupo = conceptosDelGrupo.reduce((sum, c) => sum + c.importe, 0);\n                const pisosParticipantes = pisos.filter(p => participacion[grupo.id]?.includes(p.id));\n                const nombresPisos = pisosParticipantes.map(p => p.numero).join(', ');\n                \n                datosGrupos.push([grupo.nombre, totalGrupo, nombresPisos]);\n            });\n            const wsGrupos = XLSX.utils.aoa_to_sheet(datosGrupos);\n            XLSX.utils.book_append_sheet(wb, wsGrupos, 'Grups');\n            \n            \/\/ Full de conceptes\n            const datosConceptos = [\n                ['Concepte', 'Import Anual (\u20ac)', 'Grup']\n            ];\n            conceptos.forEach(concepto => {\n                const grupoNombre = concepto.grupoId \n                    ? grupos.find(g => g.id === concepto.grupoId)?.nombre || 'Grup no trobat'\n                    : 'Sense grup';\n                datosConceptos.push([concepto.nombre, concepto.importe, grupoNombre]);\n            });\n            const wsConceptos = XLSX.utils.aoa_to_sheet(datosConceptos);\n            XLSX.utils.book_append_sheet(wb, wsConceptos, 'Conceptes');\n            \n            \/\/ Full de resultats\n            const periodicidad = document.getElementById('periodicidad').value;\n            const datosResultados = [\n                ['Pis\/Pla\u00e7a', 'Coeficient (%)', 'Quota Total (\u20ac)', `Quota ${periodicidad} (\u20ac)`]\n            ];\n            \n            \/\/ Calcular quotes per a exportaci\u00f3\n            const coeficienteTotal = pisos.reduce((sum, p) => sum + p.coeficiente, 0);\n            const cuotasPorPiso = {};\n            pisos.forEach(piso => {\n                cuotasPorPiso[piso.id] = 0;\n            });\n            \n            \/\/ Conceptes sense grup\n            const conceptosSinGrupo = conceptos.filter(c => !c.grupoId);\n            conceptosSinGrupo.forEach(concepto => {\n                pisos.forEach(piso => {\n                    const proporcion = piso.coeficiente \/ coeficienteTotal;\n                    cuotasPorPiso[piso.id] += concepto.importe * proporcion;\n                });\n            });\n            \n            \/\/ Conceptes amb grup\n            grupos.forEach(grupo => {\n                const conceptosDelGrupo = conceptos.filter(c => c.grupoId === grupo.id);\n                if (conceptosDelGrupo.length === 0) return;\n                \n                const totalGrupo = conceptosDelGrupo.reduce((sum, c) => sum + c.importe, 0);\n                const pisosParticipantes = pisos.filter(p => participacion[grupo.id]?.includes(p.id));\n                const coeficienteGrupo = pisosParticipantes.reduce((sum, p) => sum + p.coeficiente, 0);\n                \n                pisosParticipantes.forEach(piso => {\n                    const proporcion = piso.coeficiente \/ coeficienteGrupo;\n                    cuotasPorPiso[piso.id] += totalGrupo * proporcion;\n                });\n            });\n            \n            \/\/ Afegir dades al full\n            pisos.forEach(piso => {\n                const cuotaTotal = cuotasPorPiso[piso.id];\n                let cuotaPeriodo = cuotaTotal;\n                \n                switch (periodicidad) {\n                    case 'semestral':\n                        cuotaPeriodo = cuotaTotal \/ 2;\n                        break;\n                    case 'trimestral':\n                        cuotaPeriodo = cuotaTotal \/ 4;\n                        break;\n                    case 'mensual':\n                        cuotaPeriodo = cuotaTotal \/ 12;\n                        break;\n                }\n                \n                datosResultados.push([\n                    piso.numero,\n                    piso.coeficiente,\n                    cuotaTotal.toFixed(2),\n                    cuotaPeriodo.toFixed(2)\n                ]);\n            });\n            \n            const wsResultados = XLSX.utils.aoa_to_sheet(datosResultados);\n            XLSX.utils.book_append_sheet(wb, wsResultados, 'Resultats');\n            \n            \/\/ Guardar l'arxiu\n            XLSX.writeFile(wb, 'pressupost_comunitat.xlsx');\n        }\n        \n        function exportarPDF() {\n            \/\/ Usar jsPDF amb autotable\n            const { jsPDF } = window.jspdf;\n            const doc = new jsPDF();\n            \n            let yPos = 20;\n            \n            \/\/ T\u00edtol\n            doc.setFontSize(18);\n            doc.text('PRESSUPOST ANUAL DE LA COMUNITAT', 20, yPos);\n            yPos += 15;\n            \n            \/\/ Data\n            const fecha = new Date().toLocaleDateString('ca-ES');\n            doc.setFontSize(12);\n            doc.text(`Generat el: ${fecha}`, 20, yPos);\n            yPos += 20;\n            \n            \/\/ Resum del pressupost\n            const totalPresupuesto = conceptos.reduce((sum, c) => sum + c.importe, 0);\n            doc.setFontSize(14);\n            doc.text(`TOTAL PRESSUPOST ANUAL: ${totalPresupuesto.toFixed(2)} \u20ac`, 20, yPos);\n            yPos += 15;\n            \n            \/\/ Taula de grups i conceptes\n            doc.setFontSize(16);\n            doc.text('DETALL DE GRUPS I CONCEPTES', 20, yPos);\n            yPos += 10;\n            \n            \/\/ Conceptes sense grup\n            const conceptosSinGrupo = conceptos.filter(c => !c.grupoId);\n            if (conceptosSinGrupo.length > 0) {\n                const subtotalSinGrupo = conceptosSinGrupo.reduce((sum, c) => sum + c.importe, 0);\n                \n                doc.setFontSize(12);\n                doc.text(`CONCEPTES SENSE GRUP: ${subtotalSinGrupo.toFixed(2)} \u20ac`, 25, yPos);\n                yPos += 8;\n                \n                conceptosSinGrupo.forEach(concepto => {\n                    doc.text(`\u2022 ${concepto.nombre}: ${concepto.importe.toFixed(2)} \u20ac`, 30, yPos);\n                    yPos += 6;\n                    \n                    \/\/ Verificar si necessitem una nova p\u00e0gina\n                    if (yPos > 270) {\n                        doc.addPage();\n                        yPos = 20;\n                    }\n                });\n                yPos += 5;\n            }\n            \n            \/\/ Grups i els seus conceptes\n            grupos.forEach(grupo => {\n                const conceptosDelGrupo = conceptos.filter(c => c.grupoId === grupo.id);\n                if (conceptosDelGrupo.length === 0) return;\n                \n                const totalGrupo = conceptosDelGrupo.reduce((sum, c) => sum + c.importe, 0);\n                const pisosParticipantes = pisos.filter(p => participacion[grupo.id]?.includes(p.id));\n                const nombresPisos = pisosParticipantes.map(p => p.numero).join(', ');\n                \n                doc.setFontSize(12);\n                doc.text(`GRUP: ${grupo.nombre} - ${totalGrupo.toFixed(2)} \u20ac`, 25, yPos);\n                yPos += 8;\n                \n                doc.setFontSize(10);\n                doc.text(`Pisos participants: ${nombresPisos}`, 30, yPos);\n                yPos += 6;\n                \n                conceptosDelGrupo.forEach(concepto => {\n                    doc.text(`\u2022 ${concepto.nombre}: ${concepto.importe.toFixed(2)} \u20ac`, 35, yPos);\n                    yPos += 6;\n                    \n                    \/\/ Verificar si necessitem una nova p\u00e0gina\n                    if (yPos > 270) {\n                        doc.addPage();\n                        yPos = 20;\n                    }\n                });\n                yPos += 5;\n            });\n            \n            \/\/ Nova p\u00e0gina pels resultats\n            doc.addPage();\n            yPos = 20;\n            \n            \/\/ Taula de resultats\n            doc.setFontSize(16);\n            doc.text('DISTRIBUCI\u00d3 PER ENTITAT', 20, yPos);\n            yPos += 15;\n            \n            const periodicidad = document.getElementById('periodicidad').value;\n            doc.setFontSize(12);\n            doc.text(`Periodicitat de les quotes: ${periodicidad.toUpperCase()}`, 20, yPos);\n            yPos += 10;\n            \n            \/\/ Calcular quotes per a PDF\n            const coeficienteTotal = pisos.reduce((sum, p) => sum + p.coeficiente, 0);\n            const cuotasPorPiso = {};\n            pisos.forEach(piso => {\n                cuotasPorPiso[piso.id] = 0;\n            });\n            \n            \/\/ Conceptes sense grup\n            conceptosSinGrupo.forEach(concepto => {\n                pisos.forEach(piso => {\n                    const proporcion = piso.coeficiente \/ coeficienteTotal;\n                    cuotasPorPiso[piso.id] += concepto.importe * proporcion;\n                });\n            });\n            \n            \/\/ Conceptes amb grup\n            grupos.forEach(grupo => {\n                const conceptosDelGrupo = conceptos.filter(c => c.grupoId === grupo.id);\n                if (conceptosDelGrupo.length === 0) return;\n                \n                const totalGrupo = conceptosDelGrupo.reduce((sum, c) => sum + c.importe, 0);\n                const pisosParticipantes = pisos.filter(p => participacion[grupo.id]?.includes(p.id));\n                const coeficienteGrupo = pisosParticipantes.reduce((sum, p) => sum + p.coeficiente, 0);\n                \n                pisosParticipantes.forEach(piso => {\n                    const proporcion = piso.coeficiente \/ coeficienteGrupo;\n                    cuotasPorPiso[piso.id] += totalGrupo * proporcion;\n                });\n            });\n            \n            \/\/ Preparar dades per a la taula\n            const tableData = [];\n            \n            pisos.forEach(piso => {\n                const cuotaTotal = cuotasPorPiso[piso.id];\n                let cuotaPeriodo = cuotaTotal;\n                \n                switch (periodicidad) {\n                    case 'semestral':\n                        cuotaPeriodo = cuotaTotal \/ 2;\n                        break;\n                    case 'trimestral':\n                        cuotaPeriodo = cuotaTotal \/ 4;\n                        break;\n                    case 'mensual':\n                        cuotaPeriodo = cuotaTotal \/ 12;\n                        break;\n                }\n                \n                tableData.push([\n                    piso.numero,\n                    piso.coeficiente.toFixed(2) + '%',\n                    cuotaTotal.toFixed(2) + ' \u20ac',\n                    cuotaPeriodo.toFixed(2) + ' \u20ac'\n                ]);\n            });\n            \n            \/\/ Afegir taula al PDF\n            doc.autoTable({\n                startY: yPos,\n                head: [['Entitat', 'Coeficient', 'Quota Total', `Quota ${periodicidad}`]],\n                body: tableData,\n                theme: 'grid',\n                styles: { fontSize: 10 },\n                headStyles: { fillColor: [44, 62, 80] }\n            });\n            \n            \/\/ Guardar el PDF\n            doc.save('pressupost_comunitat_complet.pdf');\n        }\n        \n        \/\/ Inicialitzaci\u00f3\n        document.addEventListener('DOMContentLoaded', () => {\n            \/\/ Afegir dades d'exemple\n            agregarDatosEjemplo();\n        });\n        \n        function agregarDatosEjemplo() {\n            \/\/ Pisos d'exemple (10 pisos + 10 places de parking)\n            pisos = [\n                \/\/ Pisos\n                { id: '1', numero: 'Local A', coeficiente: 10.0 },\n                { id: '2', numero: 'Local B', coeficiente: 10.0 },\n                { id: '3', numero: '1A', coeficiente: 15.0 },\n                { id: '4', numero: '1B', coeficiente: 15.0 },\n                { id: '5', numero: '2A', coeficiente: 17.5 },\n                { id: '6', numero: '2B', coeficiente: 17.5 },\n                \/\/ Places de parking\n                { id: '7', numero: 'P1', coeficiente: 2.5 },\n                { id: '8', numero: 'P2', coeficiente: 2.5 },\n                { id: '9', numero: 'P3', coeficiente: 2.5 },\n                { id: '10', numero: 'P4', coeficiente: 2.5 },\n                { id: '11', numero: 'P5', coeficiente: 2.5 },\n                { id: '12', numero: 'P6', coeficiente: 2.5 },\n            ];\n            \n            \/\/ Grups d'exemple\n            grupos = [\n                { id: '1', nombre: 'Grup 1: Despeses generals' },\n                { id: '2', nombre: 'Grup 2: Despeses d\\'escala' },\n                { id: '3', nombre: 'Grup 3: Despeses de parking' }\n            ];\n            \n            \/\/ Conceptes d'exemple\n            conceptos = [\n                \/\/ Grup 1: Despeses generals\n                { id: '1', nombre: 'Asseguran\u00e7a de comunitat', importe: 1800.00, grupoId: '1' },\n                { id: '2', nombre: 'PRL (Prevenci\u00f3 de Riscos Laborals)', importe: 200.00, grupoId: '1' },\n                { id: '3', nombre: 'Fons de reserva', importe: 2000.00, grupoId: '1' },\n                { id: '4', nombre: 'Reparacions i manteniment de l\\'edifici', importe: 500.00, grupoId: '1' },\n                { id: '5', nombre: 'Despeses de presid\u00e8ncia i secretaria', importe: 200.00, grupoId: '1' },\n                \n                \/\/ Grup 2: Despeses d'escala\n                { id: '5', nombre: 'Llum d\\'ascensor i d\\'escala', importe: 1200.00, grupoId: '2' },\n                { id: '6', nombre: 'Neteja d\\'escala', importe: 2400.00, grupoId: '2' },\n                { id: '7', nombre: 'Manteniment d\\'ascensor', importe: 1500.00, grupoId: '2' },\n                { id: '8', nombre: 'Reparacions i manteniment de l\\'escala', importe: 500.00, grupoId: '2' },\n                { id: '9', nombre: 'Reparacions de l\\'ascensor', importe: 500.00, grupoId: '2' },\n                \n                \/\/ Grup 3: Despeses de parking\n                { id: '10', nombre: 'Neteja del parking', importe: 500.00, grupoId: '3' },\n                { id: '12', nombre: 'Llum del parking', importe: 1200.00, grupoId: '3' },\n                { id: '13', nombre: 'Reparacions i manteniment del parking', importe: 500.00, grupoId: '3' },\n                { id: '14', nombre: 'Manteniment de baixa tensi\u00f3', importe: 250.00, grupoId: '3' }\n            ];\n            \n            \/\/ Participaci\u00f3 d'exemple\n            \/\/ Grup 1: Tots els pisos i places participen\n            participacion['1'] = pisos.map(p => p.id);\n            \n            \/\/ Grup 2: Nom\u00e9s els pisos (no les places de parking)\n            participacion['2'] = pisos.filter(p => !p.numero.startsWith('P')).map(p => p.id);\n            \n            \/\/ Grup 3: Nom\u00e9s les places de parking\n            participacion['3'] = pisos.filter(p => p.numero.startsWith('P')).map(p => p.id);\n            \n            \/\/ Actualitzar les interf\u00edcies\n            actualizarListaPisos();\n            actualizarListaGrupos();\n            actualizarListaConceptos();\n            actualizarSelectorGrupos();\n            actualizarSelectoresParticipacion();\n            actualizarResumenPresupuesto();\n            calcularResultados();\n        }\n    <\/script>\n<\/body>\n<\/html>\n<\/div><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"guia\">Com Utilitzar l\u2019Eina<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1.&nbsp;<strong>Configura les entitats<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Afegeix tots els pisos, places de parking o locals.<\/li>\n\n\n\n<li>Assigna coeficients de participaci\u00f3 (la suma ha de ser 100%)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">2.&nbsp;<strong>Crea els Grups de Despesa<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Grup 1: Despeses generals (tots participen)<\/li>\n\n\n\n<li>Grup 2: Despeses d\u2019escala (nom\u00e9s pisos)<\/li>\n\n\n\n<li>Grup 3: Despeses de parking (nom\u00e9s places d&#8217;aparcament)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">3.&nbsp;<strong>Afegeix els Conceptes<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Clica sobre els imports per editar-los directament<\/li>\n\n\n\n<li>Organitza les despeses per grups<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">4.&nbsp;<strong>Configura la Participaci\u00f3<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Selecciona quins pisos participen en cada grup<\/li>\n\n\n\n<li>Els canvis es reflecteixen autom\u00e0ticament<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">5.&nbsp;<strong>Visualitza i Exporta<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Consulta les quotes per a cada pis<\/li>\n\n\n\n<li>Canvia la periodicitat (mensual, trimestral, etc.)<\/li>\n\n\n\n<li>Exporta a Excel o PDF per compartir<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">&nbsp;Consells R\u00e0pids<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Clica als n\u00fameros<\/strong>&nbsp;per editar imports i coeficients<\/li>\n\n\n\n<li><strong>Tots els c\u00e0lculs s\u00f3n en temps real<\/strong><\/li>\n\n\n\n<li><strong>Guarda els resultats<\/strong>&nbsp;amb els botons d\u2019exportaci\u00f3<\/li>\n<\/ul>\n\n\n<style>.kb-row-layout-id3461_e5a16a-05 > .kt-row-column-wrap{align-content:start;}:where(.kb-row-layout-id3461_e5a16a-05 > .kt-row-column-wrap) > .wp-block-kadence-column{justify-content:start;}.kb-row-layout-id3461_e5a16a-05 > .kt-row-column-wrap{column-gap:var(--global-kb-gap-md, 2rem);row-gap:var(--global-kb-gap-md, 2rem);max-width:var( --global-content-width, 1290px );padding-left:var(--global-content-edge-padding);padding-right:var(--global-content-edge-padding);padding-top:80px;padding-right:20px;padding-bottom:80px;padding-left:20px;grid-template-columns:minmax(0, 1fr);}.kb-row-layout-id3461_e5a16a-05{background-image:url('https:\/\/gcomunitats.cat\/wp-content\/uploads\/2025\/10\/respondiendo-email.jpg');background-size:cover;background-position:47% 80%;background-attachment:fixed;background-repeat:no-repeat;}.kb-row-layout-id3461_e5a16a-05 > .kt-row-layout-overlay{opacity:0.75;background-color:var(--global-palette2, #2B6CB0);}@media all and (max-width: 1024px), only screen and (min-device-width: 1024px) and (max-device-width: 1366px) and (-webkit-min-device-pixel-ratio: 2) and (hover: none){.kb-row-layout-id3461_e5a16a-05{background-attachment:scroll;}}@media all and (max-width: 1024px){.kb-row-layout-id3461_e5a16a-05 > .kt-row-column-wrap{padding-top:60px;padding-right:100px;padding-bottom:60px;padding-left:100px;grid-template-columns:minmax(0, 1fr);}}@media all and (max-width: 767px){.kb-row-layout-id3461_e5a16a-05 > .kt-row-column-wrap{padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;grid-template-columns:minmax(0, 1fr);}}<\/style><div class=\"kb-row-layout-wrap kb-row-layout-id3461_e5a16a-05 alignnone kt-row-has-bg wp-block-kadence-rowlayout\"><div class=\"kt-row-layout-overlay kt-row-overlay-normal\"><\/div><div class=\"kt-row-column-wrap kt-has-1-columns kt-row-layout-equal kt-tab-layout-inherit kt-mobile-layout-row kt-row-valign-top kb-theme-content-width\">\n<style>.kadence-column3461_7793e7-45 > .kt-inside-inner-col{padding-top:20px;padding-right:20px;padding-bottom:20px;padding-left:20px;}.kadence-column3461_7793e7-45 > .kt-inside-inner-col,.kadence-column3461_7793e7-45 > .kt-inside-inner-col:before{border-top-left-radius:0px;border-top-right-radius:0px;border-bottom-right-radius:0px;border-bottom-left-radius:0px;}.kadence-column3461_7793e7-45 > .kt-inside-inner-col{column-gap:var(--global-kb-gap-sm, 1rem);}.kadence-column3461_7793e7-45 > .kt-inside-inner-col{flex-direction:column;}.kadence-column3461_7793e7-45 > .kt-inside-inner-col > .aligncenter{width:100%;}.kadence-column3461_7793e7-45 > .kt-inside-inner-col:before{opacity:0.3;}.kadence-column3461_7793e7-45{position:relative;}@media all and (max-width: 1024px){.kadence-column3461_7793e7-45 > .kt-inside-inner-col{padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;flex-direction:column;justify-content:center;}}@media all and (max-width: 1024px){.kadence-column3461_7793e7-45, .kt-inside-inner-col > .kadence-column3461_7793e7-45:not(.specificity){margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;}}@media all and (max-width: 767px){.kadence-column3461_7793e7-45 > .kt-inside-inner-col{padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;flex-direction:column;justify-content:center;}}<\/style>\n<div class=\"wp-block-kadence-column kadence-column3461_7793e7-45 inner-column-1\"><div class=\"kt-inside-inner-col\"><style>.kb-row-layout-id3461_d8387e-ca > .kt-row-column-wrap{align-content:start;}:where(.kb-row-layout-id3461_d8387e-ca > .kt-row-column-wrap) > .wp-block-kadence-column{justify-content:start;}.kb-row-layout-id3461_d8387e-ca > .kt-row-column-wrap{column-gap:20px;row-gap:20px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;grid-template-columns:minmax(0, calc(35% - ((20px * 1 )\/2)))minmax(0, calc(65% - ((20px * 1 )\/2)));}.kb-row-layout-id3461_d8387e-ca > .kt-row-layout-overlay{opacity:0.30;}@media all and (max-width: 1024px){.kb-row-layout-id3461_d8387e-ca > .kt-row-column-wrap{padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;grid-template-columns:minmax(0, 1fr);}}@media all and (max-width: 767px){.kb-row-layout-id3461_d8387e-ca > .kt-row-column-wrap{padding-top:0px;padding-right:0px;padding-bottom:20px;padding-left:0px;grid-template-columns:minmax(0, 1fr);}}<\/style><div class=\"kb-row-layout-wrap kb-row-layout-id3461_d8387e-ca alignnone has-theme-palette8-background-color kt-row-has-bg wp-block-kadence-rowlayout\"><div class=\"kt-row-column-wrap kt-has-2-columns kt-row-layout-equal kt-tab-layout-row kt-mobile-layout-row kt-row-valign-top\">\n<style>.kadence-column3461_72b875-f6 > .kt-inside-inner-col{display:flex;}.kadence-column3461_72b875-f6 > .kt-inside-inner-col{padding-top:90px;padding-right:10px;padding-bottom:60px;padding-left:10px;}.kadence-column3461_72b875-f6 > .kt-inside-inner-col,.kadence-column3461_72b875-f6 > .kt-inside-inner-col:before{border-top-left-radius:0px;border-top-right-radius:0px;border-bottom-right-radius:0px;border-bottom-left-radius:0px;}.kadence-column3461_72b875-f6 > .kt-inside-inner-col{column-gap:var(--global-kb-gap-sm, 1rem);}.kadence-column3461_72b875-f6 > .kt-inside-inner-col{flex-direction:column;justify-content:flex-start;}.kadence-column3461_72b875-f6 > .kt-inside-inner-col > .aligncenter{width:100%;}.kt-row-column-wrap > .kadence-column3461_72b875-f6{align-self:flex-start;}.kt-inner-column-height-full:not(.kt-has-1-columns) > .wp-block-kadence-column.kadence-column3461_72b875-f6{align-self:auto;}.kt-inner-column-height-full:not(.kt-has-1-columns) > .wp-block-kadence-column.kadence-column3461_72b875-f6 > .kt-inside-inner-col{flex-direction:column;justify-content:flex-start;}.kadence-column3461_72b875-f6 > .kt-inside-inner-col:before{opacity:0.3;}.kadence-column3461_72b875-f6{position:relative;}.kadence-column3461_72b875-f6, .kt-inside-inner-col > .kadence-column3461_72b875-f6:not(.specificity){margin-right:12px;}@media all and (max-width: 1024px){.kt-row-column-wrap > .kadence-column3461_72b875-f6{align-self:flex-start;}}@media all and (max-width: 1024px){.kt-inner-column-height-full:not(.kt-has-1-columns) > .wp-block-kadence-column.kadence-column3461_72b875-f6{align-self:auto;}}@media all and (max-width: 1024px){.kt-inner-column-height-full:not(.kt-has-1-columns) > .wp-block-kadence-column.kadence-column3461_72b875-f6 > .kt-inside-inner-col{flex-direction:column;justify-content:flex-start;}}@media all and (max-width: 1024px){.kadence-column3461_72b875-f6 > .kt-inside-inner-col{flex-direction:column;justify-content:flex-start;}}@media all and (max-width: 1024px){.kadence-column3461_72b875-f6, .kt-inside-inner-col > .kadence-column3461_72b875-f6:not(.specificity){margin-right:0px;margin-left:0px;}}@media all and (max-width: 767px){.kadence-column3461_72b875-f6 > .kt-inside-inner-col{padding-top:20px;padding-right:20px;padding-bottom:20px;padding-left:20px;flex-direction:column;justify-content:flex-start;}.kt-row-column-wrap > .kadence-column3461_72b875-f6{align-self:flex-start;}.kt-inner-column-height-full:not(.kt-has-1-columns) > .wp-block-kadence-column.kadence-column3461_72b875-f6{align-self:auto;}.kt-inner-column-height-full:not(.kt-has-1-columns) > .wp-block-kadence-column.kadence-column3461_72b875-f6 > .kt-inside-inner-col{flex-direction:column;justify-content:flex-start;}.kadence-column3461_72b875-f6, .kt-inside-inner-col > .kadence-column3461_72b875-f6:not(.specificity){margin-right:0px;margin-left:0px;}}<\/style>\n<div class=\"wp-block-kadence-column kadence-column3461_72b875-f6 inner-column-1\"><div class=\"kt-inside-inner-col\"><style>.wp-block-kadence-advancedheading.kt-adv-heading3461_c068ef-aa, .wp-block-kadence-advancedheading.kt-adv-heading3461_c068ef-aa[data-kb-block=\"kb-adv-heading3461_c068ef-aa\"]{margin-bottom:10px;font-style:normal;}.wp-block-kadence-advancedheading.kt-adv-heading3461_c068ef-aa mark.kt-highlight, .wp-block-kadence-advancedheading.kt-adv-heading3461_c068ef-aa[data-kb-block=\"kb-adv-heading3461_c068ef-aa\"] mark.kt-highlight{font-style:normal;color:#f76a0c;-webkit-box-decoration-break:clone;box-decoration-break:clone;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.wp-block-kadence-advancedheading.kt-adv-heading3461_c068ef-aa img.kb-inline-image, .wp-block-kadence-advancedheading.kt-adv-heading3461_c068ef-aa[data-kb-block=\"kb-adv-heading3461_c068ef-aa\"] img.kb-inline-image{width:150px;vertical-align:baseline;}@media all and (max-width: 1024px){.wp-block-kadence-advancedheading.kt-adv-heading3461_c068ef-aa, .wp-block-kadence-advancedheading.kt-adv-heading3461_c068ef-aa[data-kb-block=\"kb-adv-heading3461_c068ef-aa\"]{text-align:center!important;}}@media all and (max-width: 767px){.wp-block-kadence-advancedheading.kt-adv-heading3461_c068ef-aa, .wp-block-kadence-advancedheading.kt-adv-heading3461_c068ef-aa[data-kb-block=\"kb-adv-heading3461_c068ef-aa\"]{text-align:center!important;}}<\/style>\n<h6 class=\"kt-adv-heading3461_c068ef-aa wp-block-kadence-advancedheading\" data-kb-block=\"kb-adv-heading3461_c068ef-aa\">Contacta&#8217;m!<\/h6>\n\n\n<style>.wp-block-kadence-advancedheading.kt-adv-heading3461_e4d78f-99, .wp-block-kadence-advancedheading.kt-adv-heading3461_e4d78f-99[data-kb-block=\"kb-adv-heading3461_e4d78f-99\"]{margin-bottom:20px;text-align:left;font-size:var(--global-kb-font-size-lg, 2rem);font-style:normal;}.wp-block-kadence-advancedheading.kt-adv-heading3461_e4d78f-99 mark.kt-highlight, .wp-block-kadence-advancedheading.kt-adv-heading3461_e4d78f-99[data-kb-block=\"kb-adv-heading3461_e4d78f-99\"] mark.kt-highlight{font-style:normal;color:#f76a0c;-webkit-box-decoration-break:clone;box-decoration-break:clone;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.wp-block-kadence-advancedheading.kt-adv-heading3461_e4d78f-99 img.kb-inline-image, .wp-block-kadence-advancedheading.kt-adv-heading3461_e4d78f-99[data-kb-block=\"kb-adv-heading3461_e4d78f-99\"] img.kb-inline-image{width:150px;vertical-align:baseline;}@media all and (max-width: 1024px){.wp-block-kadence-advancedheading.kt-adv-heading3461_e4d78f-99, .wp-block-kadence-advancedheading.kt-adv-heading3461_e4d78f-99[data-kb-block=\"kb-adv-heading3461_e4d78f-99\"]{text-align:center!important;}}@media all and (max-width: 767px){.wp-block-kadence-advancedheading.kt-adv-heading3461_e4d78f-99, .wp-block-kadence-advancedheading.kt-adv-heading3461_e4d78f-99[data-kb-block=\"kb-adv-heading3461_e4d78f-99\"]{text-align:center!important;}}<\/style>\n<h4 class=\"kt-adv-heading3461_e4d78f-99 wp-block-kadence-advancedheading\" data-kb-block=\"kb-adv-heading3461_e4d78f-99\"><strong>\u00bfTens algun dubte?<\/strong><\/h4>\n\n\n<style>.wp-block-kadence-advancedheading.kt-adv-heading3461_bd1d50-a7, .wp-block-kadence-advancedheading.kt-adv-heading3461_bd1d50-a7[data-kb-block=\"kb-adv-heading3461_bd1d50-a7\"]{margin-bottom:20px;font-size:var(--global-kb-font-size-md, 1.25rem);font-style:normal;}.wp-block-kadence-advancedheading.kt-adv-heading3461_bd1d50-a7 mark.kt-highlight, .wp-block-kadence-advancedheading.kt-adv-heading3461_bd1d50-a7[data-kb-block=\"kb-adv-heading3461_bd1d50-a7\"] mark.kt-highlight{font-style:normal;color:#f76a0c;-webkit-box-decoration-break:clone;box-decoration-break:clone;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.wp-block-kadence-advancedheading.kt-adv-heading3461_bd1d50-a7 img.kb-inline-image, .wp-block-kadence-advancedheading.kt-adv-heading3461_bd1d50-a7[data-kb-block=\"kb-adv-heading3461_bd1d50-a7\"] img.kb-inline-image{width:150px;vertical-align:baseline;}@media all and (max-width: 1024px){.wp-block-kadence-advancedheading.kt-adv-heading3461_bd1d50-a7, .wp-block-kadence-advancedheading.kt-adv-heading3461_bd1d50-a7[data-kb-block=\"kb-adv-heading3461_bd1d50-a7\"]{text-align:center!important;}}@media all and (max-width: 767px){.wp-block-kadence-advancedheading.kt-adv-heading3461_bd1d50-a7, .wp-block-kadence-advancedheading.kt-adv-heading3461_bd1d50-a7[data-kb-block=\"kb-adv-heading3461_bd1d50-a7\"]{text-align:center!important;}}<\/style>\n<p class=\"kt-adv-heading3461_bd1d50-a7 wp-block-kadence-advancedheading\" data-kb-block=\"kb-adv-heading3461_bd1d50-a7\"><strong>Escriu-me, sense comprom\u00eds<\/strong>.<\/p>\n<\/div><\/div>\n\n\n<style>.kadence-column3461_726933-7c > .kt-inside-inner-col{display:flex;}.kadence-column3461_726933-7c > .kt-inside-inner-col{padding-top:60px;padding-right:10px;padding-bottom:60px;padding-left:10px;}.kadence-column3461_726933-7c > .kt-inside-inner-col,.kadence-column3461_726933-7c > .kt-inside-inner-col:before{border-top-left-radius:0px;border-top-right-radius:0px;border-bottom-right-radius:0px;border-bottom-left-radius:0px;}.kadence-column3461_726933-7c > .kt-inside-inner-col{column-gap:var(--global-kb-gap-sm, 1rem);}.kadence-column3461_726933-7c > .kt-inside-inner-col{flex-direction:column;justify-content:flex-start;}.kadence-column3461_726933-7c > .kt-inside-inner-col > .aligncenter{width:100%;}.kt-row-column-wrap > .kadence-column3461_726933-7c{align-self:flex-start;}.kt-inner-column-height-full:not(.kt-has-1-columns) > .wp-block-kadence-column.kadence-column3461_726933-7c{align-self:auto;}.kt-inner-column-height-full:not(.kt-has-1-columns) > .wp-block-kadence-column.kadence-column3461_726933-7c > .kt-inside-inner-col{flex-direction:column;justify-content:flex-start;}.kadence-column3461_726933-7c > .kt-inside-inner-col:before{opacity:0.3;}.kadence-column3461_726933-7c{position:relative;}.kadence-column3461_726933-7c, .kt-inside-inner-col > .kadence-column3461_726933-7c:not(.specificity){margin-left:12px;}@media all and (max-width: 1024px){.kadence-column3461_726933-7c > .kt-inside-inner-col{padding-top:0px;flex-direction:column;justify-content:flex-start;}}@media all and (max-width: 1024px){.kt-row-column-wrap > .kadence-column3461_726933-7c{align-self:flex-start;}}@media all and (max-width: 1024px){.kt-inner-column-height-full:not(.kt-has-1-columns) > .wp-block-kadence-column.kadence-column3461_726933-7c{align-self:auto;}}@media all and (max-width: 1024px){.kt-inner-column-height-full:not(.kt-has-1-columns) > .wp-block-kadence-column.kadence-column3461_726933-7c > .kt-inside-inner-col{flex-direction:column;justify-content:flex-start;}}@media all and (max-width: 767px){.kadence-column3461_726933-7c > .kt-inside-inner-col{padding-top:20px;padding-right:20px;padding-bottom:20px;padding-left:20px;flex-direction:column;justify-content:flex-start;}.kt-row-column-wrap > .kadence-column3461_726933-7c{align-self:flex-start;}.kt-inner-column-height-full:not(.kt-has-1-columns) > .wp-block-kadence-column.kadence-column3461_726933-7c{align-self:auto;}.kt-inner-column-height-full:not(.kt-has-1-columns) > .wp-block-kadence-column.kadence-column3461_726933-7c > .kt-inside-inner-col{flex-direction:column;justify-content:flex-start;}}<\/style>\n<div class=\"wp-block-kadence-column kadence-column3461_726933-7c inner-column-2\"><div class=\"kt-inside-inner-col\"><style>.kadence-form-3461_edf635-4f .kb-form .kadence-blocks-form-field{margin-bottom:14px;}.kadence-form-3461_edf635-4f .kb-form .kadence-blocks-form-field{padding-right:6px;padding-left:6px;}.kadence-form-3461_edf635-4f .kb-form{margin-right:-6px;margin-left:-6px;}.kadence-form-3461_edf635-4f .kb-form .kadence-blocks-form-field .kb-text-style-field, .kadence-form-3461_edf635-4f .kb-form .kadence-blocks-form-field .kb-select-style-field{color:#000000;border-radius:0px;line-height:28px;background:#ffffff;border-color:rgba(0, 0, 0, 0);box-shadow:1px 1px 2px 0px rgba(0, 0, 0, 0.2);}.kadence-form-3461_edf635-4f .kb-form .kadence-blocks-form-field > label{font-family:Prompt;font-style:normal;font-weight:500;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.kadence-form-3461_edf635-4f .kb-form .kadence-blocks-form-field .kb-forms-submit{color:#000000;}.kadence-form-3461_edf635-4f .kb-form .kadence-blocks-form-field .kb-forms-submit:hover, .kadence-form-3461_edf635-4f .kb-form .kadence-blocks-form-field .kb-forms-submit:focus {color:#ffffff;}.kadence-form-3461_edf635-4f .kb-form .kadence-blocks-form-field .kb-forms-submit{text-transform:capitalize;font-family:Prompt;font-style:normal;font-weight:500;}.kb-form input.kadence-blocks-field.verify{opacity:0.0;position:absolute;top:0.0;left:0.0;width:0.0;height:0.0;z-index:-1;}@media all and (max-width: 767px){.kadence-form-3461_edf635-4f .kb-form .kadence-blocks-form-field .kb-forms-submit{margin-top:20px;}}<\/style>\n<div class=\"wp-block-kadence-form kadence-form-3461_edf635-4f kb-form-wrap\"><form class=\"kb-form\" action=\"\" method=\"post\"><div class=\"kadence-blocks-form-field kb-field-desk-width-50 kb-field-mobile-width-100 kb-input-size-standard\"><label for=\"kb_field_3461_edf635-4f_0\">Nom<span class=\"required\">*<\/span><\/label><input name=\"kb_field_0\" id=\"kb_field_3461_edf635-4f_0\" data-label=\"Nom\" type=\"text\" placeholder=\"\" value=\"\" data-type=\"text\" class=\"kb-field kb-text-style-field kb-text-field kb-field-0\" data-required=\"yes\"\/><\/div><div class=\"kadence-blocks-form-field kb-form-field-1 kb-field-desk-width-50 kb-field-mobile-width-100 kb-input-size-standard\"><label for=\"kb_field_3461_edf635-4f_1\">Email<span class=\"required\">*<\/span><\/label><input name=\"kb_field_1\" id=\"kb_field_3461_edf635-4f_1\" data-label=\"Email\" type=\"email\" placeholder=\"\" value=\"\" data-type=\"email\" class=\"kb-field kb-text-style-field kb-email-field kb-field-1\" data-required=\"yes\"\/><\/div><div class=\"kadence-blocks-form-field kb-form-field-2 kb-field-desk-width-100 kb-input-size-standard\"><label for=\"kb_field_3461_edf635-4f_2\">Messatge<span class=\"required\">*<\/span><\/label><textarea name=\"kb_field_2\" id=\"kb_field_3461_edf635-4f_2\" data-label=\"Messatge\" type=\"textarea\" placeholder=\"\" data-type=\"textarea\" class=\"kb-field kb-text-style-field kb-textarea-field kb-field-2\" rows=\"4\" data-required=\"yes\"><\/textarea><\/div><input type=\"hidden\" name=\"_kb_form_id\" value=\"3461_edf635-4f\"\/><input type=\"hidden\" name=\"_kb_form_post_id\" value=\"3461\"\/><input type=\"hidden\" name=\"action\" value=\"kb_process_ajax_submit\"\/><label class=\"kadence-verify-label\">Email<input class=\"kadence-blocks-field verify\" type=\"text\" name=\"_kb_verify_email\" autocomplete=\"new-password\" aria-hidden=\"true\" placeholder=\"Email\" tabindex=\"-1\" data-1p-ignore=\"true\" data-lpignore=\"true\" \/><\/label><div class=\"kadence-blocks-form-field kb-submit-field kb-field-desk-width-100\"><button class=\"kb-forms-submit button kb-button-size-large kb-button-width-full\">Envia consulta<\/button><\/div><\/form><\/div>\n<noscript><div class=\"kadence-blocks-form-message kadence-blocks-form-warning\">Activar JavaScript en tu navegador para enviar el formulario<\/div><style>.kadence-form-3461_edf635-4f .kadence-blocks-form-field.kb-submit-field { display: none; }<\/style><\/noscript><\/div><\/div>\n\n<\/div><\/div><\/div><\/div>\n\n<\/div><\/div>\n\n<ul class=\"wp-block-latest-posts__list is-grid columns-3 wp-block-latest-posts\"><li><div class=\"wp-block-latest-posts__featured-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"573\" src=\"https:\/\/gcomunitats.cat\/wp-content\/uploads\/2026\/03\/comunitat-de-propietaris-1024x573.jpg\" class=\"attachment-large size-large wp-post-image\" alt=\"Comunitat de propietaris. Estructura d&#039;una comunitat de propietaris: elements comuns i privats en un edifici de propietat horitzontal\" style=\"\" srcset=\"https:\/\/gcomunitats.cat\/wp-content\/uploads\/2026\/03\/comunitat-de-propietaris-1024x573.jpg 1024w, https:\/\/gcomunitats.cat\/wp-content\/uploads\/2026\/03\/comunitat-de-propietaris-300x168.jpg 300w, https:\/\/gcomunitats.cat\/wp-content\/uploads\/2026\/03\/comunitat-de-propietaris-768x430.jpg 768w, https:\/\/gcomunitats.cat\/wp-content\/uploads\/2026\/03\/comunitat-de-propietaris-1536x860.jpg 1536w, https:\/\/gcomunitats.cat\/wp-content\/uploads\/2026\/03\/comunitat-de-propietaris.jpg 1600w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><a class=\"wp-block-latest-posts__post-title\" href=\"https:\/\/gcomunitats.cat\/es\/comunitat-de-propietaris\/\">Qu\u00e8 \u00e9s una Comunitat de Propietaris: Guia Completa sobre Propietat Horitzontal a Catalunya<\/a><\/li>\n<li><div class=\"wp-block-latest-posts__featured-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"572\" src=\"https:\/\/gcomunitats.cat\/wp-content\/uploads\/2026\/03\/cese-administrador-1024x572.png\" class=\"attachment-large size-large wp-post-image\" alt=\"Junta de propietaris lliurant l&#039;acta de cese de l&#039;administrador de la comunitat de finques\" style=\"\" srcset=\"https:\/\/gcomunitats.cat\/wp-content\/uploads\/2026\/03\/cese-administrador-1024x572.png 1024w, https:\/\/gcomunitats.cat\/wp-content\/uploads\/2026\/03\/cese-administrador-300x167.png 300w, https:\/\/gcomunitats.cat\/wp-content\/uploads\/2026\/03\/cese-administrador-768x429.png 768w, https:\/\/gcomunitats.cat\/wp-content\/uploads\/2026\/03\/cese-administrador.png 1376w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><a class=\"wp-block-latest-posts__post-title\" href=\"https:\/\/gcomunitats.cat\/es\/com-cessar-ladministrador-de-finques\/\">Cessar L&#8217;Administrador de Finques: Guia Legal Pas a Pas per a Catalunya<\/a><\/li>\n<li><div class=\"wp-block-latest-posts__featured-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"559\" src=\"https:\/\/gcomunitats.cat\/wp-content\/uploads\/2026\/03\/certificat-de-corrent-de-pagament-1-1024x559.jpg\" class=\"attachment-large size-large wp-post-image\" alt=\"Certificat de corrent de pagament digital amb checkmark verd, edificis i s\u00edmbol de pagament aprovant seguretat en transaccions immobili\u00e0ries\" style=\"\" srcset=\"https:\/\/gcomunitats.cat\/wp-content\/uploads\/2026\/03\/certificat-de-corrent-de-pagament-1-1024x559.jpg 1024w, https:\/\/gcomunitats.cat\/wp-content\/uploads\/2026\/03\/certificat-de-corrent-de-pagament-1-300x164.jpg 300w, https:\/\/gcomunitats.cat\/wp-content\/uploads\/2026\/03\/certificat-de-corrent-de-pagament-1-768x419.jpg 768w, https:\/\/gcomunitats.cat\/wp-content\/uploads\/2026\/03\/certificat-de-corrent-de-pagament-1.jpg 1407w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><a class=\"wp-block-latest-posts__post-title\" href=\"https:\/\/gcomunitats.cat\/es\/certificat-de-corrent-de-pacertificat-corrent-pagament-guia-completa\/\">Certificat de Corrent de Pagament: Guia Completa per a Propietaris<\/a><\/li>\n<li><div class=\"wp-block-latest-posts__featured-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"573\" src=\"https:\/\/gcomunitats.cat\/wp-content\/uploads\/2025\/11\/Estatutos-2-1-1024x573.jpg\" class=\"attachment-large size-large wp-post-image\" alt=\"Portada sobre els estatuts de comunitats de propietaris a Catalunya\" style=\"\" srcset=\"https:\/\/gcomunitats.cat\/wp-content\/uploads\/2025\/11\/Estatutos-2-1-1024x573.jpg 1024w, https:\/\/gcomunitats.cat\/wp-content\/uploads\/2025\/11\/Estatutos-2-1-300x168.jpg 300w, https:\/\/gcomunitats.cat\/wp-content\/uploads\/2025\/11\/Estatutos-2-1-768x430.jpg 768w, https:\/\/gcomunitats.cat\/wp-content\/uploads\/2025\/11\/Estatutos-2-1.jpg 1200w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><a class=\"wp-block-latest-posts__post-title\" href=\"https:\/\/gcomunitats.cat\/es\/estatuts\/\">Els Estatuts d&#8217;una Comunitat de Propietaris a Catalunya<\/a><\/li>\n<li><div class=\"wp-block-latest-posts__featured-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1000\" height=\"560\" src=\"https:\/\/gcomunitats.cat\/wp-content\/uploads\/2025\/11\/Fons-de-Reserva-1-1.png\" class=\"attachment-large size-large wp-post-image\" alt=\"Fons de reserva\" style=\"\" srcset=\"https:\/\/gcomunitats.cat\/wp-content\/uploads\/2025\/11\/Fons-de-Reserva-1-1.png 1000w, https:\/\/gcomunitats.cat\/wp-content\/uploads\/2025\/11\/Fons-de-Reserva-1-1-300x168.png 300w, https:\/\/gcomunitats.cat\/wp-content\/uploads\/2025\/11\/Fons-de-Reserva-1-1-768x430.png 768w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><\/div><a class=\"wp-block-latest-posts__post-title\" href=\"https:\/\/gcomunitats.cat\/es\/fons-de-reserva\/\">Fons de Reserva de la comunitat de propietaris a Catalunya<\/a><\/li>\n<\/ul>\n\n<style>.kadence-column3842_f27886-34 > .kt-inside-inner-col,.kadence-column3842_f27886-34 > .kt-inside-inner-col:before{border-top-left-radius:0px;border-top-right-radius:0px;border-bottom-right-radius:0px;border-bottom-left-radius:0px;}.kadence-column3842_f27886-34 > .kt-inside-inner-col{column-gap:var(--global-kb-gap-sm, 1rem);}.kadence-column3842_f27886-34 > .kt-inside-inner-col{flex-direction:column;}.kadence-column3842_f27886-34 > .kt-inside-inner-col > .aligncenter{width:100%;}.kadence-column3842_f27886-34 > .kt-inside-inner-col:before{opacity:0.3;}.kadence-column3842_f27886-34{position:relative;}@media all and (max-width: 1024px){.kadence-column3842_f27886-34 > .kt-inside-inner-col{flex-direction:column;justify-content:center;}}@media all and (max-width: 767px){.kadence-column3842_f27886-34 > .kt-inside-inner-col{flex-direction:column;justify-content:center;}}<\/style>\n<div class=\"wp-block-kadence-column kadence-column3842_f27886-34\"><div class=\"kt-inside-inner-col\">\n<h2 class=\"wp-block-heading\">T&#8217;he pogut ajudar?<\/h2>\n\n\n\n<p class=\"has-theme-palette-3-color has-text-color has-link-color wp-elements-3463a9d62b6170b7ee64e603c3975d92\">La utilitzaci\u00f3 de totes les eines \u00e9s totalment gratu\u00efta per a tothom. Nom\u00e9s agrairia la teva col\u00b7laboraci\u00f3 per poder mantenir les eines actives i actualitzades i seguir creant noves eines que et facilitaran la gesti\u00f3 de la teva comunitat.<\/p>\n\n\n\n<!DOCTYPE html>\n<html lang=\"ca\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>Col\u00b7labora<\/title>\n    <style>\n        .donacio-section {\n            background: none; \/* Color actualizado *\/\n            padding: 2rem;\n            border-radius: 10px;\n            color: #333;\n            text-align: center;\n            margin: 2rem 0;\n            border: 1px solid #e9ecef;\n        }\n\n        .donacio-title {\n            font-size: 1.8rem;\n            margin-bottom: 2rem;\n            font-weight: 600;\n            color: #2c3e50;\n        }\n\n        .donacio-options {\n            display: grid;\n            grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));\n            gap: 2rem;\n            max-width: 800px;\n            margin: 0 auto;\n        }\n\n        .donacio-option {\n            background: white;\n            padding: 2rem;\n            border-radius: 8px;\n            color: #333;\n            box-shadow: 0 2px 10px rgba(0,0,0,0.05);\n            border: 1px solid #e9ecef;\n        }\n\n        .option-title {\n            font-size: 1.3rem;\n            font-weight: 600;\n            margin-bottom: 1.5rem;\n            color: #2c3e50;\n        }\n\n        .bizum-btn {\n            background: #00C2FF;\n            color: white;\n            border: none;\n            padding: 12px 25px;\n            border-radius: 6px;\n            font-size: 1rem;\n            font-weight: 600;\n            cursor: pointer;\n            transition: all 0.3s ease;\n            display: inline-flex;\n            align-items: center;\n            gap: 8px;\n            margin: 10px 0;\n        }\n\n        .bizum-btn:hover {\n            background: #00A8E0;\n            transform: translateY(-2px);\n        }\n\n        .bizum-number {\n            font-size: 1.4rem;\n            font-weight: 700;\n            color: #0066FF;\n            margin: 15px 0;\n            display: block;\n        }\n\n        .paypal-container {\n            margin-top: 15px;\n        }\n\n        .amount-select {\n            width: 100%;\n            padding: 10px 12px;\n            border: 1px solid #e2e8f0;\n            border-radius: 6px;\n            font-size: 1rem;\n            background: white;\n            color: #4a5568;\n            cursor: pointer;\n            transition: border-color 0.3s ease;\n            margin-bottom: 15px;\n        }\n\n        .amount-select:focus {\n            outline: none;\n            border-color: #0070BA;\n        }\n\n        .custom-amount {\n            width: 100%;\n            padding: 10px 12px;\n            border: 1px solid #e2e8f0;\n            border-radius: 6px;\n            font-size: 1rem;\n            margin-top: 10px;\n            display: none;\n        }\n\n        .custom-amount:focus {\n            outline: none;\n            border-color: #0070BA;\n        }\n\n        @media (max-width: 768px) {\n            .donacio-options {\n                grid-template-columns: 1fr;\n            }\n            \n            .donacio-title {\n                font-size: 1.5rem;\n            }\n        }\n    <\/style>\n<\/head>\n<body>\n    <section class=\"donacio-section\">\n        <h3 class=\"donacio-title\" style=\"color: white;\">Col\u00b7labora<\/h3>\n        \n        <div class=\"donacio-options\">\n            <!-- Opci\u00f3 Bizum -->\n            <div class=\"donacio-option\">\n                <h3 class=\"option-title\">\ud83d\udcf1 Bizum<\/h3>\n                <span class=\"bizum-number\">628 548 665<\/span>\n                <button class=\"bizum-btn\" onclick=\"copiarNumeroBizum(this)\">\n                    Copiar N\u00famero\n                <\/button>\n            <\/div>\n\n            <!-- Opci\u00f3 PayPal -->\n            <div class=\"donacio-option\">\n                <h3 class=\"option-title\">\ud83d\udcb3 PayPal<\/h3>\n\n                <div class=\"paypal-container\" id=\"paypal-button-container\">\n                    <form action=\"https:\/\/www.paypal.com\/donate\" method=\"post\" target=\"_top\">\n                    <input type=\"hidden\" name=\"hosted_button_id\" value=\"K2U4RXKR96NNA\" \/>\n                    <input type=\"image\" src=\"https:\/\/www.paypalobjects.com\/es_ES\/ES\/i\/btn\/btn_donate_LG.gif\" border=\"0\" name=\"submit\" title=\"PayPal - The safer, easier way to pay online!\" alt=\"Bot\u00f3n\u00a0Donar con PayPal\" \/>\n                    <img loading=\"lazy\" decoding=\"async\" alt=\"\" border=\"0\" src=\"https:\/\/www.paypal.com\/es_ES\/i\/scr\/pixel.gif\" width=\"1\" height=\"1\" \/>\n                    <\/form>\n                <\/div>\n            <\/div>\n        <\/div>\n    <\/section>\n\n    <script>\n        \/\/ Funci\u00f3 per copiar el n\u00famero de Bizum\n        function copiarNumeroBizum() {\n            const numeroBizum = '628548665';\n            navigator.clipboard.writeText(numeroBizum).then(() => {\n                const textOriginal = boton.textContent;\n                boton.textContent = 'N\u00famero copiat!';\n                boton.style.background = '#00A843';\n        \n            setTimeout(() => {\n                 boton.textContent = textOriginal;\n                 boton.style.background = '#00C2FF';\n            }, 2000);\n        }).catch(err => {\n           alert('N\u00famero copiat: 628 548 665');\n        });\n}\n\n        \/\/ Funci\u00f3 per mostrar el camp d'import personalitzat\n        function mostrarImportPersonalitzat(select) {\n            const customInput = document.querySelector('.custom-amount');\n            if (select.value === 'custom') {\n                customInput.style.display = 'block';\n                customInput.focus();\n            } else {\n                customInput.style.display = 'none';\n            }\n        }\n\n        \/\/ Funci\u00f3 per actualitzar el bot\u00f3 de PayPal amb l'import seleccionat\n        function actualitzarBotoPaypal(amount) {\n            const paypalContainer = document.getElementById('paypal-button-container');\n            \n            \/\/ Netejar el contenidor\n            paypalContainer.innerHTML = '';\n            \n            \/\/ Crear el formulari de PayPal amb l'import\n            const form = document.createElement('form');\n            form.action = 'https:\/\/www.paypal.com\/donate';\n            form.method = 'post';\n            form.target = '_top';\n            \n            \/\/ Afegir camps ocults\n            const hostedButton = document.createElement('input');\n            hostedButton.type = 'hidden';\n            hostedButton.name = 'hosted_button_id';\n            hostedButton.value = 'EL_TEU_CODI_AQUI'; \/\/ \u2190 El teu codi de PayPal\n            \n            const amountInput = document.createElement('input');\n            amountInput.type = 'hidden';\n            amountInput.name = 'amount';\n            amountInput.value = amount;\n            \n            \/\/ Crear la imatge del bot\u00f3\n            const submitInput = document.createElement('input');\n            submitInput.type = 'image';\n            submitInput.src = 'https:\/\/www.paypalobjects.com\/es_ES\/ES\/i\/btn\/btn_donate_LG.gif';\n            submitInput.border = '0';\n            submitInput.name = 'submit';\n            submitInput.title = 'PayPal - The safer, easier way to pay online!';\n            submitInput.alt = 'Bot\u00f3 Donar amb PayPal';\n            submitInput.style.cursor = 'pointer';\n            \n            \/\/ Imatge de tracking\n            const trackingImg = document.createElement('img');\n            trackingImg.alt = '';\n            trackingImg.border = '0';\n            trackingImg.src = 'https:\/\/www.paypal.com\/es_ES\/i\/scr\/pixel.gif';\n            trackingImg.width = '1';\n            trackingImg.height = '1';\n            \n            \/\/ Afegir elements al formulari\n            form.appendChild(hostedButton);\n            form.appendChild(amountInput);\n            form.appendChild(submitInput);\n            form.appendChild(trackingImg);\n            \n            \/\/ Afegir formulari al contenidor\n            paypalContainer.appendChild(form);\n        }\n\n        \/\/ Escoltar canvis en el selector d'import\n        document.querySelector('.amount-select').addEventListener('change', function(e) {\n            if (this.value && this.value !== 'custom') {\n                actualitzarBotoPaypal(this.value);\n            }\n        });\n\n        \/\/ Escoltar canvis en l'import personalitzat\n        document.querySelector('.custom-amount').addEventListener('input', function(e) {\n            if (this.value && this.value >= 1) {\n                actualitzarBotoPaypal(this.value);\n            }\n        });\n\n        \/\/ Validaci\u00f3 de l'import personalitzat\n        document.querySelector('.custom-amount').addEventListener('input', function(e) {\n            if (this.value < 1) {\n                this.value = 1;\n            }\n        });\n    <\/script>\n<\/body>\n<\/html>\n<\/div><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Simplifica la gesti\u00f3 econ\u00f2mica de la teva comunitat amb la nostra eina de pressupostos intu\u00eftiva i completa. Guia r\u00e0pida \ud83d\ude80 Gu\u00eda detallada aqu\u00ed Creador de Pressupostos per a Comunitats de Propietaris Creador de Pressupostos per a Comunitats Gestiona i distribueix les despeses de la teva comunitat de propietaris Entitats i Coeficients Conceptes i Grups Participaci\u00f3&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","footnotes":""},"class_list":["post-3685","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/gcomunitats.cat\/es\/wp-json\/wp\/v2\/pages\/3685","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gcomunitats.cat\/es\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/gcomunitats.cat\/es\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/gcomunitats.cat\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/gcomunitats.cat\/es\/wp-json\/wp\/v2\/comments?post=3685"}],"version-history":[{"count":14,"href":"https:\/\/gcomunitats.cat\/es\/wp-json\/wp\/v2\/pages\/3685\/revisions"}],"predecessor-version":[{"id":3854,"href":"https:\/\/gcomunitats.cat\/es\/wp-json\/wp\/v2\/pages\/3685\/revisions\/3854"}],"wp:attachment":[{"href":"https:\/\/gcomunitats.cat\/es\/wp-json\/wp\/v2\/media?parent=3685"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}