procesar_edicion.php Controlador de edición (UPDATE) 1 líneas
1
<?php
// ============================================================
// SIDE - ARC 1.0
// Archivo: procesar_edicion.php
// ============================================================

require_once 'conexion.php';
require_once 'helpers.php';
requerir_admin();

// --- Solo POST ---
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    header('Location: /apps/side-arc/index.php');
    exit;
}

// --- Validar CSRF ---
if (
    empty($_POST['csrf_token']) ||
    empty($_SESSION['csrf_token']) ||
    !hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'])
) {
    $_SESSION['form_error'] = 'Solicitud inválida. Intente de nuevo.';
    header('Location: /apps/side-arc/index.php');
    exit;
}
unset($_SESSION['csrf_token']);

// --- Validar ID ---
if (!isset($_POST['id']) || !is_numeric($_POST['id'])) {
    header('Location: /apps/side-arc/cuadro_clasificacion.php');
    exit;
}
$id = (int) $_POST['id'];

// ============================================================
// SANEAMIENTO
// ============================================================
function limpiar_e(?string $valor): ?string {
    if ($valor === null || trim($valor) === '') return null;
    return trim($valor);
}

$nivel_descripcion        = limpiar_e($_POST['nivel_descripcion']        ?? null);
$codigo_referencia        = limpiar_e($_POST['codigo_referencia']        ?? null);
$titulo                   = limpiar_e($_POST['titulo']                   ?? null);
$fechas                   = limpiar_e($_POST['fechas']                   ?? null);
$volumen_soporte          = limpiar_e($_POST['volumen_soporte']          ?? null);
$nombre_productor         = limpiar_e($_POST['nombre_productor']         ?? null);
$historia_institucional   = limpiar_e($_POST['historia_institucional']   ?? null);
$alcance_contenido        = limpiar_e($_POST['alcance_contenido']        ?? null);
$valoracion_eliminacion   = limpiar_e($_POST['valoracion_eliminacion']   ?? null);
$organizacion             = limpiar_e($_POST['organizacion']             ?? null);
$condiciones_acceso       = limpiar_e($_POST['condiciones_acceso']       ?? null);
$condiciones_reproduccion = limpiar_e($_POST['condiciones_reproduccion'] ?? null);
$lengua_escritura         = limpiar_e($_POST['lengua_escritura']         ?? null);
$caracteristicas_fisicas  = limpiar_e($_POST['caracteristicas_fisicas']  ?? null);
$unidades_relacionadas    = limpiar_e($_POST['unidades_relacionadas']    ?? null);
$notas                    = limpiar_e($_POST['notas']                    ?? null);
$fechas_descripciones     = limpiar_e($_POST['fechas_descripciones']     ?? null);
$estado                   = limpiar_e($_POST['estado']                   ?? null);
$nombre_descriptor        = limpiar_e($_POST['nombre_descriptor']        ?? null);
$nota_archivero           = limpiar_e($_POST['nota_archivero']           ?? null);
$fecha_creacion_revision  = limpiar_e($_POST['fecha_creacion_revision']  ?? null);
$reglas_normas            = limpiar_e($_POST['reglas_normas']            ?? null);
$pa_nombre                = limpiar_e($_POST['pa_nombre']                ?? null);
$pa_geografico            = limpiar_e($_POST['pa_geografico']            ?? null);
$pam_materia              = limpiar_e($_POST['pam_materia']              ?? null);
$objeto_digital = limpiar_e($_POST['objeto_digital'] ?? null);
$fecha_ingreso_registro = limpiar_e($_POST['fecha_ingreso_registro'] ?? null);
if ($fecha_ingreso_registro !== null &&
    !preg_match('/^\d{4}-\d{2}-\d{2}$/', $fecha_ingreso_registro)) {
    $fecha_ingreso_registro = null;
}

$fecha_inicial_filtro = isset($_POST['fecha_inicial_filtro']) &&
    is_numeric($_POST['fecha_inicial_filtro'])
    ? (int) $_POST['fecha_inicial_filtro'] : null;

$fecha_final_filtro = isset($_POST['fecha_final_filtro']) &&
    is_numeric($_POST['fecha_final_filtro'])
    ? (int) $_POST['fecha_final_filtro'] : null;

// ============================================================
// FUNCIÓN DE REDIRECCIÓN DE ERROR
// ============================================================
function redirigir_error_e(string $msg, int $id): never {
    $_SESSION['form_error'] = $msg;
    $_SESSION['form_data']  = $_POST;
    header('Location: /apps/side-arc/editar.php?id=' . $id);
    exit;
}

// --- Validaciones obligatorias ---
if (empty($titulo))            redirigir_error_e('El Título es obligatorio.', $id);
if (empty($codigo_referencia)) redirigir_error_e('El Código de referencia es obligatorio.', $id);
if (empty($nivel_descripcion)) redirigir_error_e('El Nivel de descripción es obligatorio.', $id);

// ============================================================
// VALIDAR MATRIZ SERVER-SIDE
// ============================================================
$stmt_actual = mysqli_prepare($conexion,
    "SELECT parent_id FROM descripcion_isadg WHERE id = ? LIMIT 1");
mysqli_stmt_bind_param($stmt_actual, 'i', $id);
mysqli_stmt_execute($stmt_actual);
$res_actual  = mysqli_stmt_get_result($stmt_actual);
$fila_actual = mysqli_fetch_assoc($res_actual);
mysqli_free_result($res_actual);
mysqli_stmt_close($stmt_actual);

if (!$fila_actual) {
    redirigir_error_e('El registro a editar no existe.', $id);
}

$parent_id_real   = $fila_actual['parent_id'];
$nivel_padre_real = null;

if ($parent_id_real !== null) {
    $stmt_p = mysqli_prepare($conexion,
        "SELECT nivel_descripcion FROM descripcion_isadg WHERE id = ? LIMIT 1");
    mysqli_stmt_bind_param($stmt_p, 'i', $parent_id_real);
    mysqli_stmt_execute($stmt_p);
    $res_p  = mysqli_stmt_get_result($stmt_p);
    $fila_p = mysqli_fetch_assoc($res_p);
    mysqli_free_result($res_p);
    mysqli_stmt_close($stmt_p);
    if ($fila_p) {
        $nivel_padre_real = $fila_p['nivel_descripcion'];
    }
}

$niveles_validos = niveles_permitidos_bajo($nivel_padre_real);

if (!in_array($nivel_descripcion, $niveles_validos, true)) {
    redirigir_error_e(
        'El nivel "' . $nivel_descripcion . '" no es válido para este registro. Operación bloqueada.',
        $id
    );
}

if ($fecha_inicial_filtro !== null && $fecha_final_filtro !== null &&
    $fecha_inicial_filtro > $fecha_final_filtro) {
    redirigir_error_e('El año inicial no puede ser mayor que el año final.', $id);
}

// ============================================================
// EJECUTAR UPDATE
// ============================================================
$sql = "UPDATE descripcion_isadg SET
    codigo_referencia        = ?,
    titulo                   = ?,
    fechas                   = ?,
    nivel_descripcion        = ?,
    volumen_soporte          = ?,
    nombre_productor         = ?,
    historia_institucional   = ?,
    alcance_contenido        = ?,
    valoracion_eliminacion   = ?,
    organizacion             = ?,
    condiciones_acceso       = ?,
    condiciones_reproduccion = ?,
    lengua_escritura         = ?,
    caracteristicas_fisicas  = ?,
    unidades_relacionadas    = ?,
    notas                    = ?,
    fecha_ingreso_registro   = ?,
    fechas_descripciones     = ?,
    estado                   = ?,
    nombre_descriptor        = ?,
    nota_archivero           = ?,
    fecha_creacion_revision  = ?,
    reglas_normas            = ?,
    pa_nombre                = ?,
    pa_geografico            = ?,
    pam_materia              = ?,
    objeto_digital           = ?,
    fecha_inicial_filtro     = ?,
    fecha_final_filtro       = ?
WHERE id = ?";

$stmt = mysqli_prepare($conexion, $sql);

if (!$stmt) {
    redirigir_error_e('Error interno al preparar la consulta.', $id);
}

mysqli_stmt_bind_param(
    $stmt,
    'sssssssssssssssssssssssssssiii',
    $codigo_referencia,
    $titulo,
    $fechas,
    $nivel_descripcion,
    $volumen_soporte,
    $nombre_productor,
    $historia_institucional,
    $alcance_contenido,
    $valoracion_eliminacion,
    $organizacion,
    $condiciones_acceso,
    $condiciones_reproduccion,
    $lengua_escritura,
    $caracteristicas_fisicas,
    $unidades_relacionadas,
    $notas,
    $fecha_ingreso_registro,
    $fechas_descripciones,
    $estado,
    $nombre_descriptor,
    $nota_archivero,
    $fecha_creacion_revision,
    $reglas_normas,
    $pa_nombre,
    $pa_geografico,
    $pam_materia,
    $objeto_digital,
    $fecha_inicial_filtro,
    $fecha_final_filtro,
    $id
);

if (!mysqli_stmt_execute($stmt)) {
    $err = mysqli_stmt_error($stmt);
    mysqli_stmt_close($stmt);
    redirigir_error_e('Error al actualizar: ' . $err, $id);
}

mysqli_stmt_close($stmt);
mysqli_close($conexion);

$_SESSION['form_exito'] = 'El registro fue actualizado correctamente.';
header('Location: /apps/side-arc/ficha.php?id=' . $id);
exit;