Diff: STRATO-apps/wordpress_03/app/wp-content/plugins/fluentform/app/Modules/Entries/Report.php

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