HEX
Server: nginx/1.24.0
System: Linux DGT-WORDPRESS-VM-SERVER 6.14.0-1014-azure #14~24.04.1-Ubuntu SMP Fri Oct 3 20:52:11 UTC 2025 x86_64
User: ubuntu (1000)
PHP: 8.4.12
Disabled: NONE
Upload Files
File: /mnt/data/doccure-wp/wp-content/plugins/doccure/admin/partials/class-system-payout-listing.php
<?php
/**
 * page payouts listing
 *
 * This class defines all code necessary to run during the plugin's activation.
 *
 * @since      1.0.0
 * @package    Elevator
 * @subpackage doccure/includes
 * @author     Dreams Technologies<[email protected]>
 */
require doccureGlobalSettings::get_plugin_path() . 'libraries/dompdf/autoload.inc.php';
use Dompdf\Dompdf;
use Dompdf\Options;

if( !class_exists('Payouts_List') ){
	class Payouts_List extends WP_List_Table {

		public function __construct() {

			parent::__construct( [
				'singular' => esc_html__( 'Payout', 'doccure_core' ), 
				'plural'   => esc_html__( 'Payouts', 'doccure_core' ),
				'ajax'     => false 
			] );

		}

		/**
		 * Retrieve payouts data from the database
		 *
		 * @throws error
		 * @author Dreams Technologies<[email protected]>
		 * @return 
		 */
		public static function get_payouts( $per_page = 5, $page_number = 1 ) {

			global $wpdb;

			$sql = "SELECT * FROM {$wpdb->prefix}dc_payouts_history";

			if ( ! empty( $_REQUEST['orderby'] ) ) {
				$sql .= ' ORDER BY ' . esc_sql( $_REQUEST['orderby'] );
				$sql .= ! empty( $_REQUEST['order'] ) ? ' ' . esc_sql( $_REQUEST['order'] ) : ' DESC';
			}
			
			if ( empty( $_REQUEST['orderby'] ) ) {
				$sql .= ' ORDER BY id DESC';
			}
			if( ! empty( $_REQUEST['s'] ) ){
				$search = esc_sql( $_REQUEST['s'] );
				$sql .= " WHERE card LIKE '%{$search}%'";
			}
			$sql .= " LIMIT $per_page";
			$sql .= ' OFFSET ' . ( $page_number - 1 ) * $per_page;


			$result = $wpdb->get_results( $sql, 'ARRAY_A' );

			return $result;
		}

		/**
		 * Delete Payout
		 *
		 * @throws error
		 * @author Dreams Technologies<[email protected]>
		 * @return 
		 */
		public static function delete_payouts( $id ) {
		  global $wpdb;
		  $wpdb->delete(
			"{$wpdb->prefix}dc_payouts_history",
			[ 'id' => $id ],
			[ '%d' ]
		  );
		}

		/**
		 * Change Payout Status
		 *
		 * @throws error
		 * @author Dreams Technologies<[email protected]>
		 * @return 
		 */
		public static function change_staus_payouts( $id ,$status) {
		  global $wpdb;
			if( !empty( $id ) && !empty( $status ) ) {
				$data		= array('status'	=> $status );
				$where		= array('id'		=> $id );
				$updated 	= $wpdb->update( "{$wpdb->prefix}dc_payouts_history", $data, $where );
			}
		}

		/**
		 * Returns the count of records in the database.
		 *
		 * @throws error
		 * @author Dreams Technologies<[email protected]>
		 * @return 
		 */
		public static function record_count() {
			global $wpdb;

			$sql = "SELECT COUNT(*) FROM {$wpdb->prefix}dc_payouts_history";

			return $wpdb->get_var( $sql );
		}

		/**
		 * Text displayed when no Payouts data is available
		 *
		 * @throws error
		 * @author Dreams Technologies<[email protected]>
		 * @return 
		 */
		public function no_items() {
			esc_html_e( 'No Payouts avaliable.', 'doccure_core' );
		}

		/**
		 * Render a column when no column specific method exist.
		 *
		 * @throws error
		 * @author Dreams Technologies<[email protected]>
		 * @return 
		 */
		public function column_default( $item, $column_name ) {
			$date_formate	= get_option('date_format');		
			$payrols 	= '';

			if( function_exists('doccure_get_payouts_lists') ){
				$payrols	= doccure_get_payouts_lists();
			}

			switch ( $column_name ) {
				case 'user_id':
					$user_name	= doccure_get_username($item[ $column_name ]);
					// create a nonce
					$delete_nonce = wp_create_nonce( 'sp_delete_payout' );
					$title = esc_html__( 'Delete', 'doccure_core' );


					$actions = [
						'delete' => sprintf( '<a href="?post_type=doctors&page=%s&action=%s&payout=%s&_wpnonce=%s">'.$title.'</a>', esc_attr( $_REQUEST['page'] ), 'delete', absint( $item['id'] ), $delete_nonce )
					];

					return $user_name . $this->row_actions( $actions );
				case 'amount':
					return doccure_price_format($item[ $column_name ]);
				case 'payment_method':
					$payrols = !empty( $payrols[$item[ $column_name ]]['title'] ) ? $payrols[$item[ $column_name ]]['title'] : '';
					return $payrols;

					case 'paypal_email':
						//print_r($item);
						$payment_details_get ='';
						 if($item[ 'payment_details' ] !='') { 
							$payment_details_bank = $item[ 'payment_details' ];
							$payment_details_array = unserialize($payment_details_bank);

							$payment_details_get = "Bank Account Name: " . ($payment_details_array['bank_account_name'] ?? 'N/A') . "<br>";
 							$payment_details_get .= "Bank Name: " . ($payment_details_array['bank_name'] ?? 'N/A') . "<br>";
							$payment_details_get .= "Bank Routing Number: " . ($payment_details_array['bank_routing_number'] ?? 'N/A') . "<br>";
							$payment_details_get .= "Bank IBAN: " . ($payment_details_array['bank_iban'] ?? 'N/A') . "<br>";
							$payment_details_get .= "Bank BIC/SWIFT: " . ($payment_details_array['bank_bic_swift'] ?? 'N/A');

							
						 } else {
							$payment_details_get = $item[ 'paypal_email' ];
						 }
 						$payment_details = $payment_details_get;
 						return $payment_details;
						
				case 'processed_date':
					return date($date_formate,strtotime($item[ $column_name ]));
				case 'status':
					$status_nonce = wp_create_nonce( 'sp_delete_payout' );
					$status	= !empty( $item[ $column_name ]) ? ($item[ $column_name ] === 'completed') ? 'inprogress' : 'completed' : '';
					$actions = [
						'change_status' => sprintf( '<a href="?post_type=doctors&page=%s&action=%s&payout=%s&status=%s&_wpnonce=%s">'.ucwords($status).'</a>', esc_attr( $_REQUEST['page'] ), 'change_status', absint( $item['id'] ),$status, $status_nonce )
					];
					return ucwords($item[ $column_name ]).$this->row_actions( $actions );
			}
		}

		/**
		 * Associative array of columns
		 *
		 * @throws error
		 * @author Dreams Technologies<[email protected]>
		 * @return 
		 */
		function get_columns() {
			$columns = array(
				'user_id' 			=> esc_html__( 'User Name', 'doccure_core' ),
				'amount'    		=> esc_html__( 'Amount', 'doccure_core' ),
				'payment_method'    => esc_html__( 'Payment Method', 'doccure_core' ),
				'paypal_email'    => esc_html__( 'Payout Details	', 'doccure_core' ),
				'processed_date'    => esc_html__( 'Processing Date', 'doccure_core' ),
				'status'   			=> esc_html__( 'Status', 'doccure_core' ),
			);

			return $columns;
		}

		/**
		 * Sortable
		 *
		 * @throws error
		 * @author Dreams Technologies<[email protected]>
		 * @return 
		 */
		public function get_sortable_columns() {
			$sortable_columns = array(
				'user_id' 			=> array( 'user_id', true ),
				'processed_date' 	=> array( 'processed_date', false ),
				'amount' 			=> array( 'amount', false )
			);

			return $sortable_columns;
		}

		/**
		 * Download PDF
		 *
		 * @throws error
		 * @author Dreams Technologies<[email protected]>
		 * @return 
		 */
		// public function download_pdf($start_date='',$end_date='') {
		// 	global $wpdb;

		// 	ob_clean();
		// 	ob_flush();
		// 	$sql = "SELECT * FROM {$wpdb->prefix}dc_payouts_history";
		// 	if( !empty( $start_date ) || !empty( $end_date ) ) {
		// 		$date	= date('Y-m-d');
		// 		if(!empty($start_date) && !empty($end_date)){
		// 			$sql   .= " WHERE DATE(processed_date) BETWEEN '".$start_date."' AND '".$end_date."'";
		// 			$date	= $start_date;
		// 		} else if(!empty($start_date) ){
		// 			$sql .= " WHERE	DATE(processed_date) BETWEEN '".$start_date."' AND '".$start_date."'";
		// 			$date	= $start_date;
		// 		} else if(!empty($end_date) ){
		// 			$sql .= " WHERE DATE(processed_date) BETWEEN '".$end_date."' AND '".$end_date."'";
		// 			$date	= $end_date;
		// 		}

		// 		$results 	= $wpdb->get_results( $sql, 'ARRAY_A' );
		// 		$pdf_html = '';
		// 		$dompdf = new Dompdf();
		// 		$pdf_html .= $this->renderheader($date);
		// 		$pdf_html .= $this->renderPdfHtml($results);
		// 		$pdf_html .= $this->renderFooter();
		// 		$dompdf->set_option('isHtml5ParserEnabled', true);
		// 		$dompdf->loadHtml($pdf_html);
		// 		$dompdf->setPaper('A4', 'portrait');
		// 		$dompdf->render();
		// 		$dompdf->stream($date."-payouts".".pdf");
		// 	}

		// }
		 
		// public function download_pdf($start_date = '', $end_date = '') {
		// 	global $wpdb;
		
		// 	// Prevent extra output
		// 	if (ob_get_length()) {
		// 		ob_end_clean();
		// 	}
		
		// 	ob_start();
		
		// 	// Prepare SQL Query
		// 	$sql = "SELECT * FROM {$wpdb->prefix}dc_payouts_history";
		// 	$params = [];
		
		// 	if (!empty($start_date) || !empty($end_date)) {
		// 		if (!empty($start_date) && !empty($end_date)) {
		// 			$sql .= " WHERE DATE(processed_date) BETWEEN %s AND %s";
		// 			$params = [$start_date, $end_date];
		// 		} elseif (!empty($start_date)) {
		// 			$sql .= " WHERE DATE(processed_date) = %s";
		// 			$params = [$start_date];
		// 		} elseif (!empty($end_date)) {
		// 			$sql .= " WHERE DATE(processed_date) = %s";
		// 			$params = [$end_date];
		// 		}
		// 	}
		
		// 	if (!empty($params)) {
		// 		$results = $wpdb->get_results($wpdb->prepare($sql, $params), 'ARRAY_A');
		// 	} else {
		// 		$results = $wpdb->get_results($sql, 'ARRAY_A');
		// 	}
		
		// 	// Generate HTML for PDF
		// 	$pdf_html = '';
		// 	$pdf_html .= $this->renderHeader($start_date);
		// 	$pdf_html .= $this->renderPdfHtml($results);
		// 	$pdf_html .= $this->renderFooter();
		
		// 	// Configure Dompdf
		// 	$options = new Options();
		// 	$options->set('defaultFont', 'DejaVu Sans'); // Unicode compatibility
		// 	$options->set('isHtml5ParserEnabled', true);
		// 	$options->set('isRemoteEnabled', true); // Enable images
		
		// 	$dompdf = new Dompdf($options);
		// 	$dompdf->loadHtml(mb_convert_encoding($pdf_html, 'HTML-ENTITIES', 'UTF-8'));
		// 	$dompdf->setPaper('A4', 'portrait');
		// 	$dompdf->render();
		
		// 	// Clear the output buffer and stream the PDF
		// 	ob_end_clean();
		// 	$dompdf->stream($start_date . "-payouts.pdf", ["Attachment" => false]);
		// 	// $pdf_filename = "payouts-report.pdf";
		// 	// file_put_contents($pdf_filename, $dompdf->output());
			
		// 	// echo "<script>window.open('$pdf_filename', '_blank');</script>";
			
		// 	exit; // Ensure script stops execution
		// }
		

	public function download_pdf($start_date = '', $end_date = '') {
			global $wpdb;
		
			// Prevent extra output
			if (ob_get_length()) {
				ob_end_clean();
			}
		
			ob_start();
		
			// Prepare SQL Query
			$sql = "SELECT * FROM {$wpdb->prefix}dc_payouts_history";
			$params = [];
		
			if (!empty($start_date) || !empty($end_date)) {
				if (!empty($start_date) && !empty($end_date)) {
					$sql .= " WHERE DATE(processed_date) BETWEEN %s AND %s";
					$params = [$start_date, $end_date];
				} elseif (!empty($start_date)) {
					$sql .= " WHERE DATE(processed_date) = %s";
					$params = [$start_date];
				} elseif (!empty($end_date)) {
					$sql .= " WHERE DATE(processed_date) = %s";
					$params = [$end_date];
				}
			}
		
			if (!empty($params)) {
				$results = $wpdb->get_results($wpdb->prepare($sql, $params), 'ARRAY_A');
			} else {
				$results = $wpdb->get_results($sql, 'ARRAY_A');
			}
		
			// Generate HTML for PDF
			$pdf_html = '';
			$pdf_html .= $this->renderHeader($start_date);
			$pdf_html .= $this->renderPdfHtml($results);
			$pdf_html .= $this->renderFooter();
		
			// Configure Dompdf
			$options = new Options();
			$options->set('defaultFont', 'DejaVu Sans'); // Unicode compatibility
			$options->set('isHtml5ParserEnabled', true);
			$options->set('isRemoteEnabled', true); // Enable images
		
			$dompdf = new Dompdf($options);
			$dompdf->loadHtml(mb_convert_encoding($pdf_html, 'HTML-ENTITIES', 'UTF-8'));
			$dompdf->setPaper('A4', 'portrait');
			$dompdf->render();
		
			// Clear the output buffer and stream the PDF
			ob_end_clean();
			$dompdf->stream($start_date . "-payouts.pdf", ["Attachment" => false]);
			// $pdf_filename = "payouts-report.pdf";
			// file_put_contents($pdf_filename, $dompdf->output());
			// echo "<script>window.open('$pdf_filename', '_blank');</script>";
			
			exit; // Ensure script stops execution
		}
		



		/**
		 * Render header
		 *
		 * @throws error
		 * @author Dreams Technologies<[email protected]>
		 * @return 
		 */
		public function renderheader($date){
			$border_image = get_template_directory() . '/images/border.jpg';
			$html = '<html>
			<head>
				<style>
					@page {
						margin: 20px 0px 50px 0px;
					}
						
		      @page:first {
                   margin-top: 0;
                 }
					header {
						position: running(pageHeader);
						top: 0;
						left: 0px;
						right: 0px;
						height: 50px;
						font-family: sans-serif;
						background: url('.$border_image.');
						background-size:1px;
						background-size: 100% 2px;
						background-repeat: no-repeat;
					}
		
					footer {
						position: fixed; 
						bottom: -60px; 
						left: 0px; 
						right: 0px;
						height: 50px; 
					}
					table { border-collapse: collapse; }
				</style>
			</head>
			<body style="font-family: sans-serif;">
				<header>
				<div style="width:100%; display: inline-block; text-align:center; font-family: sans-serif;">
					<table style="width:96%; margin:80px auto 0;">
						<tr style="text-align:left;">
							<td width="70%">
								<h1 style="font-size: 26px;line-height: 26px;margin: 0 0 10px; font-weight: 500; color: #3d4461;">'.esc_html__('Payout','doccure_core').'</h1>
								<span style="font-size:16px;line-height: 20px;display: block; color: #3d4461;">'.esc_html__('Payout history starting from','doccure_core').' '.date('Y-m-d', strtotime($date) ).'</span>
								
							</td>
						</tr>
					</table>
				</div>
				</header>
		
				<footer style="border-top: 1px solid #eee; text-align: center;margin-top: 80px;padding: 20px 0;">
					<span style="display: block;font-size: 16px;color: #3d4461;line-height: 20px;">
						'.esc_html__('This is a computer generated payout slip','doccure_core').'
					</span>
				</footer>';
			return $html;
		}
		
		/**
		 * Render Footer
		 *
		 * @throws error
		 * @author Dreams Technologies<[email protected]>
		 * @return 
		 */
		public function renderFooter(){
			$html = '</body></html>';
			return $html;
		}
		
		/**
		 * Render table
		 *
		 * @throws error
		 * @author Dreams Technologies<[email protected]>
		 * @return 
		 */
		public function renderPdfHtml($results){
			$payrols_list_items	= doccure_get_payouts_lists();
			$html = '';
			$html .= '<main>
			<table style="width: 95%; margin: 150px auto 0;font-family: sans-serif;">';
				$html .= '<thead>
					<tr style="text-align: left; border-radius:5px 0 0;">
						<th style="width:5%; padding: 15px 20px;background: #f5f5f5; font-size:14px;">'.esc_html__('ID','doccure_core').'</th>
						<th style="width:15%; padding: 15px 20px;background: #f5f5f5; font-size:14px;">'.esc_html__('Name','doccure_core').'</th>
						<th style="width:10%; padding: 15px 20px;background: #f5f5f5; font-size:14px;">'.esc_html__('Amount','doccure_core').'</th>
						<th style="width:10%; padding: 15px 20px;background: #f5f5f5; font-size:14px;word-wrap:break-word;">'.esc_html__('Method','doccure_core').'</th>
						<th style="width:30%; padding: 15px 20px;background: #f5f5f5; font-size:14px;word-wrap:break-word;">'.esc_html__('Details','doccure_core').'</th>
						<th style="width:15%; padding: 15px 20px;background: #f5f5f5; font-size:14px;">'.esc_html__('Status','doccure_core').'</th>
					</tr>
				</thead>
				<tbody>';
			$counter	= 0;
			if( !empty( $results ) ){
				foreach($results as $result ) { 
					$counter++;
					$user_name 		 = '';
					$paymentdetails	 = '';
					
					if( function_exists('doccure_get_username') ){
						$user_name	= doccure_get_username($result['user_id']);
					}
					
					$amounts = '0.0';
					if( function_exists('doccure_price_format') ){
						$amounts	= doccure_price_format($result['amount'],'return');
					}

					$payrol_title 	= !empty( $payrols_list_items[$result['payment_method']]['title'] ) ? $payrols_list_items[$result['payment_method']]['title'] : '';

					if( !empty( $result['payment_method'] ) && $result['payment_method'] === 'paypal' ){
						$paymentdetails	.= $result['paypal_email'];
					} elseif( !empty( $result['payment_method'] ) && $result['payment_method'] === 'bacs' ){
						$payrols_list	= !empty( $payrols_list_items['bacs']['fields'] ) ? $payrols_list_items['bacs']['fields'] : array();
						$bank_detail	= !empty( $result['payment_details'] ) ? maybe_unserialize($result['payment_details']) : array();

						if( !empty( $payrols_list ) ){
							foreach( $payrols_list as $key => $pay ){
								if( !empty( $bank_detail[$key] ) ){
									$paymentdetails	.= '<span style="display: block;">'.$pay['placeholder'].': <em style="font-style: normal;">'.$bank_detail[$key].'</em></span>';
								}
							}
						}	
					}else{
						$payrols_list	= !empty( $payrols_list_items[$result['payment_method']]['fields'] ) ? $payrols_list_items[$result['payment_method']]['fields'] : array();
						$bank_detail	= !empty( $result['payment_details'] ) ? maybe_unserialize($result['payment_details']) : array();
						if( !empty( $payrols_list ) ){
							foreach( $payrols_list as $key => $pay ){
								
								if( !empty( $bank_detail[$key] ) ){
									$title	= !empty($pay['title']) ? $pay['title'] : $pay['placeholder'];
									$paymentdetails	.= '<span style="display: block;">'.$title.': <em style="font-style: normal;">'.$bank_detail[$key].'</em></span>';
								}
							}
						}	
					}

					$html .= '<tr>
								<td style="padding: 15px 20px; border-top: 1px solid #e2e2e2; font-size:14px;">'.$counter.'</td>
								<td style="padding: 15px 20px;border-top: 1px solid #e2e2e2; font-size:14px;">'.$user_name.'</td>
								<td style="padding: 15px 20px;border-top: 1px solid #e2e2e2; font-size:14px;">'.$amounts.'</td>
								<td style="padding: 15px 20px;border-top: 1px solid #e2e2e2; font-size:14px;">'.$payrol_title.'</td>
								<td style="padding: 15px 20px;border-top: 1px solid #e2e2e2;word-wrap:break-word; font-size:14px;">'.$paymentdetails.'</td>
								<td style="padding: 15px 20px;border-top: 1px solid #e2e2e2; font-size:14px;">'.$result['status'].'</td>
							 </tr>';
				}
			}
			
			$html .= '</tbody></table></main>';


			return $html;
		}

		/**
		 * Handles data query and filter, sorting, and pagination.
		 *
		 * @throws error
		 * @author Dreams Technologies<[email protected]>
		 * @return 
		 */
		public function prepare_items() {

			$this->_column_headers = $this->get_column_info();

			$per_page     = $this->get_items_per_page( 'payout_per_page', 20 );
			$current_page = $this->get_pagenum();
			$total_items  = self::record_count();
			$start_date	= !empty($_POST['start_date']) ? $_POST['start_date'] : '';
			$end_date	= !empty($_POST['end_date']) ? $_POST['end_date'] : '';

			if( !empty($start_date) || !empty($end_date)) {
				$this->download_pdf($start_date,$end_date);	
			}

			if( !empty( $_GET['action'] ) && !empty( $_GET['payout'] ) && $_GET['action'] === 'delete' ){
				//delete action
				self::delete_payouts($_GET['payout']);
			}

			if( !empty( $_GET['action'] ) && !empty( $_GET['payout'] ) && $_GET['action'] === 'change_status' ){
				//change status action
				self::change_staus_payouts($_GET['payout'],$_GET['status']);
			}

			$this->set_pagination_args( [
				'total_items' => $total_items, 
				'per_page'    => $per_page 
			] );

			$this->items = self::get_payouts( $per_page, $current_page );
		}
	}
}