kreamweb
5/17/2019 - 2:31 PM

Points and rewards - recalculation

<?php
if ( isset( $_GET['ywpar_fix_points8'] ) ) {

	add_action( 'init', 'start_the_script7' );
	function start_the_script7() {

		global $wpdb;
		$table_name = $wpdb->prefix . 'yith_ywpar_points_log';
		$limit      = 10;
		$users      = $wpdb->get_col( "select distinct point.user_id from $table_name as point WHERE NOT EXISTS (
              SELECT * FROM " . $wpdb->base_prefix . "usermeta as um 
               WHERE `meta_key` = '_ywpar_fixed1'
                AND um.user_id = point.user_id
            )  LIMIT $limit" );
	
		if ( $users ) {
			foreach ( $users as $user ) {
  
				error_log("==== UTENTE ".$user."=====");
				ywpar_recalculation( $user );
        error_log("==== END ".$user."=====");
        delete_user_meta( $user,'_ywpar_fixed8');
        delete_user_meta( $user,'_ywpar_fixed7');
      break;
			}

			
			wp_safe_redirect( add_query_arg( array( 'users_done' => count( $users ) ) ) );
			exit();
		}

	}

}


//New calculation
function ywpar_recalculation( $user_id ){
	global $wpdb;
	
	$table_name = $wpdb->prefix . 'yith_ywpar_points_log';

	update_user_meta( $user_id,'_ywpar_rewarded_points','');
	update_user_meta( $user_id,'_ywpar_used_points','');

	$q= $wpdb->prepare( "UPDATE $table_name set  cancelled =%s WHERE user_id = %d", '0000-00-00 00:00:00', $user_id  );
	$wpdb->query($q);
	
	$wpdb->query( "DELETE from $table_name  where action IN ('expired_points') and user_id={$user_id}" );

	$point_earned = array();
$status_earned = array( 'order_completed','reviews_exp','amount_spent_exp','registration_exp','order_refund','order_cancelled', 'admin_action', 'points_exp', 'num_of_orders_exp');
	$status_redeemed = array( 'redeemed_points', 'admin_action', 'order_refund', 'order_cancelled');
	$total_points = 0; //total user points
	$used_point  = 0;  //total used point
	$redeemed_points = 0; //total redeemed points

	$query = "SELECT * FROM $table_name as ywpar_points where user_id = $user_id";

	$res   = $wpdb->get_results( $query );

	if ( $res ) {
		foreach ( $res as $entry ) {

			if ( in_array( $entry->action, $status_earned ) &&  $entry->amount > 0 ) {
				
				$point_earned[ $entry->id ] = array(
					'amount'       => $entry->amount,
					'start_amount' => $entry->amount,
					'date_earning' => $entry->date_earning
				);
				$total_points               += $entry->amount;

				continue;
			}

			if ( in_array( $entry->action, $status_redeemed ) &&  $entry->amount < 0 ) {
				$redeemed_points += absint( $entry->amount );
				if ( $point_earned ) {
					$to_redeemed = absint( $entry->amount );
          error_log(print_r($point_earned,1));
					foreach ( $point_earned as $key => $row ) {

						if ( $to_redeemed == 0 ) {
							continue;
						}

						//check we have saturated this row
						if ( isset( $row['cancelled'] ) || $row['amount'] == 0 ) {
							continue;
						}

						//check expired
						if ( ywpar_are_expired( $row['date_earning'], $entry->date_earning ) ) {
							$total_points                      -= $row['amount'];
							$point_earned[ $key ]['cancelled'] = $entry->date_earning;
							$point_earned[ $key ]['expired']   = ywpar_get_expired_date( $row['date_earning'] );
							continue;
						}

						$difference = $row['amount'] - absint( $to_redeemed );
						if ( $difference <= 0 ) {
							//	error_log('usati tutti e '.$row['amount']);
							$point_earned[ $key ]['cancelled'] = $entry->date_earning;
							$used_point                        += $row['amount'];
							$point_earned[ $key ]['amount']    = 0;
							$total_points                      -= $row['amount'];
							$to_redeemed                       -= $row['amount'];
						} else {
							//error_log('usati solo '. $to_redeemed );
							$used_point                     += absint( $to_redeemed );
							$point_earned[ $key ]['amount'] = $difference;
							$total_points                   -= absint( $to_redeemed );
							$to_redeemed                    = 0;
            }
           

          } 
          error_log(print_r($point_earned,1));
            error_log('used_point: '. $used_point);
				}

			}

		}
	}

	if ( $point_earned ) {

		foreach ( $point_earned as $id => $row ) {

			if ( ! isset( $row['cancelled'] ) && ! isset( $row['expired'] ) ) {
				if ( ywpar_are_expired( $row['date_earning'], date( 'Y-m-d H:i:s' ) ) ) {
					$total_points                     -= $row['amount'];
					$row['cancelled'] = ywpar_get_expired_date( $row['date_earning'] );
					$row['expired']   = ywpar_get_expired_date( $row['date_earning'] );
				}
			}
      error_log(print_r($row,1));
			if ( isset( $row['cancelled'] ) && ! isset( $row['expired'] ) ) {
				$q = $wpdb->prepare( "UPDATE $table_name set cancelled=%s where id=%d", $row['cancelled'], $id );
				$wpdb->query( $q );
			}
			if ( isset( $row['expired'] ) ) {
				$q = $wpdb->prepare( "INSERT INTO $table_name (`user_id`, `action`, `order_id`, `amount`, `date_earning` , `cancelled` , `description` ) VALUES 
			( %d, 'expired_points', 0, %d, %s, '0000-00-00 00:00:00','recalculated expiration points')", $user_id, - $row['amount'], $row['expired'] );
			
				$wpdb->query( $q );
			 
				$q = $wpdb->prepare( "UPDATE $table_name set cancelled=%s where id=%d", $row['expired'], $id );
				$updated = $wpdb->query( $q );
				
			}
		}

	}

	error_log('_ywpar_used_points '.$used_point );
	error_log('_ywpar_rewarded_points '.$redeemed_points );
	error_log('_ywpar_user_total_points '.$total_points );
	update_user_meta( $user_id,'_ywpar_used_points',$used_point);
	update_user_meta( $user_id,'_ywpar_rewarded_points',$redeemed_points);
	update_user_meta( $user_id,'_ywpar_user_total_points',$total_points);
	update_user_meta( $user_id, '_ywpar_fixed1', 1 );
}

function ywpar_are_expired( $data_earning, $data_check ) {
	$is_expired = false;
	if ( get_option( 'ywpar_enable_expiration_point' ) ) {
		$num_days   = get_option( 'ywpar_days_before_expiration' );
		$date1      = new DateTime( $data_earning );
		$date2      = new DateTime( $data_check );
		$interval   = $date1->diff( $date2 );
		$is_expired = ( $interval->days >= $num_days );
	}

	return $is_expired;
}

function ywpar_get_expired_date( $data_earning ) {
	$expire_date = $data_earning;
	if ( get_option( 'ywpar_enable_expiration_point' ) ) {
		$num_days   = get_option( 'ywpar_days_before_expiration' );
		$date1      = new DateTime( $data_earning );
		$date1->modify('+'.$num_days.' days');
		$expire_date   = $date1->format('Y-m-d H:i:s');
	}

	return $expire_date;
}