diff --git a/BC3Parser.php b/BC3Parser.php index a568930..43af142 100644 --- a/BC3Parser.php +++ b/BC3Parser.php @@ -93,7 +93,8 @@ public function parse() return [ 'properties' => $this->properties, 'concepts' => $this->concepts, - 'root_nodes' => $this->getRootNodes() + 'root_nodes' => $this->getRootNodes(), + 'original_text' => $content ]; } @@ -146,12 +147,17 @@ private function parseConcept($parts) if (!$code) return; + $priceRaw = $parts[3] ?? '0'; + $price = floatval(str_replace(',', '.', $priceRaw)); + $type = intval($parts[5] ?? 0); + $this->concepts[$code] = [ 'code' => $code, 'unit' => $parts[1] ?? '', 'summary' => $parts[2] ?? '', - 'price' => $parts[3] ?? 0, + 'price' => $price, 'date' => $parts[4] ?? '', // Concept date + 'type' => $type, 'children' => [], 'decomposition' => [], // For ~D 'description' => '' // For ~T @@ -333,16 +339,40 @@ private function parseDecomposition($parts) if (strlen($childCode) === 0 || $childCode === '|') continue; - // Slot 2 + // Slot 2: Factor $factor1Raw = $items[$i + 1] ?? ''; - // Slot 3 + // Slot 3: Rendimiento o Tipo $factor2Raw = $items[$i + 2] ?? ''; - $f1 = ($factor1Raw === '') ? 1.0 : floatval(str_replace(',', '.', $factor1Raw)); - $f2 = ($factor2Raw === '') ? 1.0 : floatval(str_replace(',', '.', $factor2Raw)); + // Determinar el factor real. + // Si el segundo campo tiene valor, lo usamos. Si no, si el primer campo tiene valor, lo usamos. + // Esto da soporte a formatos con dobles barras como mo001\\3.62 + $f1 = ($factor1Raw === '') ? null : floatval(str_replace(',', '.', $factor1Raw)); + $f2 = ($factor2Raw === '') ? null : floatval(str_replace(',', '.', $factor2Raw)); + + $factor = 1.0; + if ($f2 !== null) { + $factor = $f2; + } elseif ($f1 !== null) { + $factor = $f1; + } - // Combined factor - $factor = $f1 * $f2; + // El tipo de recurso se lee principalmente desde la definición del concepto, + // pero si no se encuentra, podemos deducirlo por el prefijo del código del elemento hijo. + $type = 0; + if (isset($this->concepts[$childCode])) { + $type = $this->concepts[$childCode]['type'] ?? 0; + } + if ($type === 0) { + $lowerCode = strtolower($childCode); + if (strpos($lowerCode, 'mo') === 0 || strpos($lowerCode, 'mano') === 0) { + $type = 1; + } elseif (strpos($lowerCode, 'mq') === 0 || strpos($lowerCode, 'maq') === 0) { + $type = 2; + } elseif (strpos($lowerCode, 'mt') === 0 || strpos($lowerCode, 'mat') === 0) { + $type = 3; + } + } // Advance index by 2 (so loop increments by 1 total 3) $i += 2; @@ -350,7 +380,8 @@ private function parseDecomposition($parts) $this->concepts[$parentCode]['children'][] = $childCode; $this->concepts[$parentCode]['decomposition'][] = [ 'code' => $childCode, - 'factor' => $factor + 'factor' => $factor, + 'type' => $type ]; } } diff --git a/CAPTURAS/001.jpg b/CAPTURAS/001.jpg new file mode 100644 index 0000000..018d6c7 Binary files /dev/null and b/CAPTURAS/001.jpg differ diff --git a/CAPTURAS/COEFICIENTES.jpg b/CAPTURAS/COEFICIENTES.jpg new file mode 100644 index 0000000..82eff71 Binary files /dev/null and b/CAPTURAS/COEFICIENTES.jpg differ diff --git a/CAPTURAS/DASHBOARD.jpg b/CAPTURAS/DASHBOARD.jpg new file mode 100644 index 0000000..7b2121f Binary files /dev/null and b/CAPTURAS/DASHBOARD.jpg differ diff --git a/CAPTURAS/EDICION PRECIO.jpg b/CAPTURAS/EDICION PRECIO.jpg new file mode 100644 index 0000000..c93f268 Binary files /dev/null and b/CAPTURAS/EDICION PRECIO.jpg differ diff --git a/CAPTURAS/EXPORTAR Y GUARDAR NUEVO BC3.jpg b/CAPTURAS/EXPORTAR Y GUARDAR NUEVO BC3.jpg new file mode 100644 index 0000000..2454709 Binary files /dev/null and b/CAPTURAS/EXPORTAR Y GUARDAR NUEVO BC3.jpg differ diff --git a/CAPTURAS/FILTRO POR ELEMENTOS.jpg b/CAPTURAS/FILTRO POR ELEMENTOS.jpg new file mode 100644 index 0000000..300a8f9 Binary files /dev/null and b/CAPTURAS/FILTRO POR ELEMENTOS.jpg differ diff --git a/CAPTURAS/PLANNING DE OBRAS.jpg b/CAPTURAS/PLANNING DE OBRAS.jpg new file mode 100644 index 0000000..851f5e5 Binary files /dev/null and b/CAPTURAS/PLANNING DE OBRAS.jpg differ diff --git a/CAPTURAS/ejemplo Presupuesto EXCEL.xlsx b/CAPTURAS/ejemplo Presupuesto EXCEL.xlsx new file mode 100644 index 0000000..142ffda Binary files /dev/null and b/CAPTURAS/ejemplo Presupuesto EXCEL.xlsx differ diff --git a/CAPTURAS/ejemplo Presupuesto PDF.pdf b/CAPTURAS/ejemplo Presupuesto PDF.pdf new file mode 100644 index 0000000..ecfee53 Binary files /dev/null and b/CAPTURAS/ejemplo Presupuesto PDF.pdf differ diff --git a/README.md b/README.md index b45ff13..0da730f 100644 --- a/README.md +++ b/README.md @@ -1,152 +1,208 @@ -# BC3 Viewer +# BC3 Viewer — Visualizador Premium de Presupuestos BC3 -Visualizador web de archivos BC3 (FIEBDC-3) para presupuestos de construcción. +Visualizador web avanzado de archivos BC3 (FIEBDC-3) para presupuestos de construccion. +**Mejora libre y gratuita para cualquier Arquitecto Tecnico, Arquitecto o profesional de la construccion by JMC.** -## Descripción +hecha un vistazo a las capturas en la carpeta ---> **CAPTURAS**. -BC3 Viewer es una aplicación web que permite visualizar archivos en formato BC3 (estándar FIEBDC-3 utilizado en España para el intercambio de presupuestos de construcción). La aplicación muestra una vista jerárquica del presupuesto con capítulos, subcapítulos, partidas y líneas de medición. +--- -## Características +## Creditos y Origen -- **Visualización jerárquica**: Muestra la estructura del presupuesto en forma de árbol expandible -- **Columnas de datos**: Código, Unidad, Resumen, Cantidad, Precio e Importe -- **Líneas de medición**: Tabla detallada con Uds, Largo, Ancho, Alto y cálculo de Parciales -- **Descripciones inline**: Texto descriptivo de cada partida visible al expandir -- **Detección de codificación**: Soporte para archivos ANSI, UTF-8 e ISO-8859-1 +Este proyecto **no seria posible sin el trabajo de Rafael Roa (www.rafarq.com)**, quien creo la base original del parser y visualizador BC3 en PHP. + +- **Repositorio original:** https://github.com/rafarq/BC3php +- **Web del autor Original:** https://www.rafarq.com +- LinkedIn: https://www.linkedin.com/in/rafaroa/ +- Podcast: https://rafarq.com/podcast +- X: https://x.com/rafaelroa +- Instagram: https://www.instagram.com/r4f4r04/ +- Y yo (Jose Manuel Caamaño) con mi granito de arena: https://www.linkedin.com/in/jmcaamanog/ + +Esta version ampliada ha sido desarrollada sobre su base, anadiendo funcionalidades avanzadas manteniendo el espiritu del proyecto original: **abierto, libre y util para la profesion**. + +--- + +## Descripcion + +BC3 Viewer es una aplicacion web que permite **visualizar, editar, comparar, planificar y exportar** archivos en formato BC3 (estandar FIEBDC-3 utilizado en Espana para el intercambio de presupuestos de construccion). La aplicacion muestra una vista jerarquica del presupuesto con capitulos, subcapitulos, partidas y lineas de medicion. + +--- + +## Caracteristicas Completas + +### Visualizacion +- **Arbol jerarquico expandible/colapsable** con capitulos, subcapitulos y partidas +- **Columnas redimensionables**: Codigo, Unidad, Resumen, Cantidad, Precio e Importe +- **Lineas de medicion** (~M): Tabla detallada con Uds, Largo, Ancho, Alto y Parciales +- **Descripciones inline** (~T): Texto descriptivo de cada partida al expandir +- **Deteccion de codificacion**: Soporte ANSI, UTF-8 e ISO-8859-1 +- **Modo movil drill-down**: Navegacion tactil por niveles en dispositivos pequenos +- **Breadcrumb de navegacion**: Rastro de migas para saber siempre en que nivel estas +- **Boton Volver** para retroceder en la jerarquia + +### Busqueda y Filtros +- **Busqueda en tiempo real** por titulo, codigo y medicion +- **Filtros avanzados**: por importe minimo/maximo, tipo de recurso (MO, MAQ, MAT, SUB) +- **Expandir / Contraer Todo** con un solo clic +- **Badges de tipo de recurso**: etiquetas visuales MO / MAQ / MAT / SUB + +### Edicion en Linea +- **Edicion directa de resumenes** haciendo clic en cualquier celda de descripcion +- **Edicion de precios unitarios** directamente en la tabla +- **Historial Deshacer/Rehacer** (Ctrl+Z / Ctrl+Y) con hasta 50 estados +- **Guardar archivo** modificado como nuevo BC3 con nombre automatico + +### Drag & Drop +- **Arrastrar y soltar** archivos .bc3 directamente sobre la ventana del navegador +- Overlay visual de carga al arrastrar + +### Dashboard de Analisis Visual +- **Grafico de distribucion por capitulos** (Chart.js - local, sin internet) +- **Grafico de tipos de recurso** (MO / Maquinaria / Material / Subcontrata) +- Estadisticas globales del presupuesto + +### Coeficientes Globales (PEM a PEC) +- Configuracion de **Gastos Generales (GG %)**, **Beneficio Industrial (BI %)** y **Baja/Alza general** +- Calculo automatico del **PEC** (Precio de Ejecucion por Contrata) en tiempo real + +### Comparador de Presupuestos +- Cargar un segundo archivo BC3 para **comparar partida a partida** +- Visualizacion de **desviaciones de precio** en color (positivo/negativo) +- Resumen de diferencias globales + +### Exportacion del Presupuesto +- **Exportar a PDF**: Presupuesto completo en A4, con tabla formateada y totales (local, sin internet) +- **Exportar a Excel (.xlsx)**: Presupuesto estructurado con columnas y anchos optimizados (local, sin internet) + +### PLANNING - Diagrama de Gantt Interactivo (NUEVO) +- Diagrama de Gantt interactivo a partir de los capitulos y subcapitulos del presupuesto (hasta **3 niveles**) +- **Distribucion automatica inicial** proporcional al coste de cada capitulo +- **Cabecera de meses y semanas** (semanas de 7 dias) con scroll horizontal +- **Barras completamente arrastrables**: + - Borde izquierdo: cambiar fecha de inicio + - Centro: mover toda la tarea + - Borde derecho: cambiar duracion +- **Capitulos colapsables** para mostrar/ocultar subcapitulos +- **Auto-guardado en localStorage**: El planning se recupera automaticamente al abrir el mismo fichero BC3 +- **Exportar Planning a Excel**: Tabla estructurada con Nivel, Codigo, Tarea, Fecha Inicio, Fecha Fin, Duracion (sem.), Importe +- **Exportar Planning a PDF**: A4 landscape, barras visuales en color, paginado automatico cada 26 semanas +- Control de **fecha de inicio del proyecto** y **numero de semanas total** configurable + +### Modo Oscuro +- Alternancia modo claro / modo oscuro con boton en la cabecera +- Estilos adaptativos en todos los modulos incluyendo el Gantt + +--- ## Requisitos -- PHP 7.4 o superior -- Servidor web (Apache, nginx, o PHP built-in server) +- **PHP 7.4 o superior** con extension `mbstring` +- Servidor web (Apache, nginx, o servidor PHP integrado) +- Navegador moderno (Chrome, Firefox, Edge, Safari) +- **Sin dependencias de internet** en produccion - todas las librerias JS incluidas localmente -## Instalación +--- -1. Clonar o copiar los archivos a tu servidor web: +## Instalacion + +1. Clona o copia los archivos a tu servidor web: ``` BC3php/ -├── index.html -├── style.css -├── app.js -├── BC3Parser.php -└── upload.php ++- index.php <- Pagina principal (PHP) ++- style.css <- Estilos (tema claro + oscuro + Gantt) ++- app.js <- Logica JavaScript completa ++- BC3Parser.php <- Parser PHP del formato FIEBDC-3 ++- upload.php <- Endpoint de subida de archivos ++- jspdf.umd.min.js <- Libreria PDF (local) ++- jspdf.plugin.autotable.min.js <- Plugin de tablas para PDF (local) ++- xlsx.full.min.js <- Libreria Excel/SheetJS (local) ++- chart.min.js <- Libreria graficos Chart.js (local) ``` -2. Iniciar el servidor: +2. Inicia el servidor: ```bash -# Usando el servidor built-in de PHP php -S localhost:8080 - -# O configurar en Apache/nginx ``` -3. Acceder a `http://localhost:8080` en el navegador +3. Accede a http://localhost:8080 en el navegador -## Uso +--- -1. Haz clic en "Seleccionar archivo .bc3" -2. Elige un archivo BC3 de tu ordenador -3. Haz clic en "Procesar" -4. Explora el árbol de presupuesto haciendo clic en los triángulos para expandir/colapsar +## Uso -## Estructura de Archivos +1. **Carga** el archivo BC3: arrastra y suelta o haz clic en "Seleccionar archivo .bc3" +2. **Procesa** el archivo con el boton "Procesar" +3. **Explora** el arbol jerarquico: haz clic en los triangulos para expandir/colapsar +4. **Edita** directamente haciendo clic en cualquier descripcion o precio +5. **Busca** en tiempo real con la barra de busqueda +6. **Exporta** con el menu "Exportar" PDF o Excel del presupuesto completo +7. **Planifica** con el boton "Planning" -> Diagrama Gantt interactivo +8. **Analiza** con el boton "Dashboard" -> Graficos de distribucion de costes +9. **Guarda** las modificaciones con "Guardar" -> descarga el BC3 modificado -| Archivo | Descripción | -| ----------------- | ------------------------------- | -| `index.html` | Página HTML principal | -| `style.css` | Estilos CSS (tema claro) | -| `app.js` | Lógica JavaScript del frontend | -| `BC3Parser.php` | Parser PHP para archivos BC3 | -| `upload.php` | Endpoint para subir archivos | +--- -## Formato BC3 +## Estructura de Archivos -El parser soporta los siguientes registros del estándar FIEBDC-3: +| Archivo | Descripcion | +|---------|-------------| +| index.php | Pagina HTML+PHP principal | +| style.css | Estilos CSS completos (claro, oscuro, Gantt) | +| app.js | Logica JavaScript completa (~3100 lineas) | +| BC3Parser.php | Parser PHP para el estandar FIEBDC-3 | +| upload.php | Endpoint de subida y procesado | +| jspdf.umd.min.js | Generacion de PDF en el navegador | +| jspdf.plugin.autotable.min.js | Tablas formateadas en PDF | +| xlsx.full.min.js | Generacion de Excel (.xlsx) | +| chart.min.js | Graficos del Dashboard | -- `~V` - Propiedades del archivo (versión, charset) -- `~C` - Conceptos (capítulos, partidas) -- `~D` - Descomposición (relaciones padre-hijo) -- `~T` - Textos descriptivos -- `~M` - Mediciones detalladas +--- -## Integración en Otro Proyecto +## Formato BC3 Soportado -Para integrar este visor BC3 en un proyecto existente: +| Registro | Descripcion | +|----------|-------------| +| ~V | Propiedades del archivo (version, charset, owner) | +| ~C | Conceptos (capitulos, partidas, recursos) | +| ~D | Descomposicion (relaciones padre-hijo con factores) | +| ~T | Textos descriptivos de partidas | +| ~M | Mediciones detalladas (tabla de medicion) | -### Archivos Requeridos +--- -Copia estos archivos a tu proyecto: +## Tecnologias Utilizadas -``` -tu-proyecto/ -├── BC3Parser.php # Parser PHP (backend) -├── upload.php # Endpoint de subida -├── app.js # Lógica del visor -└── style.css # Estilos (adaptar según necesidad) -``` +- **PHP 7.4+** - Backend, parsing del formato BC3 +- **JavaScript Vanilla (ES6+)** - Frontend completo, sin frameworks +- **CSS3** - Diseno responsive, modo oscuro, animaciones +- **jsPDF + AutoTable** - Exportacion a PDF +- **SheetJS (XLSX)** - Exportacion a Excel +- **Chart.js** - Dashboard visual -### HTML Mínimo Requerido - -Añade estos elementos a tu página: - -```html - - - - - -