funcional

This commit is contained in:
lizandrogd
2026-01-12 23:14:17 -05:00
parent 6d55e0bced
commit b41b1dd164
3 changed files with 406 additions and 3 deletions
+80
View File
@@ -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);
}
?>
+82
View File
@@ -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
View File
@@ -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);