213 lines
10 KiB
PHP
213 lines
10 KiB
PHP
<?php
|
|
/**
|
|
* editar.php — Formulario de edición de oficio
|
|
*/
|
|
require_once __DIR__ . '/../../config/config.php';
|
|
require_once __DIR__ . '/../../controllers/AuthController.php';
|
|
require_once __DIR__ . '/../../models/Oficio.php';
|
|
require_once __DIR__ . '/../../models/Usuario.php';
|
|
|
|
AuthController::requerirAuth();
|
|
|
|
$id = (int)($_GET['id'] ?? 0);
|
|
if (!$id) redirect(APP_URL . '/views/oficios/lista.php');
|
|
|
|
$model = new OficioModel();
|
|
$oficio = $model->buscarPorId($id);
|
|
|
|
if (!$oficio) redirect(APP_URL . '/views/oficios/lista.php?error='.urlencode('Oficio no encontrado.'));
|
|
|
|
$usuario = new UsuarioModel();
|
|
$etiquetas = $model->etiquetas();
|
|
$usuarios = $usuario->usuariosParaSelector();
|
|
$selEtiq = array_column($model->etiquetasDeOficio($id), 'id');
|
|
|
|
$errores = $_SESSION['errores_form'] ?? [];
|
|
$datos = $_SESSION['datos_form'] ?? $oficio;
|
|
unset($_SESSION['errores_form'], $_SESSION['datos_form']);
|
|
|
|
$pageTitle = 'Editar Oficio: '.$oficio['numero_oficio'];
|
|
$activeNav = 'lista';
|
|
|
|
include __DIR__ . '/../../views/layout/header.php';
|
|
include __DIR__ . '/../../views/layout/sidebar.php';
|
|
include __DIR__ . '/../../views/layout/topbar.php';
|
|
?>
|
|
<div class="page-content">
|
|
|
|
<div class="breadcrumb">
|
|
<a href="<?= APP_URL ?>/dashboard.php"><i class="fa-solid fa-house"></i></a>
|
|
<i class="fa-solid fa-chevron-right sep"></i>
|
|
<a href="<?= APP_URL ?>/views/oficios/lista.php">Oficios</a>
|
|
<i class="fa-solid fa-chevron-right sep"></i>
|
|
<a href="<?= APP_URL ?>/views/oficios/detalle.php?id=<?= $id ?>"><?= htmlspecialchars($oficio['numero_oficio']) ?></a>
|
|
<i class="fa-solid fa-chevron-right sep"></i>
|
|
<span>Editar</span>
|
|
</div>
|
|
|
|
<div class="page-header">
|
|
<div class="page-header-content">
|
|
<h1>Editar Oficio</h1>
|
|
<p><?= htmlspecialchars($oficio['numero_oficio']) ?> · <?= htmlspecialchars(mb_strimwidth($oficio['asunto'], 0, 80, '…')) ?></p>
|
|
</div>
|
|
</div>
|
|
|
|
<?php if (!empty($errores)): ?>
|
|
<div class="alert alert-danger">
|
|
<i class="fa-solid fa-circle-exclamation"></i>
|
|
<ul style="margin:.3rem 0 0 1rem">
|
|
<?php foreach ($errores as $e): ?><li><?= htmlspecialchars($e) ?></li><?php endforeach; ?>
|
|
</ul>
|
|
</div>
|
|
<?php endif; ?>
|
|
|
|
<form method="POST" action="<?= APP_URL ?>/controllers/OficioController.php?action=actualizar" enctype="multipart/form-data" novalidate>
|
|
<?= csrfField() ?>
|
|
<input type="hidden" name="id" value="<?= $id ?>">
|
|
|
|
<div class="grid-2" style="gap:1.5rem;align-items:start">
|
|
|
|
<div>
|
|
<div class="card mb-4">
|
|
<div class="card-header">
|
|
<i class="fa-solid fa-pen text-warning"></i>
|
|
<span class="card-title">Datos del Oficio</span>
|
|
</div>
|
|
<div class="card-body">
|
|
|
|
<div class="form-row" style="grid-template-columns:1fr 1fr">
|
|
<div class="form-group">
|
|
<label class="form-label">Número de Oficio <span class="required">*</span></label>
|
|
<input type="text" class="form-control" name="numero_oficio"
|
|
value="<?= htmlspecialchars($datos['numero_oficio'] ?? '') ?>" required>
|
|
</div>
|
|
<div class="form-group">
|
|
<label class="form-label">Tipo <span class="required">*</span></label>
|
|
<select class="form-control" name="tipo" required>
|
|
<option value="recibido" <?= ($datos['tipo']??'')==='recibido'?'selected':'' ?>>📥 Recibido</option>
|
|
<option value="enviado" <?= ($datos['tipo']??'')==='enviado'?'selected':'' ?>>📤 Enviado</option>
|
|
</select>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="form-group">
|
|
<label class="form-label">Remitente <span class="required">*</span></label>
|
|
<input type="text" class="form-control" name="remitente" value="<?= htmlspecialchars($datos['remitente'] ?? '') ?>" required>
|
|
</div>
|
|
<div class="form-group">
|
|
<label class="form-label">Destinatario <span class="required">*</span></label>
|
|
<input type="text" class="form-control" name="destinatario" value="<?= htmlspecialchars($datos['destinatario'] ?? '') ?>" required>
|
|
</div>
|
|
<div class="form-group">
|
|
<label class="form-label">Asunto <span class="required">*</span></label>
|
|
<textarea class="form-control" name="asunto" rows="3" data-maxlen="500" required><?= htmlspecialchars($datos['asunto'] ?? '') ?></textarea>
|
|
</div>
|
|
<div class="form-group">
|
|
<label class="form-label">Descripción</label>
|
|
<textarea class="form-control" name="descripcion" rows="4" data-maxlen="2000"><?= htmlspecialchars($datos['descripcion'] ?? '') ?></textarea>
|
|
</div>
|
|
|
|
</div>
|
|
</div>
|
|
|
|
<div class="card mb-4">
|
|
<div class="card-header"><i class="fa-solid fa-paperclip text-primary"></i><span class="card-title">Agregar Adjuntos</span></div>
|
|
<div class="card-body">
|
|
<div class="dropzone">
|
|
<i class="fa-solid fa-cloud-arrow-up" style="font-size:1.5rem;margin-bottom:.5rem;opacity:.5;display:block"></i>
|
|
<p class="dropzone-label" style="font-weight:600;">Arrastra archivos o haz clic</p>
|
|
<p style="font-size:.78rem">PDF, Word, Excel, imágenes · Máximo 10 MB</p>
|
|
<input type="file" name="adjuntos[]" style="display:none" multiple accept=".pdf,.doc,.docx,.jpg,.jpeg,.png,.gif,.xls,.xlsx">
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div>
|
|
<div class="card mb-4">
|
|
<div class="card-header"><i class="fa-solid fa-sliders text-primary"></i><span class="card-title">Control y Seguimiento</span></div>
|
|
<div class="card-body">
|
|
|
|
<div class="form-row" style="grid-template-columns:1fr 1fr">
|
|
<div class="form-group">
|
|
<label class="form-label">Fecha Recepción <span class="required">*</span></label>
|
|
<input type="date" class="form-control" name="fecha_recepcion" value="<?= $datos['fecha_recepcion']??'' ?>" required>
|
|
</div>
|
|
<div class="form-group">
|
|
<label class="form-label">Fecha Vencimiento</label>
|
|
<input type="date" class="form-control" name="fecha_vencimiento" value="<?= $datos['fecha_vencimiento']??'' ?>">
|
|
</div>
|
|
</div>
|
|
|
|
<div class="form-row" style="grid-template-columns:1fr 1fr">
|
|
<div class="form-group">
|
|
<label class="form-label">Prioridad</label>
|
|
<select class="form-control" name="prioridad">
|
|
<option value="alta" <?= ($datos['prioridad']??'')==='alta' ?'selected':'' ?>>🔴 Alta</option>
|
|
<option value="media" <?= ($datos['prioridad']??'')==='media' ?'selected':'' ?>>🟡 Media</option>
|
|
<option value="baja" <?= ($datos['prioridad']??'')==='baja' ?'selected':'' ?>>🟢 Baja</option>
|
|
</select>
|
|
</div>
|
|
<div class="form-group">
|
|
<label class="form-label">Estado</label>
|
|
<select class="form-control" name="estado">
|
|
<option value="recibido" <?= ($datos['estado']??'')==='recibido' ?'selected':'' ?>>Recibido</option>
|
|
<option value="en_proceso" <?= ($datos['estado']??'')==='en_proceso' ?'selected':'' ?>>En Proceso</option>
|
|
<option value="respondido" <?= ($datos['estado']??'')==='respondido' ?'selected':'' ?>>Respondido</option>
|
|
<option value="vencido" <?= ($datos['estado']??'')==='vencido' ?'selected':'' ?>>Vencido</option>
|
|
<option value="archivado" <?= ($datos['estado']??'')==='archivado' ?'selected':'' ?>>Archivado</option>
|
|
</select>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="form-group">
|
|
<label class="form-label">Responsable</label>
|
|
<select class="form-control" name="responsable_id">
|
|
<option value="">— Sin asignar —</option>
|
|
<?php foreach ($usuarios as $u): ?>
|
|
<option value="<?= $u['id'] ?>" <?= ($datos['responsable_id']??'')==$u['id']?'selected':'' ?>>
|
|
<?= htmlspecialchars($u['nombre_completo']) ?>
|
|
</option>
|
|
<?php endforeach; ?>
|
|
</select>
|
|
</div>
|
|
|
|
<div class="form-group">
|
|
<label class="form-label">Etiquetas</label>
|
|
<div style="display:flex;flex-wrap:wrap;gap:.45rem;padding:.5rem;background:var(--bg);border:1px solid var(--border);border-radius:var(--radius-sm)">
|
|
<?php foreach ($etiquetas as $et): ?>
|
|
<label style="display:flex;align-items:center;gap:.3rem;cursor:pointer;font-size:.8rem">
|
|
<input type="checkbox" name="etiquetas[]" value="<?= $et['id'] ?>"
|
|
<?= in_array($et['id'], $selEtiq)?'checked':'' ?>>
|
|
<span class="badge" style="background:<?= $et['color'] ?>30;color:<?= $et['color'] ?>">
|
|
<?= htmlspecialchars($et['nombre']) ?>
|
|
</span>
|
|
</label>
|
|
<?php endforeach; ?>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="form-group">
|
|
<label style="display:flex;align-items:center;gap:.5rem;cursor:pointer;font-size:.85rem;font-weight:500">
|
|
<input type="checkbox" name="es_confidencial" value="1" <?= !empty($datos['es_confidencial'])?'checked':'' ?>>
|
|
<i class="fa-solid fa-lock text-warning"></i> Confidencial
|
|
</label>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div style="display:flex;gap:.75rem;flex-direction:column">
|
|
<button type="submit" class="btn btn-warning btn-lg w-100">
|
|
<i class="fa-solid fa-floppy-disk"></i> Guardar Cambios
|
|
</button>
|
|
<a href="<?= APP_URL ?>/views/oficios/detalle.php?id=<?= $id ?>" class="btn btn-secondary btn-lg w-100">
|
|
<i class="fa-solid fa-xmark"></i> Cancelar
|
|
</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
|
|
<?php include __DIR__ . '/../../views/layout/footer.php'; ?>
|