'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.']); }