| 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;
|