PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 2.19.7
GiveWP – Donation Plugin and Fundraising Platform v2.19.7
4.16.2 4.16.1 4.16.0 4.15.5 4.15.4 4.15.3 4.15.2 4.15.1 4.15.0 2.3.0 2.3.1 2.3.2 2.30.0 2.31.0 2.31.1 2.32.0 2.33.0 2.33.1 2.33.2 2.33.3 2.33.4 2.33.5 2.4.0 2.4.1 2.4.2 2.4.3 2.4.4 2.4.5 2.4.6 2.4.7 2.5.0 2.5.1 2.5.10 2.5.11 2.5.12 2.5.13 2.5.2 2.5.3 2.5.4 2.5.5 2.5.6 2.5.7 2.5.8 2.5.9 2.6.0 2.6.1 2.6.2 2.6.3 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.8.0 2.8.1 2.9.0 2.9.1 2.9.2 2.9.3 2.9.4 2.9.5 2.9.6 2.9.7 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.1.0 3.1.1 3.1.2 3.10.0 3.11.0 3.12.0 3.12.1 3.12.2 3.12.3 3.13.0 3.14.0 3.14.1 3.14.2 3.15.0 3.15.1 3.16.0 3.16.1 3.16.2 3.16.3 3.16.4 3.16.5 3.17.0 3.17.1 3.17.2 3.18.0 3.19.0 3.19.1 3.19.2 3.19.3 3.19.4 3.2.0 3.2.1 3.2.2 3.20.0 3.21.0 3.21.1 3.22.0 3.22.1 3.22.2 3.3.0 3.3.1 3.4.0 3.4.1 3.4.2 3.5.0 3.5.1 3.6.0 3.6.1 3.6.2 3.7.0 3.8.0 3.9.0 4.0.0 4.1.0 4.1.1 4.10.0 4.10.1 4.11.0 4.12.0 4.13.0 4.13.1 4.13.2 4.14.0 4.14.1 4.14.2 4.14.3 4.14.4 4.14.5 4.14.6 4.2.0 4.2.1 4.3.0 4.3.1 4.3.2 4.4.0 4.5.0 4.6.1 4.7.0 4.7.1 4.8.0 4.8.1 4.9.0 trunk 1.9.0 2.0.0 2.0.1 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.10.0 2.10.1 2.10.2 2.10.3 2.10.4 2.11.0 2.11.1 2.11.2 2.11.3 2.12.0 2.12.1 2.12.2 2.12.3 2.13.0 2.13.1 2.13.2 2.13.3 2.13.4 2.14.0 2.15.0 2.16.0 2.16.1 2.17.0 2.17.1 2.17.3 2.18.0 2.18.1 2.19.1 2.19.2 2.19.3 2.19.4 2.19.5 2.19.6 2.19.7 2.19.8 2.2.0 2.2.1 2.2.2 2.2.3 2.2.4 2.2.5 2.2.6 2.20.0 2.20.1 2.20.2 2.21.0 2.21.1 2.21.2 2.21.3 2.21.4 2.22.0 2.22.1 2.22.2 2.22.3 2.23.0 2.23.1 2.23.2 2.24.0 2.24.1 2.24.2 2.25.0 2.25.1 2.25.2 2.25.3 2.26.0 2.27.0 2.27.1 2.27.2 2.27.3 2.28.0 2.29.0 2.29.1 2.29.2
give / src / Subscriptions / Repositories / SubscriptionRepository.php
give / src / Subscriptions / Repositories Last commit date
SubscriptionRepository.php 4 years ago
SubscriptionRepository.php
344 lines
1 <?php
2
3 namespace Give\Subscriptions\Repositories;
4
5 use Exception;
6 use Give\Framework\Database\DB;
7 use Give\Framework\Exceptions\Primitives\InvalidArgumentException;
8 use Give\Framework\Models\ModelQueryBuilder;
9 use Give\Framework\Support\Facades\DateTime\Temporal;
10 use Give\Helpers\Hooks;
11 use Give\Log\Log;
12 use Give\Subscriptions\Models\Subscription;
13
14 /**
15 * @since 2.19.6
16 */
17 class SubscriptionRepository
18 {
19
20 /**
21 * @var string[]
22 */
23 private $requiredSubscriptionProperties = [
24 'donorId',
25 'period',
26 'frequency',
27 'amount',
28 'status',
29 'donationFormId'
30 ];
31
32 /**
33 * @since 2.19.6
34 *
35 * @param int $subscriptionId
36 * @return Subscription
37 */
38 public function getById($subscriptionId)
39 {
40 return $this->queryById($subscriptionId)->get();
41 }
42
43 /**
44 * @since 2.19.6
45 *
46 * @param int $subscriptionId
47 * @return ModelQueryBuilder
48 */
49 public function queryById($subscriptionId)
50 {
51 return $this->prepareQuery()
52 ->where('id', $subscriptionId);
53 }
54
55 /**
56 * @since 2.19.6
57 *
58 * @param int $donationId
59 * @return ModelQueryBuilder
60 */
61 public function queryByDonationId($donationId)
62 {
63 return $this->prepareQuery()
64 ->where('parent_payment_id', $donationId);
65 }
66
67 /**
68 * @since 2.19.6
69 *
70 * @param int $donorId
71 * @return ModelQueryBuilder
72 */
73 public function queryByDonorId($donorId)
74 {
75 return $this->prepareQuery()
76 ->where('customer_id', $donorId);
77 }
78
79 /**
80 * @since 2.19.6
81 *
82 * @param int $id
83 *
84 * @return object[]
85 */
86 public function getNotesBySubscriptionId($id)
87 {
88 $notes = DB::table('comments')
89 ->select(
90 ['comment_content', 'note'],
91 ['comment_date', 'date']
92 )
93 ->where('comment_post_ID', $id)
94 ->where('comment_type', 'give_sub_note')
95 ->orderBy('comment_date', 'DESC')
96 ->getAll();
97
98 if (!$notes) {
99 return [];
100 }
101
102 return $notes;
103 }
104
105 /**
106 * @since 2.19.6
107 *
108 * @param Subscription $subscription
109 *
110 * @return Subscription
111 * @throws Exception
112 */
113 public function insert(Subscription $subscription)
114 {
115 $this->validateSubscription($subscription);
116
117 Hooks::doAction('give_subscription_creating', $subscription);
118
119 $date = $subscription->createdAt ? Temporal::getFormattedDateTime(
120 $subscription->createdAt
121 ) : Temporal::getCurrentFormattedDateForDatabase();
122
123 DB::query('START TRANSACTION');
124
125 try {
126 DB::table('give_subscriptions')->insert([
127 'created' => $date,
128 'status' => $subscription->status->getValue(),
129 'profile_id' => isset($subscription->gatewaySubscriptionId) ? $subscription->gatewaySubscriptionId : '',
130 'customer_id' => $subscription->donorId,
131 'period' => $subscription->period->getValue(),
132 'frequency' => $subscription->frequency,
133 'initial_amount' => $subscription->amount,
134 'recurring_amount' => $subscription->amount,
135 'recurring_fee_amount' => isset($subscription->feeAmount) ? $subscription->feeAmount : 0,
136 'bill_times' => isset($subscription->installments) ? $subscription->installments : 0,
137 'transaction_id' => isset($subscription->transactionId) ? $subscription->transactionId : '',
138 'product_id' => $subscription->donationFormId
139 ]);
140 } catch (Exception $exception) {
141 DB::query('ROLLBACK');
142
143
144 Log::error('Failed creating a subscription', compact('subscription'));
145
146 throw new $exception('Failed creating a subscription');
147 }
148
149 DB::query('COMMIT');
150
151 $subscriptionId = DB::last_insert_id();
152
153 $subscription = $this->getById($subscriptionId);
154
155 Hooks::doAction('give_subscription_created', $subscription);
156
157 return $subscription;
158 }
159
160 /**
161 * @since 2.19.6
162 *
163 * @param Subscription $subscription
164 *
165 * @return Subscription
166 * @throws Exception
167 */
168 public function update(Subscription $subscription)
169 {
170 $this->validateSubscription($subscription);
171
172 Hooks::doAction('give_subscription_updating', $subscription);
173
174 DB::query('START TRANSACTION');
175
176 try {
177 DB::table('give_subscriptions')
178 ->where('id', $subscription->id)
179 ->update([
180 'status' => $subscription->status->getValue(),
181 'profile_id' => $subscription->gatewaySubscriptionId,
182 'customer_id' => $subscription->donorId,
183 'period' => $subscription->period->getValue(),
184 'frequency' => $subscription->frequency,
185 'initial_amount' => $subscription->amount,
186 'recurring_amount' => $subscription->amount,
187 'recurring_fee_amount' => isset($subscription->feeAmount) ? $subscription->feeAmount : 0,
188 'bill_times' => isset($subscription->installments) ? $subscription->installments : 0,
189 'transaction_id' => $subscription->transactionId,
190 'product_id' => $subscription->donationFormId
191 ]);
192 } catch (Exception $exception) {
193 DB::query('ROLLBACK');
194
195 Log::error('Failed updating a subscription', compact('subscription'));
196
197 throw new $exception('Failed updating a subscription');
198 }
199
200 DB::query('COMMIT');
201
202 $subscriptionId = DB::last_insert_id();
203
204 $subscription = $this->getById($subscriptionId);
205
206 Hooks::doAction('give_subscription_updating', $subscription);
207
208 return $subscription;
209 }
210
211 /**
212 * @since 2.19.6
213 *
214 * @param Subscription $subscription
215 *
216 * @return bool
217 *
218 * @throws Exception
219 */
220 public function delete(Subscription $subscription)
221 {
222 Hooks::doAction('give_subscription_deleting', $subscription);
223
224 DB::query('START TRANSACTION');
225
226 try {
227 DB::table('give_subscriptions')
228 ->where('id', $subscription->id)
229 ->delete();
230 } catch (Exception $exception) {
231 DB::query('ROLLBACK');
232
233 Log::error('Failed deleting a subscription', compact('subscription'));
234
235 throw new $exception('Failed deleting a subscription');
236 }
237
238 DB::query('COMMIT');
239
240 Hooks::doAction('give_subscription_deleted', $subscription);
241
242 return true;
243 }
244
245 /**
246 * @since 2.19.6
247 *
248 * @param int $subscriptionId
249 * @param array $columns
250 * @return bool
251 * @throws Exception
252 */
253 public function updateLegacyColumns($subscriptionId, $columns)
254 {
255 foreach (Subscription::propertyKeys() as $key) {
256 if (array_key_exists($key, $columns)) {
257 throw new InvalidArgumentException("'$key' is not a legacy column.");
258 }
259 }
260
261 DB::query('START TRANSACTION');
262
263 try {
264 DB::table('give_subscriptions')
265 ->where('id', $subscriptionId)
266 ->update($columns);
267 } catch (Exception $exception) {
268 DB::query('ROLLBACK');
269
270 Log::error('Failed updating a subscription', compact('subscriptionId', 'columns'));
271
272 throw new $exception('Failed updating a subscription');
273 }
274
275 DB::query('COMMIT');
276
277 return true;
278 }
279
280 /**
281 * @since 2.19.6
282 *
283 * @param int $subscriptionId
284 * @return int|null
285 */
286 public function getInitialDonationId($subscriptionId)
287 {
288 $query = DB::table('give_subscriptions')
289 ->where('id', $subscriptionId)
290 ->select(['parent_payment_id', 'initialDonationId'])
291 ->get();
292
293 if (!$query) {
294 return null;
295 }
296
297 return (int)$query->initialDonationId;
298 }
299
300 /**
301 * @param Subscription $subscription
302 * @return void
303 */
304 private function validateSubscription(Subscription $subscription)
305 {
306 foreach ($this->requiredSubscriptionProperties as $key) {
307 if (!isset($subscription->$key)) {
308 throw new InvalidArgumentException("'$key' is required.");
309 }
310 }
311
312 if (!$subscription->donor) {
313 throw new InvalidArgumentException("Invalid donorId, Donor does not exist");
314 }
315 }
316
317 /**
318 * @since 2.19.6
319 *
320 * @return ModelQueryBuilder<Subscription>
321 */
322 public function prepareQuery()
323 {
324 $builder = new ModelQueryBuilder(Subscription::class);
325
326 return $builder->from('give_subscriptions')
327 ->select(
328 'id',
329 ['created', 'createdAt'],
330 ['expiration', 'expiresAt'],
331 ['customer_id', 'donorId'],
332 'period',
333 ['frequency', 'frequency'],
334 ['bill_times', 'installments'],
335 ['transaction_id', 'transactionId'],
336 ['recurring_amount', 'amount'],
337 ['recurring_fee_amount', 'feeAmount'],
338 'status',
339 ['profile_id', 'gatewaySubscriptionId'],
340 ['product_id', 'donationFormId']
341 );
342 }
343 }
344