PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 3.7.0
GiveWP – Donation Plugin and Fundraising Platform v3.7.0
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 / Tracking / TrackingData / DonationFormsData.php
give / src / Tracking / TrackingData Last commit date
ActiveDonationFormsData.php 4 years ago DonationData.php 4 years ago DonationFormsData.php 2 years ago DonationMetricsData.php 4 years ago EditedDonationFormsData.php 4 years ago GivePluginSettingsData.php 4 years ago PluginsData.php 4 years ago ServerData.php 4 years ago ThemeData.php 4 years ago WebsiteData.php 4 years ago WebsiteInfoData.php 4 years ago
DonationFormsData.php
264 lines
1 <?php
2
3 namespace Give\Tracking\TrackingData;
4
5 use Give\DonationForms\Models\DonationForm;
6 use Give\Framework\Database\DB;
7 use Give\Helpers\ArrayDataSet;
8 use Give\Helpers\Form\Template;
9 use Give\Helpers\Form\Utils;
10 use Give\Tracking\Contracts\TrackData;
11 use Give\Tracking\Helpers\DonationStatuses;
12 use Give\Tracking\Repositories\TrackEvents;
13
14 /**
15 * Class DonationFormsData
16 *
17 * Represents donation forms data
18 *
19 * @package Give\Tracking\TrackingData
20 * @since 2.10.0
21 */
22 class DonationFormsData implements TrackData
23 {
24 protected $formIds = [];
25 protected $formRevenues = [];
26 protected $formDonorCounts = [];
27
28 /**
29 * @var TrackEvents
30 */
31 protected $trackEvents;
32
33 /**
34 * DonationFormsData constructor.
35 *
36 * @param TrackEvents $trackEvents
37 */
38 public function __construct(TrackEvents $trackEvents)
39 {
40 $this->trackEvents = $trackEvents;
41 }
42
43 /**
44 * @inheritdoc
45 */
46 public function get()
47 {
48 $this->setFormIds();
49
50 if (! $this->formIds) {
51 return [];
52 }
53
54 $this->setRevenues()
55 ->setDonorCounts();
56
57 return $this->getData();
58 }
59
60 /**
61 * Get forms data.
62 *
63 * @since 3.0.0 Add support for v3 forms
64 * @since 2.10.0
65 * @return array
66 */
67 protected function getData()
68 {
69 if (! $this->formIds) {
70 return [];
71 }
72
73 $data = [];
74
75 foreach ($this->formIds as $formId) {
76 $temp = [
77 'form_id' => (int)$formId,
78 'form_url' => untrailingslashit(get_permalink($formId)),
79 'form_name' => get_post_field('post_name', $formId, 'db'),
80 'form_type' => give()->form_meta->get_meta($formId, '_give_price_option', true),
81 'form_template' => $this->getFormTemplate($formId),
82 'donor_count' => $this->formDonorCounts[$formId],
83 'revenue' => $this->formRevenues[$formId],
84 ];
85 $this->addAddonsInformation($temp, $formId);
86 $data[] = $temp;
87 }
88
89 return $data;
90 }
91
92 /**
93 * Set form ids.
94 *
95 * @since 2.10.0
96 * @return self
97 */
98 protected function setFormIds()
99 {
100 global $wpdb;
101
102 $statues = DonationStatuses::getCompletedDonationsStatues(true);
103 $time = $this->trackEvents->getRequestTime();
104
105 $this->formIds = DB::get_col(
106 "
107 SELECT DISTINCT dm.meta_value
108 FROM {$wpdb->donationmeta} as dm
109 INNER JOIN {$wpdb->posts} as p ON dm.donation_id = p.ID
110 INNER JOIN {$wpdb->donationmeta} as dm2 ON dm.donation_id = dm2.donation_id
111 WHERE p.post_status IN ({$statues})
112 AND p.post_date>='{$time}'
113 AND p.post_type='give_payment'
114 AND dm2.meta_key='_give_payment_mode'
115 AND dm2.meta_value='live'
116 AND dm.meta_key='_give_payment_form_id'
117 "
118 );
119
120 return $this;
121 }
122
123 /**
124 * Set forms revenues.
125 *
126 * @since 2.10.0
127 * @return self
128 */
129 protected function setRevenues()
130 {
131 global $wpdb;
132
133 $formIds = ArrayDataSet::getStringSeparatedByCommaEnclosedWithSingleQuote($this->formIds);
134 $defaultResult = array_combine(
135 $this->formIds,
136 array_fill(0, count($this->formIds), 0) // Set default revenue to 0
137 );
138
139 $result = DB::get_results(
140 "
141 SELECT SUM(r.amount) as amount, r.form_id
142 FROM {$wpdb->give_revenue} as r
143 INNER JOIN {$wpdb->donationmeta} as dm ON r.donation_id = dm.donation_id
144 WHERE dm.meta_key='_give_payment_mode'
145 AND dm.meta_value='live'
146 AND r.form_id IN ({$formIds})
147 GROUP BY form_id
148 ",
149 ARRAY_A
150 );
151
152 if ($result) {
153 $result = array_map(
154 'absint',
155 array_combine(
156 wp_list_pluck($result, 'form_id'),
157 wp_list_pluck($result, 'amount')
158 )
159 );
160 }
161
162 $this->formRevenues = array_replace($defaultResult, $result);
163
164 return $this;
165 }
166
167 /**
168 * Set forms revenues till current date.
169 *
170 * @since 2.10.0
171 *
172 * @return self
173 */
174 protected function setDonorCounts()
175 {
176 global $wpdb;
177
178 $formIds = ArrayDataSet::getStringSeparatedByCommaEnclosedWithSingleQuote($this->formIds);
179 $statues = DonationStatuses::getCompletedDonationsStatues(true);
180 $defaultResult = array_combine(
181 $this->formIds,
182 array_fill(0, count($this->formIds), 0) // Set default donor count to 0
183 );
184
185 $result = DB::get_results(
186 "
187 SELECT COUNT(DISTINCT dm2.meta_value) as donor_count, dm.meta_value as form_id
188 FROM {$wpdb->donationmeta} as dm
189 INNER JOIN {$wpdb->posts} as p ON donation_id = p.ID
190 INNER JOIN {$wpdb->donationmeta} as dm2 ON dm.donation_id = dm2.donation_id
191 INNER JOIN {$wpdb->donors} as donor ON dm2.meta_value = donor.id
192 INNER JOIN {$wpdb->donationmeta} as dm3 ON dm.donation_id = dm3.donation_id
193 WHERE p.post_status IN ({$statues})
194 AND dm3.meta_key='_give_payment_mode'
195 AND dm3.meta_value='live'
196 AND dm.meta_key='_give_payment_form_id'
197 AND dm.meta_value IN ({$formIds})
198 AND dm2.meta_key='_give_payment_donor_id'
199 AND donor.purchase_value > 0
200 GROUP BY dm.meta_value
201 ",
202 ARRAY_A
203 );
204
205 if ($result) {
206 $result = array_map(
207 'absint',
208 array_combine(
209 wp_list_pluck($result, 'form_id'),
210 wp_list_pluck($result, 'donor_count')
211 )
212 );
213 }
214
215 $this->formDonorCounts = array_replace($defaultResult, $result);
216
217 return $this;
218 }
219
220 /**
221 * Add addon information whether or not they active for donation form.
222 *
223 * @since 2.10.0
224 *
225 * @param array $array
226 * @param int $formId
227 */
228 private function addAddonsInformation(&$array, $formId)
229 {
230 $array = array_merge(
231 $array,
232 [
233 'recurring_donations' => (int)apply_filters('give_telemetry_form_uses_addon_recurring', false, $formId),
234 'fee_recovery' => (int)apply_filters('give_telemetry_form_uses_addon_fee_recovery', false, $formId),
235 'form_field_manager' => (int)apply_filters(
236 'give_telemetry_form_uses_addon_form_field_manager',
237 false,
238 $formId
239 ),
240 ]
241 );
242 }
243
244 /**
245 * This function is used to get the form template.
246 *
247 * @since 3.0.0
248 */
249 private function getFormTemplate(int $formId): string
250 {
251 if (Utils::isV3Form($formId)) {
252 /* @var DonationForm $form */
253 $form = DonationForm::find($formId);
254
255 return $form->settings->designId . ' (V3)';
256 }
257
258 $formTemplate = Template::getActiveID($formId);
259 return ( ! $formTemplate || 'legacy' === $formTemplate )
260 ? 'legacy'
261 : $formTemplate;
262 }
263 }
264