Test Failed
Push — master ( cd44a0...d8bbfb )
by Devin
01:14
created

Give_Tools_Recount_Income::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 3
nc 1
nop 1
dl 0
loc 5
rs 9.4285
c 0
b 0
f 0
1
<?php
2
/**
3
 * Recount earnings
4
 *
5
 * This class handles batch processing of recounting earnings
6
 *
7
 * @subpackage  Admin/Tools/Give_Tools_Recount_Income
8
 * @copyright   Copyright (c) 2016, WordImpress
9
 * @license     https://opensource.org/licenses/gpl-license GNU Public License
10
 * @since       1.5
11
 */
12
13
// Exit if accessed directly.
14
if ( ! defined( 'ABSPATH' ) ) {
15
	exit;
16
}
17
18
/**
19
 * Give_Tools_Recount_Income Class
20
 *
21
 * @since 1.5
22
 */
23
class Give_Tools_Recount_Income extends Give_Batch_Export {
24
25
	/**
26
	 * Our export type. Used for export-type specific filters/actions
27
	 * @var string
28
	 * @since 1.5
29
	 */
30
	public $export_type = '';
31
32
	/**
33
	 * Allows for a non-form batch processing to be run.
34
	 * @since  1.5
35
	 * @var boolean
36
	 */
37
	public $is_void = true;
38
39
	/**
40
	 * Sets the number of items to pull on each step
41
	 * @since  1.5
42
	 * @var integer
43
	 */
44
	public $per_step = 100;
45
46
	/**
47
	 * Constructor.
48
	 */
49
	public function __construct( $_step = 1 ) {
50
		parent::__construct( $_step );
51
52
		$this->is_writable = true;
53
	}
54
	/**
55
	 * Get the Export Data
56
	 *
57
	 * @access public
58
	 * @since 1.5
59
	 *
60
	 * @return bool
61
	 */
62
	public function get_data() {
63
64
		if ( $this->step == 1 ) {
0 ignored issues
show
introduced by
Found "== 1". Use Yoda Condition checks, you must
Loading history...
65
			$this->delete_data( 'give_temp_recount_earnings' );
66
		}
67
68
		$total = get_option( 'give_temp_recount_earnings', false );
69
70
		if ( false === $total ) {
71
			$total = (float) 0;
72
			$this->store_data( 'give_temp_recount_earnings', $total );
73
		}
74
75
		$accepted_statuses = apply_filters( 'give_recount_accepted_statuses', array( 'publish' ) );
76
77
		$args = apply_filters( 'give_recount_earnings_args', array(
78
			'number' => $this->per_step,
79
			'page'   => $this->step,
80
			'status' => $accepted_statuses,
81
			'fields' => 'ids'
0 ignored issues
show
introduced by
Each line in an array declaration must end in a comma
Loading history...
82
		) );
83
84
		$payments = give_get_payments( $args );
85
86
		if ( ! empty( $payments ) ) {
87
88
			foreach ( $payments as $payment ) {
89
90
				$total += (float) give_donation_amount( $payment, array( 'type' => 'stats' ) );
91
92
			}
93
94
			if ( $total < 0 ) {
95
				$totals = 0;
0 ignored issues
show
Unused Code introduced by
$totals is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
96
			}
97
98
			$total = round( $total, give_get_price_decimals() );
99
100
			$this->store_data( 'give_temp_recount_earnings', $total );
101
102
			return true;
103
104
		}
105
106
		update_option( 'give_earnings_total', $total );
107
108
		return false;
109
110
	}
111
112
	/**
113
	 * Return the calculated completion percentage
114
	 *
115
	 * @since 1.5
116
	 * @return int
117
	 */
118
	public function get_percentage_complete() {
119
120
		$total = $this->get_stored_data( 'give_recount_earnings_total' );
121
122
		if ( false === $total ) {
123
			$args = apply_filters( 'give_recount_earnings_total_args', array() );
124
125
			$counts = give_count_payments( $args );
126
			$total  = absint( $counts->publish );
127
			$total  = apply_filters( 'give_recount_store_earnings_total', $total );
128
129
			$this->store_data( 'give_recount_earnings_total', $total );
130
		}
131
132
		$percentage = 100;
133
134
		if ( $total > 0 ) {
135
			$percentage = ( ( $this->per_step * $this->step ) / $total ) * 100;
136
		}
137
138
		if ( $percentage > 100 ) {
139
			$percentage = 100;
140
		}
141
142
		return $percentage;
143
	}
144
145
	/**
146
	 * Set the properties specific to the payments export
147
	 *
148
	 * @since 1.5
149
	 *
150
	 * @param array $request The Form Data passed into the batch processing
151
	 */
152
	public function set_properties( $request ) {
153
	}
154
155
	/**
156
	 * Process a step
157
	 *
158
	 * @since 1.5
159
	 * @return bool
160
	 */
161
	public function process_step() {
162
163
		if ( ! $this->can_export() ) {
164
			wp_die( esc_html__( 'You do not have permission to recount stats.', 'give' ), esc_html__( 'Error', 'give' ), array( 'response' => 403 ) );
165
		}
166
167
		$had_data = $this->get_data();
168
169
		if ( $had_data ) {
170
			$this->done = false;
171
172
			return true;
173
		} else {
174
			$this->delete_data( 'give_recount_earnings_total' );
175
			$this->delete_data( 'give_temp_recount_earnings' );
176
			$this->done    = true;
177
			$this->message = esc_html__( 'Income stats have been successfully recounted.', 'give' );
178
179
			return false;
180
		}
181
	}
182
183
	/**
184
	 * Headers.
185
	 */
186
	public function headers() {
187
		give_ignore_user_abort();
188
	}
189
190
	/**
191
	 * Perform the export
192
	 *
193
	 * @access public
194
	 * @since 1.5
195
	 * @return void
196
	 */
197
	public function export() {
198
199
		// Set headers
200
		$this->headers();
201
202
		give_die();
203
	}
204
205
	/**
206
	 * Given a key, get the information from the Database Directly
207
	 *
208
	 * @since  1.5
209
	 *
210
	 * @param  string $key The option_name
211
	 *
212
	 * @return mixed       Returns the data from the database
213
	 */
214 View Code Duplication
	private function get_stored_data( $key ) {
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
215
		global $wpdb;
216
		$value = $wpdb->get_var( $wpdb->prepare( "SELECT option_value FROM $wpdb->options WHERE option_name = '%s'", $key ) );
0 ignored issues
show
introduced by
Usage of a direct database call is discouraged.
Loading history...
introduced by
Usage of a direct database call without caching is prohibited. Use wp_cache_get / wp_cache_set.
Loading history...
217
218
		if ( empty( $value ) ) {
219
			return false;
220
		}
221
222
		$maybe_json = json_decode( $value );
223
		if ( ! is_null( $maybe_json ) ) {
224
			$value = json_decode( $value, true );
225
		}
226
227
		return $value;
228
	}
229
230
	/**
231
	 * Give a key, store the value
232
	 *
233
	 * @since  1.5
234
	 *
235
	 * @param  string $key The option_name
236
	 * @param  mixed $value The value to store
237
	 *
238
	 * @return void
239
	 */
240 View Code Duplication
	private function store_data( $key, $value ) {
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
241
		global $wpdb;
242
243
		$value = is_array( $value ) ? wp_json_encode( $value ) : esc_attr( $value );
244
245
		$data = array(
246
			'option_name'  => $key,
247
			'option_value' => $value,
248
			'autoload'     => 'no',
249
		);
250
251
		$formats = array(
252
			'%s',
253
			'%s',
254
			'%s',
255
		);
256
257
		$wpdb->replace( $wpdb->options, $data, $formats );
0 ignored issues
show
introduced by
Usage of a direct database call is discouraged.
Loading history...
258
	}
259
260
	/**
261
	 * Delete an option
262
	 *
263
	 * @since  1.5
264
	 *
265
	 * @param  string $key The option_name to delete
266
	 *
267
	 * @return void
268
	 */
269
	private function delete_data( $key ) {
270
		global $wpdb;
271
		$wpdb->delete( $wpdb->options, array( 'option_name' => $key ) );
272
	}
273
274
}
275