38217-vm/wp-content/plugins/mainwp/modules/cost-tracker/widgets/widget-cost-tracker-payment-left-this-month.php
2026-02-05 17:08:59 +03:00

246 lines
9.5 KiB
PHP

<?php
/**
* MainWP Payment Left For This Month Widget
*
* Displays the Payment Left For This Month.
*
* @package MainWP/Dashboard
* @version 4.6
*/
namespace MainWP\Dashboard\Module\CostTracker;
use MainWP\Dashboard\MainWP_UI;
use MainWP\Dashboard\MainWP_Utility;
/**
* Class Cost_Tracker_Payment_Left_This_Month
*
* Displays the Payment Left For This Month.
*/
class Cost_Tracker_Payment_Left_This_Month {
/**
* Protected static variable to hold the single instance of the class.
*
* @var mixed Default null
*/
protected static $instance = null;
/**
* Return the single instance of the class.
*
* @return mixed $instance The single instance of the class.
*/
public static function instance() {
if ( is_null( static::$instance ) ) {
static::$instance = new self();
}
return static::$instance;
}
/**
* Handle render costs widget.
*/
public function render() {
$this->render_widget();
}
/**
* Render widget.
*/
public function render_widget() {
?>
<div class="mainwp-widget-header">
<h2 class="ui header handle-drag">
<?php esc_html_e( 'Payments Left For the Month', 'mainwp' ); ?>
<div class="sub header">
<?php esc_html_e( 'See upcoming costs left for this month.', 'mainwp' ); ?>
</div>
</h2>
</div>
<div class="mainwp-widget-insights-card">
<?php
/**
* Action: mainwp_module_cost_tracker_widget_top
*
* Fires at the top of the widget.
*
* @since 5.0.2
*/
do_action( 'mainwp_module_cost_tracker_widget_top', 'payment-left-for-this-month' );
?>
<div id="mainwp-message-zone" style="display:none;" class="ui message"></div>
<?php
$this->render_widget_content();
?>
<?php
/**
* Action: mainwp_module_cost_tracker_widget_bottom
*
* Fires at the bottom of the widget.
*
* @since 5.0.2
*/
do_action( 'mainwp_module_cost_tracker_widget_bottom', 'payment-left-for-this-month' );
?>
</div>
<div class="mainwp-widget-footer ui four columns stackable grid">
<div class="column">
</div>
<div class="column">
</div>
</div>
<?php
}
/**
* Get widget costs data.
*
* @param array $cost_data Cost data.
*/
public static function get_costs_widgets_data( $cost_data ) { // phpcs:ignore -- NOSONAR - complex.
$series_products_price = array();
$colors = array();
$series_data = array();
$product_colors = Cost_Tracker_Admin::get_product_colors();
$product_types = Cost_Tracker_Admin::get_product_types();
if ( is_array( $cost_data ) ) {
$current_time = time();
$upcoming1 = strtotime( gmdate( 'Y-m-01 00:00:00', $current_time ) );
$upcoming2 = strtotime( gmdate( 'Y-m-t 23:59:59', $current_time ) );
foreach ( $cost_data as $cost ) {
if ( ! isset( $series_data[ $cost->product_type ] ) ) {
$series_data[ $cost->product_type ] = array(
'name' => isset( $product_types[ $cost->product_type ] ) ? esc_js( $product_types[ $cost->product_type ] ) : 'N/A',
);
$colors[ $cost->product_type ] = isset( $product_colors[ $cost->product_type ] ) ? $product_colors[ $cost->product_type ] : '';
$series_products_price[ $cost->product_type ] = 0;
}
$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;
}
$series_products_price[ $cost->product_type ] += $next_price;
$next_rl = Cost_Tracker_Admin::get_next_renewal( $next_rl, $cost->renewal_type, false );
$next_price = 0;
}
}
}
$dec = Cost_Tracker_Utility::cost_tracker_format_price( 0, true, array( 'get_decimals' => true ) );
foreach ( $series_products_price as $product_type => $price ) {
$series_data[ $product_type ]['data'][] = round( $price, $dec );
}
$categories = array( gmdate( 'M' ) );
$cur_format = Cost_Tracker_Utility::cost_tracker_format_price( 0, true, array( 'get_currency_format' => true ) );
return array(
'series' => array_values( $series_data ),
'categories' => array_values( $categories ),
'colors' => array_values( $colors ),
'currency_format' => $cur_format['format'],
'decimals' => $cur_format['decimals'],
);
}
/**
* Method render_widget_content()
*/
public function render_widget_content() {
$costs_data = Cost_Tracker_DB::get_instance()->get_summary_data( array( 'sum_data' => 'all' ) );
$chart_data = static::get_costs_widgets_data( $costs_data );
?>
<div id="mainwp-module-cost-tracker-payment-left-for-this-month-wrapper"></div>
<script type="text/javascript">
jQuery( document ).ready( function() {
let cost_chart_colors = <?php echo wp_json_encode($chart_data['colors'], true ); //phpcs:ignore -- ok. ?>;
let cost_chart_currency_format = '<?php echo esc_js($chart_data['currency_format']); //phpcs:ignore -- ok. ?>';
let options = {
series: <?php echo wp_json_encode($chart_data['series'], true ); //phpcs:ignore -- ok. ?>,
chart: {
type: 'bar',
height: 350,
stacked: true,
},
plotOptions: {
bar: {
horizontal: true,
dataLabels: {
total: {
enabled: true,
offsetX: 0,
style: {
fontSize: '13px',
fontWeight: 900
}
}
}
},
},
xaxis: {
categories: <?php echo wp_json_encode($chart_data['categories'], true ); //phpcs:ignore -- ok. ?>,
labels: {
formatter: function (value) {
return isNaN(value) ? value : __(cost_chart_currency_format, value ); // to fix month name format.
},
style: {
colors: '#999999',
},
},
},
yaxis:{
type: 'string',
labels: {
formatter: function (value) {
return isNaN(value) ? value : __(cost_chart_currency_format, value ); // to fix month name format.
},
style: {
colors: '#999999',
},
},
},
fill: {
opacity: 1
},
legend: {
show: false
},
tooltip: {
theme: 'dark'
},
colors: [
function ( { value, seriesIndex, dataPointIndex, w } ) {
if (cost_chart_colors[seriesIndex] !== undefined) {
return cost_chart_colors[seriesIndex];
} else {
return "#5ec130";
}
}
],
};
let cost_chart = new ApexCharts(document.querySelector("#mainwp-module-cost-tracker-payment-left-for-this-month-wrapper"), options);
setTimeout(() => {
cost_chart.render();
}, 1000);
} );
</script>
<?php
}
}