PluginProbe
Fluent Forms – Customizable Contact Forms, Survey, Quiz, & Conversational Form Builder / 4.3.17
Fluent Forms – Customizable Contact Forms, Survey, Quiz, & Conversational Form Builder v4.3.17
6.2.13 6.2.12 6.2.10 6.2.11 6.2.9 6.2.8 6.2.7 6.2.6 6.2.5 6.2.4 6.2.3 6.2.2 3.6.22 3.6.31 3.6.40 3.6.41 3.6.42 3.6.50 3.6.51 3.6.60 3.6.61 3.6.62 3.6.64 3.6.65 3.6.66 All 195 releases
fluentform / app / Modules / Entries / Report.php

Report.php in Fluent Forms – Customizable Contact Forms, Survey, Quiz, & Conversational Form Builder 4.3.17, at app/Modules/Entries/Report.php

346 lines 12.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace FluentForm\App\Modules\Entries;
4
5 use FluentForm\App\Helpers\Helper;
6 use FluentForm\App\Modules\Form\FormFieldsParser;
7 use FluentForm\Framework\Foundation\Application;
8 use FluentForm\Framework\Helpers\ArrayHelper;
9
10 class Report
11 {
12 private $app;
13 private $formModel;
14
15 public function __construct(Application $app)
16 {
17 $this->app = $app;
18 $this->formModel = wpFluent()->table('fluentform_forms');
19 }
20
21 /**
22 * Get report
23 *
24 * @param bool $formId
25 */
26 public function getReport($formId = false)
27 {
28 if (!$formId) {
29 $formId = intval($this->app->request->get('form_id'));
30 }
31
32 $this->maybeMigrateData($formId);
33
34 $statuses = $this->app->request->get('statuses');
35
36 $form = $this->formModel->find($formId);
37
38 $report = $this->generateReport($form, $statuses);
39
40 wp_send_json_success($report);
41 }
42
43 public function generateReport($form, $statuses = [])
44 {
45 $formInputs = FormFieldsParser::getEntryInputs($form, ['admin_label', 'element', 'options']);
46
47 $inputLabels = FormFieldsParser::getAdminLabels($form, $formInputs);
48
49 $elements = [];
50
51 foreach ($formInputs as $inputName => $input) {
52 $elements[$inputName] = $input['element'];
53 if ('select_country' == $input['element']) {
54 $formInputs[$inputName]['options'] = getFluentFormCountryList();
55 }
56 }
57
58 $reportableInputs = Helper::getReportableInputs();
59
60 $formReportableInputs = array_intersect($reportableInputs, array_values($elements));
61
62 $reportableInputs = Helper::getSubFieldReportableInputs();
63 $formSubFieldInputs = array_intersect($reportableInputs, array_values($elements));
64
65 if (!$formReportableInputs && !$formSubFieldInputs) {
66 return [
67 'report_items' => (object) [],
68 'total_entries' => 0,
69 ];
70 }
71
72 $inputs = [];
73 $subfieldInputs = [];
74 foreach ($elements as $elementKey => $element) {
75 if (in_array($element, $formReportableInputs)) {
76 $inputs[$elementKey] = $element;
77 }
78 if (in_array($element, $formSubFieldInputs)) {
79 $subfieldInputs[$elementKey] = $element;
80 }
81 }
82
83 $whereClasuses = [];
84
85 if ($statuses) {
86 $whereClasuses['fluentform_submissions.status'] = [
87 'method' => 'whereIn',
88 'values' => $statuses,
89 ];
90 }
91
92 $reports = $this->getInputReport($form->id, array_keys($inputs), $whereClasuses);
93
94 $subFieldReports = $this->getSubFieldInputReport($form->id, array_keys($subfieldInputs), $whereClasuses);
95
96 $reports = array_merge($reports, $subFieldReports);
97
98 foreach ($reports as $reportKey => $report) {
99 $reports[$reportKey]['label'] = $inputLabels[$reportKey];
100 $reports[$reportKey]['element'] = ArrayHelper::get($inputs, $reportKey, []);
101 $reports[$reportKey]['options'] = $formInputs[$reportKey]['options'];
102 }
103
104 return [
105 'report_items' => $reports,
106 'total_entries' => $this->getEntryCounts($form->id, $statuses),
107 'browsers' => $this->getbrowserCounts($form->id, $statuses),
108 'devices' => $this->getDeviceCounts($form->id, $statuses),
109 ];
110 }
111
112 public function getInputReport($formId, $fieldNames, $whereClasuses)
113 {
114 if (!$fieldNames) {
115 return [];
116 }
117 global $wpdb;
118 $reportQuery = wpFluent()->table('fluentform_entry_details')
119 ->select([
120 'fluentform_entry_details.field_name',
121 'fluentform_entry_details.sub_field_name',
122 'fluentform_entry_details.field_value',
123 ])
124 ->select(wpFluent()->raw('count(' . $wpdb->prefix . 'fluentform_entry_details.field_name) as total_count'))
125 ->where('fluentform_entry_details.form_id', $formId)
126 ->whereIn('fluentform_entry_details.field_name', $fieldNames)
127 ->rightJoin('fluentform_submissions', 'fluentform_submissions.id', '=', 'fluentform_entry_details.submission_id');
128
129 if ($whereClasuses) {
130 foreach ($whereClasuses as $clauseColumn => $clasus) {
131 $reportQuery = $reportQuery->{$clasus['method']}($clauseColumn, $clasus['values']);
132 }
133 }
134
135 $reports = $reportQuery->groupBy(['fluentform_entry_details.field_name', 'fluentform_entry_details.field_value'])
136 ->get();
137
138 $formattedReports = [];
139 foreach ($reports as $report) {
140 $formattedReports[$report->field_name]['reports'][] = [
141 'value' => maybe_unserialize($report->field_value),
142 'count' => $report->total_count,
143 'sub_field' => $report->sub_field_name,
144 ];
145 $formattedReports[$report->field_name]['total_entry'] = $this->getEntryTotal($report->field_name, $formId, $whereClasuses);
146 }
147
148 return $formattedReports;
149 }
150
151 public function getSubFieldInputReport($formId, $fieldNames, $whereClasuses)
152 {
153 if (!$fieldNames) {
154 return [];
155 }
156
157 global $wpdb;
158 $reportQuery = wpFluent()->table('fluentform_entry_details')
159 ->select([
160 'fluentform_entry_details.field_name',
161 'fluentform_entry_details.sub_field_name',
162 'fluentform_entry_details.field_value',
163 ])
164 ->select(wpFluent()->raw('count(' . $wpdb->prefix . 'fluentform_entry_details.field_name) as total_count'))
165 ->where('fluentform_entry_details.form_id', $formId)
166 ->whereIn('fluentform_entry_details.field_name', $fieldNames)
167 ->leftJoin('fluentform_submissions', 'fluentform_submissions.id', '=', 'fluentform_entry_details.submission_id');
168
169 if ($whereClasuses) {
170 foreach ($whereClasuses as $clauseColumn => $clasus) {
171 $reportQuery = $reportQuery->{$clasus['method']}($clauseColumn, $clasus['values']);
172 }
173 }
174
175 $reports = $reportQuery->groupBy(['fluentform_entry_details.field_name', 'fluentform_entry_details.field_value', 'fluentform_entry_details.sub_field_name'])
176 ->get();
177
178 return $this->getFormattedReportsForSubInputs($reports, $formId, $whereClasuses);
179 }
180
181 protected function getFormattedReportsForSubInputs($reports, $formId, $whereClasuses)
182 {
183 if (!count($reports)) {
184 return [];
185 }
186
187 $formattedReports = [];
188
189 foreach ($reports as $report) {
190 $this->setReportForSubInput((array) $report, $formattedReports);
191 }
192
193 foreach ($formattedReports as $fieldName => $val) {
194 $formattedReports[$fieldName]['total_entry'] = $this->getEntryTotal(
195 $report->field_name,
196 $formId,
197 $whereClasuses
198 );
199
200 $formattedReports[$fieldName]['reports'] = array_values(
201 $formattedReports[$fieldName]['reports']
202 );
203 }
204
205 return $formattedReports;
206 }
207
208 protected function setReportForSubInput($report, &$formattedReports)
209 {
210 $filedValue = maybe_unserialize($report['field_value']);
211
212 if (is_array($filedValue)) {
213 foreach ($filedValue as $fVal) {
214 $this->setReportForSubInput(
215 array_merge($report, ['field_value' => $fVal]),
216 $formattedReports
217 );
218 }
219 } else {
220 $value = $report['sub_field_name'] . ' : ' . $filedValue;
221 $count = ArrayHelper::get($formattedReports, $report['field_name'] . '.reports.' . $value . '.count');
222 $count = $count ? $count + $report['total_count'] : $report['total_count'];
223
224 $formattedReports[$report['field_name']]['reports'][$value] = [
225 'value' => $value,
226 'count' => $count,
227 'sub_field' => $report['sub_field_name'],
228 ];
229 }
230 }
231
232 public function getEntryTotal($fieldName, $formId, $whereClasuses)
233 {
234 $query = wpFluent()->table('fluentform_entry_details')
235 ->select('fluentform_entry_details.id')
236 ->where('fluentform_entry_details.form_id', $formId)
237 ->where('fluentform_entry_details.field_name', $fieldName)
238 ->groupBy(['fluentform_entry_details.field_name', 'fluentform_entry_details.submission_id'])
239 ->leftJoin('fluentform_submissions', 'fluentform_submissions.id', '=', 'fluentform_entry_details.submission_id');
240
241 if ($whereClasuses) {
242 foreach ($whereClasuses as $clauseColumn => $clasus) {
243 $query = $query->{$clasus['method']}($clauseColumn, $clasus['values']);
244 }
245 }
246
247 return $query->count();
248 }
249
250 private function maybeMigrateData($formId)
251 {
252 // We have to check if we need to migrate the data
253 if ('yes' == Helper::getFormMeta($formId, 'report_data_migrated')) {
254 return true;
255 }
256 global $wpdb;
257 // let's migrate the data
258 $unmigratedData = wpFluent()
259 ->table('fluentform_submissions')
260 ->select([
261 'fluentform_submissions.id',
262 'fluentform_submissions.response',
263 ])
264 ->where('fluentform_submissions.form_id', $formId)
265 ->where(wpFluent()->raw($wpdb->prefix . 'fluentform_submissions.id NOT IN (SELECT submission_id from ' . $wpdb->prefix . 'fluentform_entry_details)'))
266 ->get();
267
268 if (!$unmigratedData) {
269 return Helper::setFormMeta($formId, 'report_data_migrated', 'yes');
270 }
271
272 $entries = new Entries();
273 foreach ($unmigratedData as $datum) {
274 $value = json_decode($datum->response, true);
275 $entries->recordEntryDetails($datum->id, $formId, $value);
276 }
277
278 return true;
279 }
280
281 private function getEntryCounts($formId, $statuses = false)
282 {
283 $totalEntries = wpFluent()
284 ->table('fluentform_submissions')
285 ->where('fluentform_submissions.form_id', $formId);
286
287 if ($statuses) {
288 $totalEntries = $totalEntries->whereIn('fluentform_submissions.status', $statuses);
289 } else {
290 $totalEntries = $totalEntries->where('fluentform_submissions.status', '!=', 'trashed');
291 }
292 return $totalEntries->count();
293 }
294
295 private function getBrowserCounts($formId, $statuses)
296 {
297 global $wpdb;
298 $browserCounts = wpFluent()->table('fluentform_submissions')
299 ->select([
300 wpFluent()->raw('count(' . $wpdb->prefix . 'fluentform_submissions.id) as total_count'),
301 'browser',
302 ])
303 ->where('form_id', $formId);
304 if ($statuses) {
305 $browserCounts = $browserCounts->whereIn('status', $statuses);
306 } else {
307 $browserCounts = $browserCounts->where('status', '!=', 'trashed');
308 }
309
310 $browserCounts = $browserCounts->groupBy('browser')
311 ->get();
312
313 $formattedData = [];
314 foreach ($browserCounts as $browser) {
315 $formattedData[$browser->browser] = $browser->total_count;
316 }
317
318 return $formattedData;
319 }
320
321 private function getDeviceCounts($formId, $statuses)
322 {
323 global $wpdb;
324 $deviceCounts = wpFluent()->table('fluentform_submissions')
325 ->select([
326 wpFluent()->raw('count(' . $wpdb->prefix . 'fluentform_submissions.id) as total_count'),
327 'device',
328 ])
329 ->where('form_id', $formId);
330 if ($statuses) {
331 $deviceCounts = $deviceCounts->whereIn('status', $statuses);
332 } else {
333 $deviceCounts = $deviceCounts->where('status', '!=', 'trashed');
334 }
335
336 $deviceCounts = $deviceCounts->groupBy('device')
337 ->get();
338
339 $formattedData = [];
340 foreach ($deviceCounts as $deviceCount) {
341 $formattedData[$deviceCount->device] = $deviceCount->total_count;
342 }
343 return $formattedData;
344 }
345 }
346