ficha.php Ficha de descripción archivística 1 líneas
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';
?>