PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 4.5.0
GiveWP – Donation Plugin and Fundraising Platform v4.5.0
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 / Donors / DonorStatisticsQuery.php
give / src / Donors Last commit date
Actions 1 year ago CustomFields 1 year ago DataTransferObjects 1 year ago Endpoints 1 year ago Exceptions 2 years ago Factories 1 year ago ListTable 1 year ago Migrations 1 year ago Models 1 year ago Repositories 1 year ago ValueObjects 1 year ago ViewModels 1 year ago resources 11 months ago DonorStatisticsQuery.php 11 months ago DonorsAdminPage.php 1 year ago DonorsQuery.php 1 year ago ServiceProvider.php 1 year ago
DonorStatisticsQuery.php
236 lines
1 <?php
2
3 namespace Give\Donors;
4
5 use Give\Campaigns\Models\Campaign;
6 use Give\Donations\ValueObjects\DonationMetaKeys;
7 use Give\Donors\Models\Donor;
8 use Give\Donors\Repositories\DonorRepository;
9 use Give\Framework\QueryBuilder\JoinQueryBuilder;
10 use Give\Framework\QueryBuilder\QueryBuilder;
11 use Give\Donors\ValueObjects\DonorType;
12
13 /**
14 * @since 4.4.0
15 */
16 class DonorStatisticsQuery extends QueryBuilder
17 {
18 /**
19 * @since 4.4.0
20 */
21 private Donor $donor;
22
23 /**
24 * @since 4.4.0
25 */
26 public function __construct(Donor $donor, $mode = '')
27 {
28 $this->donor = $donor;
29
30 $this->from('posts', 'donation');
31 $this->where('post_type', 'give_payment');
32
33 // Include only valid statuses
34 $this->whereIn('donation.post_status', ['publish', 'give_subscription']);
35
36 // Include only current payment "mode"
37 if (empty($mode)) {
38 $mode = give_is_test_mode() ? 'test' : 'live';
39 }
40 $this->joinDonationMeta(DonationMetaKeys::MODE, 'paymentMode');
41 $this->where('paymentMode.meta_value', $mode);
42
43 // Include only donations associated with the Donor.
44 $this->joinDonationMeta(DonationMetaKeys::DONOR_ID, 'donorId');
45 $this->where('donorId.meta_value', $donor->id);
46
47 $this->joinDonationMeta(DonationMetaKeys::AMOUNT, 'amount');
48 $this->joinDonationMeta(DonationMetaKeys::FEE_AMOUNT_RECOVERED, 'feeAmountRecovered');
49 $this->joinDonationMeta(DonationMetaKeys::EXCHANGE_RATE, 'exchangeRate');
50 }
51
52 /**
53 * @since 4.4.0
54 */
55 public function filterByCampaign(Campaign $campaign): self
56 {
57 $query = clone $this;
58
59 $query->joinDonationMeta(DonationMetaKeys::CAMPAIGN_ID, 'campaignId');
60 $query->where('campaignId.meta_value', $campaign->id);
61
62 return $query;
63 }
64
65 /**
66 * @since 4.5.0 update to account for exchange rate
67 * @since 4.4.0
68 *
69 * @return int|float
70 */
71 public function getLifetimeDonationsAmount()
72 {
73 $query = clone $this;
74
75 return $query->sum(
76 '(IFNULL(amount.meta_value, 0) - IFNULL(feeAmountRecovered.meta_value, 0)) / IFNULL(exchangeRate.meta_value, 1)'
77 );
78 }
79
80 /**
81 * @since 4.5.0 update to account for exchange rate
82 * @since 4.4.0
83 */
84 public function getHighestDonationAmount()
85 {
86 $query = clone $this;
87
88 $query->select('(IFNULL(amount.meta_value, 0) - IFNULL(feeAmountRecovered.meta_value, 0)) / IFNULL(exchangeRate.meta_value, 1) as highestDonationAmount');
89 $query->orderBy('CAST(amount.meta_value AS DECIMAL)', 'DESC');
90 $query->limit(1);
91 $result = $query->get();
92
93 if ( ! $result) {
94 return null;
95 }
96
97 return (float)$result->highestDonationAmount;
98 }
99
100 /**
101 * @since 4.5.0 update to account for exchange rate
102 * @since 4.4.0
103 */
104 public function getAverageDonationAmount()
105 {
106 $query = clone $this;
107
108 $donationsCount = $this->getDonationsCount();
109 $lifetimeDonationsAmount = $query->getLifetimeDonationsAmount();
110
111 return $donationsCount > 0 ? $lifetimeDonationsAmount / $donationsCount : $lifetimeDonationsAmount;
112 }
113
114 /**
115 * @since 4.4.0
116 */
117 public function getDonationsCount(): int
118 {
119 $query = clone $this;
120
121 return $query->count('donation.ID');
122 }
123
124
125 /**
126 * @since 4.5.0 update to account for exchange rate
127 * @since 4.4.0
128 */
129 public function getFirstDonation()
130 {
131 $query = clone $this;
132 $query->select(
133 'donation.post_date',
134 '(IFNULL(amount.meta_value, 0) - IFNULL(feeAmountRecovered.meta_value, 0)) / IFNULL(exchangeRate.meta_value, 1) as amount'
135 );
136 $query->orderBy('post_date', 'ASC');
137 $query->limit(1);
138 $result = $query->get();
139
140 if (!$result) {
141 return null;
142 }
143
144 return [
145 'amount' => (float)$result->amount,
146 'date' => date('Y-m-d H:i:s', strtotime($result->post_date))
147 ];
148 }
149
150 /**
151 * @since 4.5.0 update to account for exchange rate
152 * @since 4.4.0
153 */
154 public function getLastDonation()
155 {
156 $query = clone $this;
157 $query->select(
158 'donation.post_date',
159 '(IFNULL(amount.meta_value, 0) - IFNULL(feeAmountRecovered.meta_value, 0)) / IFNULL(exchangeRate.meta_value, 1) as amount'
160 );
161 $query->orderBy('post_date', 'DESC');
162 $query->limit(1);
163 $result = $query->get();
164
165 if (!$result) {
166 return null;
167 }
168
169 return [
170 'amount' => (float)$result->amount,
171 'date' => date('Y-m-d H:i:s', strtotime($result->post_date)),
172 ];
173 }
174
175 /**
176 * @since 4.4.0
177 */
178 public function getDonorType()
179 {
180 $donorRepository = give(DonorRepository::class);
181 $donorType = $donorRepository->getDonorType($this->donor->id);
182
183 if (!$donorType) {
184 return null;
185 }
186
187 switch ($donorType->getValue()) {
188 case DonorType::NEW:
189 return __('No Donations', 'give');
190 case DonorType::SUBSCRIBER:
191 return __('Subscriber', 'give');
192 case DonorType::REPEAT:
193 return __('Repeat', 'give');
194 case DonorType::SINGLE:
195 return __('One-time', 'give');
196 default:
197 return $donorType->label();
198 }
199 }
200
201 /**
202 * @since 4.4.0
203 */
204 public function preferredPaymentMethod(): string
205 {
206 $query = clone $this;
207 $query->joinDonationMeta(DonationMetaKeys::GATEWAY, 'gateway');
208 $query->select('gateway.meta_value as gateway');
209 $query->groupBy('gateway.meta_value');
210 $query->orderBy('COUNT(gateway.meta_value)', 'DESC');
211 $query->limit(1);
212 $result = $query->get();
213
214 if (!$result) {
215 return '';
216 }
217
218 return give_get_gateway_checkout_label($result->gateway) ?? $result->gateway;
219 }
220
221 /**
222 * @since 4.4.0
223 */
224 public function joinDonationMeta($key, $alias): self
225 {
226 $this->join(function (JoinQueryBuilder $builder) use ($key, $alias) {
227 $builder
228 ->leftJoin('give_donationmeta', $alias)
229 ->on('donation.ID', $alias . '.donation_id')
230 ->andOn($alias . '.meta_key', $key, true);
231 });
232
233 return $this;
234 }
235 }
236