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

Give_Tools_Delete_Test_Transactions   A

Complexity

Total Complexity 25

Size/Duplication

Total Lines 266
Duplicated Lines 23.68 %

Coupling/Cohesion

Components 1
Dependencies 3

Importance

Changes 0
Metric Value
dl 63
loc 266
rs 10
c 0
b 0
f 0
wmc 25
lcom 1
cbo 3

11 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 5 1
A get_data() 0 21 4
A get_percentage_complete() 0 17 3
A set_properties() 0 2 1
B process_step() 29 29 4
A headers() 0 3 1
A export() 0 7 1
B pre_fetch() 0 37 4
A get_stored_data() 15 15 3
A store_data() 19 19 2
A delete_data() 0 4 1

How to fix   Duplicated Code   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

1
<?php
2
/**
3
 * Delete Test Transactions
4
 *
5
 * This class handles batch processing of deleting test transactions
6
 *
7
 * @subpackage  Admin/Tools/Give_Tools_Delete_Test_Transactions
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_Delete_Test_Transactions Class
20
 *
21
 * @since 1.5
22
 */
23
class Give_Tools_Delete_Test_Transactions 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 = 30;
45
46
	/**
47
	 * Constructor.
48
	 */
49
	public function __construct( $_step = 1 ) {
50
		parent::__construct( $_step );
51
52
		$this->is_writable = true;
53
	}
54
55
	/**
56
	 * Get the Export Data
57
	 *
58
	 * @access public
59
	 * @since 1.5
60
	 * @global object $wpdb Used to query the database using the WordPress Database API
61
	 *
62
	 * @return array|bool $data The data for the CSV file
63
	 */
64
	public function get_data() {
65
		$items = $this->get_stored_data( 'give_temp_delete_test_ids' );
66
67
		if ( ! is_array( $items ) ) {
68
			return false;
69
		}
70
71
		$offset     = ( $this->step - 1 ) * $this->per_step;
72
		$step_items = array_slice( $items, $offset, $this->per_step );
73
		$meta_table = __give_v20_bc_table_details( 'payment' );
0 ignored issues
show
Unused Code introduced by
$meta_table 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...
74
75
		if ( $step_items ) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $step_items of type array is implicitly converted to a boolean; are you sure this is intended? If so, consider using ! empty($expr) instead to make it clear that you intend to check for an array without elements.

This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.

Consider making the comparison explicit by using empty(..) or ! empty(...) instead.

Loading history...
76
			foreach ( $step_items as $item ) {
77
				// Delete the main payment.
78
				give_delete_donation( absint( $item['id'] ) );
79
			}
80
			return true;
81
		}
82
83
		return false;
84
	}
85
86
	/**
87
	 * Return the calculated completion percentage
88
	 *
89
	 * @since 1.5
90
	 * @return int
91
	 */
92
	public function get_percentage_complete() {
93
94
		$items = $this->get_stored_data( 'give_temp_delete_test_ids', false );
0 ignored issues
show
Unused Code introduced by
The call to Give_Tools_Delete_Test_T...ions::get_stored_data() has too many arguments starting with false.

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress.

In this case you can add the @ignore PhpDoc annotation to the duplicate definition and it will be ignored.

Loading history...
95
		$total = count( $items );
96
97
		$percentage = 100;
98
99
		if ( $total > 0 ) {
100
			$percentage = ( ( $this->per_step * $this->step ) / $total ) * 100;
101
		}
102
103
		if ( $percentage > 100 ) {
104
			$percentage = 100;
105
		}
106
107
		return $percentage;
108
	}
109
110
	/**
111
	 * Set the properties specific to the payments export
112
	 *
113
	 * @since 1.5
114
	 *
115
	 * @param array $request The Form Data passed into the batch processing
116
	 */
117
	public function set_properties( $request ) {
118
	}
119
120
	/**
121
	 * Process a step
122
	 *
123
	 * @since 1.5
124
	 * @return bool
125
	 */
126 View Code Duplication
	public function process_step() {
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...
127
128
		if ( ! $this->can_export() ) {
129
			wp_die( __( 'You do not have permission to delete test transactions.', 'give' ), __( 'Error', 'give' ), array( 'response' => 403 ) );
130
		}
131
132
		$had_data = $this->get_data();
133
134
		if ( $had_data ) {
135
			$this->done = false;
136
137
			return true;
138
		} else {
139
			update_option( 'give_earnings_total', give_get_total_earnings( true ) );
140
			Give_Cache::delete( Give_Cache::get_key( 'give_estimated_monthly_stats' ) );
141
142
			$this->delete_data( 'give_temp_delete_test_ids' );
143
144
			// Reset the sequential order numbers
145
			if ( give_get_option( 'enable_sequential' ) ) {
146
				delete_option( 'give_last_payment_number' );
147
			}
148
149
			$this->done    = true;
150
			$this->message = __( 'Test transactions successfully deleted.', 'give' );
151
152
			return false;
153
		}
154
	}
155
156
	/**
157
	 * Headers
158
	 */
159
	public function headers() {
160
		give_ignore_user_abort();
161
	}
162
163
	/**
164
	 * Perform the export
165
	 *
166
	 * @access public
167
	 * @since 1.5
168
	 * @return void
169
	 */
170
	public function export() {
171
172
		// Set headers
173
		$this->headers();
174
175
		give_die();
176
	}
177
178
	/**
179
	 * Pre Fetch
180
	 */
181
	public function pre_fetch() {
182
183
		if ( $this->step == 1 ) {
0 ignored issues
show
introduced by
Found "== 1". Use Yoda Condition checks, you must
Loading history...
184
			$this->delete_data( 'give_temp_delete_test_ids' );
185
		}
186
187
		$items = get_option( 'give_temp_delete_test_ids', false );
188
189
		if ( false === $items ) {
190
			$items = array();
191
192
			$args = apply_filters( 'give_tools_reset_stats_total_args', array(
193
				'post_status' => 'any',
194
				'number'      => - 1,
195
				'meta_key'    => '_give_payment_mode',
0 ignored issues
show
introduced by
Detected usage of meta_key, possible slow query.
Loading history...
196
				'meta_value'  => 'test'
0 ignored issues
show
introduced by
Detected usage of meta_value, possible slow query.
Loading history...
introduced by
Each line in an array declaration must end in a comma
Loading history...
197
			) );
198
199
			$posts    = new Give_Payments_Query( $args );
200
			$payments = $posts->get_payments();
201
202
			/* @var Give_Payment $payment */
203
			foreach ( $payments as $payment ) {
204
				$items[] = array(
205
					'id'   => (int) $payment->ID,
206
					'type' => 'give_payment',
207
				);
208
			}
209
			
210
			// Allow filtering of items to remove with an unassociative array for each item.
211
			// The array contains the unique ID of the item, and a 'type' for you to use in the execution of the get_data method.
212
			$items = apply_filters( 'give_delete_test_items', $items );
213
214
			$this->store_data( 'give_temp_delete_test_ids', $items );
215
		}
216
217
	}
218
219
	/**
220
	 * Given a key, get the information from the Database Directly
221
	 *
222
	 * @since  1.5
223
	 *
224
	 * @param  string $key The option_name
225
	 *
226
	 * @return mixed       Returns the data from the database
227
	 */
228 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...
229
		global $wpdb;
230
		$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...
231
232
		if ( empty( $value ) ) {
233
			return false;
234
		}
235
236
		$maybe_json = json_decode( $value );
237
		if ( ! is_null( $maybe_json ) ) {
238
			$value = json_decode( $value, true );
239
		}
240
241
		return $value;
242
	}
243
244
	/**
245
	 * Give a key, store the value
246
	 *
247
	 * @since  1.5
248
	 *
249
	 * @param  string $key The option_name
250
	 * @param  mixed $value The value to store
251
	 *
252
	 * @return void
253
	 */
254 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...
255
		global $wpdb;
256
257
		$value = is_array( $value ) ? wp_json_encode( $value ) : esc_attr( $value );
258
259
		$data = array(
260
			'option_name'  => $key,
261
			'option_value' => $value,
262
			'autoload'     => 'no',
263
		);
264
265
		$formats = array(
266
			'%s',
267
			'%s',
268
			'%s',
269
		);
270
271
		$wpdb->replace( $wpdb->options, $data, $formats );
0 ignored issues
show
introduced by
Usage of a direct database call is discouraged.
Loading history...
272
	}
273
274
	/**
275
	 * Delete an option
276
	 *
277
	 * @since  1.5
278
	 *
279
	 * @param  string $key The option_name to delete
280
	 *
281
	 * @return void
282
	 */
283
	private function delete_data( $key ) {
284
		global $wpdb;
285
		$wpdb->delete( $wpdb->options, array( 'option_name' => $key ) );
286
	}
287
288
}
289