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