$user_id, 'morder_exists' => !empty($morder) ]); return false; } try { // Generar password para la nueva cuenta Nextcloud $password = wp_generate_password(12, false); // Obtener información del usuario con validaciones $user = get_userdata($user_id); if (!$user) { nextcloud_log_error('User not found', ['user_id' => $user_id]); return false; } $email = $user->user_email; $username = $user->user_login; $displayname = $user->display_name ?: $username; // Obtener nivel de membresía actual $level = pmpro_getMembershipLevelForUser($user_id); if (!$level) { nextcloud_log_error('No membership level found for user', ['user_id' => $user_id]); return false; } // Configurar timezone y fecha del pedido $dt = new DateTime(); $dt->setTimezone(new DateTimeZone('America/Boa_Vista')); // Usar timestamp del morder o timestamp actual $order_timestamp = !empty($morder->timestamp) ? $morder->timestamp : current_time('timestamp'); $dt->setTimestamp($order_timestamp); $fecha_pedido = $dt->format('d/m/Y H:i:s'); // Obtener configuración dinámica del usuario (del sistema de pricing dinámico) $config_data = get_nextcloud_user_config($user_id); // Obtener fecha del próximo pago usando PMPro $fecha_pago_proximo = get_pmpro_next_payment_date($user_id, $level); // Preparar datos del email $email_data = prepare_nextcloud_email_data($user, $level, $morder, $config_data, [ 'password' => $password, 'fecha_pedido' => $fecha_pedido, 'fecha_pago_proximo' => $fecha_pago_proximo ]); // Enviar email al usuario $user_email_sent = send_nextcloud_user_email($email_data); // Enviar email al administrador $admin_email_sent = send_nextcloud_admin_email($email_data); // Log del resultado nextcloud_log_info('Nextcloud TI plan processing completed', [ 'user_id' => $user_id, 'username' => $username, 'level_name' => $level->name, 'user_email_sent' => $user_email_sent, 'admin_email_sent' => $admin_email_sent, 'config_data' => $config_data ]); return true; } catch (Exception $e) { nextcloud_log_error('Exception in plan_nextcloud_ti', [ 'user_id' => $user_id, 'message' => $e->getMessage(), 'file' => $e->getFile(), 'line' => $e->getLine() ]); return false; } } /** * Obtiene la configuración dinámica del usuario */ function get_nextcloud_user_config($user_id) { $config_json = get_user_meta($user_id, 'nextcloud_config', true); if (empty($config_json)) { nextcloud_log_info('No dynamic config found for user, using defaults', ['user_id' => $user_id]); return [ 'storage_space' => '1tb', 'office_suite' => '20users', 'payment_frequency' => 'monthly', 'storage_display' => '1 Terabyte', 'office_display' => '±20 usuários (CODE - Grátis)', 'frequency_display' => 'Mensal' ]; } $config = json_decode($config_json, true); if (json_last_error() !== JSON_ERROR_NONE) { nextcloud_log_error('Invalid JSON in user config', [ 'user_id' => $user_id, 'json_error' => json_last_error_msg() ]); return null; } // Enriquecer con información de display $config['storage_display'] = get_storage_display_name($config['storage_space'] ?? '1tb'); $config['office_display'] = get_office_display_name($config['office_suite'] ?? '20users'); $config['frequency_display'] = get_frequency_display_name($config['payment_frequency'] ?? 'monthly'); return $config; } /** * Obtiene la fecha del próximo pago usando PMPro nativo */ function get_pmpro_next_payment_date($user_id, $level) { // Usar función nativa de PMPro si está disponible if (function_exists('pmpro_next_payment')) { $next_payment = pmpro_next_payment($user_id); if (!empty($next_payment)) { return date('d/m/Y', $next_payment); } } // Fallback: calcular basado en el nivel y la última orden if (class_exists('MemberOrder')) { $last_order = new MemberOrder(); $last_order->getLastMemberOrder($user_id, 'success'); if (!empty($last_order->timestamp)) { $last_payment_timestamp = is_numeric($last_order->timestamp) ? $last_order->timestamp : strtotime($last_order->timestamp); // Calcular próximo pago basado en el ciclo $cycle_seconds = get_cycle_seconds_from_level($level); $next_payment_timestamp = $last_payment_timestamp + $cycle_seconds; return date('d/m/Y', $next_payment_timestamp); } } // Último fallback: basado en la fecha actual y ciclo del nivel $cycle_seconds = get_cycle_seconds_from_level($level); $next_payment_timestamp = current_time('timestamp') + $cycle_seconds; return date('d/m/Y', $next_payment_timestamp); } /** * Calcula segundos del ciclo basado en el nivel */ function get_cycle_seconds_from_level($level) { if (empty($level->cycle_number) || empty($level->cycle_period)) { return 30 * DAY_IN_SECONDS; // Default: 30 días } $multipliers = [ 'Day' => DAY_IN_SECONDS, 'Week' => WEEK_IN_SECONDS, 'Month' => 30 * DAY_IN_SECONDS, 'Year' => YEAR_IN_SECONDS ]; $multiplier = $multipliers[$level->cycle_period] ?? (30 * DAY_IN_SECONDS); return $level->cycle_number * $multiplier; } /** * Prepara los datos para los emails */ function prepare_nextcloud_email_data($user, $level, $morder, $config_data, $additional_data) { // Determinar mensajes basados en la frecuencia $frequency_messages = get_frequency_messages($config_data['payment_frequency'] ?? 'monthly'); return [ 'user' => $user, 'level' => $level, 'morder' => $morder, 'config' => $config_data, 'password' => $additional_data['password'], 'fecha_pedido' => $additional_data['fecha_pedido'], 'fecha_pago_proximo' => $additional_data['fecha_pago_proximo'], 'monthly_message' => $frequency_messages['monthly_message'], 'date_message' => $frequency_messages['date_message'] ]; } /** * Obtiene mensajes según la frecuencia de pago */ function get_frequency_messages($payment_frequency) { $messages = [ 'monthly' => [ 'monthly_message' => 'mensal ', 'date_message' => 'Data do próximo pagamento: ' ], 'semiannual' => [ 'monthly_message' => 'semestral ', 'date_message' => 'Data da próxima cobrança semestral: ' ], 'annual' => [ 'monthly_message' => 'anual ', 'date_message' => 'Data da próxima cobrança anual: ' ], 'biennial' => [ 'monthly_message' => 'bienal ', 'date_message' => 'Data da próxima cobrança (em 2 anos): ' ], 'triennial' => [ 'monthly_message' => 'trienal ', 'date_message' => 'Data da próxima cobrança (em 3 anos): ' ], 'quadrennial' => [ 'monthly_message' => 'quadrienal ', 'date_message' => 'Data da próxima cobrança (em 4 anos): ' ], 'quinquennial' => [ 'monthly_message' => 'quinquenal ', 'date_message' => 'Data da próxima cobrança (em 5 anos): ' ] ]; return $messages[$payment_frequency] ?? $messages['monthly']; } /** * Envía email al usuario */ function send_nextcloud_user_email($data) { $user = $data['user']; $level = $data['level']; $morder = $data['morder']; $config = $data['config']; // Configuración del email $brdrv_email = "cloud@" . basename(get_site_url()); $mailto = "mailto:" . $brdrv_email; // Título del email $subject = "Sua instância Nextcloud será criada"; // Construir mensaje $message = "
Prezado(a) " . $user->display_name . " (" . $user->user_login . "),
"; $message .= "Parabéns! Seu pagamento foi confirmado e sua instância Nextcloud será criada em breve.
"; // Datos de acceso $message .= "Usuário: " . $user->user_login . "
";
$message .= "Senha: " . $data['password'] . "
Plano: " . $level->name . "
";
// Agregar información de configuración dinámica si está disponible
if (!empty($config)) {
$message .= "Armazenamento: " . ($config['storage_display'] ?? 'N/A') . "
";
$message .= "Suite Office: " . ($config['office_display'] ?? 'N/A') . "
";
$message .= "Frequência: " . ($config['frequency_display'] ?? 'N/A') . "
";
}
$message .= "Data do pedido: " . $data['fecha_pedido'] . "
";
$message .= "Valor " . $data['monthly_message'] . ": R$ " . number_format($morder->total, 2, ',', '.') . "
";
$message .= $data['date_message'] . $data['fecha_pago_proximo'] . "
⚠️ Importante - Segurança:
";
$message .= "Por segurança, recomendamos:
Se você tiver alguma dúvida, entre em contato conosco no e-mail: " . $brdrv_email . ".
"; $message .= "Atenciosamente,
Equipe Brasdrive
Plano: " . $level->name . "
";
$admin_message .= "Nome: " . $user->display_name . "
";
$admin_message .= "Usuário: " . $user->user_login . "
";
$admin_message .= "Email: " . $user->user_email . "
";
$admin_message .= "Senha gerada: " . $data['password'] . "
Armazenamento: " . ($config['storage_display'] ?? 'N/A') . "
";
$admin_message .= "Suite Office: " . ($config['office_display'] ?? 'N/A') . "
";
$admin_message .= "Frequência: " . ($config['frequency_display'] ?? 'N/A') . "
Data do pedido: " . $data['fecha_pedido'] . "
";
$admin_message .= "Próximo pagamento: " . $data['fecha_pago_proximo'] . "