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 / DonationForms / DonationQuery.php
give / src / DonationForms Last commit date
Actions 1 year ago AsyncData 1 year ago Blocks 1 year ago Controllers 1 year ago DataTransferObjects 1 year ago Exceptions 1 year ago Factories 1 year ago FormDesigns 1 year ago FormPage 1 year ago Listeners 1 year ago Migrations 1 year ago Models 2 years ago OrphanedForms 1 year ago Properties 1 year ago Repositories 1 year ago Routes 1 year ago Rules 1 year ago Shortcodes 2 years ago V2 1 year ago ValueObjects 1 year ago ViewModels 1 year ago resources 1 year ago DonationFormDataQuery.php 1 year ago DonationFormsAdminPage.php 1 year ago DonationQuery.php 1 year ago ServiceProvider.php 1 year ago SubscriptionQuery.php 2 years ago
DonationQuery.php
159 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 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()
110 * @since 3.12.0
111 * @return int|float
112 */
113 public function sumIntendedAmount($includeOnlyValidStatuses = true, $includeOnlyCurrentMode = true)
114 {
115 if ($includeOnlyValidStatuses) {
116 $this->includeOnlyValidStatuses();
117 }
118
119 if ($includeOnlyCurrentMode) {
120 $this->includeOnlyCurrentMode();
121 }
122
123 $this->joinMeta(DonationMetaKeys::AMOUNT, 'amount');
124 $this->joinMeta(DonationMetaKeys::FEE_AMOUNT_RECOVERED, 'feeAmountRecovered');
125 return $this->sum(
126 'IFNULL(amount.meta_value, 0) - IFNULL(feeAmountRecovered.meta_value, 0)'
127 );
128 }
129
130 /**
131 * Returns a calculated sum of the amounts (with recovered fees) for the donations.
132 *
133 * @since 3.14.0
134 * @return int|float
135 */
136 public function sumAmount($includeOnlyValidStatuses = true, $includeOnlyCurrentMode = true)
137 {
138 if ($includeOnlyValidStatuses) {
139 $this->includeOnlyValidStatuses();
140 }
141
142 if ($includeOnlyCurrentMode) {
143 $this->includeOnlyCurrentMode();
144 }
145
146 $this->joinMeta('_give_payment_total', 'amount');
147
148 return $this->sum(
149 'amount.meta_value'
150 );
151 }
152
153 public function countDonors()
154 {
155 $this->joinMeta(DonationMetaKeys::DONOR_ID, 'donorId');
156 return $this->count('DISTINCT donorId.meta_value');
157 }
158 }
159