PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 3.16.2
GiveWP – Donation Plugin and Fundraising Platform v3.16.2
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 2 years ago DataTransferObjects 1 year ago Exceptions 1 year ago Factories 2 years ago FormDesigns 1 year ago FormPage 2 years ago Listeners 1 year ago Migrations 2 years ago Models 2 years ago Properties 1 year ago Repositories 2 years ago Routes 1 year ago Rules 1 year ago Shortcodes 2 years ago V2 1 year ago ValueObjects 2 years ago ViewModels 2 years ago resources 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
160 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->joinMeta('_give_completed_date', 'completed');
82 $this->whereBetween('completed.meta_value', $startDate, $endDate);
83 return $this;
84 }
85
86 /**
87 * @since 3.14.0
88 */
89 public function includeOnlyValidStatuses(): DonationQuery
90 {
91 $this->whereIn('donation.post_status', ['publish', 'give_subscription']);
92
93 return $this;
94 }
95
96 /**
97 * @since 3.14.0
98 */
99 public function includeOnlyCurrentMode(): DonationQuery
100 {
101 $this->joinMeta('_give_payment_mode', 'paymentMode');
102 $this->where('paymentMode.meta_value', give_is_test_mode() ? 'test' : 'live');
103
104 return $this;
105 }
106
107 /**
108 * Returns a calculated sum of the intended amounts (without recovered fees) for the donations.
109 *
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('_give_payment_total', 'amount');
125 $this->joinMeta('_give_fee_donation_amount', 'intendedAmount');
126 return $this->sum(
127 'COALESCE(NULLIF(intendedAmount.meta_value,0), NULLIF(amount.meta_value,0), 0)'
128 );
129 }
130
131 /**
132 * Returns a calculated sum of the amounts (with recovered fees) for the donations.
133 *
134 * @since 3.14.0
135 * @return int|float
136 */
137 public function sumAmount($includeOnlyValidStatuses = true, $includeOnlyCurrentMode = true)
138 {
139 if ($includeOnlyValidStatuses) {
140 $this->includeOnlyValidStatuses();
141 }
142
143 if ($includeOnlyCurrentMode) {
144 $this->includeOnlyCurrentMode();
145 }
146
147 $this->joinMeta('_give_payment_total', 'amount');
148
149 return $this->sum(
150 'amount.meta_value'
151 );
152 }
153
154 public function countDonors()
155 {
156 $this->joinMeta(DonationMetaKeys::DONOR_ID, 'donorId');
157 return $this->count('DISTINCT donorId.meta_value');
158 }
159 }
160