403 lines
15 KiB
PHP
403 lines
15 KiB
PHP
<?php
|
|
/**
|
|
* MainWP Module Cost Tracker Hooks class.
|
|
*
|
|
* @package MainWP\Dashboard
|
|
* @version 4.6
|
|
*/
|
|
|
|
namespace MainWP\Dashboard\Module\CostTracker;
|
|
|
|
use MainWP\Dashboard\MainWP_DB_Client;
|
|
/**
|
|
* Class Cost_Tracker_Hooks
|
|
*/
|
|
class Cost_Tracker_Hooks {
|
|
|
|
/**
|
|
* Public static variable to hold the single instance of the class.
|
|
*
|
|
* @static
|
|
*
|
|
* @var mixed Default null
|
|
*/
|
|
public static $instance = null;
|
|
|
|
/**
|
|
* Public static variable to hold the clients costs.
|
|
*
|
|
* @var mixed Default null
|
|
*/
|
|
public $clients_costs = null;
|
|
|
|
/**
|
|
* Public static variable to hold the clients costs.
|
|
*
|
|
* @var mixed Default null
|
|
*/
|
|
public $clients_sites = null;
|
|
|
|
/**
|
|
* Public static variable to hold the clients costs.
|
|
*
|
|
* @var mixed Default null
|
|
*/
|
|
public $sites_costs = null;
|
|
|
|
/**
|
|
* Get Instance
|
|
*
|
|
* Creates public static instance.
|
|
*
|
|
* @static
|
|
*
|
|
* @return Cost_Tracker_Hooks
|
|
*/
|
|
public static function get_instance() {
|
|
if ( null === static::$instance ) {
|
|
static::$instance = new self();
|
|
}
|
|
return static::$instance;
|
|
}
|
|
|
|
/**
|
|
* Constructor
|
|
*
|
|
* Runs each time the class is called.
|
|
*/
|
|
public function __construct() {
|
|
}
|
|
|
|
/**
|
|
* Initiate Hooks
|
|
*
|
|
* Initiates hooks for the extension.
|
|
*/
|
|
public function init() {
|
|
add_filter( 'mainwp_widgets_screen_options', array( &$this, 'hook_widgets_screen_options' ), 10, 1 ); // for both client, site overview widgets.
|
|
add_filter( 'mainwp_header_actions_right', array( $this, 'hook_screen_options' ), 10, 2 );
|
|
add_action( 'mainwp_clientstable_prepared_items', array( &$this, 'hook_clientstable_prepared_items' ), 10, 2 );
|
|
add_filter( 'mainwp_clients_sitestable_getcolumns', array( &$this, 'hook_manage_clients_column' ), 10 );
|
|
add_filter( 'mainwp_clients_sitestable_item', array( &$this, 'hook_manage_clients_display_item' ), 10 );
|
|
add_filter( 'mainwp_sitestable_getcolumns', array( &$this, 'hook_manage_sites_column' ), 10 );
|
|
add_action( 'mainwp_sitestable_prepared_items', array( &$this, 'hook_sitestable_prepared_items' ), 10, 2 );
|
|
add_filter( 'mainwp_sitestable_item', array( &$this, 'hook_manage_sites_display_item' ), 10 );
|
|
|
|
add_filter( 'mainwp_clients_getmetaboxes', array( &$this, 'hook_get_client_page_metaboxes' ), 10, 1 );
|
|
add_filter( 'mainwp_clients_widgets_screen_options', array( &$this, 'hook_get_widgets_screen_options' ), 10, 1 );
|
|
|
|
add_filter( 'mainwp_getmetaboxes', array( &$this, 'hook_get_site_overview_page_metaboxes' ), 10, 2 );
|
|
}
|
|
|
|
/**
|
|
* Widgets screen options.
|
|
*
|
|
* @param array $input Input.
|
|
*
|
|
* @return array $input Input.
|
|
*/
|
|
public function hook_widgets_screen_options( $input ) {
|
|
$input['advanced-cost-tracker-widget'] = esc_html__( 'Cost Tracker', 'mainwp' );
|
|
return $input;
|
|
}
|
|
|
|
/**
|
|
* Method hook_screen_options()
|
|
*
|
|
* Create Screen Options button.
|
|
*
|
|
* @param mixed $input Screen options button HTML.
|
|
*
|
|
* @return mixed Screen sptions button.
|
|
*/
|
|
public function hook_screen_options( $input ) {
|
|
if ( isset( $_GET['page'] ) && 'ManageCostTracker' === $_GET['page'] ) { //phpcs:ignore WordPress.Security.NonceVerification.Recommended
|
|
$input .= '<a class="ui button basic icon" onclick="mainwp_module_cost_tracker_sites_screen_options(); return false;" data-inverted="" data-position="bottom right" href="#" target="_blank" data-tooltip="' . esc_html__( 'Page Settings', 'mainwp' ) . '"><i class="cog icon"></i></a>';
|
|
}
|
|
return $input;
|
|
}
|
|
|
|
|
|
/**
|
|
* Method hook_manage_clients_column().
|
|
*
|
|
* Handle hook to manage sites columns.
|
|
*
|
|
* @param array $columns sites table columns.
|
|
*
|
|
* @return array $columns columns.
|
|
*/
|
|
public function hook_manage_clients_column( $columns ) {
|
|
$columns['client-cost-tracker'] = '<span data-tooltip="30-Day cost forecast" data-position="left center" data-inverted="">' . __( 'Costs', 'mainwp' ) . '</span>';
|
|
return $columns;
|
|
}
|
|
|
|
/**
|
|
* Method hook_clientstable_prepared_items().
|
|
*
|
|
* Handle hook to prepared manage sites items.
|
|
*
|
|
* @param array $clients sites prepared.
|
|
* @param array $clients_ids sites ids prepared.
|
|
*/
|
|
public function hook_clientstable_prepared_items( $clients, $clients_ids ) {
|
|
unset( $clients );
|
|
if ( null === $this->clients_costs ) {
|
|
$this->clients_sites = array();
|
|
// get all sites of the $clients_ids.
|
|
$cls_sites = MainWP_DB_Client::instance()->get_websites_by_client_ids( $clients_ids );
|
|
if ( is_array( $cls_sites ) ) {
|
|
foreach ( $cls_sites as $cls_site ) {
|
|
if ( ! empty( $cls_site->client_id ) && ! isset( $this->clients_sites[ $cls_site->client_id ] ) ) {
|
|
$this->clients_sites[ $cls_site->client_id ] = array();
|
|
}
|
|
$this->clients_sites[ $cls_site->client_id ][] = $cls_site->id;
|
|
}
|
|
}
|
|
$this->clients_costs = Cost_Tracker_DB::get_instance()->get_all_cost_trackers_by_clients( $clients_ids, array( 'get_cost_sites' => true ) );
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Manage Sites Item
|
|
*
|
|
* Adds the custom column data in the Manage Sites and Monitoring tables.
|
|
*
|
|
* @param array $item Site comlumn data.
|
|
*
|
|
* @return array $item Site comlumn data.
|
|
*/
|
|
public function hook_manage_clients_display_item( $item ) { //phpcs:ignore -- NOSONAR - complex.
|
|
if ( ! is_array( $item ) || ! isset( $item['client_id'] ) ) {
|
|
return $item;
|
|
}
|
|
$client_id = $item['client_id'];
|
|
if ( ! isset( $item['client-cost-tracker'] ) ) {
|
|
|
|
$current_time = time();
|
|
$upcoming1 = strtotime( gmdate( 'Y-m-d 00:00:00', $current_time ) );
|
|
$upcoming2 = strtotime( '+1 month', $current_time );
|
|
|
|
$series_products_price = array();
|
|
$total_prices = 0;
|
|
|
|
// get all cost trackers of current client.
|
|
$client_costs = is_array( $this->clients_costs ) && isset( $this->clients_costs[ $client_id ] ) ? $this->clients_costs[ $client_id ] : array();
|
|
if ( is_array( $client_costs ) && ! empty( $this->clients_sites[ $client_id ] ) ) {
|
|
|
|
foreach ( $client_costs as $cost ) {
|
|
if ( 'active' !== $cost->cost_status || 'subscription' !== $cost->type ) {
|
|
continue;
|
|
}
|
|
|
|
$next_rl = $cost->next_renewal;
|
|
|
|
if ( $next_rl <= $upcoming1 ) {
|
|
$next_rl = Cost_Tracker_Admin::get_next_renewal( $upcoming1, $cost->renewal_type, false );
|
|
}
|
|
|
|
$next_price = 0;
|
|
while ( $next_rl <= $upcoming2 ) {
|
|
|
|
if ( $next_rl > $upcoming1 && $next_rl <= $upcoming2 ) {
|
|
$next_price = $cost->price;
|
|
}
|
|
|
|
$cost_val = 0;
|
|
|
|
if ( ! empty( $next_price ) && is_array( $cost->cost_sites_ids ) ) {
|
|
foreach ( $cost->cost_sites_ids as $ct_siteid ) {
|
|
// if site of cost tracker in the client's sites then calculate the site's cost/price.
|
|
if ( is_array( $this->clients_sites[ $client_id ] ) && in_array( $ct_siteid, $this->clients_sites[ $client_id ] ) ) {
|
|
if ( 'single_site' === $cost->license_type ) {
|
|
$cost_val += $cost->price;
|
|
} elseif ( 'multi_site' === $cost->license_type && ! empty( $cost->count_sites ) ) {
|
|
$cost_val += $cost->price / $cost->count_sites;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( ! empty( $cost_val ) ) {
|
|
if ( ! isset( $series_products_price[ $cost->id ] ) ) {
|
|
$series_products_price[ $cost->id ] = 0;
|
|
}
|
|
$series_products_price[ $cost->id ] += $cost_val;
|
|
$total_prices += $cost_val;
|
|
}
|
|
|
|
$next_rl = Cost_Tracker_Admin::get_next_renewal( $next_rl, $cost->renewal_type, false );
|
|
$next_price = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
$params = '';
|
|
$selected_ids = array_keys( $series_products_price );
|
|
if ( ! empty( $selected_ids ) ) {
|
|
$params = '&selected_ids=' . implode( ',', $selected_ids ) . '&client_id=' . intval( $client_id );
|
|
}
|
|
$item['client-cost-tracker'] = '<a class="ui mini basic grey button" href="admin.php?page=ManageCostTracker' . $params . '" ><i class="file invoice dollar icon"></i>' . Cost_Tracker_Utility::cost_tracker_format_price( $total_prices, true ) . '</a>';
|
|
|
|
}
|
|
return $item;
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
* Method hook_manage_sites_column().
|
|
*
|
|
* Handle hook to manage sites columns.
|
|
*
|
|
* @param array $columns sites table columns.
|
|
*
|
|
* @return array $columns columns.
|
|
*/
|
|
public function hook_manage_sites_column( $columns ) {
|
|
$columns['site-cost-tracker'] = '<span data-tooltip="30-Day cost forecast" data-position="left center" data-inverted="">' . __( 'Costs', 'mainwp' ) . '</span>';
|
|
return $columns;
|
|
}
|
|
|
|
|
|
/**
|
|
* Method hook_sitestable_prepared_items().
|
|
*
|
|
* Handle hook to prepared manage sites items.
|
|
*
|
|
* @param array $websites sites prepared.
|
|
* @param array $site_ids sites ids prepared.
|
|
*/
|
|
public function hook_sitestable_prepared_items( $websites, $site_ids ) {
|
|
unset( $websites );
|
|
if ( null === $this->sites_costs ) {
|
|
$this->sites_costs = Cost_Tracker_DB::get_instance()->get_all_cost_trackers_by_sites( $site_ids );
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Manage Sites Item
|
|
*
|
|
* Adds the custom column data in the Manage Sites and Monitoring tables.
|
|
*
|
|
* @param array $item Site comlumn data.
|
|
*
|
|
* @return array $item Site comlumn data.
|
|
*/
|
|
public function hook_manage_sites_display_item( $item ) { //phpcs:ignore -- NOSONAR - complex.
|
|
if ( ! is_array( $item ) || ! isset( $item['id'] ) ) {
|
|
return $item;
|
|
}
|
|
|
|
$item_id = $item['id'];
|
|
|
|
if ( ! isset( $item['site-cost-tracker'] ) ) {
|
|
|
|
$current_time = time();
|
|
$upcoming1 = strtotime( gmdate( 'Y-m-d 00:00:00', $current_time ) );
|
|
$upcoming2 = strtotime( '+1 month', $current_time );
|
|
|
|
$series_products_price = array();
|
|
$total_prices = 0;
|
|
$site_costs = is_array( $this->sites_costs ) && isset( $this->sites_costs[ $item_id ] ) ? $this->sites_costs[ $item_id ] : array();
|
|
if ( is_array( $site_costs ) ) {
|
|
foreach ( $site_costs as $cost ) {
|
|
if ( 'active' !== $cost->cost_status || 'subscription' !== $cost->type ) {
|
|
continue;
|
|
}
|
|
$next_rl = $cost->next_renewal;
|
|
if ( $next_rl <= $upcoming1 ) {
|
|
$next_rl = Cost_Tracker_Admin::get_next_renewal( $upcoming1, $cost->renewal_type, false );
|
|
}
|
|
$next_price = 0;
|
|
while ( $next_rl <= $upcoming2 ) {
|
|
if ( $next_rl > $upcoming1 && $next_rl <= $upcoming2 ) {
|
|
$next_price = $cost->price;
|
|
}
|
|
|
|
$price = 0;
|
|
if ( ! empty( $next_price ) ) {
|
|
if ( 'single_site' === $cost->license_type ) {
|
|
$price = $cost->price;
|
|
} elseif ( 'multi_site' === $cost->license_type && ! empty( $cost->count_sites ) ) {
|
|
$price = $cost->price / $cost->count_sites;
|
|
}
|
|
}
|
|
|
|
if ( ! empty( $price ) ) {
|
|
|
|
if ( ! isset( $series_products_price[ $cost->id ] ) ) {
|
|
$series_products_price[ $cost->id ] = 0;
|
|
}
|
|
|
|
$series_products_price[ $cost->id ] += $price;
|
|
$total_prices += $price;
|
|
}
|
|
|
|
$next_rl = Cost_Tracker_Admin::get_next_renewal( $next_rl, $cost->renewal_type, false );
|
|
$next_price = 0;
|
|
}
|
|
}
|
|
}
|
|
$params = '';
|
|
$selected_ids = array_keys( $series_products_price );
|
|
if ( ! empty( $selected_ids ) ) {
|
|
$params = '&selected_ids=' . implode( ',', $selected_ids ) . '&site_id=' . intval( $item_id );
|
|
}
|
|
$item['site-cost-tracker'] = '<a class="ui mini basic grey button" href="admin.php?page=ManageCostTracker' . $params . '" ><i class="file invoice dollar icon"></i>' . Cost_Tracker_Utility::cost_tracker_format_price( $total_prices, true ) . '</a>';
|
|
}
|
|
|
|
return $item;
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
* Widgets screen options.
|
|
*
|
|
* @param array $input Input.
|
|
*
|
|
* @return array $input Input.
|
|
*/
|
|
public function hook_get_widgets_screen_options( $input ) {
|
|
$input['advanced-cost-tracker-costs'] = __( 'Cost Tracker', 'mainwp' );
|
|
return $input;
|
|
}
|
|
|
|
|
|
/**
|
|
* Method hook_get_client_page_metaboxes().
|
|
*
|
|
* Hook Clients get metaboxes.
|
|
*
|
|
* @param array $widgets Client widgets.
|
|
*/
|
|
public function hook_get_client_page_metaboxes( $widgets ) {
|
|
$widgets[] = array(
|
|
'id' => 'cost-tracker-costs',
|
|
'callback' => array( Cost_Tracker_Clients_Widget::instance(), 'callback_render_costs_widget' ),
|
|
);
|
|
return $widgets;
|
|
}
|
|
|
|
/**
|
|
* Method hook_get_client_page_metaboxes().
|
|
*
|
|
* Hook Clients get metaboxes.
|
|
*
|
|
* @param array $widgets Client widgets.
|
|
* @param int $dashboard_siteid Site Id.
|
|
*
|
|
* @return array $widgets Widgets data.
|
|
*/
|
|
public function hook_get_site_overview_page_metaboxes( $widgets, $dashboard_siteid = 0 ) {
|
|
if ( ! empty( $dashboard_siteid ) ) {
|
|
$widgets[] = array(
|
|
'id' => 'cost-tracker-widget',
|
|
'callback' => array( Cost_Tracker_Sites_Widget::instance(), 'callback_render_costs_widget' ),
|
|
);
|
|
}
|
|
return $widgets;
|
|
}
|
|
}
|