| 1 |
<?php
// ============================================================
// SIDE - ARC 1.0
// Archivo: ficha.php
// ============================================================
if (session_status() === PHP_SESSION_NONE) {
session_start();
}
require_once 'conexion.php';
require_once 'helpers.php';
if (!isset($_GET['id']) || !is_numeric($_GET['id'])) {
header('Location: /apps/side-arc/cuadro_clasificacion.php');
exit;
}
$id_actual = (int) $_GET['id'];
$es_nuevo = isset($_GET['nuevo']) && $_GET['nuevo'] === '1';
$es_admin = isset($_SESSION['admin_id']) && !empty($_SESSION['admin_id']);
$stmt = mysqli_prepare($conexion,
"SELECT * FROM descripcion_isadg WHERE id = ? LIMIT 1");
mysqli_stmt_bind_param($stmt, 'i', $id_actual);
mysqli_stmt_execute($stmt);
$res = mysqli_stmt_get_result($stmt);
$registro = mysqli_fetch_assoc($res);
mysqli_free_result($res);
mysqli_stmt_close($stmt);
if (!$registro) {
header('Location: /apps/side-arc/cuadro_clasificacion.php');
exit;
}
$sql_ancestros = "
WITH RECURSIVE ancestros AS (
SELECT id, parent_id, titulo, nivel_descripcion
FROM descripcion_isadg
WHERE id = ?
UNION ALL
SELECT d.id, d.parent_id, d.titulo, d.nivel_descripcion
FROM descripcion_isadg d
INNER JOIN ancestros a ON d.id = a.parent_id
)
SELECT id FROM ancestros
";
$stmt2 = mysqli_prepare($conexion, $sql_ancestros);
mysqli_stmt_bind_param($stmt2, 'i', $id_actual);
mysqli_stmt_execute($stmt2);
$res2 = mysqli_stmt_get_result($stmt2);
$ids_abiertos = [];
while ($fila = mysqli_fetch_assoc($res2)) {
$ids_abiertos[$fila['id']] = true;
}
mysqli_free_result($res2);
mysqli_stmt_close($stmt2);
$res3 = mysqli_query($conexion,
"SELECT id, parent_id, titulo, nivel_descripcion, codigo_referencia
FROM descripcion_isadg
ORDER BY codigo_referencia ASC");
$arbol_indexado = [];
while ($fila = mysqli_fetch_assoc($res3)) {
$arbol_indexado[$fila['parent_id']][] = $fila;
}
mysqli_free_result($res3);
function renderizar_arbol_ficha(
?int $padre_id,
array &$arbol,
array &$ids_abiertos,
int $id_actual
): void {
if (!isset($arbol[$padre_id])) {
return;
}
echo '<ul class="ficha-arbol__lista">';
foreach ($arbol[$padre_id] as $nodo) {
$id = (int) $nodo['id'];
$prefijo = prefijo_nivel($nodo['nivel_descripcion']);
$titulo = h($nodo['titulo']);
$tiene_hijos = isset($arbol[$id]);
$es_activo = ($id === $id_actual);
$esta_abierto = isset($ids_abiertos[$id]);
echo '<li class="ficha-arbol__item">';
if ($tiene_hijos) {
$open_attr = $esta_abierto ? ' open' : '';
echo '<details class="ficha-arbol__details"' . $open_attr . '>';
echo '<summary class="ficha-arbol__summary'
. ($es_activo ? ' ficha-arbol__summary--activo' : '') . '">';
echo '<span class="arbol-nodo__prefijo nivel-'
. strtolower($prefijo) . '">[' . $prefijo . ']</span>';
echo '<a href="/apps/side-arc/ficha.php?id=' . $id . '" '
. 'class="ficha-arbol__enlace'
. ($es_activo ? ' ficha-arbol__enlace--activo' : '') . '">'
. $titulo . '</a>';
echo '</summary>';
renderizar_arbol_ficha($id, $arbol, $ids_abiertos, $id_actual);
echo '</details>';
} else {
echo '<div class="ficha-arbol__hoja'
. ($es_activo ? ' ficha-arbol__hoja--activo' : '') . '">';
echo '<span class="arbol-nodo__prefijo nivel-'
. strtolower($prefijo) . '">[' . $prefijo . ']</span>';
echo '<a href="/apps/side-arc/ficha.php?id=' . $id . '" '
. 'class="ficha-arbol__enlace'
. ($es_activo ? ' ficha-arbol__enlace--activo' : '') . '">'
. $titulo . '</a>';
echo '</div>';
}
echo '</li>';
}
echo '</ul>';
}
function campo_ficha(string $etiqueta, ?string $valor, bool $es_textarea = false): void {
if ($valor === null || trim($valor) === '') {
return;
}
$valor_seguro = h($valor);
echo '<div class="ficha-campo">';
echo '<dt class="ficha-campo__etiqueta">' . $etiqueta . '</dt>';
if ($es_textarea) {
echo '<dd class="ficha-campo__valor ficha-campo__valor--texto">'
. nl2br($valor_seguro) . '</dd>';
} else {
echo '<dd class="ficha-campo__valor">' . $valor_seguro . '</dd>';
}
echo '</div>';
}
$stmt_hijos = mysqli_prepare($conexion,
"SELECT COUNT(*) AS total FROM descripcion_isadg WHERE parent_id = ?");
mysqli_stmt_bind_param($stmt_hijos, 'i', $id_actual);
mysqli_stmt_execute($stmt_hijos);
$res_hijos = mysqli_stmt_get_result($stmt_hijos);
$total_hijos = (int) mysqli_fetch_assoc($res_hijos)['total'];
mysqli_free_result($res_hijos);
mysqli_stmt_close($stmt_hijos);
$titulo_pagina = h($registro['titulo']);
require_once 'header.php';
$prefijo_actual = prefijo_nivel($registro['nivel_descripcion']);
?>
<?php if ($es_nuevo): ?>
<div class="alerta alerta--exito">✔ El registro fue creado exitosamente.</div>
<?php endif; ?>
<?php if (isset($_SESSION['form_exito'])): ?>
<div class="alerta alerta--exito">✔ <?= h($_SESSION['form_exito']) ?></div>
<?php unset($_SESSION['form_exito']); ?>
<?php endif; ?>
<div class="ficha-layout">
<aside class="ficha-panel ficha-panel--izquierdo">
<div class="ficha-panel__cabecera">
<h2 class="ficha-panel__titulo">Cuadro de clasificación</h2>
<a href="/apps/side-arc/cuadro_clasificacion.php"
class="ficha-panel__ver-todo">Ver completo</a>
</div>
<nav class="ficha-arbol" aria-label="Árbol documental">
<?php renderizar_arbol_ficha(null, $arbol_indexado, $ids_abiertos, $id_actual); ?>
</nav>
</aside>
<section class="ficha-panel ficha-panel--derecho">
<!-- Encabezado -->
<div class="ficha-encabezado">
<div style="display:flex; justify-content:space-between; align-items:flex-start;">
<h1 class="ficha-titulo"><?= h($registro['titulo']) ?></h1>
<div style="display:flex; gap:0.5rem; align-items:center; margin-left:1rem;">
<?php if ($total_hijos > 0): ?>
<a href="/apps/side-arc/subordinados.php?parent_id=<?= $id_actual ?>"
class="btn btn--primario style="padding:0.55rem 1.25rem; font-size:0.92rem;">
Ver <?= $total_hijos ?> entidad(es) subordinada(s) →
</a>
<?php endif; ?>
</div>
</div>
</div>
<!-- Toolbar admin -->
<?php if ($es_admin): ?>
<div class="ficha-toolbar">
<a href="/apps/side-arc/editar.php?id=<?= $id_actual ?>"
class="btn btn--toolbar">Editar</a>
<?php if ($registro['nivel_descripcion'] !== 'Unidad Documental Simple'): ?>
<a href="/apps/side-arc/ingreso.php?parent_id=<?= $id_actual ?>"
class="btn btn--toolbar">+ Subordinado</a>
<?php endif; ?>
<a href="/apps/side-arc/subir_objeto.php?id=<?= $id_actual ?>"
class="btn btn--toolbar">Objeto Digital</a>
<a href="/apps/side-arc/importar.php?parent_id=<?= $id_actual ?>"
class="btn btn--toolbar">⬆ Importar CSV</a>
<a href="/apps/side-arc/exportar.php?id=<?= $id_actual ?>"
class="btn btn--toolbar">⬇ Exportar CSV</a>
<a href="/apps/side-arc/eliminar.php?id=<?= $id_actual ?>"
class="btn btn--toolbar btn--toolbar--peligro"
onclick="return confirm('¿Confirma la eliminación de este registro?')">
Eliminar</a>
</div>
<?php endif; ?>
<!-- Visor objeto digital -->
<?php if (!empty($registro['objeto_digital'])): ?>
<div class="ficha-objeto-digital">
<?php
$ruta = $registro['objeto_digital'];
$ext = strtolower(pathinfo($ruta, PATHINFO_EXTENSION));
$url = '/apps/side-arc/' . h($ruta);
$es_img = in_array($ext, ['jpg','jpeg','png','gif','webp']);
$es_pdf = ($ext === 'pdf');
?>
<?php if ($es_img): ?>
<img src="<?= $url ?>" alt="Objeto digital"
class="ficha-objeto-digital__img">
<?php elseif ($es_pdf): ?>
<iframe src="<?= $url ?>" class="ficha-objeto-digital__pdf"
title="Documento PDF"></iframe>
<?php endif; ?>
<a href="<?= $url ?>" target="_blank"
class="btn btn--primario"
style="margin-top:0.5rem; display:inline-block;">
Abrir en nueva pestaña
</a>
</div>
<?php endif; ?>
<!-- Metadatos ISAD(G) -->
<dl class="ficha-metadatos">
<!-- ÁREA 1: IDENTIFICACIÓN -->
<div class="ficha-seccion">
<h3 class="ficha-seccion__titulo">Área de Identificación</h3>
<?php
campo_ficha('Código de referencia', $registro['codigo_referencia']);
campo_ficha('Nivel de descripción', $registro['nivel_descripcion']);
campo_ficha('Fecha(s)', $registro['fechas']);
campo_ficha('Volumen y soporte', $registro['volumen_soporte'], true);
?>
</div>
<!-- ÁREA 2: CONTEXTO -->
<?php if (!empty($registro['nombre_productor']) ||
!empty($registro['historia_institucional'])): ?>
<div class="ficha-seccion">
<h3 class="ficha-seccion__titulo">Área de Contexto</h3>
<?php
campo_ficha('Nombre del productor', $registro['nombre_productor']);
campo_ficha('Historia institucional / Reseña biográfica',
$registro['historia_institucional'], true);
?>
</div>
<?php endif; ?>
<!-- ÁREA 3: CONTENIDO Y ESTRUCTURA -->
<?php if (!empty($registro['alcance_contenido']) ||
!empty($registro['valoracion_eliminacion']) ||
!empty($registro['organizacion'])): ?>
<div class="ficha-seccion">
<h3 class="ficha-seccion__titulo">Área de Contenido y Estructura</h3>
<?php
campo_ficha('Alcance y contenido',
$registro['alcance_contenido'], true);
campo_ficha('Valoración, selección y eliminación',
$registro['valoracion_eliminacion'], true);
campo_ficha('Organización', $registro['organizacion'], true);
?>
</div>
<?php endif; ?>
<!-- ÁREA 4: CONDICIONES DE ACCESO -->
<?php if (!empty($registro['condiciones_acceso']) ||
!empty($registro['condiciones_reproduccion']) ||
!empty($registro['lengua_escritura']) ||
!empty($registro['caracteristicas_fisicas'])): ?>
<div class="ficha-seccion">
<h3 class="ficha-seccion__titulo">Área de Condiciones de Acceso y Utilización</h3>
<?php
campo_ficha('Condiciones de acceso',
$registro['condiciones_acceso'], true);
campo_ficha('Condiciones de reproducción',
$registro['condiciones_reproduccion'], true);
campo_ficha('Lengua / escritura(s)', $registro['lengua_escritura']);
campo_ficha('Características físicas y requisitos técnicos',
$registro['caracteristicas_fisicas'], true);
?>
</div>
<?php endif; ?>
<!-- ÁREA 5: DOCUMENTACIÓN ASOCIADA -->
<?php if (!empty($registro['unidades_relacionadas'])): ?>
<div class="ficha-seccion">
<h3 class="ficha-seccion__titulo">Área de Documentación Asociada</h3>
<?php
campo_ficha('Unidades de descripción relacionadas',
$registro['unidades_relacionadas'], true);
?>
</div>
<?php endif; ?>
<!-- ÁREA 6: NOTAS -->
<?php if (!empty($registro['notas'])): ?>
<div class="ficha-seccion">
<h3 class="ficha-seccion__titulo">Área de Notas</h3>
<?php campo_ficha('Notas', $registro['notas'], true); ?>
</div>
<?php endif; ?>
<!-- ÁREA 7: CONTROL DE LA DESCRIPCIÓN -->
<?php if (!empty($registro['fecha_ingreso_registro']) ||
!empty($registro['fechas_descripciones']) ||
!empty($registro['estado']) ||
!empty($registro['nombre_descriptor']) ||
!empty($registro['nota_archivero']) ||
!empty($registro['fecha_creacion_revision']) ||
!empty($registro['reglas_normas'])): ?>
<div class="ficha-seccion">
<h3 class="ficha-seccion__titulo">Área de Control de la Descripción</h3>
<?php
campo_ficha('Estado', $registro['estado']);
campo_ficha('Fecha de ingreso del registro', $registro['fecha_ingreso_registro']);
campo_ficha('Fecha(s) de la(s) descripción(es)',
$registro['fechas_descripciones']);
campo_ficha('Nombre del descriptor', $registro['nombre_descriptor']);
campo_ficha('Nota del archivero', $registro['nota_archivero'], true);
campo_ficha('Fecha de creación, revisión y eliminación',
$registro['fecha_creacion_revision']);
campo_ficha('Reglas o normas', $registro['reglas_normas']);
?>
</div>
<?php endif; ?>
<!-- ÁREA 8: PUNTOS DE ACCESO -->
<?php if (!empty($registro['pa_nombre']) ||
!empty($registro['pa_geografico']) ||
!empty($registro['pam_materia'])): ?>
<div class="ficha-seccion">
<h3 class="ficha-seccion__titulo">Puntos de Acceso e Indexación</h3>
<?php
campo_ficha('PA – Nombre (personal o corporativo)', $registro['pa_nombre']);
campo_ficha('PA – Nombre geográfico o toponímico', $registro['pa_geografico']);
campo_ficha('PAM – Encabezamiento de materia', $registro['pam_materia']);
?>
</div>
<?php endif; ?>
</dl>
</section>
</div>
<?php
mysqli_close($conexion);
require_once 'footer.php';
?>
|