EJERCICIO 3 PDO

<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <title>EJERCICIO 3 PDO</title>
    <link rel="stylesheet" href="../webroot/css/estiloGeneral.css">
    <link rel="stylesheet" href="../webroot/css/estiloFormularioTabla.css">
</head>
<body>
    <header>
        <h1><b>EJERCICIO 3 PDO</b></h1>
    </header>
    <main>  
        <?php
        // Incluye la librería de validación de formularios, que contiene funciones reutilizables.
        include_once "../core/231018libreriaValidacion.php";
        
        //Enlace a los datos de conexión
                require_once '../config/confDBPDO.php';


        //--- Inicialización de variables de estado y almacenamiento ---

        // Flag para controlar si el formulario ha sido enviado y si los datos son correctos.
        $bEntradaOK = true;
        // Array para almacenar los mensajes de error de cada campo del formulario.
        $aErrores = [
            'T02_CodDepartamento' => '',
            'T02_DescDepartamento' => '',
            'T02_VolumenDeNegocio' => '',
        ];
        // Array para almacenar los datos válidos y limpios del formulario.
        $aRespuestas=[
            'T02_CodDepartamento' => '',
            'T02_DescDepartamento' => '',
            'T02_VolumenDeNegocio' => '',
        ];

        // Comprueba si el formulario ha sido enviado para iniciar el proceso de validación.
        if (isset($_REQUEST["enviar"])) {

            // --- Validación de los campos del formulario ---
            $aErrores['T02_CodDepartamento'] = validacionFormularios::comprobarAlfabetico($_REQUEST['T02_CodDepartamento'],3,0,1);
            $aErrores['T02_DescDepartamento'] = validacionFormularios::comprobarAlfabetico($_REQUEST['T02_DescDepartamento'],255,0,1);

            // Normaliza el separador decimal a un punto para una correcta validación de tipo float.
            $sVolumenNegocioNormalizado = str_replace(',', '.', $_REQUEST['T02_VolumenDeNegocio']);
            $aErrores['T02_VolumenDeNegocio'] = validacionFormularios::comprobarFloat($sVolumenNegocioNormalizado);

            // Recorre el array de errores. Si encuentra alguno, marca la entrada como no válida.
            foreach($aErrores as $sNombreCampo => $sMensajeError){
                if(!empty($sMensajeError)){
                    $bEntradaOK = false;
                }
            }

            // --- Verificación de unicidad del código de departamento en la BBDD ---
            if (empty($aErrores['T02_CodDepartamento'])) {
                try {
                    $oConexionPDO = new PDO(DSN, USERNAME, PASSWORD);
                    $sConsultaSQL = "SELECT T02_CodDepartamento FROM T02_Departamento WHERE T02_CodDepartamento=?";

                    $oSentenciaPreparada = $oConexionPDO->prepare($sConsultaSQL);
                    $oSentenciaPreparada->bindParam(1, $_REQUEST['T02_CodDepartamento']);
                    $oSentenciaPreparada->execute();

                    if ($oSentenciaPreparada->rowCount() > 0) {
                        $aErrores['T02_CodDepartamento'] = 'El código ya existe en la BBDD';
                        $bEntradaOK = false;
                    }
                } catch (PDOException $oExcepcionPDO) {
                    $aErrores['T02_CodDepartamento'] = 'Error: ' . $oExcepcionPDO->getMessage();
                    $bEntradaOK = false;
                } finally {
                    unset($oConexionPDO);
                }
            }

        } else {
            // Si el formulario no se ha enviado (primera visita), se fuerza a que se muestre.
            $bEntradaOK = false;
        }
        ?>

        <?php
        // --- Tratamiento de la lógica principal: Inserción o Visualización del Formulario ---
        if($bEntradaOK){
            // Si la entrada es válida, prepara los datos y los inserta en la BBDD.
            $aRespuestas['T02_CodDepartamento'] = strtoupper($_REQUEST['T02_CodDepartamento']);
            $aRespuestas['T02_DescDepartamento'] = "Departamento de ".$_REQUEST['T02_DescDepartamento'];
            $aRespuestas['T02_VolumenDeNegocio'] = str_replace(',', '.', $_REQUEST['T02_VolumenDeNegocio']);
            
            try {
                $oConexionPDO = new PDO(DSN, USERNAME, PASSWORD);
                $sConsultaSQL = "INSERT INTO T02_Departamento (T02_CodDepartamento, T02_DescDepartamento, T02_FechaCreacionDepartamento, T02_VolumenDeNegocio) VALUES (?,?,now(),?)";

                $oSentenciaPreparada = $oConexionPDO->prepare($sConsultaSQL);
                $oSentenciaPreparada->bindParam(1, $aRespuestas['T02_CodDepartamento']);
                $oSentenciaPreparada->bindParam(2, $aRespuestas['T02_DescDepartamento']);
                $oSentenciaPreparada->bindParam(3, $aRespuestas['T02_VolumenDeNegocio']);
                $oSentenciaPreparada->execute();
                
            } catch (PDOException $oExcepcionPDO) {
                echo '<p class="error">Error al crear el departamento: ' . $oExcepcionPDO->getMessage() . '</p>';
            } finally {
                unset($oConexionPDO);
            }

            // Muestra un mensaje de éxito y un botón para añadir otro departamento.
            echo '<div style="text-align: center; margin: 40px 0;">';
            echo '<h2>¡Éxito!</h2>';
            echo '<p><b>El nuevo departamento se ha creado correctamente.</b></p>';
            echo '<a href="' . htmlspecialchars($_SERVER['PHP_SELF']) . '" class="boton">Añadir otro departamento</a>';
            echo '</div>';
            
        } else { // Si la entrada no es válida (o es la primera carga), muestra el formulario.
            $oFechaActual = new DateTime();
            ?>
                <form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>" method="post"> 
                    <h2>Añadir Nuevo Departamento</h2>
                    
                    <div class="form-group">
                        <label for="T02_CodDepartamento">Código (3 letras):</label>
                        <input type="text" id="T02_CodDepartamento" class="obligatorio" name="T02_CodDepartamento" value="<?php echo $_REQUEST['T02_CodDepartamento'] ?? '' ?>" style="text-transform: uppercase;">
                        <?php if($aErrores['T02_CodDepartamento']) echo "<span class='error'>{$aErrores['T02_CodDepartamento']}</span>"; ?>
                    </div>

                    <div class="form-group">
                        <label for="T02_DescDepartamento">Descripción:</label>
                        <input type="text" id="T02_DescDepartamento" name="T02_DescDepartamento" class="obligatorio" value="<?php echo $_REQUEST['T02_DescDepartamento'] ?? '' ?>" placeholder="Ej: Marketing">
                        <?php if($aErrores['T02_DescDepartamento']) echo "<span class='error'>{$aErrores['T02_DescDepartamento']}</span>"; ?>
                    </div>

                    <div class="form-group">
                        <label for="T02_FechaCreacionDepartamento">Fecha de Alta:</label>
                        <input type="text" id="T02_FechaCreacionDepartamento" value="<?php echo $oFechaActual->format("d/m/Y") ?>" readonly>
                    </div>

                    <div class="form-group">
                        <label for="T02_VolumenDeNegocio">Volumen de Negocio:</label>
                        <input type="text" id="T02_VolumenDeNegocio" name="T02_VolumenDeNegocio" value="<?php echo $_REQUEST['T02_VolumenDeNegocio'] ?? '' ?>" placeholder="Ej: 15000.50">
                        <?php if($aErrores['T02_VolumenDeNegocio']) echo "<span class='error'>{$aErrores['T02_VolumenDeNegocio']}</span>"; ?>
                    </div>
                    
                    <div class="form-actions">
                        <input type="submit" value="Aceptar" name="enviar">
                        <a href="#" class="boton cancelar">Cancelar</a>
                    </div>
                </form>
            <?php
        }

        // --- Bloque para mostrar la tabla de departamentos existentes (se ejecuta siempre) ---
        echo "<h2>Listado Actual de Departamentos</h2>";
        try {
            $oConexionPDO = new PDO(DSN, USERNAME, PASSWORD);
            $sConsultaSQL = "SELECT * FROM T02_Departamento";
            $oSentenciaPreparada = $oConexionPDO->prepare($sConsultaSQL);
            $oSentenciaPreparada->execute();
            
            echo '<table>';
            echo '<tr><th>Código</th><th>Departamento</th><th>Fecha de Creación</th><th>Volumen de Negocio</th><th>Fecha de Baja</th></tr>';

            while ($aFilaDepartamento = $oSentenciaPreparada->fetch(PDO::FETCH_ASSOC)) {
                echo '<tr>';
                echo '<td>'.$aFilaDepartamento['T02_CodDepartamento'].'</td>';
                echo '<td>'.$aFilaDepartamento["T02_DescDepartamento"].'</td>';
                
                $oFecha = new DateTime($aFilaDepartamento["T02_FechaCreacionDepartamento"]);
                echo '<td>'.$oFecha->format('d/m/Y').'</td>';
                
                echo '<td>'.number_format($aFilaDepartamento["T02_VolumenDeNegocio"], 2, ',', '.').' €</td>';
                
                if (is_null($aFilaDepartamento["T02_FechaBajaDepartamento"])) {
                    echo '<td></td>';
                } else {
                    $oFecha = new DateTime($aFilaDepartamento["T02_FechaBajaDepartamento"]);
                    echo '<td>'.$oFecha->format('d/m/Y').'</td>';
                }
                echo '</tr>';
            }
            echo '</table>';

        } catch (PDOException $oExcepcionPDO) {
            echo '<p class="error">Error al mostrar la tabla: '.$oExcepcionPDO->getMessage().'</p>';
        } finally {
            unset($oConexionPDO);
        }
        ?>
    </main>
    <footer>
        <caption>
            <a href="/ENLDWESProyectoTema4/indexProyectoTema4.php">Enrique Nieto Lorenzo</a> | 10/11/2025
        </caption>
    </footer>
</body>
</html>