false, 'message' => 'Faltan datos obligatorios']); exit(); } $tipo = $input['tipo']; $motivo = trim($input['motivo']); $cabina_id = isset($input['cabina_id']) ? (int)$input['cabina_id'] : null; try { $pdo->beginTransaction(); if ($tipo === 'emergencia') { // Abrir todas las jaulas ocupadas o reservadas $stmt = $pdo->prepare("UPDATE cabinas SET estado = 'disponible', comentarios = CONCAT(IFNULL(comentarios, ''), '\n[EMERGENCIA] ', :motivo, ' - ', NOW()) WHERE estado IN ('ocupada', 'reservada')"); $stmt->execute([':motivo' => $motivo]); $afectadas = $stmt->rowCount(); $pdo->commit(); echo json_encode(['success' => true, 'message' => "Apertura de emergencia ejecutada. $afectadas jaulas liberadas."]); } else { // Apertura manual individual if (!$cabina_id) { throw new Exception("Se requiere cabina_id para apertura manual"); } $stmt = $pdo->prepare("UPDATE cabinas SET estado = 'disponible', comentarios = CONCAT(IFNULL(comentarios, ''), '\n[MANUAL] ', :motivo, ' - ', NOW()) WHERE id = :id"); $stmt->execute([':id' => $cabina_id, ':motivo' => $motivo]); if ($stmt->rowCount() === 0) { throw new Exception("Jaula no encontrada"); } $pdo->commit(); echo json_encode(['success' => true, 'message' => 'Jaula abierta manualmente. Motivo registrado.']); } } catch (Exception $e) { $pdo->rollBack(); http_response_code(500); echo json_encode(['success' => false, 'message' => 'Error: ' . $e->getMessage()]); } ?>