PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 4.14.6
GiveWP – Donation Plugin and Fundraising Platform v4.14.6
4.16.3 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 / DonationForms / DonationQuery.php
give / src / DonationForms Last commit date
Actions 4 months ago AsyncData 1 year ago Blocks 2 months ago Controllers 3 months ago DataTransferObjects 5 months ago Exceptions 1 year ago Factories 9 months ago FormDesigns 11 months ago FormPage 1 year ago Listeners 1 year ago Migrations 1 year ago Models 10 months ago OrphanedForms 1 year ago Properties 2 months ago Repositories 10 months ago Routes 5 months ago Rules 9 months ago Shortcodes 2 years ago V2 4 months ago ValueObjects 1 year ago ViewModels 2 months ago resources 4 months ago DonationFormDataQuery.php 11 months ago DonationFormsAdminPage.php 1 year ago DonationQuery.php 11 months ago ServiceProvider.php 7 months ago SubscriptionQuery.php 2 years ago
DonationQuery.php
161 lines
1 <?php
2
3 namespace Give\DonationForms;
4
5 use Give\Donations\ValueObjects\DonationMetaKeys;
6 use Give\Framework\QueryBuilder\JoinQueryBuilder;
7 use Give\Framework\QueryBuilder\QueryBuilder;
8
9 /**
10 * An opinionated Query Builder for GiveWP donations and meta fields.
11 *
12 * @since 3.12.0
13 *
14 * Example usage:
15 * (new DonationQuery)
16 * ->form(1816)
17 * ->between('2024-02-00', '2024-02-23')
18 * ->sumIntendedAmount();
19 */
20 class DonationQuery extends QueryBuilder
21 {
22 /**
23 * @since 3.12.0
24 */
25 public function __construct()
26 {
27 $this->from('posts', 'donation');
28 }
29
30 /**
31 * An opinionated join method for the donation meta table.
32 * @since 3.12.0
33 */
34 public function joinMeta($key, $alias): DonationQuery
35 {
36 $this->join(function (JoinQueryBuilder $builder) use ($key, $alias) {
37 $builder
38 ->leftJoin('give_donationmeta', $alias)
39 ->on('donation.ID', $alias . '.donation_id')
40 ->andOn($alias . '.meta_key', $key, true);
41 });
42 return $this;
43 }
44
45 /**
46 * An opinionated where method for the donation form ID meta field.
47 * @since 3.12.0
48 */
49 public function form($formId)
50 {
51 $this->joinMeta('_give_payment_form_id', 'formId');
52 $this->where('formId.meta_value', $formId);
53 return $this;
54 }
55
56
57 /**
58 * An opinionated where method for the multiple donation form IDs meta field.
59 * @since 3.12.0
60 */
61 public function forms(array $formIds): DonationQuery
62 {
63 $this->joinMeta('_give_payment_form_id', 'formId');
64 $this->whereIn('formId.meta_value', $formIds);
65 return $this;
66 }
67
68 /**
69 * An opinionated whereBetween method for the completed date meta field.
70 * @since 3.12.0
71 */
72 public function between($startDate, $endDate): DonationQuery
73 {
74 // If the dates are empty or invalid, they will fallback to January 1st, 1970.
75 // For the start date, this is exactly what we need, but for the end date, we should set it as the current date so that we have a correct date range.
76 $startDate = date('Y-m-d H:i:s', strtotime($startDate));
77 $endDate = empty($endDate)
78 ? date('Y-m-d H:i:s')
79 : date('Y-m-d H:i:s', strtotime($endDate));
80
81 $this->whereBetween('donation.post_date', $startDate, $endDate);
82 return $this;
83 }
84
85 /**
86 * @since 3.14.0
87 */
88 public function includeOnlyValidStatuses(): DonationQuery
89 {
90 $this->whereIn('donation.post_status', ['publish', 'give_subscription']);
91
92 return $this;
93 }
94
95 /**
96 * @since 3.14.0
97 */
98 public function includeOnlyCurrentMode(): DonationQuery
99 {
100 $this->joinMeta('_give_payment_mode', 'paymentMode');
101 $this->where('paymentMode.meta_value', give_is_test_mode() ? 'test' : 'live');
102
103 return $this;
104 }
105
106 /**
107 * Returns a calculated sum of the intended amounts (without recovered fees) for the donations.
108 *
109 * @since 4.5.0 update to account for exchange rate
110 * @since 3.14.0 Use the NULLIF function to prevent zero values that can generate a wrong final result and use $this->includeOnlyValidStatuses() and $this->includeOnlyCurrentMode()
111 * @since 3.12.0
112 * @return int|float
113 */
114 public function sumIntendedAmount($includeOnlyValidStatuses = true, $includeOnlyCurrentMode = true)
115 {
116 if ($includeOnlyValidStatuses) {
117 $this->includeOnlyValidStatuses();
118 }
119
120 if ($includeOnlyCurrentMode) {
121 $this->includeOnlyCurrentMode();
122 }
123
124 $this->joinMeta(DonationMetaKeys::AMOUNT, 'amount');
125 $this->joinMeta(DonationMetaKeys::FEE_AMOUNT_RECOVERED, 'feeAmountRecovered');
126 $this->joinMeta(DonationMetaKeys::EXCHANGE_RATE, 'exchangeRate');
127 return $this->sum(
128 '(IFNULL(amount.meta_value, 0) - IFNULL(feeAmountRecovered.meta_value, 0)) / IFNULL(exchangeRate.meta_value, 1)'
129 );
130 }
131
132 /**
133 * Returns a calculated sum of the amounts (with recovered fees) for the donations.
134 *
135 * @since 3.14.0
136 * @return int|float
137 */
138 public function sumAmount($includeOnlyValidStatuses = true, $includeOnlyCurrentMode = true)
139 {
140 if ($includeOnlyValidStatuses) {
141 $this->includeOnlyValidStatuses();
142 }
143
144 if ($includeOnlyCurrentMode) {
145 $this->includeOnlyCurrentMode();
146 }
147
148 $this->joinMeta('_give_payment_total', 'amount');
149
150 return $this->sum(
151 'amount.meta_value'
152 );
153 }
154
155 public function countDonors()
156 {
157 $this->joinMeta(DonationMetaKeys::DONOR_ID, 'donorId');
158 return $this->count('DISTINCT donorId.meta_value');
159 }
160 }
161