ingreso.php Formulario de ingreso ISAD(G) 1 líneas
1
<?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;">
        &#10003; 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>