PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 4.4.0
GiveWP – Donation Plugin and Fundraising Platform v4.4.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 1 year ago DonorStatisticsQuery.php 1 year ago DonorsAdminPage.php 1 year ago DonorsQuery.php 1 year ago ServiceProvider.php 1 year ago
DonorStatisticsQuery.php
230 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 }
50
51 /**
52 * @since 4.4.0
53 */
54 public function filterByCampaign(Campaign $campaign): self
55 {
56 $query = clone $this;
57
58 $query->joinDonationMeta(DonationMetaKeys::CAMPAIGN_ID, 'campaignId');
59 $query->where('campaignId.meta_value', $campaign->id);
60
61 return $query;
62 }
63
64 /**
65 * @since 4.4.0
66 *
67 * @return int|float
68 */
69 public function getLifetimeDonationsAmount()
70 {
71 $query = clone $this;
72
73 return $query->sum(
74 'IFNULL(amount.meta_value, 0) - IFNULL(feeAmountRecovered.meta_value, 0)'
75 );
76 }
77
78 /**
79 * @since 4.4.0
80 */
81 public function getHighestDonationAmount()
82 {
83 $query = clone $this;
84
85 $query->select('IFNULL(amount.meta_value, 0) - IFNULL(feeAmountRecovered.meta_value, 0) as highestDonationAmount');
86 $query->orderBy('CAST(amount.meta_value AS DECIMAL)', 'DESC');
87 $query->limit(1);
88 $result = $query->get();
89
90 if ( ! $result) {
91 return null;
92 }
93
94 return (float)$result->highestDonationAmount;
95 }
96
97 /**
98 * @since 4.4.0
99 */
100 public function getAverageDonationAmount()
101 {
102 $query = clone $this;
103
104 $donationsCount = $this->getDonationsCount();
105 $lifetimeDonationsAmount = $query->getLifetimeDonationsAmount();
106
107 return $donationsCount > 0 ? $lifetimeDonationsAmount / $donationsCount : $lifetimeDonationsAmount;
108 }
109
110 /**
111 * @since 4.4.0
112 */
113 public function getDonationsCount(): int
114 {
115 $query = clone $this;
116
117 return $query->count('donation.ID');
118 }
119
120
121 /**
122 * @since 4.4.0
123 */
124 public function getFirstDonation()
125 {
126 $query = clone $this;
127 $query->select(
128 'donation.post_date',
129 'IFNULL(amount.meta_value, 0) - IFNULL(feeAmountRecovered.meta_value, 0) as amount'
130 );
131 $query->orderBy('post_date', 'ASC');
132 $query->limit(1);
133 $result = $query->get();
134
135 if (!$result) {
136 return null;
137 }
138
139 return [
140 'amount' => (float)$result->amount,
141 'date' => date('Y-m-d H:i:s', strtotime($result->post_date))
142 ];
143 }
144
145 /**
146 * @since 4.4.0
147 */
148 public function getLastDonation()
149 {
150 $query = clone $this;
151 $query->select(
152 'donation.post_date',
153 'IFNULL(amount.meta_value, 0) - IFNULL(feeAmountRecovered.meta_value, 0) as amount'
154 );
155 $query->orderBy('post_date', 'DESC');
156 $query->limit(1);
157 $result = $query->get();
158
159 if (!$result) {
160 return null;
161 }
162
163 return [
164 'amount' => (float)$result->amount,
165 'date' => date('Y-m-d H:i:s', strtotime($result->post_date)),
166 ];
167 }
168
169 /**
170 * @since 4.4.0
171 */
172 public function getDonorType()
173 {
174 $donorRepository = give(DonorRepository::class);
175 $donorType = $donorRepository->getDonorType($this->donor->id);
176
177 if (!$donorType) {
178 return null;
179 }
180
181 switch ($donorType->getValue()) {
182 case DonorType::NEW:
183 return __('No Donations', 'give');
184 case DonorType::SUBSCRIBER:
185 return __('Subscriber', 'give');
186 case DonorType::REPEAT:
187 return __('Repeat', 'give');
188 case DonorType::SINGLE:
189 return __('One-time', 'give');
190 default:
191 return $donorType->label();
192 }
193 }
194
195 /**
196 * @since 4.4.0
197 */
198 public function preferredPaymentMethod(): string
199 {
200 $query = clone $this;
201 $query->joinDonationMeta(DonationMetaKeys::GATEWAY, 'gateway');
202 $query->select('gateway.meta_value as gateway');
203 $query->groupBy('gateway.meta_value');
204 $query->orderBy('COUNT(gateway.meta_value)', 'DESC');
205 $query->limit(1);
206 $result = $query->get();
207
208 if (!$result) {
209 return '';
210 }
211
212 return give_get_gateway_checkout_label($result->gateway) ?? $result->gateway;
213 }
214
215 /**
216 * @since 4.4.0
217 */
218 public function joinDonationMeta($key, $alias): self
219 {
220 $this->join(function (JoinQueryBuilder $builder) use ($key, $alias) {
221 $builder
222 ->leftJoin('give_donationmeta', $alias)
223 ->on('donation.ID', $alias . '.donation_id')
224 ->andOn($alias . '.meta_key', $key, true);
225 });
226
227 return $this;
228 }
229 }
230