103 lines
4.7 KiB
PHP
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.']);
|
|
}
|