Issues (54)

src/Pronamic.php (2 issues)

1
<?php
2
/**
3
 * Pronamic
4
 *
5
 * @author    Pronamic <[email protected]>
6
 * @copyright 2005-2022 Pronamic
7
 * @license   GPL-3.0-or-later
8
 * @package   Pronamic\WordPress\Pay\Extensions\MemberPress
9
 */
10
11
namespace Pronamic\WordPress\Pay\Extensions\MemberPress;
12
13
use MeprTransaction;
0 ignored issues
show
The type MeprTransaction was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
14
use Pronamic\WordPress\Money\Money;
15
use Pronamic\WordPress\Money\TaxedMoney;
16
use Pronamic\WordPress\Pay\AddressHelper;
17
use Pronamic\WordPress\Pay\Customer;
18
use Pronamic\WordPress\Pay\ContactName;
19
use Pronamic\WordPress\Pay\Core\Util as Core_Util;
20
use Pronamic\WordPress\Pay\Payments\Payment;
21
use Pronamic\WordPress\Pay\Payments\PaymentLines;
22
use Pronamic\WordPress\Pay\Subscriptions\Subscription;
23
use Pronamic\WordPress\Pay\Subscriptions\SubscriptionInterval;
24
use Pronamic\WordPress\Pay\Subscriptions\SubscriptionPhase;
25
26
/**
27
 * Pronamic
28
 *
29
 * @author  Remco Tolsma
30
 * @version 3.1.0
31
 * @since   2.0.5
32
 */
33
class Pronamic {
34
	/**
35
	 * Get Pronamic payment from MemberPress transaction.
36
	 *
37
	 * @param MeprTransaction $memberpress_transaction MemberPress transaction object.
38
	 * @return Payment
39
	 * @throws \Exception Throws an exception as soon as no new subscription period can be created.
40
	 */
41
	public static function get_payment( MeprTransaction $memberpress_transaction ) {
42
		$payment = new Payment();
43
44
		// MemberPress.
45
		$memberpress_user         = $memberpress_transaction->user();
46
		$memberpress_product      = $memberpress_transaction->product();
47
		$memberpress_subscription = $memberpress_transaction->subscription();
0 ignored issues
show
The assignment to $memberpress_subscription is dead and can be removed.
Loading history...
48
49
		// Title.
50
		$title = sprintf(
51
			/* translators: %s: payment data title */
52
			__( 'Payment for %s', 'pronamic_ideal' ),
53
			sprintf(
54
				/* translators: %s: order id */
55
				__( 'MemberPress transaction %s', 'pronamic_ideal' ),
56
				$memberpress_transaction->id
57
			)
58
		);
59
60
		$payment->order_id    = $memberpress_transaction->id;
61
		$payment->title       = $title;
62
		$payment->source      = 'memberpress_transaction';
63
		$payment->source_id   = $memberpress_transaction->id;
64
65
		$payment->set_description( $memberpress_product->post_title );
66
67
		// Contact.
68
		$contact_name = new ContactName();
69
		$contact_name->set_first_name( $memberpress_user->first_name );
70
		$contact_name->set_last_name( $memberpress_user->last_name );
71
72
		$customer = new Customer();
73
		$customer->set_name( $contact_name );
74
		$customer->set_email( $memberpress_user->user_email );
75
		$customer->set_user_id( $memberpress_user->ID );
76
77
		$payment->set_customer( $customer );
78
79
		/**
80
		 * Address.
81
		 *
82
		 * @link https://github.com/wp-premium/memberpress-business/blob/1.3.36/app/models/MeprUser.php#L1191-L1216
83
		 */
84
		$address = AddressHelper::from_array(
85
			array(
86
				'line_1'       => $memberpress_user->address( 'one', false ),
87
				'line_2'       => $memberpress_user->address( 'two', false ),
88
				'postal_code'  => $memberpress_user->address( 'zip', false ),
89
				'city'         => $memberpress_user->address( 'city', false ),
90
				'region'       => $memberpress_user->address( 'state', false ),
91
				'country_code' => $memberpress_user->address( 'country', false ),
92
			)
93
		);
94
95
		if ( null !== $address ) {
96
			$address->set_name( $contact_name );
97
		}
98
99
		$payment->set_billing_address( $address );
100
		$payment->set_shipping_address( $address );
101
102
		/**
103
		 * Total.
104
		 */
105
		$payment->set_total_amount(
106
			new TaxedMoney(
107
				$memberpress_transaction->total,
108
				MemberPress::get_currency(),
109
				$memberpress_transaction->tax_amount,
110
				$memberpress_transaction->tax_rate
111
			)
112
		);
113
114
		/**
115
		 * Vat number.
116
		 *
117
		 * @link https://github.com/wp-premium/memberpress-business/search?utf8=%E2%9C%93&q=mepr_vat_number&type=
118
		 * @todo
119
		 */
120
121
		/**
122
		 * Subscription.
123
		 */
124
		$subscription = self::get_subscription( $memberpress_transaction );
125
126
		if ( $subscription ) {
127
			$period = $subscription->new_period();
128
129
			if ( null === $period ) {
130
				throw new \Exception( 'Could not create new period for subscription.' );
131
			}
132
133
			$payment->add_period( $period );
134
		}
135
136
		/*
137
		 * Lines.
138
		 */
139
		$payment->lines = new PaymentLines();
140
141
		$line = $payment->lines->new_line();
142
143
		$line->set_id( $memberpress_product->ID );
144
		$line->set_name( $memberpress_product->post_title );
145
		$line->set_quantity( 1 );
146
		$line->set_unit_price( $payment->get_total_amount() );
147
		$line->set_total_amount( $payment->get_total_amount() );
148
149
		$product_url = \get_permalink( $memberpress_product->ID );
150
151
		if ( false !== $product_url ) {     
152
			$line->set_product_url( $product_url );
153
		}
154
155
		/*
156
		 * Return.
157
		 */
158
		return $payment;
159
	}
160
161
	/**
162
	 * Get Pronamic subscription from MemberPress transaction.
163
	 *
164
	 * @param MeprTransaction $memberpress_transaction MemberPress transaction object.
165
	 * @return Subscription|null
166
	 */
167
	public static function get_subscription( MeprTransaction $memberpress_transaction ) {
168
		$memberpress_product = $memberpress_transaction->product();
169
170
		if ( $memberpress_product->is_one_time_payment() ) {
171
			return null;
172
		}
173
174
		$memberpress_subscription = $memberpress_transaction->subscription();
175
176
		if ( ! $memberpress_subscription ) {
177
			return null;
178
		}
179
180
		/**
181
		 * Subscription.
182
		 */
183
		$subscription = new Subscription();
184
185
		$start_date = new \DateTimeImmutable();
186
187
		// Trial phase.
188
		if ( $memberpress_subscription->in_trial() ) {
189
			$trial_phase = new SubscriptionPhase(
190
				$subscription,
191
				$start_date,
192
				new SubscriptionInterval( 'P' . $memberpress_subscription->trial_days . 'D' ),
193
				new TaxedMoney(
194
					$memberpress_subscription->trial_total,
195
					MemberPress::get_currency(),
196
					$memberpress_subscription->trial_tax_amount,
197
					$memberpress_subscription->tax_rate
198
				)
199
			);
200
201
			$trial_phase->set_total_periods( 1 );
202
			$trial_phase->set_trial( true );
203
204
			$subscription->add_phase( $trial_phase );
205
206
			$trail_end_date = $trial_phase->get_end_date();
207
208
			if ( null !== $trail_end_date ) {
209
				$start_date = $trail_end_date;
210
			}
211
		}
212
213
		// Total periods.
214
		$total_periods = null;
215
216
		$limit_cycles_number = (int) $memberpress_subscription->limit_cycles_num;
217
218
		if ( $memberpress_subscription->limit_cycles && $limit_cycles_number > 0 ) {
219
			$total_periods = $limit_cycles_number;
220
		}
221
222
		// Regular phase.
223
		$regular_phase = new SubscriptionPhase(
224
			$subscription,
225
			$start_date,
226
			new SubscriptionInterval( 'P' . $memberpress_product->period . Core_Util::to_period( $memberpress_product->period_type ) ),
227
			new Money( $memberpress_subscription->total, MemberPress::get_currency() )
228
		);
229
230
		$regular_phase->set_total_periods( $total_periods );
231
232
		$subscription->add_phase( $regular_phase );
233
234
		// Source.
235
		$subscription->source    = 'memberpress_subscription';
236
		$subscription->source_id = $memberpress_subscription->id;
237
238
		return $subscription;
239
	}
240
}
241