Completed
Pull Request — master (#2165)
by Justin
06:18
created

WPSC_Purchase_Log::get_log_by_meta()   C

Complexity

Conditions 8
Paths 7

Size

Total Lines 24
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 8
eloc 15
c 0
b 0
f 0
nc 7
nop 2
dl 0
loc 24
rs 5.7377
1
<?php
2
// by default, expire stats cache after 48 hours
3
// this doesn't have any effect if you're not using APC or memcached
4
5
if ( ! defined( 'WPSC_PURCHASE_LOG_STATS_CACHE_EXPIRE' ) ) {
6
	define( 'WPSC_PURCHASE_LOG_STATS_CACHE_EXPIRE', DAY_IN_SECONDS * 2 );
7
}
8
9
class WPSC_Purchase_Log extends WPSC_Query_Base {
10
	const INCOMPLETE_SALE  		= 1;
11
	const ORDER_RECEIVED  	 	= 2;
12
	const ACCEPTED_PAYMENT		= 3;
13
	const JOB_DISPATCHED   		= 4;
14
	const CLOSED_ORDER     		= 5;
15
	const PAYMENT_DECLINED 		= 6;
16
	const REFUNDED         		= 7;
17
	const REFUND_PENDING   		= 8;
18
	const PARTIALLY_REFUNDED 	= 9;
19
20
	/**
21
	 * Names of column that requires escaping values as strings before being inserted
22
	 * into the database
23
	 *
24
	 * @access private
25
	 * @static
26
	 * @since 3.8.9
27
	 *
28
	 * @var array
29
	 */
30
	private static $string_cols = array(
31
		'sessionid',
32
		'transactid',
33
		'authcode',
34
		'date',
35
		'gateway',
36
		'billing_country',
37
		'shipping_country',
38
		'email_sent',
39
		'stock_adjusted',
40
		'discount_data',
41
		'track_id',
42
		'billing_region',
43
		'shipping_region',
44
		'find_us',
45
		'engrave_text',
46
		'shipping_method',
47
		'shipping_option',
48
		'affiliate_id',
49
		'plugin_version',
50
		'notes',
51
	);
52
53
	/**
54
	 * Names of column that requires escaping values as integers before being inserted
55
	 * into the database
56
	 *
57
	 * @static
58
	 * @since 3.8.9
59
	 * @var array
60
	 */
61
	private static $int_cols = array(
62
		'id',
63
		'statusno',
64
		'processed',
65
		'user_ID',
66
	);
67
68
	/**
69
	 * Names of column that requires escaping values as float before being inserted
70
	 * into the database
71
	 *
72
	 * @static
73
	 * @since 4.0
74
	 * @var array
75
	 */
76
	private static $float_cols = array(
77
		'totalprice',
78
		'base_shipping',
79
		'discount_value',
80
		'wpec_taxes_total',
81
		'wpec_taxes_rate',
82
	);
83
84
	/**
85
	 * Array of metadata
86
	 *
87
	 * @static
88
	 * @since 4.0
89
	 * @var array
90
	 */
91
	private static $metadata = array(
92
		'totalprice',
93
		'base_shipping',
94
		'discount_value',
95
		'wpec_taxes_total',
96
		'wpec_taxes_rate',
97
	);
98
99
	private $gateway_data = array();
100
101
	private $is_status_changed = false;
102
	private $previous_status   = false;
103
104
	private $cart_contents = array();
105
	private $cart_ids = array();
106
	private $can_edit = null;
107
108
	/**
109
	 * Contains the constructor arguments. This array is necessary because we will
110
	 * lazy load the DB row into $this->data whenever necessary. Lazy loading is,
111
	 * in turn, necessary because sometimes right after saving a new record, we need
112
	 * to fetch a property with the same object.
113
	 *
114
	 * @access private
115
	 * @since 3.8.9
116
	 *
117
	 * @var array
118
	 */
119
	private $args = array(
120
		'col'   => '',
121
		'value' => '',
122
	);
123
124
   protected $buyers_name = null;
125
   protected $buyers_city = null;
126
   protected $buyers_email = null;
127
   protected $buyers_address = null;
128
   protected $buyers_state_and_postcode = null;
129
   protected $buyers_country = null;
130
   protected $buyers_phone = null;
131
   protected $shipping_name = null;
132
   protected $shipping_address = null;
133
   protected $shipping_city = null;
134
   protected $shipping_state_and_postcode = null;
135
   protected $shipping_country = null;
136
   protected $payment_method = null;
137
   protected $shipping_method = null;
138
139
	/**
140
	 * Get the SQL query format for a column
141
	 *
142
	 * @since 3.8.9
143
	 * @param  string $col Name of the column
144
	 * @return string      Placeholder
145
	 */
146
	private static function get_column_format( $col ) {
147
		if ( in_array( $col, self::$string_cols ) ) {
148
			return '%s';
149
		}
150
151
		if ( in_array( $col, self::$int_cols ) ) {
152
			return '%d';
153
		}
154
155
		return '%f';
156
	}
157
158
	/**
159
	 * Query the purchase log table to get sales and earning stats
160
	 *
161
	 * Accepts an array of arguments:
162
	 * 	- 'ids': IDs of products for which you want to get stats
163
	 * 	- 'products': array of WPSC_Product objects for which you want to get stats
164
	 * 	- 'start' and 'end': the timestamp range (integers) during which you want
165
	 * 	                     to collect the stats.
166
	 * 	                     You can use none, either, or both of them.
167
	 * 	                     Note that the [start, end) interval is a left-closed,
168
	 * 	                     right-open.
169
	 * 	                     E.g.: to get stats from Jan 1st, 2013 to
170
	 * 	                     Dec 31st, 2013 (23:59:59),
171
	 * 	                     set "start" to the timestamp for Jan 1st, 2013, set
172
	 * 	                     "end" to the timestamp for Jan 1st, 2014
173
	 *  - 'order': what to sort the results by, defaults to 'id'.
174
	 *            Can be 'ids', 'sales', 'earnings' or empty string to disable sorting
175
	 *  - 'orderby': how to sort the results, defaults to 'ASC'.
176
	 *              Can be 'ASC', 'DESC' (lowercase is fine too)
177
	 *  - 'per_page': How many items to fetch, defaults to 0, which fetches all results
178
	 *  - 'page': Which page of the results to fetch, defaults to 1.
179
	 *            Has no effect if per_page is set to 0.
180
	 *
181
	 * @since 3.8.14
182
	 * @param  array|string $args Arguments
183
	 * @return array       Array containing 'sales' and 'earnings' stats
184
	 */
185
	public static function fetch_stats( $args ) {
186
		global $wpdb;
187
188
		$defaults = array(
189
			'ids'      => array(), // IDs of the products to be queried
190
			'products' => array(), // Array of WPSC_Products objects
191
			'start'    => 0,       // Int. timestamp, has to be UTC
192
			'end'      => 0,       // Int. timestamp, has to be UTC
193
			'order'    => 'ASC',
194
			'orderby'  => 'id',
195
			'per_page' => 0,
196
			'page'     => 1,
197
		);
198
199
		$args = wp_parse_args( $args, $defaults );
200
201
		// convert more advanced date / time args into "start" and "end"
202
		$args = self::convert_date_args( $args );
203
204
		// build an array of WPSC_Product objects based on 'ids' and 'products' args
205
		$products = array_merge(
206
			$args['products'],
207
			array_map( array( 'WPSC_Product', 'get_instance' ), $args['ids'] )
208
		);
209
210
		// eliminate duplicates (Note: usage of this requires PHP 5.2.9)
211
		$products = array_unique( $products, SORT_REGULAR );
212
213
		if ( empty( $products ) ) {
214
			return null;
215
		}
216
217
		$needs_fetching = array();
218
219
		$stats = array(
220
			'sales'    => 0,
221
			'earnings' => 0,
222
		);
223
224
		// if we have date restriction, that means we won't be able to rely upon
225
		// individual stats cache inside WPSC_Product objects
226
		$has_date_restriction = ! ( empty( $args['start'] ) && empty( $args['end'] ) );
227
228
		// if we do NOT have date restriction, find out which WPSC_Product object
229
		// has stats cache, and which don't
230
		if ( ! $has_date_restriction ) {
231
			foreach ( $products as $product ) {
232
				// store the ID if this product doesn't have a stats cache yet
233
				if ( $product->post->_wpsc_stats === '' ) {
234
					$needs_fetching[] = $product->post->ID;
235
				} else {
236
237
					// tally up the sales and earnings if this one has cache already
238
					$prod_meta = get_post_meta( $product->post->ID, '_wpsc_stats', true );
239
240
					if ( isset( $prod_meta['sales'] ) && isset( $prod_meta['earnings'] ) ) {
241
						$stats['sales']    += $prod_meta['sales'];
242
						$stats['earnings'] += $prod_meta['earnings'];
243
					}
244
					$needs_fetching[]   = $product->post->ID;
245
				}
246
			}
247
		}
248
249
		// never hurts to make sure
250
		$needs_fetching = array_map( 'absint', $needs_fetching );
251
252
		// pagination arguments
253
		$limit = '';
254
255
		if ( ! empty( $args['per_page'] ) ) {
256
			$offset = ( $args['page'] - 1 ) * $args['per_page'];
257
			$limit = "LIMIT " . absint( $args['per_page'] ) . " OFFSET " . absint( $offset );
258
		}
259
260
		// sorting
261
		$order = '';
262
263
		if ( ! empty( $args['orderby'] ) )
264
			$order = "ORDER BY " . esc_sql( $args['orderby'] ) . " " . esc_sql( $args['order'] );
265
266
		// date
267
		$where = "WHERE p.processed IN (3, 4, 5)";
268
269
		if ( $has_date_restriction ) {
270
			// start date equal or larger than $args['start']
271
			if ( ! empty( $args['start'] ) )
272
				$where .= " AND CAST(p.date AS UNSIGNED) >= " . absint( $args['start'] );
273
274
			// end date less than $args['end'].
275
			// the "<" sign is not a typo, such upper limit makes it easier for
276
			// people to specify range.
277
			// E.g.: [1/1/2013 - 1/1/2014) rather than:
278
			//       [1/1/2013 - 31/12/2013 23:59:59]
279
			if ( ! empty( $args['end'] ) )
280
				$where .= " AND CAST(p.date AS UNSIGNED) < " . absint( $args['end'] );
281
		}
282
283
		// assemble the SQL query
284
		$sql = "
285
			SELECT cc.prodid AS id, SUM(cc.quantity) AS sales, SUM(cc.quantity * cc.price) AS earnings
286
			FROM $wpdb->wpsc_purchase_logs AS p
287
			INNER JOIN
288
				$wpdb->wpsc_cart_contents AS cc
289
				ON p.id = cc.purchaseid AND cc.prodid IN (" . implode( ', ', $needs_fetching ) . ")
290
			{$where}
291
			GROUP BY cc.prodid
292
			{$order}
293
			{$limit}
294
		";
295
296
		// if the result is cached, don't bother querying the database
297
		$cache_key = md5( $sql );
298
		$results   = wp_cache_get( $cache_key, 'wpsc_purchase_logs_stats' );
299
300
		if ( false === $results ) {
301
			$results = $wpdb->get_results( $sql );
302
			wp_cache_set( $cache_key, $results, 'wpsc_purchase_logs_stats', WPSC_PURCHASE_LOG_STATS_CACHE_EXPIRE );
303
		}
304
305
		// tally up the sales and earnings from the query results
306
		foreach ( $results as $row ) {
307
			if ( ! $has_date_restriction ) {
308
				$product           = WPSC_Product::get_instance( $row->id );
309
				$product->sales    = $row->sales;
310
				$product->earnings = $row->earnings;
311
			}
312
313
			$stats['sales']    += $row->sales;
314
			$stats['earnings'] += $row->earnings;
315
		}
316
317
		return $stats;
318
	}
319
320
	/**
321
	 * Convert advanced date/time arguments like year, month, day, 'ago' etc.
322
	 * into basic arguments which are "start" and "end".
323
	 *
324
	 * @since  3.8.14
325
	 * @param  array $args Arguments
326
	 * @return array       Arguments after converting
327
	 */
328
	private static function convert_date_args( $args ) {
329
		// TODO: Implement this
330
		return $args;
331
	}
332
333
	/**
334
	 * Get overall sales and earning stats for just one product
335
	 *
336
	 * @since 3.8.14
337
	 * @param  int $id ID of the product
338
	 * @return array   Array containing 'sales' and 'earnings' stats
339
	 */
340
	public static function get_stats_for_product( $id, $args = '' ) {
341
342
		$product = WPSC_Product::get_instance( $id );
343
344
		// if this product has variations
345
		if ( $product->has_variations ) {
346
			// get total stats of variations
347
			$args['products'] = $product->variations;
348
		} else {
349
			// otherwise, get stats of only this product
350
			$args['products'] = array( $product );
351
		}
352
353
		return self::fetch_stats( $args );
354
	}
355
356
	/**
357
	 * Check whether the status code indicates a completed status
358
	 *
359
	 * @since 3.8.13
360
	 * @param int  $status Status code
361
	 * @return boolean
362
	 */
363
	public static function is_order_status_completed( $status ) {
364
		$completed_status = apply_filters( 'wpsc_order_status_completed', array(
365
			self::ACCEPTED_PAYMENT,
366
			self::JOB_DISPATCHED,
367
			self::CLOSED_ORDER,
368
		) );
369
370
		return in_array( $status, $completed_status );
371
	}
372
373
	/**
374
	 * Update cache of the passed log object
375
	 *
376
	 * @access public
377
	 * @static
378
	 * @since 3.8.9
379
	 *
380
	 * @param WPSC_Purchase_Log $log The log object that you want to store into cache
381
	 * @return void
382
	 */
383
	public static function update_cache( &$log ) {
384
385
		// wpsc_purchase_logs stores the data array, while wpsc_purchase_logs_sessionid stores the
386
		// log id that's associated with the sessionid
387
		$id = $log->get( 'id' );
388
		wp_cache_set( $id, $log->data, 'wpsc_purchase_logs' );
389
390
		if ( $sessionid = $log->get( 'sessionid' ) ) {
391
			wp_cache_set( $sessionid, $id, 'wpsc_purchase_logs_sessionid' );
392
		}
393
394
		wp_cache_set( $id, $log->cart_contents, 'wpsc_purchase_log_cart_contents' );
395
		do_action( 'wpsc_purchase_log_update_cache', $log );
396
	}
397
398
	/**
399
	 * Deletes cache of a log (either by using the log ID or sessionid)
400
	 *
401
	 * @access public
402
	 * @static
403
	 * @since 3.8.9
404
	 *
405
	 * @param string $value The value to query
406
	 * @param string $col Optional. Defaults to 'id'. Whether to delete cache by using
407
	 *                    a purchase log ID or sessionid
408
	 * @return void
409
	 */
410
	public static function delete_cache( $value, $col = 'id' ) {
411
		// this will pull from the old cache, so no worries there
412
		$log = new WPSC_Purchase_Log( $value, $col );
413
414
		wp_cache_delete( $log->get( 'id' ), 'wpsc_purchase_logs' );
415
		wp_cache_delete( $log->get( 'sessionid' ), 'wpsc_purchase_logs_sessionid' );
416
		wp_cache_delete( $log->get( 'id' ), 'wpsc_purchase_log_cart_contents' );
417
		wp_cache_delete( $log->get( 'id' ), 'wpsc_purchase_meta' );
418
419
		do_action( 'wpsc_purchase_log_delete_cache', $log, $value, $col );
420
	}
421
422
	/**
423
	 * Deletes a log from the database.
424
	 *
425
	 * @access  public
426
	 * @since   3.8.9
427
	 *
428
	 * @uses  $wpdb                              Global database instance.
429
	 * @uses  wpsc_is_store_admin()              Check user has admin capabilities.
430
	 * @uses  WPSC_Purchase_Log::delete_cache()  Delete purchaselog cache.
431
	 * @uses  WPSC_Claimed_Stock                 Claimed Stock class.
432
	 *
433
	 * @param   string   $log_id   ID of the log.
434
	 * @return  boolean            Deleted successfully.
435
	 */
436
	public function delete( $log_id = false ) {
437
438
		global $wpdb;
439
440
		if ( ! ( isset( $this ) && get_class( $this ) == __CLASS__ ) ) {
441
			_wpsc_doing_it_wrong( 'WPSC_Purchase_Log::delete', __( 'WPSC_Purchase_Log::delete() is no longer a static method and should not be called statically.', 'wp-e-commerce' ), '3.9.0' );
442
		}
443
444
		if ( false !== $log_id ) {
445
			_wpsc_deprecated_argument( __FUNCTION__, '3.9.0', 'The $log_id param is not used. You must first create an instance of WPSC_Purchase_Log before calling this method.' );
446
		}
447
448
		if ( ! wpsc_is_store_admin() ) {
449
			return false;
450
		}
451
452
		$log_id = $this->get( 'id' );
453
454
		if ( $log_id > 0 ) {
455
456
			do_action( 'wpsc_purchase_log_before_delete', $log_id );
457
458
			self::delete_cache( $log_id );
459
460
			// Delete claimed stock
461
			$purchlog_status = $wpdb->get_var( $wpdb->prepare( "SELECT `processed` FROM `" . WPSC_TABLE_PURCHASE_LOGS . "` WHERE `id`= %d", $log_id ) );
462
			if ( $purchlog_status == WPSC_Purchase_Log::CLOSED_ORDER || $purchlog_status == WPSC_Purchase_Log::INCOMPLETE_SALE ) {
463
				$claimed_query = new WPSC_Claimed_Stock( array(
464
					'cart_id'        => $log_id,
465
					'cart_submitted' => 1
466
				) );
467
				$claimed_query->clear_claimed_stock( 0 );
468
			}
469
470
			// Delete cart content, submitted data, then purchase log
471
			$wpdb->query( $wpdb->prepare( "DELETE FROM `" . WPSC_TABLE_CART_CONTENTS . "` WHERE `purchaseid` = %d", $log_id ) );
472
			$wpdb->query( $wpdb->prepare( "DELETE FROM `" . WPSC_TABLE_SUBMITTED_FORM_DATA . "` WHERE `log_id` IN (%d)", $log_id ) );
473
			$wpdb->query( $wpdb->prepare( "DELETE FROM `" . WPSC_TABLE_PURCHASE_LOGS . "` WHERE `id` = %d LIMIT 1", $log_id ) );
474
			$wpdb->query( $wpdb->prepare( "DELETE FROM `" . WPSC_TABLE_PURCHASE_META . "` WHERE `wpsc_purchase_id` = %d", $log_id ) );
475
			$wpdb->query( $wpdb->prepare( "DELETE FROM `" . WPSC_TABLE_DOWNLOAD_STATUS . "` WHERE `purchid` = %d ", $log_id ) );
476
477
			do_action( 'wpsc_purchase_log_delete', $log_id );
478
479
			return true;
480
481
		}
482
483
		return false;
484
485
	}
486
487
	/**
488
	 * Constructor of the purchase log object. If no argument is passed, this simply
489
	 * create a new empty object. Otherwise, this will get the purchase log from the
490
	 * DB either by using purchase log id or sessionid (specified by the 2nd argument).
491
	 *
492
	 * Eg:
493
	 *
494
	 * // get purchase log with ID number 23
495
	 * $log = new WPSC_Purchase_Log( 23 );
496
	 *
497
	 * // get purchase log with sessionid "asdf"
498
	 * $log = new WPSC_Purchase_Log( 'asdf', 'sessionid' )
499
	 *
500
	 * @access public
501
	 * @since 3.8.9
502
	 *
503
	 * @param string $value Optional. Defaults to false.
504
	 * @param string $col Optional. Defaults to 'id'.
505
	 */
506
	public function __construct( $value = false, $col = 'id' ) {
507
		if ( false === $value ) {
508
			return;
509
		}
510
511
		if ( is_array( $value ) ) {
512
			$this->set( $value );
513
			return;
514
		}
515
516
		global $wpdb;
517
518
		if ( ! in_array( $col, array( 'id', 'sessionid' ) ) ) {
519
			return;
520
		}
521
522
		// store the constructor args into an array so that later we can lazy load the data
523
		$this->args = array(
524
			'col'   => $col,
525
			'value' => $value,
526
		);
527
528
		// if the sessionid is in cache, pull out the id
529
		if ( $col == 'sessionid'  && $id = wp_cache_get( $value, 'wpsc_purchase_logs_sessionid' ) ) {
530
				$col = 'id';
531
				$value = $id;
532
		}
533
534
		// if the id is specified, try to get from cache
535
		if ( $col == 'id' ) {
536
			$this->data = wp_cache_get( $value, 'wpsc_purchase_logs' );
537
			$this->cart_contents = wp_cache_get( $value, 'wpsc_purchase_log_cart_contents' );
538
		}
539
540
		// cache exists
541
		if ( $this->data ) {
542
			$this->set_meta_props();
543
			$this->fetched = true;
544
			$this->exists  = true;
545
			return;
546
		}
547
	}
548
549
	private function set_total_shipping() {
550
551
		$base_shipping  = $this->get( 'base_shipping' );
552
		$item_shipping  = wp_list_pluck( $this->get_items(), 'pnp' );
553
554
		$this->meta_data['total_shipping'] = $base_shipping + array_sum( $item_shipping );
555
556
		return $this->meta_data['total_shipping'];
557
	}
558
559
	private function set_gateway_name() {
560
		global $wpsc_gateways;
561
		$gateway = $this->get( 'gateway' );
562
		$gateway_name = $gateway;
563
564
		if( 'wpsc_merchant_testmode' == $gateway )
565
			$gateway_name = __( 'Manual Payment', 'wp-e-commerce' );
566
		elseif ( isset( $wpsc_gateways[$gateway] ) )
567
			$gateway_name = $wpsc_gateways[$gateway]['name'];
568
569
		$this->meta_data['gateway_name'] = $gateway_name;
570
		return $this->meta_data['gateway_name'];
571
	}
572
573
	private function set_shipping_method_names() {
574
		global $wpsc_shipping_modules;
575
576
		$shipping_method = $this->get( 'shipping_method' );
577
		$shipping_option = $this->get( 'shipping_option' );
578
		$shipping_method_name = $shipping_method;
579
		$shipping_option_name = $shipping_option;
580
581
		if ( ! empty ( $wpsc_shipping_modules[$shipping_method] ) ) {
0 ignored issues
show
Coding Style introduced by
Space before opening parenthesis of function call prohibited
Loading history...
582
			$shipping_class = $wpsc_shipping_modules[$shipping_method];
583
			$shipping_method_name = $shipping_class->name;
584
		}
585
586
		$this->meta_data['shipping_method_name'] = $shipping_method_name;
587
		$this->meta_data['shipping_option_name'] = $shipping_option_name;
588
	}
589
590
	private function set_meta_props() {
591
592
		foreach ( wpsc_get_purchase_custom( $this->get( 'id' ) ) as $key => $value  ) {
593
			$this->meta_data[ $key ] = wpsc_get_purchase_meta( $this->get( 'id' ), $key, true );
594
		}
595
596
		$this->set_total_shipping();
597
		$this->set_gateway_name();
598
		$this->set_shipping_method_names();
599
	}
600
601
public function get_meta() {
602
603
		if ( empty( $this->data ) || empty( $this->meta_data ) ) {
604
			$this->fetch();
605
		}
606
607
		return (array) apply_filters( 'wpsc_purchase_log_meta_data', $this->meta_data );
608
	}
609
610
	/**
611
	 * Fetches the actual record from the database
612
	 *
613
	 * @access protected
614
	 * @since 3.8.9
615
	 *
616
	 * @return void
617
	 */
618
	protected function fetch() {
619
		global $wpdb;
620
621
		if ( $this->fetched ) {
622
			return;
623
		}
624
625
		// If $this->args is not set yet, it means the object contains a new unsaved
626
		// row so we don't need to fetch from DB
627
		if ( ! $this->args['col'] || ! $this->args['value'] ) {
628
			return;
629
		}
630
631
		extract( $this->args );
0 ignored issues
show
introduced by
extract() usage is highly discouraged, due to the complexity and unintended issues it might cause.
Loading history...
632
633
		$format = self::get_column_format( $col );
634
		$sql    = $wpdb->prepare( "SELECT * FROM " . WPSC_TABLE_PURCHASE_LOGS . " WHERE {$col} = {$format}", $value );
635
636
		$this->exists = false;
637
638
		if ( $data = $wpdb->get_row( $sql, ARRAY_A ) ) {
639
			$this->exists        = true;
640
			$this->data          = apply_filters( 'wpsc_purchase_log_data', $data );
641
			$this->cart_contents = $this->get_items();
642
643
			$this->set_meta_props();
644
			self::update_cache( $this );
645
		}
646
647
		do_action( 'wpsc_purchase_log_fetched', $this );
648
649
		$this->fetched = true;
650
	}
651
652
	/**
653
	 * Prepares the return value for get() (apply_filters, etc).
654
	 *
655
	 * @access protected
656
	 * @since  4.0
657
	 *
658
	 * @param  mixed  $value Value fetched
659
	 * @param  string $key   Key for $data.
660
	 *
661
	 * @return mixed
662
	 */
663
	protected function prepare_get( $value, $key ) {
664
		return apply_filters( 'wpsc_purchase_log_get_property', $value, $key, $this );
665
	}
666
667
	/**
668
	 * Prepares the return value for get_data() (apply_filters, etc).
669
	 *
670
	 * @access protected
671
	 * @since  4.0
672
	 *
673
	 * @return mixed
674
	 */
675
	protected function prepare_get_data() {
676
		return apply_filters( 'wpsc_purchase_log_get_data', $this->data, $this );
677
	}
678
679
	/**
680
	 * Prepares the return value for get_meta() (apply_filters, etc).
681
	 *
682
	 * @access protected
683
	 * @since  4.0
684
	 *
685
	 * @return mixed
686
	 */
687
	protected function prepare_get_meta() {
688
		return (array) apply_filters( 'wpsc_purchase_log_meta_data', $this->meta_data );
689
	}
690
691
	public function get_cart_contents() {
692
		_wpsc_doing_it_wrong( __FUNCTION__, __( 'This function has been deprecated in favor of the get_items() method.', 'wp-e-commerce' ), '4.0' )
693
		return $this->get_items();
0 ignored issues
show
Bug introduced by
This code did not parse for me. Apparently, there is an error somewhere around this line:

Syntax error, unexpected T_RETURN
Loading history...
694
	}
695
696
	public function get_items() {
697
		global $wpdb;
698
699
		if ( ! empty( $this->cart_contents ) && $this->fetched ) {
700
			return $this->cart_contents;
701
		}
702
703
		$id = $this->get( 'id' );
704
705
		// Bail if we don't have a log object yet (no id).
706
		if ( empty( $id ) ) {
707
			return $this->cart_contents;
708
		}
709
710
		$sql = $wpdb->prepare( "SELECT * FROM " . WPSC_TABLE_CART_CONTENTS . " WHERE purchaseid = %d", $id );
711
		$this->cart_contents = $wpdb->get_results( $sql );
712
713
		if ( is_array( $this->cart_contents ) ) {
714
			foreach ( $this->cart_contents as $index => $item ) {
715
				$this->cart_ids[ absint( $item->id ) ] = $index;
716
			}
717
		}
718
719
		return $this->cart_contents;
720
	}
721
722
723
724
	public function get_cart_item( $item_id ) {
725
		$item_id = absint( $item_id );
726
		$cart    = $this->get_items();
727
728
		if ( isset( $this->cart_ids[ $item_id ] ) ) {
729
			return $cart[ $this->cart_ids[ $item_id ] ];
730
		}
731
732
		return false;
733
	}
734
735
	public function get_cart_item_from_product_id( $product_id ) {
736
		$product_id = absint( $product_id );
737
		$cart       = $this->get_items();
738
739
		foreach ( $cart as $item ) {
740
			if ( $product_id === absint( $item->prodid ) ) {
741
				return $item;
742
			}
743
		}
744
745
		return false;
746
	}
747
748
	public function update_cart_item( $item_id, $data ) {
749
		global $wpdb;
750
751
		$item_id = absint( $item_id );
752
		$item = $this->get_cart_item( $item_id );
753
754
		if ( $item ) {
755
			do_action( 'wpsc_purchase_log_before_update_cart_item', $item_id );
756
757
			$data = wp_unslash( $data );
758
			$result = $wpdb->update( WPSC_TABLE_CART_CONTENTS, $data, array( 'id' => $item_id  ) );
759
760
			if ( $result ) {
761
762
				$this->cart_contents = array();
763
				$this->get_cart_item( $item_id );
764
765
				do_action( 'wpsc_purchase_log_update_cart_item', $item_id );
766
			}
767
768
			return $result;
769
		}
770
771
		return false;
772
	}
773
774
	public function remove_cart_item( $item_id ) {
775
		global $wpdb;
776
777
		$item_id = absint( $item_id );
778
		$item = $this->get_cart_item( $item_id );
779
780
		if ( $item ) {
781
			do_action( 'wpsc_purchase_log_before_remove_cart_item', $item_id );
782
783
			$result = $wpdb->delete( WPSC_TABLE_CART_CONTENTS, array( 'id' => $item_id ) );
784
785
			if ( $result ) {
786
787
				unset( $this->cart_contents[ $this->cart_ids[ $item_id ] ] );
788
				unset( $this->cart_ids[ $item_id ] );
789
790
				do_action( 'wpsc_purchase_log_remove_cart_item', $item_id );
791
			}
792
793
			return $result;
794
		}
795
796
		return false;
797
	}
798
799
	public function get_gateway_data( $from_currency = false, $to_currency = false ) {
800
		if ( ! $this->exists() ) {
801
			return array();
802
		}
803
804
		$subtotal = 0;
805
		$shipping = wpsc_convert_currency( (float) $this->get( 'base_shipping' ), $from_currency, $to_currency );
806
		$items    = array();
807
808
		$this->gateway_data = array(
809
			'amount'  => wpsc_convert_currency( $this->get( 'totalprice' ), $from_currency, $to_currency ),
810
			'invoice' => $this->get( 'sessionid' ),
811
			'tax'     => wpsc_convert_currency( $this->get( 'wpec_taxes_total' ), $from_currency, $to_currency ),
812
		);
813
814
		foreach ( $this->cart_contents as $item ) {
815
			$item_price = wpsc_convert_currency( $item->price, $from_currency, $to_currency );
816
			$items[] = array(
817
				'name'     => $item->name,
818
				'amount'   => $item_price,
819
				'tax'      => wpsc_convert_currency( $item->tax_charged, $from_currency, $to_currency ),
820
				'quantity' => $item->quantity,
821
			);
822
			$subtotal += $item_price * $item->quantity;
823
			$shipping += wpsc_convert_currency( $item->pnp, $from_currency, $to_currency );
824
		}
825
826
		$this->gateway_data['discount'] = wpsc_convert_currency( (float) $this->get( 'discount_value' ), $from_currency, $to_currency );
827
828
		$this->gateway_data['items'] = $items;
829
		$this->gateway_data['shipping'] = $shipping;
830
		$this->gateway_data['subtotal'] = $subtotal;
831
832
		if ( $from_currency ) {
833
			// adjust total amount in case there's slight decimal error
834
			$total = $subtotal + $shipping + $this->gateway_data['tax'] - $this->gateway_data['discount'];
835
			if ( $this->gateway_data['amount'] != $total ) {
836
				$this->gateway_data['amount'] = $total;
837
			}
838
		}
839
840
		$this->gateway_data = apply_filters( 'wpsc_purchase_log_gateway_data', $this->gateway_data, $this->get_data() );
841
		return $this->gateway_data;
842
	}
843
844
	/**
845
	 * Sets a property to a certain value. This function accepts a key and a value
846
	 * as arguments, or an associative array containing key value pairs.
847
	 *
848
	 * Loops through data, comparing against database, and saves as meta if not found in purchase log table.
849
	 *
850
	 * @access public
851
	 * @since 3.8.9
852
	 *
853
	 * @param mixed $key Name of the property (column), or an array containing key
854
	 *                   value pairs
855
	 * @param string|int $value Optional. Defaults to false. In case $key is a string,
856
	 *                          this should be specified.
857
	 * @return WPSC_Purchase_Log The current object (for method chaining)
858
	 */
859
	public function set( $key, $value = null ) {
860
		if ( is_array( $key ) ) {
861
			$properties = $key;
862
		} else {
863
			if ( is_null( $value ) ) {
864
				return $this;
865
			}
866
867
			$properties = array( $key => $value );
868
		}
869
870
		$properties = apply_filters( 'wpsc_purchase_log_set_properties', $properties, $this );
871
872
		if ( array_key_exists( 'processed', $properties ) ) {
873
			$this->previous_status = $this->get( 'processed' );
874
875
			if ( $properties['processed'] != $this->previous_status ) {
876
				$this->is_status_changed = true;
877
			}
878
		}
879
880
		if ( ! is_array( $this->data ) ) {
881
			$this->data = array();
882
		}
883
884
		foreach ( $properties as $key => $value ) {
885
			if ( ! in_array( $key, array_merge( self::$string_cols, self::$int_cols, self::$float_cols ) ) ) {
886
				$this->meta_data[ $key ] = $value;
887
				unset( $properties[ $key ] );
888
			}
0 ignored issues
show
introduced by
Blank line found after control structure
Loading history...
889
890
		}
891
892
		$this->data = array_merge( $this->data, $properties );
893
		return $this;
894
	}
895
896
	/**
897
	 * Returns an array containing the parameter format so that this can be used in
898
	 * $wpdb methods (update, insert etc.)
899
	 *
900
	 * @access private
901
	 * @since 3.8.9
902
	 *
903
	 * @param array $data
904
	 * @return array
905
	 */
906
	private function get_data_format( $data ) {
907
		$format = array();
908
909
		foreach ( $data as $key => $value ) {
910
			$format[] = self::get_column_format( $key );
911
		}
912
913
		return $format;
914
	}
915
916
	/**
917
	 * Saves the purchase log back to the database
918
	 *
919
	 * @access public
920
	 * @since 3.8.9
921
	 *
922
	 * @return void
923
	 */
924
	public function save() {
925
		global $wpdb;
926
927
		do_action( 'wpsc_purchase_log_pre_save', $this );
928
929
		// $this->args['col'] is empty when the record is new and needs to
930
		// be inserted. Otherwise, it means we're performing an update
931
		$where_col = $this->args['col'];
932
933
		$result = false;
934
935
		if ( $where_col ) {
936
			$where_val = $this->args['value'];
937
			$where_format = self::get_column_format( $where_col );
938
			do_action( 'wpsc_purchase_log_pre_update', $this );
939
			self::delete_cache( $where_val, $where_col );
940
			$data = apply_filters( 'wpsc_purchase_log_update_data', $this->data );
941
			$format = $this->get_data_format( $data );
942
			$result = $wpdb->update( WPSC_TABLE_PURCHASE_LOGS, $data, array( $where_col => $where_val ), $format, array( $where_format ) );
943
			do_action( 'wpsc_purchase_log_update', $this );
944
		} else {
945
			do_action( 'wpsc_purchase_log_pre_insert', $this );
946
			$data = apply_filters( 'wpsc_purchase_log_insert_data', $this->data );
947
			$format = $this->get_data_format( $data );
948
			$result = $wpdb->insert( WPSC_TABLE_PURCHASE_LOGS, $data, $format );
949
950
			if ( $result ) {
951
				$this->set( 'id', $wpdb->insert_id );
952
953
				// set $this->args so that properties can be lazy loaded right after
954
				// the row is inserted into the db
955
				$this->args = array(
956
					'col'   => 'id',
957
					'value' => $this->get( 'id' ),
958
				);
959
			}
960
961
			do_action( 'wpsc_purchase_log_insert', $this );
962
		}
963
964
		if ( $this->is_status_changed ) {
965
966
			if ( $this->is_transaction_completed() ) {
967
				$this->update_downloadable_status();
968
			}
969
970
			$current_status          = $this->get( 'processed' );
971
			$previous_status         = $this->previous_status;
972
			$this->previous_status   = $current_status;
973
			$this->is_status_changed = false;
974
975
			do_action( 'wpsc_update_purchase_log_status', $this->get( 'id' ), $current_status, $previous_status, $this );
976
		}
977
978
		if ( ! empty( $this->meta_data ) ) {
979
			$this->save_meta();
980
		}
981
982
		do_action( 'wpsc_purchase_log_save', $this );
983
984
		return $result;
985
	}
986
987
	/**
988
	 * Save meta data for purchase log, if any was set via set().
989
	 *
990
	 * @access public
991
	 * @since  4.0
992
	 *
993
	 * @return WPSC_Query_Base  The current object (for method chaining)
994
	 */
995
	public function save_meta() {
996
		do_action( 'wpsc_purchase_log_pre_save_meta', $this );
997
998
		$meta = $this->get_meta();
999
1000
		foreach ( $meta as $key => $value ) {
1001
			wpsc_update_purchase_meta( $this->get( 'id' ), $key, $value );
1002
		}
1003
1004
		do_action( 'wpsc_purchase_log_save_meta', $this );
1005
1006
		return $this;
1007
	}
1008
1009
	private function update_downloadable_status() {
1010
		global $wpdb;
1011
1012
		foreach ( $this->get_items() as $item ) {
1013
			$wpdb->update(
1014
				WPSC_TABLE_DOWNLOAD_STATUS,
1015
				array(
1016
					'active' => '1'
1017
				),
1018
				array(
1019
					'cartid'  => $item->id,
1020
					'purchid' => $this->get( 'id' ),
1021
				)
1022
			);
1023
		}
1024
	}
1025
1026
	public function have_downloads_locked() {
1027
		global $wpdb;
1028
1029
		$sql = $wpdb->prepare( "SELECT `ip_number` FROM `" . WPSC_TABLE_DOWNLOAD_STATUS . "` WHERE `purchid` = %d ", $this->get( 'id' ) );
1030
		$ip_number = $wpdb->get_var( $sql );
1031
1032
		return $ip_number;
1033
	}
1034
1035
	/**
1036
	 * Adds ability to retrieve a purchase log by a meta key or value.
1037
	 *
1038
	 * @since  4.0
1039
	 *
1040
	 * @param  string $key   Meta key. Optional.
1041
	 * @param  string $value Meta value. Optional.
1042
	 *
1043
	 * @return false|WPSC_Purchase_Log  False if no log is found or meta key and value are both not provided. WPSC_Purchase_Log object if found.
1044
	 */
1045
	public static function get_log_by_meta( $key = '', $value = '' ) {
1046
1047
		if ( empty( $key ) && empty( $value ) ) {
1048
			return false;
1049
		}
1050
1051
		global $wpdb;
1052
1053
		if ( ! empty( $key ) && empty( $value ) ) {
1054
			$sql = $wpdb->prepare( 'SELECT wpsc_purchase_id FROM ' . WPSC_TABLE_PURCHASE_META . ' WHERE meta_key = %s', $key );
1055
		} else if ( empty( $key ) && ! empty( $value ) ) {
1056
			$sql = $wpdb->prepare( 'SELECT wpsc_purchase_id FROM ' . WPSC_TABLE_PURCHASE_META . ' WHERE meta_value = %s', $value );
1057
		} else {
1058
			$sql = $wpdb->prepare( 'SELECT wpsc_purchase_id FROM ' . WPSC_TABLE_PURCHASE_META . ' WHERE meta_key = %s AND meta_value = %s', $key, $value );
1059
		}
1060
1061
		$id = $wpdb->get_var( $sql );
1062
1063
		if ( $id ) {
1064
			return new WPSC_Purchase_Log( $id );
1065
		} else {
1066
			return false;
1067
		}
1068
	}
1069
1070
	public function get_next_log_id() {
1071
		if ( ! $this->exists() ) {
1072
			return false;
1073
		}
1074
1075
		global $wpdb;
1076
1077
		$sql = $wpdb->prepare(
1078
			"SELECT MIN(id) FROM " . WPSC_TABLE_PURCHASE_LOGS . " WHERE id > %d",
1079
			$this->get( 'id' )
1080
		);
1081
1082
		return $wpdb->get_var( $sql );
1083
	}
1084
1085
	public function get_previous_log_id() {
1086
		if ( ! $this->exists() ) {
1087
			return false;
1088
		}
1089
1090
		global $wpdb;
1091
1092
		$sql = $wpdb->prepare(
1093
			"SELECT MAX(id) FROM " . WPSC_TABLE_PURCHASE_LOGS . " WHERE id < %d",
1094
			$this->get( 'id' )
1095
		);
1096
1097
		return $wpdb->get_var( $sql );
1098
	}
1099
1100
	public function is_transaction_completed() {
1101
		return WPSC_Purchase_Log::is_order_status_completed( $this->get( 'processed' ) );
1102
	}
1103
1104
	public function can_edit() {
1105
		if ( null === $this->can_edit ) {
1106
			$can_edit = current_user_can( 'edit_others_posts' ) && ! $this->is_transaction_completed();
1107
			$this->can_edit = apply_filters( 'wpsc_can_edit_order', $can_edit, $this );
1108
		}
1109
1110
		return $this->can_edit;
1111
	}
1112
1113
	public function is_order_received() {
1114
		return $this->get( 'processed' ) == self::ORDER_RECEIVED;
1115
	}
1116
1117
	public function is_incomplete_sale() {
1118
		return $this->get( 'processed' ) == self::INCOMPLETE_SALE;
1119
	}
1120
1121
	public function is_accepted_payment() {
1122
		return $this->get( 'processed' ) == self::ACCEPTED_PAYMENT;
1123
	}
1124
1125
	public function is_job_dispatched() {
1126
		return $this->get( 'processed' ) == self::JOB_DISPATCHED;
1127
	}
1128
1129
	public function is_closed_order() {
1130
		return $this->get( 'processed' ) == self::CLOSED_ORDER;
1131
	}
1132
1133
	public function is_payment_declined() {
1134
		return $this->get( 'processed' ) == self::PAYMENT_DECLINED;
1135
	}
1136
1137
	public function is_refunded() {
1138
		return $this->get( 'processed' ) == self::REFUNDED;
1139
	}
1140
1141
	public function is_refund_pending() {
1142
		return $this->get( 'processed' ) == self::REFUND_PENDING;
1143
	}
1144
1145
	/*
1146
	 * Utility methods using the $purchlogitem global.. Global usage to be replaced in the future.
1147
	 *
1148
	 * TODO: seriously get rid of all these badly coded purchaselogs.functions.php functions
1149
	 * and wpsc_purchaselogs/wpsc_purchaselogs_items classes.
1150
	 */
1151
1152
	/**
1153
	 * Init the purchase log items for this purchase log.
1154
	 *
1155
	 * @since  4.0
1156
	 *
1157
	 * @return wpsc_purchaselogs_items|false The purhchase log item object or false.
1158
	 */
1159
	public function init_items() {
1160
		global $purchlogitem;
1161
		if ( ! $this->exists() ) {
1162
			return false;
1163
		}
1164
1165
		$form_data_obj = new WPSC_Checkout_Form_Data( $this->get( 'id' ) );
1166
		$purchlogitem = new wpsc_purchaselogs_items( $this->get( 'id' ), $this, $form_data_obj );
1167
	}
1168
1169
	public function buyers_name() {
1170
		global $purchlogitem;
1171
1172
		if ( null === $this->buyers_name ) {
1173
			$first_name = $last_name = '';
1174
1175
			if ( isset( $purchlogitem->userinfo['billingfirstname'] ) ) {
1176
				$first_name = $purchlogitem->userinfo['billingfirstname']['value'];
1177
			}
1178
1179
			if ( isset( $purchlogitem->userinfo['billinglastname'] ) ) {
1180
				$last_name = ' ' . $purchlogitem->userinfo['billinglastname']['value'];
1181
			}
1182
1183
			$this->buyers_name = trim( $first_name . $last_name );
1184
		}
1185
1186
		return $this->buyers_name;
1187
	}
1188
1189
	public function buyers_city() {
1190
		global $purchlogitem;
1191
1192
		if ( null === $this->buyers_city ) {
1193
			$this->buyers_city = isset( $purchlogitem->userinfo['billingcity']['value'] ) ? $purchlogitem->userinfo['billingcity']['value'] : '';
1194
		}
1195
1196
		return $this->buyers_city;
1197
	}
1198
1199
	public function buyers_email() {
1200
		global $purchlogitem;
1201
1202
		if ( null === $this->buyers_email ) {
1203
			$this->buyers_email = isset( $purchlogitem->userinfo['billingemail']['value'] ) ? $purchlogitem->userinfo['billingemail']['value'] : '';
1204
		}
1205
1206
		return $this->buyers_email;
1207
	}
1208
1209
	public function buyers_address() {
1210
		global $purchlogitem;
1211
1212
		if ( null === $this->buyers_address ) {
1213
			$this->buyers_address = isset( $purchlogitem->userinfo['billingaddress']['value'] ) ? nl2br( esc_html( $purchlogitem->userinfo['billingaddress']['value'] ) ) : '';
1214
		}
1215
1216
		return $this->buyers_address;
1217
	}
1218
1219
	public function buyers_state_and_postcode() {
1220
		global $purchlogitem;
1221
1222
		if ( null === $this->buyers_state_and_postcode ) {
1223
1224
			if ( is_numeric( $this->get( 'billing_region' ) ) ) {
1225
				$state = wpsc_get_region( $this->get( 'billing_region' ) );
1226
			} else {
1227
				$state = $purchlogitem->userinfo['billingstate']['value'];
1228
				$state = is_numeric( $state ) ? wpsc_get_region( $state ) : $state;
1229
			}
1230
1231
			$output = esc_html( $state );
1232
1233
			if ( isset( $purchlogitem->userinfo['billingpostcode']['value'] ) && ! empty( $purchlogitem->userinfo['billingpostcode']['value'] ) ) {
1234
				if ( $output ) {
1235
					$output .= ', '; // TODO determine if it's ok to make this a space only (like shipping_state_and_postcode)
1236
				}
1237
				$output .= $purchlogitem->userinfo['billingpostcode']['value'];
1238
			}
1239
1240
			$this->buyers_state_and_postcode = $output;
1241
		}
1242
1243
		return $this->buyers_state_and_postcode;
1244
	}
1245
1246
	public function buyers_country() {
1247
		global $purchlogitem;
1248
1249
		if ( null === $this->buyers_country ) {
1250
			$this->buyers_country = isset( $purchlogitem->userinfo['billingcountry']['value'] ) ? wpsc_get_country( $purchlogitem->userinfo['billingcountry']['value'] ) : '';
1251
		}
1252
1253
		return $this->buyers_country;
1254
	}
1255
1256
	public function buyers_phone() {
1257
		global $purchlogitem;
1258
1259
		if ( null === $this->buyers_phone ) {
1260
			$this->buyers_phone = isset( $purchlogitem->userinfo['billingphone']['value'] ) ? $purchlogitem->userinfo['billingphone']['value'] : '';
1261
		}
1262
1263
		return $this->buyers_phone;
1264
	}
1265
1266
	public function shipping_name() {
1267
		global $purchlogitem;
1268
1269
		if ( null === $this->shipping_name ) {
1270
			$this->shipping_name = isset( $purchlogitem->shippinginfo['shippingfirstname']['value'] ) ? $purchlogitem->shippinginfo['shippingfirstname']['value'] : '';
1271
		}
1272
1273
		return $this->shipping_name;
1274
	}
1275
1276
	public function shipping_city() {
1277
		global $purchlogitem;
1278
1279
		if ( null === $this->shipping_city ) {
1280
			$this->shipping_city = isset( $purchlogitem->shippinginfo['shippingcity']['value'] ) ? $purchlogitem->shippinginfo['shippingcity']['value'] : '';
1281
		}
1282
1283
		return $this->shipping_city;
1284
	}
1285
1286
	public function shipping_address() {
1287
		global $purchlogitem;
1288
1289
		if ( null === $this->shipping_address ) {
1290
			$this->shipping_address = isset( $purchlogitem->shippinginfo['shippingaddress']['value'] ) ? nl2br( esc_html( $purchlogitem->shippinginfo['shippingaddress']['value'] ) ) : '';
1291
		}
1292
1293
		return $this->shipping_address;
1294
	}
1295
1296
	public function shipping_state_and_postcode() {
1297
		global $purchlogitem;
1298
1299
		if ( null === $this->shipping_state_and_postcode ) {
1300
			if ( is_numeric( $this->get( 'shipping_region' ) ) ) {
1301
				$output = wpsc_get_region( $this->get( 'shipping_region' ) );
1302
			} else {
1303
				$state = $purchlogitem->shippinginfo['shippingstate']['value'];
1304
				$output = is_numeric( $state ) ? wpsc_get_region( $state ) : $state;
1305
			}
1306
1307
			if ( !empty( $purchlogitem->shippinginfo['shippingpostcode']['value'] ) ){
1308
				if ( $output ) {
1309
					$output .= ' ';
1310
				}
1311
1312
				$output .= $purchlogitem->shippinginfo['shippingpostcode']['value'];
1313
			}
1314
1315
			$this->shipping_state_and_postcode = $output;
1316
		}
1317
1318
		return $this->shipping_state_and_postcode;
1319
	}
1320
1321
	public function shipping_country() {
1322
		global $purchlogitem;
1323
1324
		if ( null === $this->shipping_country ) {
1325
			$this->shipping_country = isset( $purchlogitem->shippinginfo['shippingcountry'] )
1326
				? wpsc_get_country( $purchlogitem->shippinginfo['shippingcountry']['value'] )
1327
				: '';
1328
		}
1329
1330
		return $this->shipping_country;
1331
	}
1332
1333
	public function payment_method() {
1334
		global $nzshpcrt_gateways;
1335
1336
		if ( null === $this->payment_method ) {
1337
			if ( 'wpsc_merchant_testmode' == $this->get( 'gateway' ) ) {
1338
				$this->payment_method = __( 'Manual Payment', 'wp-e-commerce' );
1339
			} else {
1340
				foreach ( (array) $nzshpcrt_gateways as $gateway ) {
1341
					if ( isset( $gateway['internalname'] ) && $gateway['internalname'] == $this->get( 'gateway' ) ) {
1342
						$this->payment_method = $gateway['name'];
1343
					}
1344
				}
1345
1346
				if ( ! $this->payment_method ) {
1347
					$this->payment_method = $this->get( 'gateway' );
1348
				}
1349
			}
1350
		}
1351
1352
		return $this->payment_method;
1353
	}
1354
1355
	public function shipping_method() {
1356
		global $wpsc_shipping_modules;
1357
1358
		if ( null === $this->shipping_method ) {
1359
1360
			if ( ! empty( $wpsc_shipping_modules[ $this->get( 'shipping_method' ) ] ) ) {
1361
				$this->shipping_method = $wpsc_shipping_modules[ $this->get( 'shipping_method' ) ]->getName();
1362
			} else {
1363
				$this->shipping_method = $this->get( 'shipping_method' );
1364
			}
0 ignored issues
show
introduced by
Blank line found after control structure
Loading history...
1365
1366
		}
1367
1368
		return $this->shipping_method;
1369
	}
1370
1371
	/**
1372
	 * Returns base shipping should make a function to calculate items shipping as well
1373
	 *
1374
	 * @since  4.0
1375
	 *
1376
	 * @param  boolean $numeric Return numeric value.
1377
	 *
1378
	 * @return mixed
1379
	 */
1380
	public function discount( $numeric = false ) {
1381
		$discount = $this->get( 'discount_value' );
1382
		if ( ! $numeric ) {
1383
			$discount = wpsc_currency_display( $discount, array( 'display_as_html' => false ) );
1384
		}
1385
1386
		return $discount;
1387
	}
1388
1389
	/**
1390
	 * Returns base shipping should make a function to calculate items shipping as well
1391
	 *
1392
	 * @since  4.0
1393
	 *
1394
	 * @param  boolean $numeric       Return numeric value.
1395
	 * @param  boolean $include_items Whether to calculate per-item-shipping.
1396
	 *
1397
	 * @return mixed
1398
	 */
1399
	public function shipping( $numeric = false, $include_items = false ) {
1400
		$total_shipping = $this->get( 'base_shipping' );
1401
1402
		if ( $include_items ) {
1403
			$total_shipping = $this->meta_data['total_shipping'];
1404
		}
1405
1406
		if ( ! $numeric ) {
1407
			$total_shipping = wpsc_currency_display( $total_shipping, array( 'display_as_html' => false ) );
1408
		}
1409
1410
		return $total_shipping;
1411
	}
1412
1413
	/**
1414
	 * Returns taxes total.
1415
	 *
1416
	 * @since  4.0
1417
	 *
1418
	 * @param  boolean $numeric Return numeric value.
1419
	 *
1420
	 * @return mixed
1421
	 */
1422
	public function taxes( $numeric = false ) {
1423
		$taxes = $this->get( 'wpec_taxes_total' );
1424
1425
		if ( ! $numeric ) {
1426
			$taxes = wpsc_currency_display( $taxes, array( 'display_as_html' => false ) );
1427
		}
1428
1429
		return $taxes;
1430
	}
1431
1432
	public function total_price() {
1433
		global $purchlogitem;
1434
1435
		$total = $purchlogitem->totalAmount - $this->discount( true ) + $this->shipping( true ) + $this->taxes( true );
1436
		return wpsc_currency_display( $total, array( 'display_as_html' => false ) );
1437
	}
1438
1439
}
1440