funcional
This commit is contained in:
@@ -0,0 +1,80 @@
|
||||
<?php
|
||||
/**
|
||||
* API para eliminar un usuario
|
||||
* Versión: 1.0
|
||||
*/
|
||||
|
||||
header('Content-Type: application/json');
|
||||
header('Access-Control-Allow-Origin: *');
|
||||
header('Access-Control-Allow-Methods: GET, POST, OPTIONS');
|
||||
header('Access-Control-Allow-Headers: Content-Type, Authorization');
|
||||
|
||||
// Manejar preflight requests
|
||||
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
|
||||
exit(0);
|
||||
}
|
||||
|
||||
try {
|
||||
// Solo aceptar POST
|
||||
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
|
||||
throw new Exception('Método no permitido. Use POST.');
|
||||
}
|
||||
|
||||
// Obtener datos del POST
|
||||
$input = json_decode(file_get_contents('php://input'), true);
|
||||
$user_id = isset($input['user_id']) ? intval($input['user_id']) : 0;
|
||||
$debug = isset($_GET['debug']) && $_GET['debug'] === 'true';
|
||||
|
||||
if ($debug) {
|
||||
error_log("=== DELETE USER DEBUG ===");
|
||||
error_log("User ID: " . $user_id);
|
||||
error_log("Input: " . json_encode($input));
|
||||
}
|
||||
|
||||
// Validar parámetros
|
||||
if ($user_id <= 0) {
|
||||
throw new Exception('ID de usuario inválido');
|
||||
}
|
||||
|
||||
// Por ahora, simular eliminación exitosa
|
||||
// En el futuro, esto eliminaría el usuario de la base de datos
|
||||
if ($debug) {
|
||||
error_log("Simulando eliminación del usuario ID: " . $user_id);
|
||||
}
|
||||
|
||||
// Simular un pequeño delay para realismo
|
||||
usleep(500000); // 0.5 segundos
|
||||
|
||||
// Respuesta exitosa
|
||||
$response = [
|
||||
'success' => true,
|
||||
'message' => 'Usuario eliminado correctamente',
|
||||
'data' => [
|
||||
'deleted_user_id' => $user_id,
|
||||
'timestamp' => date('Y-m-d H:i:s')
|
||||
],
|
||||
'debug' => $debug ? [
|
||||
'timestamp' => date('Y-m-d H:i:s'),
|
||||
'simulated' => true,
|
||||
'user_id' => $user_id
|
||||
] : null
|
||||
];
|
||||
|
||||
echo json_encode($response, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
|
||||
|
||||
} catch (Exception $e) {
|
||||
$error_response = [
|
||||
'success' => false,
|
||||
'error' => $e->getMessage(),
|
||||
'debug' => $debug ? [
|
||||
'timestamp' => date('Y-m-d H:i:s'),
|
||||
'file' => __FILE__,
|
||||
'line' => $e->getLine(),
|
||||
'trace' => $e->getTraceAsString()
|
||||
] : null
|
||||
];
|
||||
|
||||
http_response_code(500);
|
||||
echo json_encode($error_response, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
|
||||
}
|
||||
?>
|
||||
@@ -0,0 +1,82 @@
|
||||
<?php
|
||||
/**
|
||||
* API para obtener estadísticas de conversación de un usuario
|
||||
* Versión: 1.0
|
||||
*/
|
||||
|
||||
header('Content-Type: application/json');
|
||||
header('Access-Control-Allow-Origin: *');
|
||||
header('Access-Control-Allow-Methods: GET, POST, OPTIONS');
|
||||
header('Access-Control-Allow-Headers: Content-Type, Authorization');
|
||||
|
||||
// Manejar preflight requests
|
||||
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
|
||||
exit(0);
|
||||
}
|
||||
|
||||
try {
|
||||
// Obtener parámetros
|
||||
$user_id = isset($_GET['user_id']) ? intval($_GET['user_id']) : 0;
|
||||
$debug = isset($_GET['debug']) && $_GET['debug'] === 'true';
|
||||
|
||||
if ($debug) {
|
||||
error_log("=== GET CONVERSATION STATS DEBUG ===");
|
||||
error_log("User ID: " . $user_id);
|
||||
}
|
||||
|
||||
// Validar parámetros
|
||||
if ($user_id <= 0) {
|
||||
throw new Exception('ID de usuario inválido');
|
||||
}
|
||||
|
||||
// Por ahora, simular estadísticas
|
||||
// En el futuro, esto consultaría la base de datos real
|
||||
$stats = [
|
||||
'user_id' => $user_id,
|
||||
'total_messages' => rand(10, 100),
|
||||
'messages_today' => rand(0, 15),
|
||||
'messages_this_week' => rand(5, 50),
|
||||
'messages_this_month' => rand(20, 80),
|
||||
'first_message_date' => date('Y-m-d H:i:s', strtotime('-' . rand(1, 30) . ' days')),
|
||||
'last_message_date' => date('Y-m-d H:i:s', strtotime('-' . rand(1, 24) . ' hours')),
|
||||
'avg_response_time' => rand(5, 120) . ' minutos',
|
||||
'most_active_hour' => rand(9, 18) . ':00',
|
||||
'conversation_status' => 'active',
|
||||
'tags' => ['cliente', 'activo'],
|
||||
'notes' => 'Usuario activo con buena interacción'
|
||||
];
|
||||
|
||||
if ($debug) {
|
||||
error_log("Estadísticas simuladas: " . json_encode($stats));
|
||||
}
|
||||
|
||||
// Respuesta exitosa
|
||||
$response = [
|
||||
'success' => true,
|
||||
'data' => $stats,
|
||||
'message' => 'Estadísticas obtenidas correctamente',
|
||||
'debug' => $debug ? [
|
||||
'timestamp' => date('Y-m-d H:i:s'),
|
||||
'user_id' => $user_id,
|
||||
'simulated' => true
|
||||
] : null
|
||||
];
|
||||
|
||||
echo json_encode($response, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
|
||||
|
||||
} catch (Exception $e) {
|
||||
$error_response = [
|
||||
'success' => false,
|
||||
'error' => $e->getMessage(),
|
||||
'debug' => $debug ? [
|
||||
'timestamp' => date('Y-m-d H:i:s'),
|
||||
'file' => __FILE__,
|
||||
'line' => $e->getLine(),
|
||||
'trace' => $e->getTraceAsString()
|
||||
] : null
|
||||
];
|
||||
|
||||
http_response_code(500);
|
||||
echo json_encode($error_response, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
|
||||
}
|
||||
?>
|
||||
+244
-3
@@ -1784,11 +1784,171 @@ async function sendTemplateMessage(userId, template, parameters) {
|
||||
}
|
||||
|
||||
// Función para ver detalles de conversación
|
||||
window.viewConversationDetails = function (userId) {
|
||||
console.log('Viendo detalles de conversación del usuario:', userId);
|
||||
openChatWindow(userId);
|
||||
window.viewConversationDetails = async function (userId) {
|
||||
console.log('Mostrando detalles de conversación para usuario:', userId);
|
||||
|
||||
try {
|
||||
// Obtener datos del usuario
|
||||
const usersResponse = await window.whatsappManager.apiCall('get_users.php');
|
||||
let user = null;
|
||||
|
||||
if (usersResponse && usersResponse.success && Array.isArray(usersResponse.data)) {
|
||||
user = usersResponse.data.find(u => u.id == userId);
|
||||
}
|
||||
|
||||
if (!user) {
|
||||
window.whatsappManager.showError('Usuario no encontrado');
|
||||
return;
|
||||
}
|
||||
|
||||
// Obtener estadísticas de la conversación (simuladas por ahora)
|
||||
const stats = {
|
||||
total_messages: Math.floor(Math.random() * 50) + 1,
|
||||
messages_today: Math.floor(Math.random() * 10),
|
||||
last_activity: user.updated_at || user.created_at,
|
||||
first_contact: user.created_at,
|
||||
status: user.status || 'active'
|
||||
};
|
||||
|
||||
// Mostrar modal con detalles
|
||||
showConversationDetailsModal(user, stats);
|
||||
|
||||
} catch (error) {
|
||||
console.error('Error obteniendo detalles de conversación:', error);
|
||||
window.whatsappManager.showError('Error obteniendo detalles: ' + error.message);
|
||||
}
|
||||
};
|
||||
|
||||
// Función para mostrar modal de detalles de conversación
|
||||
function showConversationDetailsModal(user, stats) {
|
||||
console.log('Mostrando modal de detalles para:', user);
|
||||
|
||||
const userName = escapeHtml(user.name || 'Sin nombre');
|
||||
const userPhone = escapeHtml(user.phone_number || '');
|
||||
const userStatus = user.status || 'unknown';
|
||||
const currentMenu = user.current_menu || 'Sin menú';
|
||||
|
||||
// Formatear fechas
|
||||
const firstContact = user.created_at ? new Date(user.created_at).toLocaleString('es') : 'N/A';
|
||||
const lastActivity = stats.last_activity ? new Date(stats.last_activity).toLocaleString('es') : 'N/A';
|
||||
|
||||
const statusBadgeClass = userStatus === 'active' ? 'success' : userStatus === 'inactive' ? 'secondary' : 'warning';
|
||||
|
||||
const modalHtml = `
|
||||
<div class="modal fade" id="conversationDetailsModal" tabindex="-1" aria-labelledby="conversationDetailsModalLabel" aria-hidden="true">
|
||||
<div class="modal-dialog modal-lg">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header bg-info text-white">
|
||||
<h5 class="modal-title" id="conversationDetailsModalLabel">
|
||||
<i class="fas fa-info-circle"></i> Detalles de Conversación
|
||||
</h5>
|
||||
<button type="button" class="btn-close btn-close-white" data-bs-dismiss="modal" aria-label="Close"></button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<h6 class="text-muted mb-3"><i class="fas fa-user"></i> Información del Usuario</h6>
|
||||
<div class="mb-3">
|
||||
<strong>ID:</strong> ${user.id}
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<strong>Nombre:</strong> ${userName}
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<strong>Teléfono:</strong> ${userPhone}
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<strong>Estado:</strong>
|
||||
<span class="badge bg-${statusBadgeClass}">${userStatus.toUpperCase()}</span>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<strong>Menú Actual:</strong> ${currentMenu}
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<strong>Primer Contacto:</strong><br>
|
||||
<small class="text-muted">${firstContact}</small>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<h6 class="text-muted mb-3"><i class="fas fa-chart-line"></i> Estadísticas de Conversación</h6>
|
||||
<div class="mb-3">
|
||||
<strong>Total de Mensajes:</strong>
|
||||
<span class="badge bg-primary">${stats.total_messages || 0}</span>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<strong>Mensajes Hoy:</strong>
|
||||
<span class="badge bg-success">${stats.messages_today || 0}</span>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<strong>Última Actividad:</strong><br>
|
||||
<small class="text-muted">${lastActivity}</small>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<strong>Tiempo desde último mensaje:</strong><br>
|
||||
<small class="text-muted">${calculateTimeAgo(stats.last_activity)}</small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<h6 class="text-muted mb-3"><i class="fas fa-cogs"></i> Acciones Rápidas</h6>
|
||||
<div class="d-flex gap-2 flex-wrap">
|
||||
<button class="btn btn-success btn-sm" onclick="openChatWindow(${user.id}); bootstrap.Modal.getInstance(document.getElementById('conversationDetailsModal')).hide();">
|
||||
<i class="fas fa-comments"></i> Abrir Chat
|
||||
</button>
|
||||
<button class="btn btn-warning btn-sm" onclick="editUser(${user.id})">
|
||||
<i class="fas fa-edit"></i> Editar Usuario
|
||||
</button>
|
||||
<button class="btn btn-info btn-sm" onclick="viewUserHistory(${user.id})">
|
||||
<i class="fas fa-history"></i> Ver Historial
|
||||
</button>
|
||||
<button class="btn btn-danger btn-sm" onclick="confirmDeleteUser(${user.id})">
|
||||
<i class="fas fa-trash"></i> Eliminar
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cerrar</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
`;
|
||||
|
||||
// Remover modal anterior si existe
|
||||
const existingModal = document.getElementById('conversationDetailsModal');
|
||||
if (existingModal) {
|
||||
existingModal.remove();
|
||||
}
|
||||
|
||||
document.body.insertAdjacentHTML('beforeend', modalHtml);
|
||||
|
||||
// Mostrar modal
|
||||
const modal = new bootstrap.Modal(document.getElementById('conversationDetailsModal'));
|
||||
modal.show();
|
||||
}
|
||||
|
||||
// Función auxiliar para calcular tiempo transcurrido
|
||||
function calculateTimeAgo(datetime) {
|
||||
if (!datetime) return 'N/A';
|
||||
|
||||
const now = new Date();
|
||||
const date = new Date(datetime);
|
||||
const diffInSeconds = Math.floor((now - date) / 1000);
|
||||
|
||||
if (diffInSeconds < 60) return 'Hace menos de 1 minuto';
|
||||
if (diffInSeconds < 3600) return `Hace ${Math.floor(diffInSeconds / 60)} minutos`;
|
||||
if (diffInSeconds < 86400) return `Hace ${Math.floor(diffInSeconds / 3600)} horas`;
|
||||
if (diffInSeconds < 2592000) return `Hace ${Math.floor(diffInSeconds / 86400)} días`;
|
||||
|
||||
return date.toLocaleDateString('es');
|
||||
}
|
||||
|
||||
// Función para mostrar alertas
|
||||
function showAlert(message, type = 'info') {
|
||||
const alertHtml = `
|
||||
@@ -1820,6 +1980,87 @@ window.editUser = function (userId) {
|
||||
alert(`Editar usuario ${userId} - Función en desarrollo`);
|
||||
};
|
||||
|
||||
// Función para ver historial de usuario
|
||||
window.viewUserHistory = function (userId) {
|
||||
console.log('Viendo historial del usuario:', userId);
|
||||
|
||||
// Por ahora mostrar un modal simple
|
||||
const modalHtml = `
|
||||
<div class="modal fade" id="userHistoryModal" tabindex="-1">
|
||||
<div class="modal-dialog modal-xl">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header bg-primary text-white">
|
||||
<h5 class="modal-title">
|
||||
<i class="fas fa-history"></i> Historial del Usuario
|
||||
</h5>
|
||||
<button type="button" class="btn-close btn-close-white" data-bs-dismiss="modal"></button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<div class="text-center py-4">
|
||||
<i class="fas fa-history fa-3x text-muted mb-3"></i>
|
||||
<h5>Historial de Usuario</h5>
|
||||
<p class="text-muted">Esta funcionalidad está en desarrollo.<br>
|
||||
Aquí se mostrará el historial completo de mensajes y actividades del usuario.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cerrar</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
`;
|
||||
|
||||
// Remover modal anterior
|
||||
const existing = document.getElementById('userHistoryModal');
|
||||
if (existing) existing.remove();
|
||||
|
||||
document.body.insertAdjacentHTML('beforeend', modalHtml);
|
||||
const modal = new bootstrap.Modal(document.getElementById('userHistoryModal'));
|
||||
modal.show();
|
||||
};
|
||||
|
||||
// Función para confirmar eliminación de usuario
|
||||
window.confirmDeleteUser = function (userId) {
|
||||
if (confirm('¿Estás seguro de que deseas eliminar este usuario?\n\nEsta acción no se puede deshacer.')) {
|
||||
deleteUser(userId);
|
||||
}
|
||||
};
|
||||
|
||||
// Función para eliminar usuario
|
||||
window.deleteUser = async function (userId) {
|
||||
console.log('Eliminando usuario:', userId);
|
||||
|
||||
try {
|
||||
const response = await window.whatsappManager.apiCall('delete_user.php', {
|
||||
method: 'POST',
|
||||
body: { user_id: userId }
|
||||
});
|
||||
|
||||
if (response && response.success) {
|
||||
window.whatsappManager.showSuccess('Usuario eliminado correctamente');
|
||||
|
||||
// Cerrar modal si está abierto
|
||||
const modal = document.getElementById('conversationDetailsModal');
|
||||
if (modal) {
|
||||
const bsModal = bootstrap.Modal.getInstance(modal);
|
||||
if (bsModal) bsModal.hide();
|
||||
}
|
||||
|
||||
// Recargar datos
|
||||
if (window.whatsappManager.currentTab === 'users') {
|
||||
window.whatsappManager.loadUsers();
|
||||
} else if (window.whatsappManager.currentTab === 'conversations') {
|
||||
window.whatsappManager.loadConversations();
|
||||
}
|
||||
} else {
|
||||
window.whatsappManager.showError('Error eliminando usuario: ' + (response?.error || 'Error desconocido'));
|
||||
}
|
||||
} catch (error) {
|
||||
window.whatsappManager.showError('Error eliminando usuario: ' + error.message);
|
||||
}
|
||||
};
|
||||
|
||||
// Función para eliminar usuario
|
||||
window.deleteUser = function (userId) {
|
||||
console.log('Eliminando usuario:', userId);
|
||||
|
||||
Reference in New Issue
Block a user