103 lines
4.7 KiB
PHP

<?php
/**
* oficios.php — API REST básica para oficios
* Autenticación: session cookie (misma sesión PHP) o Bearer token (futuro)
* Endpoints:
* GET /api/oficios.php → lista (paginada, filtros)
* GET /api/oficios.php?id=N → detalle
* POST /api/oficios.php → crear
* PUT /api/oficios.php?id=N → actualizar estado
* DELETE /api/oficios.php?id=N → eliminación lógica
*/
declare(strict_types=1);
header('Content-Type: application/json; charset=utf-8');
header('X-Content-Type-Options: nosniff');
require_once __DIR__ . '/../config/config.php';
require_once __DIR__ . '/../models/Oficio.php';
iniciarSesion();
// ── Autenticación mínima ─────────────────────────────────────────────────────
if (empty($_SESSION['usuario_id'])) {
http_response_code(401);
echo json_encode(['error' => 'No autenticado.', 'code' => 401]);
exit();
}
$method = $_SERVER['REQUEST_METHOD'];
$model = new OficioModel();
$userId = (int)$_SESSION['usuario_id'];
$esAdmin = ($_SESSION['usuario_rol'] ?? '') === 'administrador';
// ── Routing ──────────────────────────────────────────────────────────────────
switch ($method) {
case 'GET':
$id = (int)($_GET['id'] ?? 0);
if ($id) {
$oficio = $model->buscarPorId($id);
if (!$oficio) { http_response_code(404); echo json_encode(['error'=>'No encontrado']); exit(); }
echo json_encode(['data' => $oficio, 'ok' => true]);
} else {
$filtros = [
'tipo' => $_GET['tipo'] ?? '',
'estado' => $_GET['estado'] ?? '',
'prioridad' => $_GET['prioridad'] ?? '',
'busqueda' => $_GET['busqueda'] ?? '',
'semaforo' => $_GET['semaforo'] ?? '',
];
$oficios = $model->listar($filtros, !$esAdmin, $userId);
echo json_encode(['data' => $oficios, 'total' => count($oficios), 'ok' => true]);
}
break;
case 'POST':
$body = json_decode(file_get_contents('php://input'), true) ?? $_POST;
$datos = [
'numero_oficio' => clean($body['numero_oficio'] ?? $model->generarNumero($body['tipo'] ?? 'recibido')),
'tipo' => clean($body['tipo'] ?? 'recibido'),
'remitente' => clean($body['remitente'] ?? ''),
'destinatario' => clean($body['destinatario'] ?? ''),
'asunto' => clean($body['asunto'] ?? ''),
'descripcion' => clean($body['descripcion'] ?? ''),
'fecha_recepcion' => clean($body['fecha_recepcion'] ?? date('Y-m-d')),
'fecha_vencimiento' => clean($body['fecha_vencimiento'] ?? ''),
'prioridad' => clean($body['prioridad'] ?? 'media'),
'estado' => clean($body['estado'] ?? 'recibido'),
'responsable_id' => (int)($body['responsable_id'] ?? 0),
'es_confidencial' => (int)($body['es_confidencial'] ?? 0),
'etiquetas' => $body['etiquetas'] ?? [],
];
if (empty($datos['remitente']) || empty($datos['asunto'])) {
http_response_code(422);
echo json_encode(['error' => 'Remitente y asunto son requeridos.']);
break;
}
$id = $model->crear($datos, $userId);
http_response_code(201);
echo json_encode(['data' => ['id' => $id], 'ok' => true]);
break;
case 'PUT':
$id = (int)($_GET['id'] ?? 0);
$body = json_decode(file_get_contents('php://input'), true) ?? [];
if (!$id) { http_response_code(400); echo json_encode(['error'=>'ID requerido']); break; }
$oficio = $model->buscarPorId($id);
if (!$oficio) { http_response_code(404); echo json_encode(['error'=>'No encontrado']); break; }
$datos = array_merge($oficio, $body);
$model->actualizar($id, $datos, $userId);
echo json_encode(['ok' => true, 'message' => 'Oficio actualizado.']);
break;
case 'DELETE':
$id = (int)($_GET['id'] ?? 0);
if (!$id) { http_response_code(400); echo json_encode(['error'=>'ID requerido']); break; }
$model->eliminarLogico($id, $userId);
echo json_encode(['ok' => true, 'message' => 'Oficio eliminado (lógicamente).']);
break;
default:
http_response_code(405);
echo json_encode(['error' => 'Método no permitido.']);
}