Files
roi-theme/wp-content/plugins/wp-marketing-automations/modules/emails/class-bwfan-notification-metrics-controller.php
root a22573bf0b Commit inicial - WordPress Análisis de Precios Unitarios
- WordPress core y plugins
- Tema Twenty Twenty-Four configurado
- Plugin allow-unfiltered-html.php simplificado
- .gitignore configurado para excluir wp-config.php y uploads

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-03 21:04:30 -06:00

357 lines
16 KiB
PHP
Executable File

<?php
if ( ! defined( 'ABSPATH' ) ) {
exit;
} // Exit if accessed directly
/**
* Class BWFAN_Notification_Metrics_Controller
*/
class BWFAN_Notification_Metrics_Controller {
protected $data = array();
protected $date_params = array();
private $frequency = '';
/**
* Constructor.
*
* @param array $date_params
*/
public function __construct( $date_params = array(), $frequency = 'weekly' ) {
$this->date_params = wp_parse_args( $date_params, array(
'from_date' => date( 'Y-m-d 00:00:00', strtotime( '-1 day' ) ),
'to_date' => date( 'Y-m-d 23:59:59', strtotime( '-1 day' ) ),
'from_date_previous' => date( 'Y-m-d 00:00:00', strtotime( '-2 day' ) ),
'to_date_previous' => date( 'Y-m-d 23:59:59', strtotime( '-2 day' ) ),
) );
$this->frequency = $frequency;
}
/**
* Get metrics.
*
* @return array
*/
public function get_data() {
return $this->data;
}
/**
* Prepare data.
*/
public function prepare_data() {
$this->data['metrics'] = array();
$this->data['metrics']['total_contacts'] = $this->get_total_contacts();
$this->data['metrics'] = array_merge( $this->data['metrics'], $this->get_total_engagement_sent() );
if ( class_exists( 'WooCommerce' ) ) {
$this->data['metrics'] = array_merge( $this->data['metrics'], $this->get_total_carts() );
$this->data['metrics'] = array_merge( $this->data['metrics'], $this->get_conversions() );
}
}
/**
* Get percentage change.
*
* @param int $previous_value The previous value.
* @param int $current_value The current value.
*
* @return float
*/
public function get_percentage_change( $previous_value = 0, $current_value = 0 ) {
switch ( $previous_value ) {
case 0:
return $current_value * 100;
default:
return ( ( $current_value - $previous_value ) / $previous_value ) * 100;
}
}
/**
* Get total contacts.
*
* @return array
*/
public function get_total_contacts() {
$contacts = BWFAN_Dashboards::get_total_contacts( $this->date_params['from_date'], $this->date_params['to_date'] );
$previous_contacts = BWFAN_Dashboards::get_total_contacts( $this->date_params['from_date_previous'], $this->date_params['to_date_previous'] );
// Calculate percentage change
$percentage_change = $this->get_percentage_change( $previous_contacts, $contacts );
return array(
'text' => __( 'New Contacts', 'wp-marketing-automations' ),
/* translators: 1: Dynamic Text. */ 'previous_text' => sprintf( __( '- Previous %1$s', 'wp-marketing-automations' ), $this->get_frequency_text() ),
'count' => $contacts,
'previous_count' => $previous_contacts,
'percentage_change' => sprintf( '%s%%', round( $percentage_change, 2 ) ),
'percentage_change_positive' => $percentage_change >= 0,
);
}
/**
* Get total engagement sent.
*
* @return array
*/
public function get_total_engagement_sent() {
$engagement_sent = BWFAN_Dashboards::get_total_engagement_sents( $this->date_params['from_date'], $this->date_params['to_date'], '', '' );
$previous_engagement_sent = BWFAN_Dashboards::get_total_engagement_sents( $this->date_params['from_date_previous'], $this->date_params['to_date_previous'], '', '' );
$engagement_open = BWFAN_Dashboards::get_total_email_open( $this->date_params['from_date'], $this->date_params['to_date'], '', '' );
$previous_engagement_open = BWFAN_Dashboards::get_total_email_open( $this->date_params['from_date_previous'], $this->date_params['to_date_previous'], '', '' );
$engagement_click = BWFAN_Dashboards::get_total_email_click( $this->date_params['from_date'], $this->date_params['to_date'], '', '' );
$previous_engagement_click = BWFAN_Dashboards::get_total_email_click( $this->date_params['from_date_previous'], $this->date_params['to_date_previous'], '', '' );
return array(
'email_sent' => $this->get_total_email_sent( $engagement_sent, $previous_engagement_sent ),
'email_open' => $this->get_total_email_open( $engagement_open, $previous_engagement_open ),
'email_click' => $this->get_total_email_click( $engagement_click, $previous_engagement_click ),
);
}
/**
* Get total email click.
*
* @param array $engagement_click The engagement sent data for the current date range.
* @param array $previous_engagement_click The engagement sent data for the previous date range.
*
* @return array
*/
public function get_total_email_click( $engagement_click, $previous_engagement_click ) {
$email_click = isset( $engagement_click[0]['email_click'] ) ? $engagement_click[0]['email_click'] : 0;
$previous_email_click = isset( $previous_engagement_click[0]['email_click'] ) ? $previous_engagement_click[0]['email_click'] : 0;
// Calculate percentage change
$percentage_change = $this->get_percentage_change( $previous_email_click, $email_click );
return array(
'text' => __( 'Emails Clicked', 'wp-marketing-automations' ),
/* translators: 1: Dynamic Text. */ 'previous_text' => sprintf( __( '- Previous %1$s', 'wp-marketing-automations' ), $this->get_frequency_text() ),
'count' => $email_click,
'previous_count' => $previous_email_click,
'percentage_change' => sprintf( '%s%%', round( $percentage_change, 2 ) ),
'percentage_change_positive' => $percentage_change >= 0,
);
}
/**
* Get total email open.
*
* @param array $engagement_sent The engagement sent data for the current date range.
* @param array $previous_engagement_sent The engagement sent data for the previous date range.
*
* @return array
*/
public function get_total_email_open( $engagement_open, $previous_engagement_open ) {
$email_open = isset( $engagement_open[0]['email_open'] ) ? $engagement_open[0]['email_open'] : 0;
$previous_email_open = isset( $previous_engagement_open[0]['email_open'] ) ? $previous_engagement_open[0]['email_open'] : 0;
// Calculate percentage change
$percentage_change = $this->get_percentage_change( $previous_email_open, $email_open );
return array(
'text' => __( 'Emails Opened', 'wp-marketing-automations' ),
/* translators: 1: Dynamic Text. */ 'previous_text' => sprintf( __( '- Previous %1$s', 'wp-marketing-automations' ), $this->get_frequency_text() ),
'count' => $email_open,
'previous_count' => $previous_engagement_open,
'percentage_change' => sprintf( '%s%%', round( $percentage_change, 2 ) ),
'percentage_change_positive' => $percentage_change >= 0,
);
}
/**
* Get total email sent.
*
* @param array $engagement_sent The engagement sent data for the current date range.
* @param array $previous_engagement_sent The engagement sent data for the previous date range.
*
* @return array
*/
public function get_total_email_sent( $engagement_sent, $previous_engagement_sent ) {
$email_sent = isset( $engagement_sent[0]['email_sents'] ) ? $engagement_sent[0]['email_sents'] : 0;
$previous_email_sent = isset( $previous_engagement_sent[0]['email_sents'] ) ? $previous_engagement_sent[0]['email_sents'] : 0;
// Calculate percentage change
$percentage_change = $this->get_percentage_change( $previous_email_sent, $email_sent );
return array(
'text' => __( 'Emails Sent', 'wp-marketing-automations' ),
/* translators: 1: Dynamic Text. */ 'previous_text' => sprintf( __( '- Previous %1$s', 'wp-marketing-automations' ), $this->get_frequency_text() ),
'count' => $email_sent,
'previous_count' => $previous_email_sent,
'percentage_change' => sprintf( '%s%%', round( $percentage_change, 2 ) ),
'percentage_change_positive' => $percentage_change >= 0,
);
}
/**
* Get total sms sent.
*
* @param array $engagement_sent The engagement sent data for the current date range.
* @param array $previous_engagement_sent The engagement sent data for the previous date range.
*
* @return array
*/
public function get_total_sms_sent( $engagement_sent, $previous_engagement_sent ) {
$sms_sent = isset( $engagement_sent[0]['sms_sent'] ) ? $engagement_sent[0]['sms_sent'] : 0;
$previous_sms_sent = isset( $previous_engagement_sent[0]['sms_sent'] ) ? $previous_engagement_sent[0]['sms_sent'] : 0;
// Calculate percentage change
$percentage_change = $this->get_percentage_change( $previous_sms_sent, $sms_sent );
return array(
'text' => __( 'SMS Sent', 'wp-marketing-automations' ),
/* translators: 1: Dynamic Text. */ 'previous_text' => sprintf( __( '- Previous %1$s', 'wp-marketing-automations' ), $this->get_frequency_text() ),
'count' => $sms_sent,
'previous_count' => $previous_sms_sent,
'percentage_change' => sprintf( '%s%%', round( $percentage_change, 2 ) ),
'percentage_change_positive' => $percentage_change >= 0,
);
}
/**
* Get total carts.
*
* @return array
*/
private function get_total_carts() {
require_once BWFAN_PLUGIN_DIR . '/includes/class-bwfan-cart-analytics.php';
$captured_cart = BWFAN_Cart_Analytics::get_captured_cart( $this->date_params['from_date'], $this->date_params['to_date'] );
$previous_captured_cart = BWFAN_Cart_Analytics::get_captured_cart( $this->date_params['from_date_previous'], $this->date_params['to_date_previous'] );
$recovered_cart = BWFAN_Cart_Analytics::get_recovered_cart( $this->date_params['from_date'], $this->date_params['to_date'] );
$previous_recovered_cart = BWFAN_Cart_Analytics::get_recovered_cart( $this->date_params['from_date_previous'], $this->date_params['to_date_previous'] );
$recovered_count = isset( $recovered_cart[0]['count'] ) ? $recovered_cart[0]['count'] : 0;
$previous_recovered_count = isset( $previous_recovered_cart[0]['count'] ) ? $previous_recovered_cart[0]['count'] : 0;
// Calculate percentage change
$recovered_percentage_change = $this->get_percentage_change( $previous_recovered_count, $recovered_count );
$count = isset( $captured_cart[0]['count'] ) ? $captured_cart[0]['count'] : 0;
$previous_count = isset( $previous_captured_cart[0]['count'] ) ? $previous_captured_cart[0]['count'] : 0;
// Calculate percentage change
$percentage_change = $this->get_percentage_change( $previous_count, $count );
return array(
array(
'text' => __( 'Carts Captured', 'wp-marketing-automations' ),
/* translators: 1: Dynamic Text. */ 'previous_text' => sprintf( __( '- Previous %1$s', 'wp-marketing-automations' ), $this->get_frequency_text() ),
'count' => $count,
'previous_count' => $previous_count,
'percentage_change' => sprintf( '%s%%', round( $percentage_change, 2 ) ),
'percentage_change_positive' => $percentage_change >= 0,
),
array(
'text' => __( 'Carts Recovered', 'wp-marketing-automations' ),
/* translators: 1: Dynamic Text. */ 'previous_text' => sprintf( __( '- Previous %1$s', 'wp-marketing-automations' ), $this->get_frequency_text() ),
'count' => $recovered_count,
'previous_count' => $previous_recovered_count,
'percentage_change' => sprintf( '%s%%', round( $recovered_percentage_change, 2 ) ),
'percentage_change_positive' => $recovered_percentage_change >= 0,
),
);
}
/**
* Get conversions.
*
* @return array
*/
public function get_conversions() {
$total_orders = BWFAN_Dashboards::get_total_orders( $this->date_params['from_date'], $this->date_params['to_date'], '', '' );
$previous_total_orders = BWFAN_Dashboards::get_total_orders( $this->date_params['from_date_previous'], $this->date_params['to_date_previous'], '', '' );
return array(
'total_orders' => $this->get_total_orders( $total_orders, $previous_total_orders ),
'total_revenue' => $this->get_total_revenue( $total_orders, $previous_total_orders ),
);
}
/**
* Get total orders.
*
* @param array $total_orders The total orders data for the current date range.
* @param array $previous_total_orders The total orders data for the previous date range.
*
* @return array
*/
public function get_total_orders( $total_orders, $previous_total_orders ) {
$total_orders = isset( $total_orders[0]['total_orders'] ) ? $total_orders[0]['total_orders'] : 0;
$previous_total_orders = isset( $previous_total_orders[0]['total_orders'] ) ? $previous_total_orders[0]['total_orders'] : 0;
// Calculate percentage change
$percentage_change = $this->get_percentage_change( $previous_total_orders, $total_orders );
return array(
'text' => __( 'Total Orders', 'wp-marketing-automations' ),
/* translators: 1: Dynamic Text. */ 'previous_text' => sprintf( __( '- Previous %1$s', 'wp-marketing-automations' ), $this->get_frequency_text() ),
'count' => $total_orders,
'previous_count' => $previous_total_orders,
'percentage_change' => sprintf( '%s%%', round( $percentage_change, 2 ) ),
'percentage_change_positive' => $percentage_change >= 0,
);
}
/**
* Get total revenue.
*
* @param array $total_orders The total orders data for the current date range.
* @param array $previous_total_orders The total orders data for the previous date range.
*
* @return array
*/
public function get_total_revenue( $total_orders, $previous_total_orders ) {
$total_revenue = isset( $total_orders[0]['total_revenue'] ) ? $total_orders[0]['total_revenue'] : 0;
$previous_total_revenue = isset( $previous_total_orders[0]['total_revenue'] ) ? $previous_total_orders[0]['total_revenue'] : 0;
// Calculate percentage change
$percentage_change = $this->get_percentage_change( $previous_total_revenue, $total_revenue );
return array(
'text' => __( 'Total Revenue', 'wp-marketing-automations' ),
/* translators: 1: Dynamic Text. */ 'previous_text' => sprintf( __( '- Previous %1$s', 'wp-marketing-automations' ), $this->get_frequency_text() ),
'count_suffix' => function_exists( 'get_woocommerce_currency' ) ? get_woocommerce_currency() : __( 'USD', 'wp-marketing-automations' ),
'count' => round( $total_revenue, 2 ),
'previous_count' => $previous_total_revenue,
'percentage_change' => sprintf( '%s%%', round( $percentage_change, 2 ) ),
'percentage_change_positive' => $percentage_change >= 0,
);
}
/**
* Check if email has data and ready to go
*
* @return bool
*/
public function is_valid() {
$is_valid = false;
foreach ( $this->data['metrics'] as $metric ) {
if ( floatval( $metric['count'] ) > 0 ) {
$is_valid = true;
break;
}
}
return $is_valid;
}
protected function get_frequency_text( $capitalized = false ) {
if ( 'daily' === $this->frequency ) {
return $capitalized ? __( 'Day', 'wp-marketing-automations' ) : __( 'day', 'wp-marketing-automations' );
}
if ( 'monthly' === $this->frequency ) {
return $capitalized ? __( 'Month', 'wp-marketing-automations' ) : __( 'month', 'wp-marketing-automations' );
}
return $capitalized ? __( 'Week', 'wp-marketing-automations' ) : __( 'week', 'wp-marketing-automations' );
}
}