// 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 '';
}
// 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');
?>
Mi Cuenta – Top Of The World