<?php // ============================================================ // SIDE - ARC 1.0 // Archivo: ingreso.php // Propósito: Formulario de ingreso manual de descripciones // archivísticas ISAD(G). Genera dinámicamente el // selector de niveles según la matriz jerárquica. // Protegido: solo administradores. // ============================================================ require_once 'conexion.php'; require_once 'helpers.php'; requerir_admin(); $titulo_pagina = 'Nuevo Registro'; // ============================================================ // OBTENER DATOS DEL PADRE (si se pasó parent_id por GET) // ============================================================ $parent_id = null; $padre = null; $nivel_padre = null; $niveles_permitidos = []; if (isset($_GET['parent_id']) && is_numeric($_GET['parent_id'])) { $parent_id = (int) $_GET['parent_id']; $stmt = mysqli_prepare( $conexion, "SELECT id, titulo, nivel_descripcion, codigo_referencia FROM descripcion_isadg WHERE id = ? LIMIT 1" ); mysqli_stmt_bind_param($stmt, 'i', $parent_id); mysqli_stmt_execute($stmt); $res = mysqli_stmt_get_result($stmt); $padre = mysqli_fetch_assoc($res); mysqli_free_result($res); // <-- free sobre el RESULT mysqli_stmt_close($stmt); // <-- close sobre el STMT if (!$padre) { // parent_id inválido: resetear $parent_id = null; } else { $nivel_padre = $padre['nivel_descripcion']; // Bloquear si el padre es US (nunca tiene hijos) if ($nivel_padre === 'Unidad Documental Simple') { mysqli_close($conexion); require_once 'header.php'; echo '<div class="alerta alerta--error" style="margin-top:2rem;">' . '⛔ Las Unidades Documentales Simples no pueden tener registros subordinados.' . ' <a href="/apps/side-arc/ficha.php?id=' . $parent_id . '">Volver a la ficha</a>.' . '</div>'; require_once 'footer.php'; exit; } } } // Niveles permitidos según el padre detectado $niveles_permitidos = niveles_permitidos_bajo($nivel_padre); // ============================================================ // RECUPERAR MENSAJE DE ERROR/ÉXITO DE REDIRECCIÓN // ============================================================ $mensaje_error = ''; if (isset($_SESSION['form_error'])) { $mensaje_error = $_SESSION['form_error']; unset($_SESSION['form_error']); } // Recuperar datos del formulario si hubo error (repoblar campos) $form_data = $_SESSION['form_data'] ?? []; unset($_SESSION['form_data']); // Token CSRF if (empty($_SESSION['csrf_token'])) { $_SESSION['csrf_token'] = bin2hex(random_bytes(32)); } require_once 'header.php'; ?> <div class="form-pagina__encabezado"> <div style="display:flex; justify-content:space-between; align-items:flex-start;"> <div> <h1 class="form-pagina__titulo">Nuevo Registro Archivístico</h1> <?php if ($padre): ?> <p class="form-pagina__contexto" style="margin-top:0.8rem;"> Creando registro subordinado de: <span class="badge-nivel"><?= htmlspecialchars($nivel_padre) ?></span> <strong><?= htmlspecialchars($padre['titulo']) ?></strong> </p> <?php else: ?> <p class="form-pagina__contexto"> Ingresando registro raíz de fondo documental. </p> <?php endif; ?> </div> <div style="display:flex; gap:0.5rem; margin-left:1rem; white-space:nowrap; align-items:center;"> <button type="submit" form="form-isadg" class="btn btn--primario" style="padding:0.55rem 1.25rem; font-size:0.92rem;"> ✓ Guardar Registro </button> <a href="/apps/side-arc/cuadro_clasificacion.php" class="btn btn--cancelar" style="padding:0.55rem 1.25rem; font-size:0.92rem;"> Cancelar </a> </div> </div> </div> <?php if (empty($niveles_permitidos)): ?> <div class="alerta alerta--advertencia"> No hay niveles de descripción disponibles para este contexto. </div> <?php else: ?> <form id="form-isadg" action="/apps/side-arc/procesar_ingreso.php" method="POST" class="form-isadg" novalidate> <input type="hidden" name="csrf_token" value="<?= $_SESSION['csrf_token'] ?>"> <input type="hidden" name="parent_id" value="<?= $parent_id ?? '' ?>"> <!-- ================================================== SECCIÓN 1: IDENTIFICACIÓN ================================================== --> <fieldset class="form-seccion"> <legend class="form-seccion__titulo">Área de Identificación</legend> <!-- Fila 1: Nivel / Código --> <div class="form-grid form-grid--2" style="margin-bottom:1rem;"> <div class="form-grupo"> <label for="codigo_referencia" class="form-label form-label--req">Código de referencia</label> <input type="text" id="codigo_referencia" name="codigo_referencia" class="form-input" value="<?= htmlspecialchars($form_data['codigo_referencia'] ?? '') ?>" maxlength="100" required> </div> <div class="form-grupo"> <label for="nivel_descripcion" class="form-label form-label--req">Nivel de descripción</label> <select id="nivel_descripcion" name="nivel_descripcion" class="form-input form-select" required> <option value="">— Seleccione un nivel —</option> <?php foreach ($niveles_permitidos as $nivel): ?> <option value="<?= htmlspecialchars($nivel) ?>" <?= (($form_data['nivel_descripcion'] ?? '') === $nivel) ? 'selected' : '' ?>> <?= htmlspecialchars($nivel) ?> </option> <?php endforeach; ?> </select> </div> </div> <!-- Fila 2: Título (full) --> <div class="form-grid form-grid--1" style="margin-bottom:1rem;"> <div class="form-grupo"> <label for="titulo" class="form-label form-label--req">Título</label> <input type="text" id="titulo" name="titulo" class="form-input" value="<?= htmlspecialchars($form_data['titulo'] ?? '') ?>" maxlength="255" required> </div> </div> <!-- Fila 3: Fecha(s) / Año inicial / Año final --> <div class="form-grid form-grid--2" style="margin-bottom:1rem;"> <div class="form-grupo"> <label for="fechas" class="form-label">Fecha(s)</label> <input type="text" id="fechas" name="fechas" class="form-input" value="<?= htmlspecialchars($form_data['fechas'] ?? '') ?>" maxlength="255" placeholder="Ej: 1990-2005 / ca. 1980"> </div> <div class="form-grupo"> <label for="fecha_inicial_filtro" class="form-label">Año inicial</label> <input type="number" id="fecha_inicial_filtro" name="fecha_inicial_filtro" class="form-input" value="<?= htmlspecialchars($form_data['fecha_inicial_filtro'] ?? '') ?>" min="1000" max="2999" placeholder="Ej: 1990"> </div> <div class="form-grupo"> <label for="fecha_final_filtro" class="form-label">Año final</label> <input type="number" id="fecha_final_filtro" name="fecha_final_filtro" class="form-input" value="<?= htmlspecialchars($form_data['fecha_final_filtro'] ?? '') ?>" min="1000" max="2999" placeholder="Ej: 2005"> </div> </div> <!-- Fila 4: Volumen y soporte (full) --> <div class="form-grid form-grid--1"> <div class="form-grupo"> <label for="volumen_soporte" class="form-label">Volumen y soporte</label> <textarea id="volumen_soporte" name="volumen_soporte" class="form-input form-textarea" rows="2"><?= htmlspecialchars($form_data['volumen_soporte'] ?? '') ?></textarea> </div> </div> </fieldset> <!-- ================================================== SECCIÓN 2: CONTEXTO ================================================== --> <fieldset class="form-seccion"> <legend class="form-seccion__titulo"> Área de Contexto </legend> <div class="form-grid form-grid--1"> <div class="form-grupo"> <label for="nombre_productor" class="form-label"> Nombre del productor </label> <input type="text" id="nombre_productor" name="nombre_productor" class="form-input" value="<?= htmlspecialchars($form_data['nombre_productor'] ?? '') ?>" maxlength="255"> </div> <div class="form-grupo form-grupo--full"> <label for="historia_institucional" class="form-label"> Historia institucional / Reseña biográfica </label> <textarea id="historia_institucional" name="historia_institucional" class="form-input form-textarea" rows="4"><?= htmlspecialchars($form_data['historia_institucional'] ?? '') ?></textarea> </div> </div> </fieldset> <!-- ================================================== SECCIÓN 3: CONTENIDO Y ESTRUCTURA ================================================== --> <fieldset class="form-seccion"> <legend class="form-seccion__titulo"> Área de Contenido y Estructura </legend> <div class="form-grid form-grid--1"> <div class="form-grupo"> <label for="alcance_contenido" class="form-label"> Alcance y contenido </label> <textarea id="alcance_contenido" name="alcance_contenido" class="form-input form-textarea" rows="5"><?= htmlspecialchars($form_data['alcance_contenido'] ?? '') ?></textarea> </div> </div> <div class="form-grid form-grid--2" style="margin-bottom:1rem;"> <div class="form-grupo"> <label for="valoracion_eliminacion" class="form-label"> Valoración, selección y eliminación </label> <textarea id="valoracion_eliminacion" name="valoracion_eliminacion" class="form-input form-textarea" rows="3"><?= htmlspecialchars($form_data['valoracion_eliminacion'] ?? '') ?></textarea> </div> <div class="form-grupo"> <label for="organizacion" class="form-label"> Organización </label> <textarea id="organizacion" name="organizacion" class="form-input form-textarea" rows="3"><?= htmlspecialchars($form_data['organizacion'] ?? '') ?></textarea> </div> </div> </fieldset> <!-- ================================================== SECCIÓN 4: CONDICIONES DE ACCESO ================================================== --> <fieldset class="form-seccion"> <legend class="form-seccion__titulo"> Área de Condiciones de Acceso y Utilización </legend> <div class="form-grid form-grid--2"> <div class="form-grupo"> <label for="condiciones_acceso" class="form-label"> Condiciones de acceso </label> <textarea id="condiciones_acceso" name="condiciones_acceso" class="form-input form-textarea" rows="3"><?= htmlspecialchars($form_data['condiciones_acceso'] ?? '') ?></textarea> </div> <div class="form-grupo"> <label for="condiciones_reproduccion" class="form-label"> Condiciones de reproducción </label> <textarea id="condiciones_reproduccion" name="condiciones_reproduccion" class="form-input form-textarea" rows="3"><?= htmlspecialchars($form_data['condiciones_reproduccion'] ?? '') ?></textarea> </div> <div class="form-grupo"> <label for="caracteristicas_fisicas" class="form-label"> Características físicas y requisitos técnicos </label> <textarea id="caracteristicas_fisicas" name="caracteristicas_fisicas" class="form-input form-textarea" rows="3"><?= htmlspecialchars($form_data['caracteristicas_fisicas'] ?? '') ?></textarea> </div> <div class="form-grupo"> <label for="lengua_escritura" class="form-label"> Lengua / escritura(s) </label> <input type="text" id="lengua_escritura" name="lengua_escritura" class="form-input" value="<?= htmlspecialchars($form_data['lengua_escritura'] ?? '') ?>" maxlength="255" placeholder="Ej: Español, Latín"> </div> </div> </fieldset> <!-- ================================================== SECCIÓN 5: DOCUMENTACIÓN ASOCIADA ================================================== --> <fieldset class="form-seccion"> <legend class="form-seccion__titulo"> Área de Documentación Asociada </legend> <div class="form-grid form-grid--1"> <div class="form-grupo"> <label for="unidades_relacionadas" class="form-label"> Unidades de descripción relacionadas </label> <textarea id="unidades_relacionadas" name="unidades_relacionadas" class="form-input form-textarea" rows="3"><?= htmlspecialchars($form_data['unidades_relacionadas'] ?? '') ?></textarea> </div> </div> </fieldset> <!-- ================================================== SECCIÓN 6: NOTAS ================================================== --> <fieldset class="form-seccion"> <legend class="form-seccion__titulo"> Área de Notas </legend> <div class="form-grid form-grid--1"> <div class="form-grupo"> <label for="notas" class="form-label">Notas</label> <textarea id="notas" name="notas" class="form-input form-textarea" rows="3"><?= htmlspecialchars($form_data['notas'] ?? '') ?></textarea> </div> </div> </fieldset> <!-- ================================================== SECCIÓN 7: CONTROL DE LA DESCRIPCIÓN ================================================== --> <fieldset class="form-seccion"> <legend class="form-seccion__titulo"> Área de Control de la Descripción </legend> <div class="form-grid form-grid--2"> <div class="form-grupo"> <label for="fecha_ingreso_registro" class="form-label"> Fecha de ingreso del registro </label> <input type="date" id="fecha_ingreso_registro" name="fecha_ingreso_registro" class="form-input" value="<?= htmlspecialchars( $form_data['fecha_ingreso_registro'] ?? date('Y-m-d') ) ?>"> </div> <div class="form-grupo"> <label for="fechas_descripciones" class="form-label"> Fecha(s) de la(s) descripción(es) </label> <input type="text" id="fechas_descripciones" name="fechas_descripciones" class="form-input" value="<?= htmlspecialchars($form_data['fechas_descripciones'] ?? '') ?>" maxlength="255"> </div> <div class="form-grupo"> <label for="estado" class="form-label">Estado</label> <select id="estado" name="estado" class="form-input form-select"> <option value="">— Seleccione —</option> <?php $estados = ['Borrador', 'Revisión', 'Actualizado']; foreach ($estados as $est): ?> <option value="<?= $est ?>" <?= (($form_data['estado'] ?? '') === $est) ? 'selected' : '' ?>> <?= $est ?> </option> <?php endforeach; ?> </select> </div> <div class="form-grupo form-grupo--full"> <label for="nota_archivero" class="form-label"> Nota del archivero </label> <textarea id="nota_archivero" name="nota_archivero" class="form-input form-textarea" rows="3"><?= htmlspecialchars($form_data['nota_archivero'] ?? '') ?></textarea> </div> <div class="form-grupo"> <label for="nombre_descriptor" class="form-label"> Nombre del descriptor </label> <input type="text" id="nombre_descriptor" name="nombre_descriptor" class="form-input" value="<?= htmlspecialchars($form_data['nombre_descriptor'] ?? '') ?>" maxlength="255"> </div> <div class="form-grupo"> <label for="fecha_creacion_revision" class="form-label"> Fecha de creación, revisión y eliminación </label> <input type="text" id="fecha_creacion_revision" name="fecha_creacion_revision" class="form-input" value="<?= htmlspecialchars($form_data['fecha_creacion_revision'] ?? '') ?>" maxlength="255"> </div> <div class="form-grupo"> <label for="reglas_normas" class="form-label"> Reglas o normas </label> <input type="text" id="reglas_normas" name="reglas_normas" class="form-input" value="<?= htmlspecialchars($form_data['reglas_normas'] ?? '') ?>" maxlength="255" placeholder="Ej: ISAD(G), ISAAR(CPF)"> </div> </div> </fieldset> <!-- ================================================== SECCIÓN 8: PUNTOS DE ACCESO ================================================== --> <fieldset class="form-seccion"> <legend class="form-seccion__titulo"> Puntos de Acceso e Indexación </legend> <div class="form-grid form-grid--2"> <div class="form-grupo"> <label for="pa_nombre" class="form-label"> PA – Nombre (personal o corporativo) </label> <input type="text" id="pa_nombre" name="pa_nombre" class="form-input" value="<?= htmlspecialchars($form_data['pa_nombre'] ?? '') ?>" maxlength="255"> </div> <div class="form-grupo"> <label for="pa_geografico" class="form-label"> PA – Nombre geográfico o toponímico </label> <input type="text" id="pa_geografico" name="pa_geografico" class="form-input" value="<?= htmlspecialchars($form_data['pa_geografico'] ?? '') ?>" maxlength="255"> </div> <div class="form-grupo"> <label for="pam_materia" class="form-label"> PAM – Encabezamiento de materia </label> <input type="text" id="pam_materia" name="pam_materia" class="form-input" value="<?= htmlspecialchars($form_data['pam_materia'] ?? '') ?>" maxlength="255"> </div> </div> </fieldset> </form> <?php endif; // fin de niveles_permitidos ?> </div><!-- /.form-pagina --> <?php mysqli_close($conexion); require_once 'footer.php'; ?> <script> document.getElementById('selector_archivo').addEventListener('change', function() { if (this.files && this.files[0]) { document.getElementById('objeto_digital').value = 'objetos_digitales/' + this.files[0].name; } }); </script>