PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / trunk
GiveWP – Donation Plugin and Fundraising Platform vtrunk
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 7 months ago CustomFields 1 year ago DataTransferObjects 1 year ago Endpoints 5 months ago Exceptions 2 years ago Factories 1 year ago ListTable 7 months ago Migrations 1 year ago Models 1 year ago Repositories 8 months ago ValueObjects 9 months ago resources 5 months ago DonorStatisticsQuery.php 9 months ago DonorsAdminPage.php 5 months ago DonorsQuery.php 5 months ago ServiceProvider.php 5 months ago
DonorStatisticsQuery.php
226 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.10.0 Updated return value
177 * @since 4.4.0
178 */
179 public function getDonorType()
180 {
181 $donorRepository = give(DonorRepository::class);
182 $donorType = $donorRepository->getDonorType($this->donor->id);
183
184 if (!$donorType) {
185 return null;
186 }
187
188 return $donorType->label();
189 }
190
191 /**
192 * @since 4.4.0
193 */
194 public function preferredPaymentMethod(): string
195 {
196 $query = clone $this;
197 $query->joinDonationMeta(DonationMetaKeys::GATEWAY, 'gateway');
198 $query->select('gateway.meta_value as gateway');
199 $query->groupBy('gateway.meta_value');
200 $query->orderBy('COUNT(gateway.meta_value)', 'DESC');
201 $query->limit(1);
202 $result = $query->get();
203
204 if (!$result) {
205 return '';
206 }
207
208 return give_get_gateway_checkout_label($result->gateway) ?? $result->gateway;
209 }
210
211 /**
212 * @since 4.4.0
213 */
214 public function joinDonationMeta($key, $alias): self
215 {
216 $this->join(function (JoinQueryBuilder $builder) use ($key, $alias) {
217 $builder
218 ->leftJoin('give_donationmeta', $alias)
219 ->on('donation.ID', $alias . '.donation_id')
220 ->andOn($alias . '.meta_key', $key, true);
221 });
222
223 return $this;
224 }
225 }
226