Completed
Pull Request — master (#664)
by Devin
19:01
created

functions.php ➔ give_get_payment_status()   C

Complexity

Conditions 8
Paths 6

Size

Total Lines 28
Code Lines 14

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 72

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 8
eloc 14
nc 6
nop 2
dl 0
loc 28
ccs 0
cts 6
cp 0
crap 72
rs 5.3846
c 1
b 0
f 0
1
<?php
0 ignored issues
show
Coding Style Compatibility introduced by
For compatibility and reusability of your code, PSR1 recommends that a file should introduce either new symbols (like classes, functions, etc.) or have side-effects (like outputting something, or including other files), but not both at the same time. The first symbol is defined on line 35 and the first side effect is on line 14.

The PSR-1: Basic Coding Standard recommends that a file should either introduce new symbols, that is classes, functions, constants or similar, or have side effects. Side effects are anything that executes logic, like for example printing output, changing ini settings or writing to a file.

The idea behind this recommendation is that merely auto-loading a class should not change the state of an application. It also promotes a cleaner style of programming and makes your code less prone to errors, because the logic is not spread out all over the place.

To learn more about the PSR-1, please see the PHP-FIG site on the PSR-1.

Loading history...
2
/**
3
 * Payment Functions
4
 *
5
 * @package     Give
6
 * @subpackage  Payments
7
 * @copyright   Copyright (c) 2016, WordImpress
8
 * @license     http://opensource.org/licenses/gpl-1.0.php GNU Public License
9
 * @since       1.0
10
 */
11
12
// Exit if accessed directly
13
if ( ! defined( 'ABSPATH' ) ) {
14
	exit;
15
}
16
17
/**
18
 * Get Payments
19
 *
20
 * Retrieve payments from the database.
21
 *
22
 * Since 1.0, this function takes an array of arguments, instead of individual
23
 * parameters. All of the original parameters remain, but can be passed in any
24
 * order via the array.
25
 *
26
 * $offset = 0, $number = 20, $mode = 'live', $orderby = 'ID', $order = 'DESC',
27
 * $user = null, $status = 'any', $meta_key = null
28
 *
29
 * @since 1.0
30
 *
31
 * @param array $args Arguments passed to get payments
32
 *
33
 * @return object $payments Payments retrieved from the database
34
 */
35
function give_get_payments( $args = array() ) {
36
37
	// Fallback to post objects to ensure backwards compatibility
38 34
	if ( ! isset( $args['output'] ) ) {
39 34
		$args['output'] = 'posts';
40 34
	}
41
42 34
	$args     = apply_filters( 'give_get_payments_args', $args );
43 34
	$payments = new Give_Payments_Query( $args );
44
45 34
	return $payments->get_payments();
46
}
47
48
/**
49
 * Retrieve payment by a given field
50
 *
51
 * @since       1.0
52
 *
53
 * @param       string $field The field to retrieve the payment with
54
 * @param       mixed $value The value for $field
55
 *
56
 * @return      mixed
57
 */
58
function give_get_payment_by( $field = '', $value = '' ) {
59
60 34
	if ( empty( $field ) || empty( $value ) ) {
61
		return false;
62
	}
63
64 34
	switch ( strtolower( $field ) ) {
65
66 34
		case 'id':
67 34
			$payment = new Give_Payment( $value );
68
			$id      = $payment->ID;
69 34
70
			if ( empty( $id ) ) {
71
				return false;
72
			}
73 34
74
			break;
75
76
		case 'key':
77
			$payment = give_get_payments( array(
78
				'meta_key'       => '_give_payment_purchase_key',
79
				'meta_value'     => $value,
80
				'posts_per_page' => 1,
81
				'fields'         => 'ids',
82
			) );
83
84
			if ( $payment ) {
85
				$payment = new Give_Payment( $payment[0] );
86
			}
87
88
			break;
89
90
		case 'payment_number':
91
			$payment = give_get_payments( array(
92
				'meta_key'       => '_give_payment_number',
93
				'meta_value'     => $value,
94
				'posts_per_page' => 1,
95
				'fields'         => 'ids',
96
			) );
97
98
			if ( $payment ) {
99
				$payment = new Give_Payment( $payment[0] );
100
			}
101
102
			break;
103 34
104
		default:
105 34
			return false;
106 34
	}
107
108
	if ( $payment ) {
109
		return $payment;
110
	}
111
112
	return false;
113
}
114
115
/**
116
 * Insert Payment
117
 *
118
 * @since 1.0
119
 *
120
 * @param array $payment_data
121
 *
122 34
 * @return int|bool Payment ID if payment is inserted, false otherwise
123
 */
124
function give_insert_payment( $payment_data = array() ) {
125
126
	if ( empty( $payment_data ) ) {
127 34
		return false;
128
	}
129
130 34
	$payment    = new Give_Payment();
131 34
	$gateway    = ! empty( $payment_data['gateway'] ) ? $payment_data['gateway'] : '';
132 34
	$gateway    = empty( $gateway ) && isset( $_POST['give-gateway'] ) ? $_POST['give-gateway'] : $gateway;
133
	$form_id    = isset( $payment_data['give_form_id'] ) ? $payment_data['give_form_id'] : 0;
134
	$price_id   = isset( $payment_data['give_price_id'] ) ? $payment_data['give_price_id'] : give_get_price_id( $payment_data['give_form_id'], $payment_data['price'] );
135
	$form_title = isset( $payment_data['give_form_title'] ) ? $payment_data['give_form_title'] : get_the_title( $form_id );
136
137 34
	//Set properties
138
	$payment->total          = $payment_data['price'];
0 ignored issues
show
Documentation introduced by
The property $total is declared protected in Give_Payment. Since you implemented __set(), maybe consider adding a @property or @property-write annotation. This makes it easier for IDEs to provide auto-completion.

Since your code implements the magic setter _set, this function will be called for any write access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

Since the property has write access only, you can use the @property-write annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
139
	$payment->status         = ! empty( $payment_data['status'] ) ? $payment_data['status'] : 'pending';
0 ignored issues
show
Documentation introduced by
The property $status is declared protected in Give_Payment. Since you implemented __set(), maybe consider adding a @property or @property-write annotation. This makes it easier for IDEs to provide auto-completion.

Since your code implements the magic setter _set, this function will be called for any write access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

Since the property has write access only, you can use the @property-write annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
140
	$payment->currency       = ! empty( $payment_data['currency'] ) ? $payment_data['currency'] : give_get_currency();
0 ignored issues
show
Documentation introduced by
The property $currency is declared protected in Give_Payment. Since you implemented __set(), maybe consider adding a @property or @property-write annotation. This makes it easier for IDEs to provide auto-completion.

Since your code implements the magic setter _set, this function will be called for any write access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

Since the property has write access only, you can use the @property-write annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
141 34
	$payment->user_info      = $payment_data['user_info'];
0 ignored issues
show
Documentation introduced by
The property $user_info is declared private in Give_Payment. Since you implemented __set(), maybe consider adding a @property or @property-write annotation. This makes it easier for IDEs to provide auto-completion.

Since your code implements the magic setter _set, this function will be called for any write access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

Since the property has write access only, you can use the @property-write annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
142 34
	$payment->gateway        = $gateway;
0 ignored issues
show
Documentation introduced by
The property $gateway is declared protected in Give_Payment. Since you implemented __set(), maybe consider adding a @property or @property-write annotation. This makes it easier for IDEs to provide auto-completion.

Since your code implements the magic setter _set, this function will be called for any write access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

Since the property has write access only, you can use the @property-write annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
143 34
	$payment->form_title     = $form_title;
0 ignored issues
show
Documentation introduced by
The property $form_title is declared protected in Give_Payment. Since you implemented __set(), maybe consider adding a @property or @property-write annotation. This makes it easier for IDEs to provide auto-completion.

Since your code implements the magic setter _set, this function will be called for any write access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

Since the property has write access only, you can use the @property-write annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
144 34
	$payment->form_id        = $form_id;
0 ignored issues
show
Documentation introduced by
The property $form_id is declared protected in Give_Payment. Since you implemented __set(), maybe consider adding a @property or @property-write annotation. This makes it easier for IDEs to provide auto-completion.

Since your code implements the magic setter _set, this function will be called for any write access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

Since the property has write access only, you can use the @property-write annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
145 34
	$payment->price_id       = $price_id;
0 ignored issues
show
Documentation introduced by
The property $price_id is declared protected in Give_Payment. Since you implemented __set(), maybe consider adding a @property or @property-write annotation. This makes it easier for IDEs to provide auto-completion.

Since your code implements the magic setter _set, this function will be called for any write access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

Since the property has write access only, you can use the @property-write annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
146 34
	$payment->user_id        = $payment_data['user_info']['id'];
0 ignored issues
show
Documentation introduced by
The property $user_id is declared protected in Give_Payment. Since you implemented __set(), maybe consider adding a @property or @property-write annotation. This makes it easier for IDEs to provide auto-completion.

Since your code implements the magic setter _set, this function will be called for any write access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

Since the property has write access only, you can use the @property-write annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
147 34
	$payment->email          = $payment_data['user_email'];
0 ignored issues
show
Documentation introduced by
The property $email is declared protected in Give_Payment. Since you implemented __set(), maybe consider adding a @property or @property-write annotation. This makes it easier for IDEs to provide auto-completion.

Since your code implements the magic setter _set, this function will be called for any write access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

Since the property has write access only, you can use the @property-write annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
148 34
	$payment->first_name     = $payment_data['user_info']['first_name'];
0 ignored issues
show
Documentation introduced by
The property $first_name is declared protected in Give_Payment. Since you implemented __set(), maybe consider adding a @property or @property-write annotation. This makes it easier for IDEs to provide auto-completion.

Since your code implements the magic setter _set, this function will be called for any write access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

Since the property has write access only, you can use the @property-write annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
149
	$payment->last_name      = $payment_data['user_info']['last_name'];
0 ignored issues
show
Documentation introduced by
The property $last_name is declared protected in Give_Payment. Since you implemented __set(), maybe consider adding a @property or @property-write annotation. This makes it easier for IDEs to provide auto-completion.

Since your code implements the magic setter _set, this function will be called for any write access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

Since the property has write access only, you can use the @property-write annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
150
	$payment->email          = $payment_data['user_info']['email'];
0 ignored issues
show
Documentation introduced by
The property $email is declared protected in Give_Payment. Since you implemented __set(), maybe consider adding a @property or @property-write annotation. This makes it easier for IDEs to provide auto-completion.

Since your code implements the magic setter _set, this function will be called for any write access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

Since the property has write access only, you can use the @property-write annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
151 34
	$payment->ip             = give_get_ip();
0 ignored issues
show
Documentation introduced by
The property $ip is declared protected in Give_Payment. Since you implemented __set(), maybe consider adding a @property or @property-write annotation. This makes it easier for IDEs to provide auto-completion.

Since your code implements the magic setter _set, this function will be called for any write access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

Since the property has write access only, you can use the @property-write annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
152
	$payment->key            = $payment_data['purchase_key'];
0 ignored issues
show
Documentation introduced by
The property $key is declared protected in Give_Payment. Since you implemented __set(), maybe consider adding a @property or @property-write annotation. This makes it easier for IDEs to provide auto-completion.

Since your code implements the magic setter _set, this function will be called for any write access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

Since the property has write access only, you can use the @property-write annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
153 34
	$payment->mode           = give_is_test_mode() ? 'test' : 'live';
0 ignored issues
show
Documentation introduced by
The property $mode is declared protected in Give_Payment. Since you implemented __set(), maybe consider adding a @property or @property-write annotation. This makes it easier for IDEs to provide auto-completion.

Since your code implements the magic setter _set, this function will be called for any write access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

Since the property has write access only, you can use the @property-write annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
154
	$payment->parent_payment = ! empty( $payment_data['parent'] ) ? absint( $payment_data['parent'] ) : '';
0 ignored issues
show
Documentation introduced by
The property $parent_payment is declared protected in Give_Payment. Since you implemented __set(), maybe consider adding a @property or @property-write annotation. This makes it easier for IDEs to provide auto-completion.

Since your code implements the magic setter _set, this function will be called for any write access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

Since the property has write access only, you can use the @property-write annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
155
156 34
	//Add the donation
157 34
	$args = array(
158 34
		'price'    => $payment->total,
0 ignored issues
show
Documentation introduced by
The property $total is declared protected in Give_Payment. Since you implemented __get(), maybe consider adding a @property or @property-read annotation. This makes it easier for IDEs to provide auto-completion.

Since your code implements the magic setter _set, this function will be called for any write access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

Since the property has write access only, you can use the @property-write annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
159 34
		'price_id' => $payment->price_id,
0 ignored issues
show
Documentation introduced by
The property $price_id is declared protected in Give_Payment. Since you implemented __get(), maybe consider adding a @property or @property-read annotation. This makes it easier for IDEs to provide auto-completion.

Since your code implements the magic setter _set, this function will be called for any write access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

Since the property has write access only, you can use the @property-write annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
160 34
		'fees'     => isset( $payment_data['fees'] ) ? $payment_data['fees'] : array()
161 34
	);
162
163 34
	$payment->add_donation( $payment->form_id, $args );
0 ignored issues
show
Documentation introduced by
The property $form_id is declared protected in Give_Payment. Since you implemented __get(), maybe consider adding a @property or @property-read annotation. This makes it easier for IDEs to provide auto-completion.

Since your code implements the magic setter _set, this function will be called for any write access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

Since the property has write access only, you can use the @property-write annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
164 34
165 34
	//Set date if present
166
	if ( isset( $payment_data['post_date'] ) ) {
167 34
		$payment->date = $payment_data['post_date'];
0 ignored issues
show
Documentation introduced by
The property $date is declared protected in Give_Payment. Since you implemented __set(), maybe consider adding a @property or @property-write annotation. This makes it easier for IDEs to provide auto-completion.

Since your code implements the magic setter _set, this function will be called for any write access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

Since the property has write access only, you can use the @property-write annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
168
	}
169
170
	//Handle sequential payments
171
	if ( give_get_option( 'enable_sequential' ) ) {
172
		$number          = give_get_next_payment_number();
173 34
		$payment->number = give_format_payment_number( $number );
0 ignored issues
show
Documentation introduced by
The property $number is declared protected in Give_Payment. Since you implemented __set(), maybe consider adding a @property or @property-write annotation. This makes it easier for IDEs to provide auto-completion.

Since your code implements the magic setter _set, this function will be called for any write access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

Since the property has write access only, you can use the @property-write annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
174
		update_option( 'give_last_payment_number', $number );
175
	}
176 34
177 10
	// Clear the user's purchased cache
178 10
	delete_transient( 'give_user_' . $payment_data['user_info']['id'] . '_purchases' );
179
180
	//Save payment
181 34
	$payment->save();
182 34
183 34
	//Hook it
184 34
	do_action( 'give_insert_payment', $payment->ID, $payment_data );
185
186 34
	//Return payment ID upon success
187 34
	if ( ! empty( $payment->ID ) ) {
188 34
		return $payment->ID;
189
	}
190 34
191
	// Return false if no payment was inserted
192
	return false;
193 34
194 34
}
195 34
196 34
/**
197 34
 * Updates a payment status.
198 34
 *
199 34
 * @since 1.0
200 34
 *
201 34
 * @param int $payment_id Payment ID
202
 * @param string $new_status New Payment Status (default: publish)
203 34
 *
204
 * @return bool
205
 */
206
function give_update_payment_status( $payment_id, $new_status = 'publish' ) {
207
208
	$payment         = new Give_Payment( $payment_id );
209 34
	$payment->status = $new_status;
0 ignored issues
show
Documentation introduced by
The property $status is declared protected in Give_Payment. Since you implemented __set(), maybe consider adding a @property or @property-write annotation. This makes it easier for IDEs to provide auto-completion.

Since your code implements the magic setter _set, this function will be called for any write access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

Since the property has write access only, you can use the @property-write annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
210
	$updated         = $payment->save();
211 34
212
	return $updated;
213 34
}
214
215
216
/**
217
 * Deletes a Donation
218
 *
219
 * @since 1.0
220
 * @global    $give_logs
221
 * @uses  Give_Logging::delete_logs()
222
 *
223
 * @param int $payment_id Payment ID (default: 0)
224
 * @param bool $update_customer If we should update the customer stats (default:true)
225
 *
226
 * @return void
227
 */
228
function give_delete_purchase( $payment_id = 0, $update_customer = true ) {
229
	global $give_logs;
0 ignored issues
show
Compatibility Best Practice introduced by
Use of global functionality is not recommended; it makes your code harder to test, and less reusable.

Instead of relying on global state, we recommend one of these alternatives:

1. Pass all data via parameters

function myFunction($a, $b) {
    // Do something
}

2. Create a class that maintains your state

class MyClass {
    private $a;
    private $b;

    public function __construct($a, $b) {
        $this->a = $a;
        $this->b = $b;
    }

    public function myFunction() {
        // Do something
    }
}
Loading history...
230
231
	$payment = new Give_Payment( $payment_id );
232
233 34
	give_undo_purchase( false, $payment_id );
234 34
235 34
	$amount      = give_get_payment_amount( $payment_id );
236
	$status      = $payment->post_status;
0 ignored issues
show
Documentation introduced by
The property $post_status is declared protected in Give_Payment. Since you implemented __get(), maybe consider adding a @property or @property-read annotation. This makes it easier for IDEs to provide auto-completion.

Since your code implements the magic setter _set, this function will be called for any write access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

Since the property has write access only, you can use the @property-write annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
237 34
	$customer_id = give_get_payment_customer_id( $payment_id );
238
	$customer    = new Give_Customer( $customer_id );
239
240
	if ( $status == 'revoked' || $status == 'publish' ) {
241 34
		// Only decrease earnings if they haven't already been decreased (or were never increased for this payment)
242
		give_decrease_total_earnings( $amount );
243 34
		// Clear the This Month earnings (this_monththis_month is NOT a typo)
244
		delete_transient( md5( 'give_earnings_this_monththis_month' ) );
245
246
		if ( $customer->id && $update_customer ) {
247 34
248
			// Decrement the stats for the customer
249 34
			$customer->decrease_purchase_count();
250
			$customer->decrease_value( $amount );
251
252
		}
253 34
	}
254
255 34
	do_action( 'give_payment_delete', $payment_id );
256
257 34
	if ( $customer->id && $update_customer ) {
258
259
		// Remove the payment ID from the customer
260 34
		$customer->remove_payment( $payment_id );
261 34
262 34
	}
263 34
264
	// Remove the payment
265 34
	wp_delete_post( $payment_id, true );
266
267 34
	// Remove related sale log entries
268
	$give_logs->delete_logs(
269 34
		null,
270 34
		'sale',
271
		array(
272
			array(
273
				'key'   => '_give_log_payment_id',
274
				'value' => $payment_id
275
			)
276
		)
277
	);
278
279
	do_action( 'give_payment_deleted', $payment_id );
280
}
281
282
/**
283
 * Undoes a donation, including the decrease of donations and earning stats. Used for when refunding or deleting a donation
284
 *
285
 * @since 1.0
286
 *
287
 * @param int $form_id Form (Post) ID
288
 * @param int $payment_id Payment ID
289
 *
290
 * @return void
291
 */
292
function give_undo_purchase( $form_id = false, $payment_id ) {
293
294
	if ( ! empty( $form_id ) ) {
295
		$form_id = false;
296
		_give_deprected_argument( 'form_id', 'give_undo_purchase', '1.5' );
297
	}
298
299
	$payment = new Give_Payment( $payment_id );
300
301
302
	$maybe_decrease_earnings = apply_filters( 'give_decrease_earnings_on_undo', true, $payment, $payment->form_id );
0 ignored issues
show
Documentation introduced by
The property $form_id is declared protected in Give_Payment. Since you implemented __get(), maybe consider adding a @property or @property-read annotation. This makes it easier for IDEs to provide auto-completion.

Since your code implements the magic setter _set, this function will be called for any write access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

Since the property has write access only, you can use the @property-write annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
303
	if ( true === $maybe_decrease_earnings ) {
304
		// decrease earnings
305
		give_decrease_earnings( $payment->form_id, $payment->total );
0 ignored issues
show
Documentation introduced by
The property $form_id is declared protected in Give_Payment. Since you implemented __get(), maybe consider adding a @property or @property-read annotation. This makes it easier for IDEs to provide auto-completion.

Since your code implements the magic setter _set, this function will be called for any write access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

Since the property has write access only, you can use the @property-write annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
Documentation introduced by
The property $total is declared protected in Give_Payment. Since you implemented __get(), maybe consider adding a @property or @property-read annotation. This makes it easier for IDEs to provide auto-completion.

Since your code implements the magic setter _set, this function will be called for any write access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

Since the property has write access only, you can use the @property-write annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
306
	}
307
308
	$maybe_decrease_sales = apply_filters( 'give_decrease_sales_on_undo', true, $payment, $payment->form_id );
0 ignored issues
show
Documentation introduced by
The property $form_id is declared protected in Give_Payment. Since you implemented __get(), maybe consider adding a @property or @property-read annotation. This makes it easier for IDEs to provide auto-completion.

Since your code implements the magic setter _set, this function will be called for any write access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

Since the property has write access only, you can use the @property-write annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
309
	if ( true === $maybe_decrease_sales ) {
310
		// decrease purchase count
311
		give_decrease_purchase_count( $payment->form_id );
0 ignored issues
show
Documentation introduced by
The property $form_id is declared protected in Give_Payment. Since you implemented __get(), maybe consider adding a @property or @property-read annotation. This makes it easier for IDEs to provide auto-completion.

Since your code implements the magic setter _set, this function will be called for any write access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

Since the property has write access only, you can use the @property-write annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
312
	}
313
314
}
315
316
317
/**
318
 * Count Payments
319
 *
320
 * Returns the total number of payments recorded.
321
 *
322
 * @since 1.0
323
 *
324
 * @param array $args
325
 *
326
 * @return array $count Number of payments sorted by payment status
327
 */
328
function give_count_payments( $args = array() ) {
329
330
	global $wpdb;
0 ignored issues
show
Compatibility Best Practice introduced by
Use of global functionality is not recommended; it makes your code harder to test, and less reusable.

Instead of relying on global state, we recommend one of these alternatives:

1. Pass all data via parameters

function myFunction($a, $b) {
    // Do something
}

2. Create a class that maintains your state

class MyClass {
    private $a;
    private $b;

    public function __construct($a, $b) {
        $this->a = $a;
        $this->b = $b;
    }

    public function myFunction() {
        // Do something
    }
}
Loading history...
331
332
	$defaults = array(
333
		'user'       => null,
334
		's'          => null,
335
		'start-date' => null,
336
		'end-date'   => null,
337
		'form_id'    => null,
338
	);
339
340
	$args = wp_parse_args( $args, $defaults );
341
342
	$select = "SELECT p.post_status,count( * ) AS num_posts";
343
	$join   = '';
344
	$where  = "WHERE p.post_type = 'give_payment'";
345
346
	// Count payments for a specific user
347
	if ( ! empty( $args['user'] ) ) {
348
349
		if ( is_email( $args['user'] ) ) {
350
			$field = 'email';
351
		} elseif ( is_numeric( $args['user'] ) ) {
352
			$field = 'id';
353
		} else {
354
			$field = '';
355
		}
356
357
		$join = "LEFT JOIN $wpdb->postmeta m ON (p.ID = m.post_id)";
358
359
		if ( ! empty( $field ) ) {
360
			$where .= "
361
				AND m.meta_key = '_give_payment_user_{$field}'
362
				AND m.meta_value = '{$args['user']}'";
363
		}
364
365
		// Count payments for a search
366
	} elseif ( ! empty( $args['s'] ) ) {
367
368
		if ( is_email( $args['s'] ) || strlen( $args['s'] ) == 32 ) {
369
370
			if ( is_email( $args['s'] ) ) {
371
				$field = '_give_payment_user_email';
372
			} else {
373
				$field = '_give_payment_purchase_key';
374
			}
375
376
			$join = "LEFT JOIN $wpdb->postmeta m ON (p.ID = m.post_id)";
377
			$where .= $wpdb->prepare( "
378
				AND m.meta_key = %s
379
				AND m.meta_value = %s",
380
				$field,
381
				$args['s']
382
			);
383
384
		} elseif ( '#' == substr( $args['s'], 0, 1 ) ) {
385
386
			$search = str_replace( '#:', '', $args['s'] );
387
			$search = str_replace( '#', '', $search );
388
389
			$select = "SELECT p2.post_status,count( * ) AS num_posts ";
390
			$join   = "LEFT JOIN $wpdb->postmeta m ON m.meta_key = '_give_log_payment_id' AND m.post_id = p.ID ";
391
			$join .= "INNER JOIN $wpdb->posts p2 ON m.meta_value = p2.ID ";
392
			$where = "WHERE p.post_type = 'give_log' ";
393
			$where .= $wpdb->prepare( "AND p.post_parent = %d} ", $search );
394
395
		} elseif ( is_numeric( $args['s'] ) ) {
396
397
			$join = "LEFT JOIN $wpdb->postmeta m ON (p.ID = m.post_id)";
398
			$where .= $wpdb->prepare( "
399
				AND m.meta_key = '_give_payment_user_id'
400
				AND m.meta_value = %d",
401
				$args['s']
402
			);
403
404
		} else {
405
			$search = $wpdb->esc_like( $args['s'] );
406
			$search = '%' . $search . '%';
407
408
			$where .= $wpdb->prepare( "AND ((p.post_title LIKE %s) OR (p.post_content LIKE %s))", $search, $search );
409
		}
410
411
	}
412
413
	if ( ! empty( $args['form_id'] ) && is_numeric( $args['form_id'] ) ) {
414
415
		$where .= $wpdb->prepare( " AND p.post_parent = %d", $args['form_id'] );
416
417
	}
418
	// Limit payments count by date
419
	if ( ! empty( $args['start-date'] ) && false !== strpos( $args['start-date'], '/' ) ) {
420
421
		$date_parts = explode( '/', $args['start-date'] );
422
		$month      = ! empty( $date_parts[0] ) && is_numeric( $date_parts[0] ) ? $date_parts[0] : 0;
423
		$day        = ! empty( $date_parts[1] ) && is_numeric( $date_parts[1] ) ? $date_parts[1] : 0;
424
		$year       = ! empty( $date_parts[2] ) && is_numeric( $date_parts[2] ) ? $date_parts[2] : 0;
425
426
		$is_date = checkdate( $month, $day, $year );
427
		if ( false !== $is_date ) {
428
429
			$date = new DateTime( $args['start-date'] );
430
			$where .= $wpdb->prepare( " AND p.post_date >= '%s'", $date->format( 'Y-m-d' ) );
431
432
		}
433
434
		// Fixes an issue with the payments list table counts when no end date is specified (partiy with stats class)
435
		if ( empty( $args['end-date'] ) ) {
436
			$args['end-date'] = $args['start-date'];
437
		}
438
439
	}
440
441
	if ( ! empty ( $args['end-date'] ) && false !== strpos( $args['end-date'], '/' ) ) {
442
443
		$date_parts = explode( '/', $args['end-date'] );
444
445
		$month = ! empty( $date_parts[0] ) ? $date_parts[0] : 0;
446
		$day   = ! empty( $date_parts[1] ) ? $date_parts[1] : 0;
447
		$year  = ! empty( $date_parts[2] ) ? $date_parts[2] : 0;
448
449
		$is_date = checkdate( $month, $day, $year );
450
		if ( false !== $is_date ) {
451
452
			$date = new DateTime( $args['end-date'] );
453
			$where .= $wpdb->prepare( " AND p.post_date <= '%s'", $date->format( 'Y-m-d' ) );
454
455
		}
456
457
	}
458
459
	$where = apply_filters( 'give_count_payments_where', $where );
460
	$join  = apply_filters( 'give_count_payments_join', $join );
461
462
	$query = "$select
463
		FROM $wpdb->posts p
464
		$join
465
		$where
466
		GROUP BY p.post_status
467
	";
468
469
	$cache_key = md5( $query );
470
471
	$count = wp_cache_get( $cache_key, 'counts' );
472
	if ( false !== $count ) {
473
		return $count;
474
	}
475
476
	$count = $wpdb->get_results( $query, ARRAY_A );
477
478
	$stats    = array();
479
	$statuses = get_post_stati();
480
	if ( isset( $statuses['private'] ) && empty( $args['s'] ) ) {
481
		unset( $statuses['private'] );
482
	}
483
484
	foreach ( $statuses as $state ) {
485
		$stats[ $state ] = 0;
486
	}
487
488
	foreach ( (array) $count as $row ) {
489
490
		if ( 'private' == $row['post_status'] && empty( $args['s'] ) ) {
491
			continue;
492
		}
493
494
		$stats[ $row['post_status'] ] = $row['num_posts'];
495
	}
496
497
	$stats = (object) $stats;
498
	wp_cache_set( $cache_key, $stats, 'counts' );
499
500
	return $stats;
501
}
502
503
504
/**
505
 * Check For Existing Payment
506
 *
507
 * @since 1.0
508
 *
509
 * @param int $payment_id Payment ID
510
 *
511
 * @return bool true if payment exists, false otherwise
512
 */
513
function give_check_for_existing_payment( $payment_id ) {
514
	$exists  = false;
515
	$payment = new Give_Payment( $payment_id );
516
517
518
	if ( $payment_id === $payment->ID && 'publish' === $payment->status ) {
0 ignored issues
show
Documentation introduced by
The property $status is declared protected in Give_Payment. Since you implemented __get(), maybe consider adding a @property or @property-read annotation. This makes it easier for IDEs to provide auto-completion.

Since your code implements the magic setter _set, this function will be called for any write access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

Since the property has write access only, you can use the @property-write annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
519
		$exists = true;
520
	}
521
522
	return $exists;
523
}
524
525
/**
526
 * Get Payment Status
527
 *
528
 * @since 1.0
529
 *
530
 * @param WP_Post $payment
531
 * @param bool $return_label Whether to return the donation status or not
532
 *
533
 * @return bool|mixed if payment status exists, false otherwise
534
 */
535
function give_get_payment_status( $payment, $return_label = false ) {
536
537
	if ( ! is_object( $payment ) || ! isset( $payment->post_status ) ) {
538
		return false;
539
	}
540
541
	$statuses = give_get_payment_statuses();
542
543
	if ( ! is_array( $statuses ) || empty( $statuses ) ) {
544
		return false;
545
	}
546
547
	$payment = new Give_Payment( $payment->ID );
548
549
	if ( array_key_exists( $payment->status, $statuses ) ) {
0 ignored issues
show
Documentation introduced by
The property $status is declared protected in Give_Payment. Since you implemented __get(), maybe consider adding a @property or @property-read annotation. This makes it easier for IDEs to provide auto-completion.

Since your code implements the magic setter _set, this function will be called for any write access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

Since the property has write access only, you can use the @property-write annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
550
		if ( true === $return_label ) {
551
			return $statuses[ $payment->status ];
0 ignored issues
show
Documentation introduced by
The property $status is declared protected in Give_Payment. Since you implemented __get(), maybe consider adding a @property or @property-read annotation. This makes it easier for IDEs to provide auto-completion.

Since your code implements the magic setter _set, this function will be called for any write access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

Since the property has write access only, you can use the @property-write annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
552
		} else {
553
			// Account that our 'publish' status is labeled 'Complete'
554
			$post_status = 'publish' == $payment->status ? 'Complete' : $payment->post_status;
0 ignored issues
show
Documentation introduced by
The property $status is declared protected in Give_Payment. Since you implemented __get(), maybe consider adding a @property or @property-read annotation. This makes it easier for IDEs to provide auto-completion.

Since your code implements the magic setter _set, this function will be called for any write access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

Since the property has write access only, you can use the @property-write annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
Documentation introduced by
The property $post_status is declared protected in Give_Payment. Since you implemented __get(), maybe consider adding a @property or @property-read annotation. This makes it easier for IDEs to provide auto-completion.

Since your code implements the magic setter _set, this function will be called for any write access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

Since the property has write access only, you can use the @property-write annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
555
556
			// Make sure we're matching cases, since they matter
557
			return array_search( strtolower( $post_status ), array_map( 'strtolower', $statuses ) );
558
		}
559
	}
560
561
	return false;
562
}
563
564
/**
565
 * Retrieves all available statuses for payments.
566
 *
567
 * @since 1.0
568
 * @return array $payment_status All the available payment statuses
569
 */
570
function give_get_payment_statuses() {
571
	$payment_statuses = array(
572
		'pending'     => __( 'Pending', 'give' ),
573
		'publish'     => __( 'Complete', 'give' ),
574
		'refunded'    => __( 'Refunded', 'give' ),
575
		'failed'      => __( 'Failed', 'give' ),
576
		'cancelled'   => __( 'Cancelled', 'give' ),
577
		'abandoned'   => __( 'Abandoned', 'give' ),
578
		'preapproval' => __( 'Pre-Approved', 'give' ),
579
		'revoked'     => __( 'Revoked', 'give' )
580
	);
581
582
	return apply_filters( 'give_payment_statuses', $payment_statuses );
583
}
584
585
/**
586
 * Get Payment Status Keys
587
 *
588 34
 * @description Retrieves keys for all available statuses for payments
589 34
 *
590 34
 * @since       1.0
591 34
 * @return array $payment_status All the available payment statuses
592 34
 */
593 34
function give_get_payment_status_keys() {
594 34
	$statuses = array_keys( give_get_payment_statuses() );
595 34
	asort( $statuses );
596 34
597
	return array_values( $statuses );
598 34
}
599
600
/**
601
 * Get Earnings By Date
602
 *
603
 * @since 1.0
604
 *
605
 * @param int $day Day number
606
 * @param int $month_num Month number
607
 * @param int $year Year
608
 * @param int $hour Hour
609
 *
610
 * @return int $earnings Earnings
611
 */
612
function give_get_earnings_by_date( $day = null, $month_num, $year = null, $hour = null ) {
613
614
	// This is getting deprecated soon. Use Give_Payment_Stats with the get_earnings() method instead
615
616
	global $wpdb;
0 ignored issues
show
Compatibility Best Practice introduced by
Use of global functionality is not recommended; it makes your code harder to test, and less reusable.

Instead of relying on global state, we recommend one of these alternatives:

1. Pass all data via parameters

function myFunction($a, $b) {
    // Do something
}

2. Create a class that maintains your state

class MyClass {
    private $a;
    private $b;

    public function __construct($a, $b) {
        $this->a = $a;
        $this->b = $b;
    }

    public function myFunction() {
        // Do something
    }
}
Loading history...
617
618
	$args = array(
619
		'post_type'              => 'give_payment',
620
		'nopaging'               => true,
621
		'year'                   => $year,
622
		'monthnum'               => $month_num,
623
		'post_status'            => array( 'publish', 'revoked' ),
624
		'fields'                 => 'ids',
625
		'update_post_term_cache' => false
626
	);
627
	if ( ! empty( $day ) ) {
628
		$args['day'] = $day;
629
	}
630
631
	if ( ! empty( $hour ) ) {
632
		$args['hour'] = $hour;
633
	}
634
635
	$args = apply_filters( 'give_get_earnings_by_date_args', $args );
636
	$key  = 'give_stats_' . substr( md5( serialize( $args ) ), 0, 15 );
637
638
	if ( ! empty( $_GET['_wpnonce'] ) && wp_verify_nonce( $_GET['_wpnonce'], 'give-refresh-reports' ) ) {
639
		$earnings = false;
640
	} else {
641
		$earnings = get_transient( $key );
642
	}
643
644
	if ( false === $earnings ) {
645
		$sales    = get_posts( $args );
646
		$earnings = 0;
647
		if ( $sales ) {
648
			$sales = implode( ',', $sales );
649
650
			$earnings = $wpdb->get_var( "SELECT SUM(meta_value) FROM $wpdb->postmeta WHERE meta_key = '_give_payment_total' AND post_id IN ({$sales})" );
651
652
		}
653
		// Cache the results for one hour
654
		set_transient( $key, $earnings, HOUR_IN_SECONDS );
655
	}
656
657
	return round( $earnings, 2 );
658
}
659
660
/**
661
 * Get Donations (sales) By Date
662
 *
663
 * @since  1.0
664
 *
665
 * @param int $day Day number
666
 * @param int $month_num Month number
667
 * @param int $year Year
668
 * @param int $hour Hour
669
 *
670
 * @return int $count Sales
671
 */
672
function give_get_sales_by_date( $day = null, $month_num = null, $year = null, $hour = null ) {
673
674
	// This is getting deprecated soon. Use Give_Payment_Stats with the get_sales() method instead
675
	$args = array(
676
		'post_type'              => 'give_payment',
677
		'nopaging'               => true,
678
		'year'                   => $year,
679
		'fields'                 => 'ids',
680
		'post_status'            => array( 'publish', 'revoked' ),
681
		'update_post_meta_cache' => false,
682
		'update_post_term_cache' => false
683
	);
684
685
	$show_free = apply_filters( 'give_sales_by_date_show_free', true, $args );
686
687
	if ( false === $show_free ) {
688
		$args['meta_query'] = array(
689
			array(
690
				'key'     => '_give_payment_total',
691
				'value'   => 0,
692
				'compare' => '>',
693
				'type'    => 'NUMERIC',
694
			),
695
		);
696
	}
697
698
	if ( ! empty( $month_num ) ) {
699
		$args['monthnum'] = $month_num;
700
	}
701
702
	if ( ! empty( $day ) ) {
703
		$args['day'] = $day;
704
	}
705
706
	if ( ! empty( $hour ) ) {
707
		$args['hour'] = $hour;
708
	}
709
710
	$args = apply_filters( 'give_get_sales_by_date_args', $args );
711
712
	$key = 'give_stats_' . substr( md5( serialize( $args ) ), 0, 15 );
713
714
	if ( ! empty( $_GET['_wpnonce'] ) && wp_verify_nonce( $_GET['_wpnonce'], 'give-refresh-reports' ) ) {
715
		$count = false;
716
	} else {
717
		$count = get_transient( $key );
718
	}
719
720
	if ( false === $count ) {
721
		$sales = new WP_Query( $args );
722
		$count = (int) $sales->post_count;
723
		// Cache the results for one hour
724
		set_transient( $key, $count, HOUR_IN_SECONDS );
725
	}
726
727
	return $count;
728
}
729
730
/**
731
 * Checks whether a payment has been marked as complete.
732
 *
733
 * @since 1.0
734
 *
735
 * @param int $payment_id Payment ID to check against
736
 *
737
 * @return bool true if complete, false otherwise
738
 */
739
function give_is_payment_complete( $payment_id ) {
740
	$payment = new Give_Payment( $payment_id );
741
742
	$ret = false;
743
744
	if ( $payment->ID > 0 ) {
745
746
		if ( (int) $payment_id === (int) $payment->ID && 'publish' == $payment->status ) {
0 ignored issues
show
Documentation introduced by
The property $status is declared protected in Give_Payment. Since you implemented __get(), maybe consider adding a @property or @property-read annotation. This makes it easier for IDEs to provide auto-completion.

Since your code implements the magic setter _set, this function will be called for any write access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

Since the property has write access only, you can use the @property-write annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
747
			$ret = true;
748
		}
749
750
	}
751
752
	return apply_filters( 'give_is_payment_complete', $ret, $payment_id, $payment->post_status );
0 ignored issues
show
Documentation introduced by
The property $post_status is declared protected in Give_Payment. Since you implemented __get(), maybe consider adding a @property or @property-read annotation. This makes it easier for IDEs to provide auto-completion.

Since your code implements the magic setter _set, this function will be called for any write access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

Since the property has write access only, you can use the @property-write annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
753
}
754
755
/**
756
 * Get Total Sales (Donations)
757
 *
758
 * @since 1.0
759
 * @return int $count Total sales
760
 */
761
function give_get_total_sales() {
762
763
	$payments = give_count_payments();
764
765
	return $payments->revoked + $payments->publish;
766
}
767
768
/**
769
 * Get Total Earnings
770
 *
771 34
 * @since 1.0
772
 * @return float $total Total earnings
773
 */
774 34
function give_get_total_earnings() {
775
776 34
	$total = get_option( 'give_earnings_total', false );
777
778 34
	// If no total stored in DB, use old method of calculating total earnings
779
	if ( false === $total ) {
780 34
781
		global $wpdb;
0 ignored issues
show
Compatibility Best Practice introduced by
Use of global functionality is not recommended; it makes your code harder to test, and less reusable.

Instead of relying on global state, we recommend one of these alternatives:

1. Pass all data via parameters

function myFunction($a, $b) {
    // Do something
}

2. Create a class that maintains your state

class MyClass {
    private $a;
    private $b;

    public function __construct($a, $b) {
        $this->a = $a;
        $this->b = $b;
    }

    public function myFunction() {
        // Do something
    }
}
Loading history...
782 34
783
		$total = get_transient( 'give_earnings_total' );
784 34
785 34
		if ( false === $total ) {
786 34
787 34
			$total = (float) 0;
788
789 34
			$args = apply_filters( 'give_get_total_earnings_args', array(
790
				'offset' => 0,
791
				'number' => - 1,
792 34
				'status' => array( 'publish', 'revoked' ),
793 34
				'fields' => 'ids'
794
			) );
795
796
797
			$payments = give_get_payments( $args );
798
			if ( $payments ) {
799
800
				/*
801 34
				 * If performing a purchase, we need to skip the very last payment in the database, since it calls
802 34
				 * give_increase_total_earnings() on completion, which results in duplicated earnings for the very
803 34
				 * first purchase
804
				 */
805 34
806
				if ( did_action( 'give_update_payment_status' ) ) {
807
					array_pop( $payments );
808
				}
809
810 34
				if ( ! empty( $payments ) ) {
811
					$payments = implode( ',', $payments );
812
					$total += $wpdb->get_var( "SELECT SUM(meta_value) FROM $wpdb->postmeta WHERE meta_key = '_give_payment_total' AND post_id IN({$payments})" );
813 34
				}
814
815
			}
816 34
817 34
			// Cache results for 1 day. This cache is cleared automatically when a payment is made
818 34
			set_transient( 'give_earnings_total', $total, 86400 );
819
820 34
			// Store the total for the first time
821
			update_option( 'give_earnings_total', $total );
822
		}
823
	}
824 34
825
	if ( $total < 0 ) {
826
		$total = 0; // Don't ever show negative earnings
827
	}
828
829
	return apply_filters( 'give_total_earnings', round( $total, give_currency_decimal_filter() ) );
830
}
831
832
/**
833
 * Increase the Total Earnings
834
 *
835
 * @since 1.0
836
 *
837 34
 * @param $amount int The amount you would like to increase the total earnings by.
838 34
 *
839 34
 * @return float $total Total earnings
840
 */
841 34
function give_increase_total_earnings( $amount = 0 ) {
842
	$total = give_get_total_earnings();
843
	$total += $amount;
844
	update_option( 'give_earnings_total', $total );
845
846
	return $total;
847
}
848
849
/**
850
 * Decrease the Total Earnings
851
 *
852
 * @since 1.0
853
 *
854
 * @param $amount int The amount you would like to decrease the total earnings by.
855
 *
856
 * @return float $total Total earnings
857
 */
858
function give_decrease_total_earnings( $amount = 0 ) {
859
	$total = give_get_total_earnings();
860
	$total -= $amount;
861
	if ( $total < 0 ) {
862
		$total = 0;
863
	}
864
	update_option( 'give_earnings_total', $total );
865
866
	return $total;
867
}
868
869
/**
870
 * Get Payment Meta for a specific Payment
871
 *
872
 * @since 1.0
873
 *
874
 * @param int $payment_id Payment ID
875
 * @param string $meta_key The meta key to pull
876
 * @param bool $single Pull single meta entry or as an object
877 34
 *
878
 * @return mixed $meta Payment Meta
879 34
 */
880
function give_get_payment_meta( $payment_id = 0, $meta_key = '_give_payment_meta', $single = true ) {
881 34
	$payment = new Give_Payment( $payment_id );
882 34
883 34
	return $payment->get_meta( $meta_key, $single );
884
}
885 34
886 34
/**
887 34
 * Update the meta for a payment
888
 *
889 34
 * @param  integer $payment_id Payment ID
890 34
 * @param  string $meta_key Meta key to update
891 34
 * @param  string $meta_value Value to update to
892 34
 * @param  string $prev_value Previous value
893
 *
894 34
 * @return mixed               Meta ID if successful, false if unsuccessful
895
 */
896 34
function give_update_payment_meta( $payment_id = 0, $meta_key = '', $meta_value = '', $prev_value = '' ) {
897
	$payment = new Give_Payment( $payment_id );
898
899
	return $payment->update_meta( $meta_key, $meta_value, $prev_value );
900
}
901
902
/**
903
 * Get the user_info Key from Payment Meta
904
 *
905
 * @since 1.0
906
 *
907
 * @param int $payment_id Payment ID
908
 *
909
 * @return array $user_info User Info Meta Values
910
 */
911 34
function give_get_payment_meta_user_info( $payment_id ) {
912
	$payment = new Give_Payment( $payment_id );
913
914
	return $payment->user_info;
0 ignored issues
show
Documentation introduced by
The property $user_info is declared private in Give_Payment. Since you implemented __get(), maybe consider adding a @property or @property-read annotation. This makes it easier for IDEs to provide auto-completion.

Since your code implements the magic setter _set, this function will be called for any write access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

Since the property has write access only, you can use the @property-write annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
915 34
}
916
917
/**
918
 * Get the donations Key from Payment Meta
919
 *
920
 * @description Retrieves the form_id from a (Previously titled give_get_payment_meta_donations)
921
 * @since       1.0
922
 *
923 34
 * @param int $payment_id Payment ID
924
 *
925 34
 * @return int $form_id
926 34
 */
927
function give_get_payment_form_id( $payment_id ) {
928 34
	$payment = new Give_Payment( $payment_id );
929 34
930
	return $payment->form_id;
0 ignored issues
show
Documentation introduced by
The property $form_id is declared protected in Give_Payment. Since you implemented __get(), maybe consider adding a @property or @property-read annotation. This makes it easier for IDEs to provide auto-completion.

Since your code implements the magic setter _set, this function will be called for any write access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

Since the property has write access only, you can use the @property-write annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
931 34
}
932 34
933
/**
934 34
 * Get the user email associated with a payment
935
 *
936 34
 * @since 1.0
937
 *
938 34
 * @param int $payment_id Payment ID
939
 *
940
 * @return string $email User Email
941
 */
942
function give_get_payment_user_email( $payment_id ) {
943
	$payment = new Give_Payment( $payment_id );
944
945
	return $payment->email;
0 ignored issues
show
Documentation introduced by
The property $email is declared protected in Give_Payment. Since you implemented __get(), maybe consider adding a @property or @property-read annotation. This makes it easier for IDEs to provide auto-completion.

Since your code implements the magic setter _set, this function will be called for any write access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

Since the property has write access only, you can use the @property-write annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
946
}
947
948
/**
949
 * Is the payment provided associated with a user account
950
 *
951 34
 * @since  1.3
952 34
 *
953
 * @param  int $payment_id The payment ID
954 34
 *
955
 * @return bool            If the payment is associated with a user (false) or not (true)
956
 */
957
function give_is_guest_payment( $payment_id ) {
958
	$payment_user_id  = give_get_payment_user_id( $payment_id );
959
	$is_guest_payment = ! empty( $payment_user_id ) && $payment_user_id > 0 ? false : true;
960
961
	return (bool) apply_filters( 'give_is_guest_payment', $is_guest_payment, $payment_id );
962
}
963
964
/**
965
 * Get the user ID associated with a payment
966
 *
967
 * @since 1.3
968
 *
969
 * @param int $payment_id Payment ID
970
 *
971
 * @return string $user_id User ID
972
 */
973
function give_get_payment_user_id( $payment_id ) {
974
	$payment = new Give_Payment( $payment_id );
975
976
	return $payment->user_id;
0 ignored issues
show
Documentation introduced by
The property $user_id is declared protected in Give_Payment. Since you implemented __get(), maybe consider adding a @property or @property-read annotation. This makes it easier for IDEs to provide auto-completion.

Since your code implements the magic setter _set, this function will be called for any write access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

Since the property has write access only, you can use the @property-write annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
977
}
978
979
/**
980
 * Get the donor ID associated with a payment
981
 *
982
 * @since 1.0
983
 *
984
 * @param int $payment_id Payment ID
985 34
 *
986
 * @return string $customer_id Customer ID
987 34
 */
988
function give_get_payment_customer_id( $payment_id ) {
989
	$payment = new Give_Payment( $payment_id );
990
991
	return $payment->customer_id;
0 ignored issues
show
Documentation introduced by
The property $customer_id is declared protected in Give_Payment. Since you implemented __get(), maybe consider adding a @property or @property-read annotation. This makes it easier for IDEs to provide auto-completion.

Since your code implements the magic setter _set, this function will be called for any write access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

Since the property has write access only, you can use the @property-write annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
992
}
993
994
/**
995
 * Get the IP address used to make a purchase
996
 *
997
 * @since 1.0
998
 *
999
 * @param int $payment_id Payment ID
1000
 *
1001
 * @return string $ip User IP
1002
 */
1003
function give_get_payment_user_ip( $payment_id ) {
1004
	$payment = new Give_Payment( $payment_id );
1005
1006
	return $payment->ip;
0 ignored issues
show
Documentation introduced by
The property $ip is declared protected in Give_Payment. Since you implemented __get(), maybe consider adding a @property or @property-read annotation. This makes it easier for IDEs to provide auto-completion.

Since your code implements the magic setter _set, this function will be called for any write access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

Since the property has write access only, you can use the @property-write annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
1007
}
1008
1009
/**
1010
 * Get the date a payment was completed
1011
 *
1012
 * @since 1.0
1013
 *
1014
 * @param int $payment_id Payment ID
1015
 *
1016
 * @return string $date The date the payment was completed
1017
 */
1018
function give_get_payment_completed_date( $payment_id = 0 ) {
1019
	$payment = new Give_Payment( $payment_id );
1020
1021
	return $payment->completed_date;
0 ignored issues
show
Documentation introduced by
The property $completed_date is declared protected in Give_Payment. Since you implemented __get(), maybe consider adding a @property or @property-read annotation. This makes it easier for IDEs to provide auto-completion.

Since your code implements the magic setter _set, this function will be called for any write access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

Since the property has write access only, you can use the @property-write annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
1022
}
1023
1024
/**
1025
 * Get the gateway associated with a payment
1026
 *
1027
 * @since 1.0
1028
 *
1029
 * @param int $payment_id Payment ID
1030
 *
1031
 * @return string $gateway Gateway
1032
 */
1033
function give_get_payment_gateway( $payment_id ) {
1034
	$payment = new Give_Payment( $payment_id );
1035
1036
	return $payment->gateway;
0 ignored issues
show
Documentation introduced by
The property $gateway is declared protected in Give_Payment. Since you implemented __get(), maybe consider adding a @property or @property-read annotation. This makes it easier for IDEs to provide auto-completion.

Since your code implements the magic setter _set, this function will be called for any write access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

Since the property has write access only, you can use the @property-write annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
1037
}
1038
1039
/**
1040
 * Get the currency code a payment was made in
1041
 *
1042
 * @since 1.0
1043
 *
1044
 * @param int $payment_id Payment ID
1045
 *
1046
 * @return string $currency The currency code
1047
 */
1048
function give_get_payment_currency_code( $payment_id = 0 ) {
1049
	$payment = new Give_Payment( $payment_id );
1050
1051
	return $payment->currency;
0 ignored issues
show
Documentation introduced by
The property $currency is declared protected in Give_Payment. Since you implemented __get(), maybe consider adding a @property or @property-read annotation. This makes it easier for IDEs to provide auto-completion.

Since your code implements the magic setter _set, this function will be called for any write access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

Since the property has write access only, you can use the @property-write annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
1052
}
1053
1054
/**
1055
 * Get the currency name a payment was made in
1056
 *
1057
 * @since 1.0
1058
 *
1059 34
 * @param int $payment_id Payment ID
1060
 *
1061 34
 * @return string $currency The currency name
1062
 */
1063
function give_get_payment_currency( $payment_id = 0 ) {
1064
	$currency = give_get_payment_currency_code( $payment_id );
1065
1066
	return apply_filters( 'give_payment_currency', give_get_currency_name( $currency ), $payment_id );
1067
}
1068
1069
/**
1070
 * Get the purchase key for a purchase
1071
 *
1072
 * @since 1.0
1073
 *
1074
 * @param int $payment_id Payment ID
1075
 *
1076
 * @return string $key Purchase key
1077
 */
1078
function give_get_payment_key( $payment_id = 0 ) {
1079
	$payment = new Give_Payment( $payment_id );
1080
1081
	return $payment->key;
0 ignored issues
show
Documentation introduced by
The property $key is declared protected in Give_Payment. Since you implemented __get(), maybe consider adding a @property or @property-read annotation. This makes it easier for IDEs to provide auto-completion.

Since your code implements the magic setter _set, this function will be called for any write access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

Since the property has write access only, you can use the @property-write annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
1082
}
1083
1084
/**
1085
 * Get the payment order number
1086
 *
1087
 * This will return the payment ID if sequential order numbers are not enabled or the order number does not exist
1088
 *
1089
 * @since 1.0
1090 34
 *
1091
 * @param int $payment_id Payment ID
1092 34
 *
1093
 * @return string $number Payment order number
1094
 */
1095
function give_get_payment_number( $payment_id = 0 ) {
1096 34
	$payment = new Give_Payment( $payment_id );
1097
1098 34
	return $payment->number;
0 ignored issues
show
Documentation introduced by
The property $number is declared protected in Give_Payment. Since you implemented __get(), maybe consider adding a @property or @property-read annotation. This makes it easier for IDEs to provide auto-completion.

Since your code implements the magic setter _set, this function will be called for any write access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

Since the property has write access only, you can use the @property-write annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
1099
}
1100
1101
/**
1102
 * Formats the payment number with the prefix and postfix
1103
 *
1104
 * @since  1.3
1105
 *
1106
 * @param  int $number The payment number to format
1107
 *
1108
 * @return string      The formatted payment number
1109
 */
1110
function give_format_payment_number( $number ) {
1111 34
1112
	if ( ! give_get_option( 'enable_sequential' ) ) {
1113 34
		return $number;
1114
	}
1115
1116
	if ( ! is_numeric( $number ) ) {
1117
		return $number;
1118
	}
1119
1120
	$prefix  = give_get_option( 'sequential_prefix' );
1121
	$number  = absint( $number );
1122
	$postfix = give_get_option( 'sequential_postfix' );
1123
1124
	$formatted_number = $prefix . $number . $postfix;
1125
1126 34
	return apply_filters( 'give_format_payment_number', $formatted_number, $prefix, $number, $postfix );
1127 34
}
1128
1129 34
/**
1130
 * Gets the next available order number
1131
 *
1132
 * This is used when inserting a new payment
1133
 *
1134
 * @since 1.0
1135
 * @return string $number The next available payment number
1136
 */
1137
function give_get_next_payment_number() {
1138
1139
	if ( ! give_get_option( 'enable_sequential' ) ) {
1140
		return false;
1141
	}
1142
1143
	$number           = get_option( 'give_last_payment_number' );
1144
	$start            = give_get_option( 'sequential_start', 1 );
1145
	$increment_number = true;
1146
1147
	if ( false !== $number ) {
1148
1149
		if ( empty( $number ) ) {
1150
1151
			$number           = $start;
1152
			$increment_number = false;
1153
1154
		}
1155
1156
	} else {
1157 34
1158
		// This case handles the first addition of the new option, as well as if it get's deleted for any reason
1159 34
		$payments     = new Give_Payments_Query( array(
1160
			'number'  => 1,
1161
			'order'   => 'DESC',
1162
			'orderby' => 'ID',
1163
			'output'  => 'posts',
1164
			'fields'  => 'ids'
1165
		) );
1166
		$last_payment = $payments->get_payments();
1167
1168
		if ( ! empty( $last_payment ) ) {
1169
1170
			$number = give_get_payment_number( $last_payment[0] );
1171
1172
		}
1173
1174
		if ( ! empty( $number ) && $number !== (int) $last_payment[0] ) {
1175 34
1176
			$number = give_remove_payment_prefix_postfix( $number );
1177 34
1178
		} else {
1179
1180
			$number           = $start;
1181
			$increment_number = false;
1182
		}
1183
1184
	}
1185
1186
	$increment_number = apply_filters( 'give_increment_payment_number', $increment_number, $number );
1187
1188
	if ( $increment_number ) {
1189 34
		$number ++;
1190
	}
1191
1192
	return apply_filters( 'give_get_next_payment_number', $number );
1193
}
1194
1195
/**
1196
 * Given a given a number, remove the pre/postfix
1197
 *
1198
 * @since  1.3
1199
 *
1200
 * @param  string $number The formatted Current Number to increment
1201
 *
1202
 * @return string          The new Payment number without prefix and postfix
1203
 */
1204
function give_remove_payment_prefix_postfix( $number ) {
1205
1206
	$prefix  = give_get_option( 'sequential_prefix' );
1207
	$postfix = give_get_option( 'sequential_postfix' );
1208
1209
	// Remove prefix
1210
	$number = preg_replace( '/' . $prefix . '/', '', $number, 1 );
1211
1212
	// Remove the postfix
1213
	$length      = strlen( $number );
1214
	$postfix_pos = strrpos( $number, $postfix );
1215
	if ( false !== $postfix_pos ) {
1216
		$number = substr_replace( $number, '', $postfix_pos, $length );
1217
	}
1218
1219
	// Ensure it's a whole number
1220
	$number = intval( $number );
1221
1222
	return apply_filters( 'give_remove_payment_prefix_postfix', $number, $prefix, $postfix );
1223
1224
}
1225
1226
1227
/**
1228
 * Get Payment Amount
1229
 *
1230
 * @description Get the fully formatted payment amount. The payment amount is retrieved using give_get_payment_amount() and is then sent through give_currency_filter() and  give_format_amount() to format the amount correctly.
1231
 *
1232
 * @since       1.0
1233
 *
1234
 * @param int $payment_id Payment ID
1235
 *
1236
 * @return string $amount Fully formatted payment amount
1237
 */
1238
function give_payment_amount( $payment_id = 0 ) {
1239
	$amount = give_get_payment_amount( $payment_id );
1240
1241
	return give_currency_filter( give_format_amount( $amount ), give_get_payment_currency_code( $payment_id ) );
1242
}
1243
1244
/**
1245
 * Get the amount associated with a payment
1246
 *
1247
 * @access public
1248
 * @since  1.0
1249
 *
1250
 * @param int $payment_id Payment ID
1251
 *
1252
 * @return mixed|void
1253
 */
1254
function give_get_payment_amount( $payment_id ) {
1255
1256
	$payment = new Give_Payment( $payment_id );
1257
1258
	return apply_filters( 'give_payment_amount', floatval( $payment->total ), $payment_id );
0 ignored issues
show
Documentation introduced by
The property $total is declared protected in Give_Payment. Since you implemented __get(), maybe consider adding a @property or @property-read annotation. This makes it easier for IDEs to provide auto-completion.

Since your code implements the magic setter _set, this function will be called for any write access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

Since the property has write access only, you can use the @property-write annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
1259
}
1260
1261
/**
1262
 * Payment Subtotal
1263
 *
1264
 * @description: Retrieves subtotal for payment (this is the amount before fees) and then returns a full formatted amount. This function essentially calls give_get_payment_subtotal()
1265
 *
1266
 * @since 1.5
1267
 *
1268
 * @param int $payment_id Payment ID
1269
 *
1270
 * @see give_get_payment_subtotal()
1271
 *
1272
 * @return array Fully formatted payment subtotal
1273
 */
1274
function give_payment_subtotal( $payment_id = 0 ) {
1275
	$subtotal = give_get_payment_subtotal( $payment_id );
1276
1277
	return give_currency_filter( give_format_amount( $subtotal ), give_get_payment_currency_code( $payment_id ) );
1278
}
1279
1280
/**
1281
 * Get Payment Subtotal
1282
 *
1283
 * @description: Retrieves subtotal for payment (this is the amount before fees) and then returns a non formatted amount.
1284
 *
1285
 * @since 1.5
1286
 *
1287
 * @param int $payment_id Payment ID
1288
 *
1289
 * @return float $subtotal Subtotal for payment (non formatted)
1290
 */
1291
function give_get_payment_subtotal( $payment_id = 0 ) {
1292
	$payment = new G_Payment( $payment_id );
1293
1294
	return $payment->subtotal;
1295
}
1296
1297
/**
1298
 * Retrieves arbitrary fees for the payment
1299
 *
1300
 * @since 1.5
1301
 *
1302
 * @param int $payment_id Payment ID
1303
 * @param string $type Fee type
1304
 *
1305
 * @return mixed array if payment fees found, false otherwise
1306
 */
1307
function give_get_payment_fees( $payment_id = 0, $type = 'all' ) {
1308
	$payment = new Give_Payment( $payment_id );
1309
1310
	return $payment->get_fees( $type );
1311
}
1312
1313
/**
1314
 * Retrieves the transaction ID for the given payment
1315
 *
1316
 * @since  1.0
1317
 *
1318
 * @param int $payment_id Payment ID
1319
 *
1320
 * @return string The Transaction ID
1321
 */
1322
function give_get_payment_transaction_id( $payment_id = 0 ) {
1323
	$payment = new Give_Payment( $payment_id );
1324
1325
	return $payment->transaction_id;
0 ignored issues
show
Documentation introduced by
The property $transaction_id is declared protected in Give_Payment. Since you implemented __get(), maybe consider adding a @property or @property-read annotation. This makes it easier for IDEs to provide auto-completion.

Since your code implements the magic setter _set, this function will be called for any write access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

Since the property has write access only, you can use the @property-write annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
1326
}
1327
1328
/**
1329
 * Sets a Transaction ID in post meta for the given Payment ID
1330
 *
1331
 * @since  1.0
1332
 *
1333
 * @param int $payment_id Payment ID
1334
 * @param string $transaction_id The transaction ID from the gateway
1335
 *
1336
 * @return bool|mixed
1337
 */
1338
function give_set_payment_transaction_id( $payment_id = 0, $transaction_id = '' ) {
1339
1340
	if ( empty( $payment_id ) || empty( $transaction_id ) ) {
1341
		return false;
1342
	}
1343
1344
	$transaction_id = apply_filters( 'give_set_payment_transaction_id', $transaction_id, $payment_id );
1345
1346
	return give_update_payment_meta( $payment_id, '_give_payment_transaction_id', $transaction_id );
1347 34
}
1348
1349 34
/**
1350 1
 * Retrieve the purchase ID based on the purchase key
1351 1
 *
1352
 * @since 1.0
1353 1
 * @global object $wpdb Used to query the database using the WordPress
1354
 *                      Database API
1355
 *
1356 1
 * @param string $key the purchase key to search for
1357
 *
1358 34
 * @return int $purchase Purchase ID
1359
 */
1360
function give_get_purchase_id_by_key( $key ) {
1361
	global $wpdb;
0 ignored issues
show
Compatibility Best Practice introduced by
Use of global functionality is not recommended; it makes your code harder to test, and less reusable.

Instead of relying on global state, we recommend one of these alternatives:

1. Pass all data via parameters

function myFunction($a, $b) {
    // Do something
}

2. Create a class that maintains your state

class MyClass {
    private $a;
    private $b;

    public function __construct($a, $b) {
        $this->a = $a;
        $this->b = $b;
    }

    public function myFunction() {
        // Do something
    }
}
Loading history...
1362
1363
	$purchase = $wpdb->get_var( $wpdb->prepare( "SELECT post_id FROM $wpdb->postmeta WHERE meta_key = '_give_payment_purchase_key' AND meta_value = %s LIMIT 1", $key ) );
1364
1365
	if ( $purchase != null ) {
1366
		return $purchase;
1367
	}
1368
1369
	return 0;
1370
}
1371
1372
1373 10
/**
1374 10
 * Retrieve the purchase ID based on the transaction ID
1375
 *
1376 10
 * @since 1.3
1377
 * @global object $wpdb Used to query the database using the WordPress
1378 10
 *                      Database API
1379 10
 *
1380
 * @param string $key the transaction ID to search for
1381 10
 *
1382
 * @return int $purchase Purchase ID
1383 10
 */
1384
function give_get_purchase_id_by_transaction_id( $key ) {
1385
	global $wpdb;
0 ignored issues
show
Compatibility Best Practice introduced by
Use of global functionality is not recommended; it makes your code harder to test, and less reusable.

Instead of relying on global state, we recommend one of these alternatives:

1. Pass all data via parameters

function myFunction($a, $b) {
    // Do something
}

2. Create a class that maintains your state

class MyClass {
    private $a;
    private $b;

    public function __construct($a, $b) {
        $this->a = $a;
        $this->b = $b;
    }

    public function myFunction() {
        // Do something
    }
}
Loading history...
1386
1387
	$purchase = $wpdb->get_var( $wpdb->prepare( "SELECT post_id FROM $wpdb->postmeta WHERE meta_key = '_give_payment_transaction_id' AND meta_value = %s LIMIT 1", $key ) );
1388
1389
	if ( $purchase != null ) {
1390
		return $purchase;
1391
	}
1392
1393
	return 0;
1394
}
1395
1396
/**
1397
 * Retrieve all notes attached to a purchase
1398
 *
1399
 * @since 1.0
1400
 *
1401
 * @param int $payment_id The payment ID to retrieve notes for
1402
 * @param string $search Search for notes that contain a search term
1403
 *
1404
 * @return array $notes Payment Notes
1405
 */
1406
function give_get_payment_notes( $payment_id = 0, $search = '' ) {
1407
1408
	if ( empty( $payment_id ) && empty( $search ) ) {
1409
		return false;
1410
	}
1411
1412
	remove_action( 'pre_get_comments', 'give_hide_payment_notes', 10 );
1413
	remove_filter( 'comments_clauses', 'give_hide_payment_notes_pre_41', 10, 2 );
1414
1415
	$notes = get_comments( array( 'post_id' => $payment_id, 'order' => 'ASC', 'search' => $search ) );
1416
1417
	add_action( 'pre_get_comments', 'give_hide_payment_notes', 10 );
1418
	add_filter( 'comments_clauses', 'give_hide_payment_notes_pre_41', 10, 2 );
1419
1420
	return $notes;
1421
}
1422
1423
1424
/**
1425
 * Add a note to a payment
1426
 *
1427
 * @since 1.0
1428
 *
1429
 * @param int $payment_id The payment ID to store a note for
1430
 * @param string $note The note to store
1431
 *
1432
 * @return int The new note ID
1433
 */
1434
function give_insert_payment_note( $payment_id = 0, $note = '' ) {
1435
	if ( empty( $payment_id ) ) {
1436
		return false;
1437
	}
1438
1439
	do_action( 'give_pre_insert_payment_note', $payment_id, $note );
1440
1441
	$note_id = wp_insert_comment( wp_filter_comment( array(
1442
		'comment_post_ID'      => $payment_id,
1443
		'comment_content'      => $note,
1444
		'user_id'              => is_admin() ? get_current_user_id() : 0,
1445
		'comment_date'         => current_time( 'mysql' ),
1446
		'comment_date_gmt'     => current_time( 'mysql', 1 ),
1447
		'comment_approved'     => 1,
1448
		'comment_parent'       => 0,
1449
		'comment_author'       => '',
1450
		'comment_author_IP'    => '',
1451
		'comment_author_url'   => '',
1452
		'comment_author_email' => '',
1453
		'comment_type'         => 'give_payment_note'
1454
1455
	) ) );
1456
1457
	do_action( 'give_insert_payment_note', $note_id, $payment_id, $note );
1458
1459
	return $note_id;
1460
}
1461
1462
/**
1463
 * Deletes a payment note
1464
 *
1465
 * @since 1.0
1466
 *
1467
 * @param int $comment_id The comment ID to delete
1468
 * @param int $payment_id The payment ID the note is connected to
1469
 *
1470
 * @return bool True on success, false otherwise
1471
 */
1472
function give_delete_payment_note( $comment_id = 0, $payment_id = 0 ) {
1473
	if ( empty( $comment_id ) ) {
1474
		return false;
1475
	}
1476
1477
	do_action( 'give_pre_delete_payment_note', $comment_id, $payment_id );
1478
	$ret = wp_delete_comment( $comment_id, true );
1479
	do_action( 'give_post_delete_payment_note', $comment_id, $payment_id );
1480
1481
	return $ret;
1482
}
1483
1484
/**
1485
 * Gets the payment note HTML
1486
 *
1487
 * @since 1.0
1488
 *
1489
 * @param     object /int $note The comment object or ID
1490
 * @param int $payment_id The payment ID the note is connected to
1491
 *
1492
 * @return string
1493 34
 */
1494
function give_get_payment_note_html( $note, $payment_id = 0 ) {
1495
1496
	if ( is_numeric( $note ) ) {
1497 34
		$note = get_comment( $note );
1498
	}
1499 34
1500 34
	if ( ! empty( $note->user_id ) ) {
1501 34
		$user = get_userdata( $note->user_id );
1502 34
		$user = $user->display_name;
1503 34
	} else {
1504 34
		$user = __( 'System', 'give' );
1505 34
	}
1506 34
1507 34
	$date_format = get_option( 'date_format' ) . ', ' . get_option( 'time_format' );
1508 34
1509 34
	$delete_note_url = wp_nonce_url( add_query_arg( array(
1510 34
		'give-action' => 'delete_payment_note',
1511
		'note_id'     => $note->comment_ID,
1512
		'payment_id'  => $payment_id
1513 34
	) ), 'give_delete_payment_note_' . $note->comment_ID );
1514
1515 34
	$note_html = '<div class="give-payment-note" id="give-payment-note-' . $note->comment_ID . '">';
1516
	$note_html .= '<p>';
1517 34
	$note_html .= '<strong>' . $user . '</strong>&nbsp;&ndash;&nbsp;<span style="color:#aaa;font-style:italic;">' . date_i18n( $date_format, strtotime( $note->comment_date ) ) . '</span><br/>';
1518
	$note_html .= $note->comment_content;
1519
	$note_html .= '&nbsp;&ndash;&nbsp;<a href="' . esc_url( $delete_note_url ) . '" class="give-delete-payment-note" data-note-id="' . absint( $note->comment_ID ) . '" data-payment-id="' . absint( $payment_id ) . '" title="' . __( 'Delete this payment note', 'give' ) . '">' . __( 'Delete', 'give' ) . '</a>';
1520
	$note_html .= '</p>';
1521
	$note_html .= '</div>';
1522
1523
	return $note_html;
1524
1525
}
1526
1527
/**
1528
 * Exclude notes (comments) on give_payment post type from showing in Recent
1529
 * Comments widgets
1530
 *
1531
 * @since 1.0
1532
 *
1533
 * @param object $query WordPress Comment Query Object
1534
 *
1535
 * @return void
1536
 */
1537
function give_hide_payment_notes( $query ) {
1538
	global $wp_version;
0 ignored issues
show
Compatibility Best Practice introduced by
Use of global functionality is not recommended; it makes your code harder to test, and less reusable.

Instead of relying on global state, we recommend one of these alternatives:

1. Pass all data via parameters

function myFunction($a, $b) {
    // Do something
}

2. Create a class that maintains your state

class MyClass {
    private $a;
    private $b;

    public function __construct($a, $b) {
        $this->a = $a;
        $this->b = $b;
    }

    public function myFunction() {
        // Do something
    }
}
Loading history...
1539
1540
	if ( version_compare( floatval( $wp_version ), '4.1', '>=' ) ) {
1541
		$types = isset( $query->query_vars['type__not_in'] ) ? $query->query_vars['type__not_in'] : array();
1542
		if ( ! is_array( $types ) ) {
1543
			$types = array( $types );
1544
		}
1545
		$types[]                           = 'give_payment_note';
1546
		$query->query_vars['type__not_in'] = $types;
1547
	}
1548
}
1549
1550
add_action( 'pre_get_comments', 'give_hide_payment_notes', 10 );
1551
1552
/**
1553
 * Exclude notes (comments) on give_payment post type from showing in Recent Comments widgets
1554
 *
1555
 * @since 1.0
1556
 *
1557
 * @param array $clauses Comment clauses for comment query
1558
 * @param object $wp_comment_query WordPress Comment Query Object
1559
 *
1560
 * @return array $clauses Updated comment clauses
1561
 */
1562
function give_hide_payment_notes_pre_41( $clauses, $wp_comment_query ) {
0 ignored issues
show
Unused Code introduced by
The parameter $wp_comment_query is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
1563
	global $wpdb, $wp_version;
0 ignored issues
show
Compatibility Best Practice introduced by
Use of global functionality is not recommended; it makes your code harder to test, and less reusable.

Instead of relying on global state, we recommend one of these alternatives:

1. Pass all data via parameters

function myFunction($a, $b) {
    // Do something
}

2. Create a class that maintains your state

class MyClass {
    private $a;
    private $b;

    public function __construct($a, $b) {
        $this->a = $a;
        $this->b = $b;
    }

    public function myFunction() {
        // Do something
    }
}
Loading history...
1564
1565
	if ( version_compare( floatval( $wp_version ), '4.1', '<' ) ) {
1566
		$clauses['where'] .= ' AND comment_type != "give_payment_note"';
1567
	}
1568
1569
	return $clauses;
1570
}
1571
1572
add_filter( 'comments_clauses', 'give_hide_payment_notes_pre_41', 10, 2 );
1573
1574
1575
/**
1576
 * Exclude notes (comments) on give_payment post type from showing in comment feeds
1577
 *
1578
 * @since 1.0
1579
 *
1580
 * @param array $where
1581
 * @param object $wp_comment_query WordPress Comment Query Object
1582
 *
1583
 * @return array $where
1584
 */
1585
function give_hide_payment_notes_from_feeds( $where, $wp_comment_query ) {
0 ignored issues
show
Unused Code introduced by
The parameter $wp_comment_query is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
1586
	global $wpdb;
0 ignored issues
show
Compatibility Best Practice introduced by
Use of global functionality is not recommended; it makes your code harder to test, and less reusable.

Instead of relying on global state, we recommend one of these alternatives:

1. Pass all data via parameters

function myFunction($a, $b) {
    // Do something
}

2. Create a class that maintains your state

class MyClass {
    private $a;
    private $b;

    public function __construct($a, $b) {
        $this->a = $a;
        $this->b = $b;
    }

    public function myFunction() {
        // Do something
    }
}
Loading history...
1587
1588
	$where .= $wpdb->prepare( " AND comment_type != %s", 'give_payment_note' );
1589
1590
	return $where;
1591
}
1592
1593
add_filter( 'comment_feed_where', 'give_hide_payment_notes_from_feeds', 10, 2 );
1594
1595
1596
/**
1597
 * Remove Give Comments from the wp_count_comments function
1598
 *
1599
 * @access public
1600
 * @since  1.0
1601
 *
1602
 * @param array $stats (empty from core filter)
1603
 * @param int $post_id Post ID
1604
 *
1605
 * @return array Array of comment counts
1606
 */
1607
function give_remove_payment_notes_in_comment_counts( $stats, $post_id ) {
1608
	global $wpdb, $pagenow;
0 ignored issues
show
Compatibility Best Practice introduced by
Use of global functionality is not recommended; it makes your code harder to test, and less reusable.

Instead of relying on global state, we recommend one of these alternatives:

1. Pass all data via parameters

function myFunction($a, $b) {
    // Do something
}

2. Create a class that maintains your state

class MyClass {
    private $a;
    private $b;

    public function __construct($a, $b) {
        $this->a = $a;
        $this->b = $b;
    }

    public function myFunction() {
        // Do something
    }
}
Loading history...
1609
1610
	if ( 'index.php' != $pagenow ) {
1611
		return $stats;
1612
	}
1613
1614
	$post_id = (int) $post_id;
1615
1616
	if ( apply_filters( 'give_count_payment_notes_in_comments', false ) ) {
1617
		return $stats;
1618
	}
1619
1620
	$stats = wp_cache_get( "comments-{$post_id}", 'counts' );
1621
1622
	if ( false !== $stats ) {
1623
		return $stats;
1624
	}
1625
1626
	$where = 'WHERE comment_type != "give_payment_note"';
1627
1628
	if ( $post_id > 0 ) {
1629
		$where .= $wpdb->prepare( " AND comment_post_ID = %d", $post_id );
1630
	}
1631
1632
	$count = $wpdb->get_results( "SELECT comment_approved, COUNT( * ) AS num_comments FROM {$wpdb->comments} {$where} GROUP BY comment_approved", ARRAY_A );
1633
1634
	$total    = 0;
1635
	$approved = array(
1636
		'0'            => 'moderated',
1637
		'1'            => 'approved',
1638
		'spam'         => 'spam',
1639
		'trash'        => 'trash',
1640
		'post-trashed' => 'post-trashed'
1641
	);
1642
	foreach ( (array) $count as $row ) {
1643
		// Don't count post-trashed toward totals
1644
		if ( 'post-trashed' != $row['comment_approved'] && 'trash' != $row['comment_approved'] ) {
1645
			$total += $row['num_comments'];
1646
		}
1647
		if ( isset( $approved[ $row['comment_approved'] ] ) ) {
1648
			$stats[ $approved[ $row['comment_approved'] ] ] = $row['num_comments'];
1649
		}
1650
	}
1651
1652
	$stats['total_comments'] = $total;
1653
	foreach ( $approved as $key ) {
1654
		if ( empty( $stats[ $key ] ) ) {
1655
			$stats[ $key ] = 0;
1656
		}
1657
	}
1658
1659
	$stats = (object) $stats;
1660
	wp_cache_set( "comments-{$post_id}", $stats, 'counts' );
1661
1662
	return $stats;
1663
}
1664
1665
add_filter( 'wp_count_comments', 'give_remove_payment_notes_in_comment_counts', 10, 2 );
1666
1667
1668
/**
1669
 * Filter where older than one week
1670
 *
1671
 * @access public
1672
 * @since  1.0
1673
 *
1674
 * @param string $where Where clause
1675
 *
1676
 * @return string $where Modified where clause
1677
 */
1678
function give_filter_where_older_than_week( $where = '' ) {
1679
	// Payments older than one week
1680
	$start = date( 'Y-m-d', strtotime( '-7 days' ) );
1681
	$where .= " AND post_date <= '{$start}'";
1682
1683
	return $where;
1684
}
1685
1686
1687
/**
1688
 * Get Payment Form ID
1689
 *
1690
 * @description: Retrieves the form title and appends the price ID title if applicable
1691
 *
1692
 * @since 1.5
1693
 *
1694
 * @param array $payment_meta
1695
 * @param bool $level_title Whether you want the entire title or just the level title
1696
 *
1697
 * @return string $form_title Returns the full title if $level_title false, otherwise returns the levels title
1698
 */
1699
function give_get_payment_form_title( $payment_meta, $level_title = false, $separator = '' ) {
1700
1701
	$form_id    = isset( $payment_meta['form_id'] ) ? $payment_meta['form_id'] : 0;
1702
	$form_title = isset( $payment_meta['form_title'] ) ? $payment_meta['form_title'] : '';
1703
	$price_id   = isset( $payment_meta['price_id'] ) ? $payment_meta['price_id'] : give_get_price_id( $form_id, $payment_meta['price'] );
1704
1705
	if ( $level_title == true ) {
0 ignored issues
show
Coding Style Best Practice introduced by
It seems like you are loosely comparing two booleans. Considering using the strict comparison === instead.

When comparing two booleans, it is generally considered safer to use the strict comparison operator.

Loading history...
1706
		$form_title = '';
1707
	}
1708
1709
	if ( give_has_variable_prices( $form_id ) ) {
1710
1711
		if ( ! empty( $separator ) ) {
1712
			$form_title .= ' ' . $separator;
1713
		}
1714
		$form_title .= ' <span class="donation-level-text-wrap">';
1715
1716
		if ( $price_id == 'custom' ) {
1717
1718
			$custom_amount_text = get_post_meta( $form_id, '_give_custom_amount_text', true );
1719
			$form_title .= ! empty( $custom_amount_text ) ? $custom_amount_text : __( 'Custom Amount', 'give' );
1720
1721
		} else {
1722
			$form_title .= give_get_price_option_name( $form_id, $price_id );
1723
		}
1724
1725
		$form_title .= '</span>';
1726
1727
	}
1728
1729
	return apply_filters( 'give_get_payment_form_title', $form_title, $payment_meta );
1730
1731
}
1732
1733
/**
1734
 * Get Price ID
1735
 *
1736
 * @description Retrieves the Price ID when provided a proper form ID and price (donation) total
1737
 *
1738
 * @param $form_id
1739
 * @param $price
1740
 *
1741
 * @return string $price_id
1742
 */
1743
function give_get_price_id( $form_id, $price ) {
1744
1745
	$price_id = 0;
1746
1747
	if ( give_has_variable_prices( $form_id ) ) {
1748
1749
		$levels = maybe_unserialize( get_post_meta( $form_id, '_give_donation_levels', true ) );
1750
1751
		foreach ( $levels as $level ) {
1752
1753
			$level_amount = (float) give_sanitize_amount( $level['_give_amount'] );
1754
1755
			//check that this indeed the recurring price
1756
			if ( $level_amount == $price ) {
1757 34
1758
				$price_id = $level['_give_id']['level_id'];
1759 34
1760
			}
1761 34
1762
		}
1763 34
1764
	}
1765 34
1766
	return $price_id;
1767
1768
}