// Restringir acceso al dashboard por usuario function verificar_acceso_dashboard() { if (is_page('mi-cuenta')) { if (!is_user_logged_in()) { wp_redirect(wp_login_url()); exit; } } } add_action('template_redirect', 'verificar_acceso_dashboard'); @media (max-width: 480px) { .cliente-nombre { font-size: 20px; } .saldo-cantidad { font-size: 24px; } .dashboard-card { padding: 15px; } } // Procesar solicitud de trámites function procesar_solicitud_tramites() { if (isset($_POST['solicitar_tramite']) && isset($_POST['tramite_nonce'])) { // Verificar nonce de seguridad if (!wp_verify_nonce($_POST['tramite_nonce'], 'solicitar_tramite')) { wp_die('Error de seguridad'); } $cliente_id = intval($_POST['cliente_id']); $tramites_solicitados = isset($_POST['tramites']) ? $_POST['tramites'] : array(); if (empty($tramites_solicitados)) { add_action('admin_notices', function() { echo '

Por favor selecciona al menos un trámite.

'; }); return; } // Obtener trámites actuales $tramites_actuales = get_post_meta($cliente_id, 'tramites_activos', true); if (!is_array($tramites_actuales)) { $tramites_actuales = array(); } // Nombres de trámites $nombres_tramites = array( 'aclaracion_saldo' => 'Aclaración de saldo', 'actualizar_rfc' => 'Actualizar RFC', 'cambio_domicilio' => 'Cambio de domicilio', 'portabilidad' => 'Portabilidad línea fija', 'visita_tecnica' => 'Visita técnica', 'autoinstalacion' => 'Autoinstalación de equipo' ); // Agregar nuevos trámites foreach ($tramites_solicitados as $tramite) { $tramites_actuales[] = array( 'tipo' => $tramite, 'fecha_solicitud' => date('d/m/Y'), 'estado' => 'pendiente', 'notas' => 'Solicitud realizada desde el portal del cliente' ); } // Guardar trámites actualizados update_post_meta($cliente_id, 'tramites_activos', $tramites_actuales); // Enviar notificación por email al administrador enviar_notificacion_tramite($cliente_id, $tramites_solicitados); // Mensaje de éxito add_action('wp_footer', function() { echo ''; }); } } add_action('init', 'procesar_solicitud_tramites'); // Enviar notificación por email function enviar_notificacion_tramite($cliente_id, $tramites) { $cliente_nombre = get_the_title($cliente_id); $numero_cuenta = get_post_meta($cliente_id, 'numero_cuenta', true); $admin_email = get_option('admin_email'); $nombres_tramites = array( 'aclaracion_saldo' => 'Aclaración de saldo', 'actualizar_rfc' => 'Actualizar RFC', 'cambio_domicilio' => 'Cambio de domicilio', 'portabilidad' => 'Portabilidad línea fija', 'visita_tecnica' => 'Visita técnica', 'autoinstalacion' => 'Autoinstalación de equipo' ); $lista_tramites = ''; foreach ($tramites as $tramite) { $lista_tramites .= '- ' . $nombres_tramites[$tramite] . "\n"; } $asunto = 'Nueva solicitud de trámite - ' . $cliente_nombre; $mensaje = "Se ha recibido una nueva solicitud de trámite:\n\n"; $mensaje .= "Cliente: {$cliente_nombre}\n"; $mensaje .= "Cuenta: {$numero_cuenta}\n"; $mensaje .= "Fecha: " . date('d/m/Y H:i') . "\n\n"; $mensaje .= "Trámites solicitados:\n{$lista_tramites}\n\n"; $mensaje .= "Ver detalles en: " . admin_url('post.php?post=' . $cliente_id . '&action=edit'); wp_mail($admin_email, $asunto, $mensaje); } // Agregar metabox para gestión rápida de trámites en el admin function agregar_metabox_tramites_rapidos() { add_meta_box( 'tramites_rapidos', '🛠️ Gestión Rápida de Trámites', 'mostrar_metabox_tramites', 'cliente', 'side', 'high' ); } add_action('add_meta_boxes', 'agregar_metabox_tramites_rapidos'); function mostrar_metabox_tramites($post) { $tramites = get_post_meta($post->ID, 'tramites_activos', true); if (empty($tramites) || !is_array($tramites)) { echo '

No hay trámites activos

'; return; } echo '
'; echo ''; foreach ($tramites as $index => $tramite) { $estado_class = 'estado-' . $tramite['estado']; echo '
'; echo '' . esc_html($tramite['tipo']) . '
'; echo 'Fecha: ' . esc_html($tramite['fecha_solicitud']) . '
'; echo '' . esc_html(ucfirst($tramite['estado'])) . ''; echo '
'; } echo '
'; } // Widget para estadísticas en el dashboard de WordPress function agregar_widget_estadisticas_clientes() { wp_add_dashboard_widget( 'estadisticas_clientes', '📊 Estadísticas de Clientes', 'mostrar_widget_estadisticas' ); } add_action('wp_dashboard_setup', 'agregar_widget_estadisticas_clientes'); function mostrar_widget_estadisticas() { $total_clientes = wp_count_posts('cliente')->publish; // Contar trámites pendientes $args = array( 'post_type' => 'cliente', 'posts_per_page' => -1 ); $clientes = get_posts($args); $tramites_pendientes = 0; $tramites_totales = 0; $saldo_total = 0; foreach ($clientes as $cliente) { $tramites = get_post_meta($cliente->ID, 'tramites_activos', true); if (is_array($tramites)) { foreach ($tramites as $tramite) { $tramites_totales++; if ($tramite['estado'] === 'pendiente') { $tramites_pendientes++; } } } $saldo = get_post_meta($cliente->ID, 'saldo_disponible', true); $saldo_total += floatval($saldo); } echo '
'; echo '
'; echo '
' . $total_clientes . '
'; echo '
Clientes Totales
'; echo '
'; echo '
'; echo '
' . $tramites_pendientes . '
'; echo '
Trámites Pendientes
'; echo '
'; echo '
'; echo '
' . $tramites_totales . '
'; echo '
Trámites Totales
'; echo '
'; echo '
'; echo '
$' . number_format($saldo_total, 2) . '
'; echo '
Saldo Total
'; echo '
'; echo '
'; echo '
'; echo 'Ver Todos los Clientes'; echo '
'; } // Exportar clientes a CSV function agregar_boton_exportar_csv() { $screen = get_current_screen(); if ($screen->post_type === 'cliente') { echo '📥 Exportar a CSV'; } } add_action('admin_notices', 'agregar_boton_exportar_csv'); function exportar_clientes_csv() { if (!current_user_can('manage_options')) { wp_die('No tienes permisos para esta acción'); } $args = array( 'post_type' => 'cliente', 'posts_per_page' => -1 ); $clientes = get_posts($args); header('Content-Type: text/csv; charset=utf-8'); header('Content-Disposition: attachment; filename=clientes_' . date('Y-m-d') . '.csv'); $output = fopen('php://output', 'w'); // Encabezados fputcsv($output, array( 'Nombre', 'Número de Cuenta', 'Saldo Disponible', 'Paquete', 'Servicios', 'Teléfono', 'Email', 'RFC' )); // Datos foreach ($clientes as $cliente) { $numero_cuenta = get_post_meta($cliente->ID, 'numero_cuenta', true); $saldo = get_post_meta($cliente->ID, 'saldo_disponible', true); $paquete = get_post_meta($cliente->ID, 'paquete_contratado', true); $contacto = get_post_meta($cliente->ID, 'datos_contacto', true); $fiscal = get_post_meta($cliente->ID, 'datos_fiscales', true); $servicios = get_the_terms($cliente->ID, 'servicio'); $servicios_str = ''; if ($servicios && !is_wp_error($servicios)) { $servicios_str = implode(', ', wp_list_pluck($servicios, 'name')); } fputcsv($output, array( $cliente->post_title, $numero_cuenta, $saldo, $paquete, $servicios_str, isset($contacto['telefono']) ? $contacto['telefono'] : '', isset($contacto['email']) ? $contacto['email'] : '', isset($fiscal['rfc']) ? $fiscal['rfc'] : '' )); } fclose($output); exit; } add_action('wp_ajax_exportar_clientes_csv', 'exportar_clientes_csv'); // Búsqueda de clientes por número de cuenta en el admin function buscar_por_numero_cuenta($query) { if (!is_admin() || !$query->is_main_query()) { return; } if ($query->get('post_type') !== 'cliente') { return; } $search_term = $query->get('s'); if (empty($search_term)) { return; } // Buscar por número de cuenta $meta_query = array( 'relation' => 'OR', array( 'key' => 'numero_cuenta', 'value' => $search_term, 'compare' => 'LIKE' ) ); $query->set('meta_query', $meta_query); $query->set('s', ''); // Limpiar búsqueda de título para que solo busque en meta } add_action('pre_get_posts', 'buscar_por_numero_cuenta'); ?> Dashboard – Top Of The World

// Mostrar dashboard del cliente actual (ID automático)

// Mostrar dashboard de un cliente específico

Scroll al inicio