Merge pull request #17700 from ixiam/dev-#1843
[civicrm-core.git] / CRM / Report / Utils / Get.php
1 <?php
2 /*
3 +--------------------------------------------------------------------+
4 | Copyright CiviCRM LLC. All rights reserved. |
5 | |
6 | This work is published under the GNU AGPLv3 license with some |
7 | permitted exceptions and without any warranty. For full license |
8 | and copyright information, see https://civicrm.org/licensing |
9 +--------------------------------------------------------------------+
10 */
11
12 /**
13 *
14 * @package CRM
15 * @copyright CiviCRM LLC https://civicrm.org/licensing
16 */
17 class CRM_Report_Utils_Get {
18
19 /**
20 * @param string $name
21 * @param $type
22 *
23 * @return mixed|null
24 */
25 public static function getTypedValue($name, $type) {
26 $value = $_GET[$name] ?? NULL;
27 if ($value === NULL) {
28 return NULL;
29 }
30 return CRM_Utils_Type::escape($value,
31 CRM_Utils_Type::typeToString($type),
32 FALSE
33 );
34 }
35
36 /**
37 * @param string $fieldName
38 * @param $field
39 * @param $defaults
40 *
41 * @return bool
42 */
43 public static function dateParam($fieldName, &$field, &$defaults) {
44 // type = 12 (datetime) is not recognized by Utils_Type::escape() method,
45 // and therefore the below hack
46 $type = 4;
47
48 $from = self::getTypedValue("{$fieldName}_from", $type);
49 $to = self::getTypedValue("{$fieldName}_to", $type);
50
51 $relative = self::getTypedValue("{$fieldName}_relative", CRM_Utils_Type::T_STRING);
52 if ($relative !== NULL) {
53 $defaults["{$fieldName}_relative"] = $relative;
54 }
55 if ($relative) {
56 list($from, $to) = CRM_Utils_Date::getFromTo($relative, NULL, NULL);
57 $from = substr($from, 0, 8);
58 $to = substr($to, 0, 8);
59 }
60
61 if (!($from || $to)) {
62 return FALSE;
63 }
64
65 if ($from !== NULL) {
66 $dateFrom = CRM_Utils_Date::setDateDefaults($from);
67 if ($dateFrom !== NULL &&
68 !empty($dateFrom[0])
69 ) {
70 $defaults["{$fieldName}_from"] = $dateFrom[0];
71 }
72 }
73
74 if ($to !== NULL) {
75 $dateTo = CRM_Utils_Date::setDateDefaults($to);
76 if ($dateTo !== NULL &&
77 !empty($dateTo[0])
78 ) {
79 $defaults["{$fieldName}_to"] = $dateTo[0];
80 }
81 }
82 }
83
84 /**
85 * @param string $fieldName
86 * @param $field
87 * @param $defaults
88 */
89 public static function stringParam($fieldName, &$field, &$defaults) {
90 $fieldOP = CRM_Utils_Array::value("{$fieldName}_op", $_GET, 'like');
91
92 switch ($fieldOP) {
93 case 'has':
94 case 'sw':
95 case 'ew':
96 case 'nhas':
97 case 'like':
98 case 'eq':
99 case 'neq':
100 $value = self::getTypedValue("{$fieldName}_value", CRM_Utils_Array::value('type', $field));
101 if ($value !== NULL) {
102 $defaults["{$fieldName}_value"] = $value;
103 $defaults["{$fieldName}_op"] = $fieldOP;
104 }
105 break;
106
107 case 'nll':
108 case 'nnll':
109 $defaults["{$fieldName}_op"] = $fieldOP;
110 break;
111
112 case 'in':
113 case 'notin':
114 case 'mhas':
115 $value = self::getTypedValue("{$fieldName}_value", CRM_Utils_Type::T_STRING);
116 if ($value !== NULL) {
117 $defaults["{$fieldName}_value"] = explode(",", $value);
118 $defaults["{$fieldName}_op"] = $fieldOP;
119 }
120 break;
121 }
122 }
123
124 /**
125 * @param string $fieldName
126 * @param $field
127 * @param $defaults
128 */
129 public static function intParam($fieldName, &$field, &$defaults) {
130 $fieldOP = CRM_Utils_Array::value("{$fieldName}_op", $_GET, 'eq');
131
132 switch ($fieldOP) {
133 case 'lte':
134 case 'gte':
135 case 'eq':
136 case 'lt':
137 case 'gt':
138 case 'neq':
139 $value = self::getTypedValue("{$fieldName}_value", $field['type']);
140 if ($value !== NULL) {
141 $defaults["{$fieldName}_value"] = $value;
142 $defaults["{$fieldName}_op"] = $fieldOP;
143 }
144 break;
145
146 case 'bw':
147 case 'nbw':
148 $minValue = self::getTypedValue("{$fieldName}_min", $field['type']);
149 $maxValue = self::getTypedValue("{$fieldName}_max", $field['type']);
150 if ($minValue !== NULL ||
151 $maxValue !== NULL
152 ) {
153 if ($minValue !== NULL) {
154 $defaults["{$fieldName}_min"] = $minValue;
155 }
156 if ($maxValue !== NULL) {
157 $defaults["{$fieldName}_max"] = $maxValue;
158 }
159 $defaults["{$fieldName}_op"] = $fieldOP;
160 }
161 break;
162
163 case 'nll':
164 case 'nnll':
165 $defaults["{$fieldName}_op"] = $fieldOP;
166 break;
167
168 case 'in':
169 case 'notin':
170 // send the type as string so that multiple values can also be retrieved from url.
171 // for e.g url like - "memtype_in=in&memtype_value=1,2,3"
172 $value = self::getTypedValue("{$fieldName}_value", CRM_Utils_Type::T_STRING);
173 if (!preg_match('/^(\d+)(,\d+){0,14}$/', $value)) {
174 // extra check. Also put a limit of 15 max values.
175 $value = NULL;
176 }
177 if ($value !== NULL) {
178 $defaults["{$fieldName}_value"] = explode(",", $value);
179 $defaults["{$fieldName}_op"] = $fieldOP;
180 }
181 break;
182 }
183 }
184
185 /**
186 * @param $defaults
187 */
188 public static function processChart(&$defaults) {
189 $chartType = $_GET["charts"] ?? NULL;
190 if (in_array($chartType, [
191 'barChart',
192 'pieChart',
193 ])) {
194 $defaults["charts"] = $chartType;
195 }
196 }
197
198 /**
199 * @param $fieldGrp
200 * @param $defaults
201 */
202 public static function processFilter(&$fieldGrp, &$defaults) {
203 // process only filters for now
204 foreach ($fieldGrp as $tableName => $fields) {
205 foreach ($fields as $fieldName => $field) {
206 switch (CRM_Utils_Array::value('type', $field)) {
207 case CRM_Utils_Type::T_INT:
208 case CRM_Utils_Type::T_FLOAT:
209 case CRM_Utils_Type::T_MONEY:
210 self::intParam($fieldName, $field, $defaults);
211 break;
212
213 case CRM_Utils_Type::T_DATE:
214 case CRM_Utils_Type::T_DATE | CRM_Utils_Type::T_TIME:
215 self::dateParam($fieldName, $field, $defaults);
216 break;
217
218 case CRM_Utils_Type::T_STRING:
219 default:
220 self::stringParam($fieldName, $field, $defaults);
221 break;
222 }
223 }
224 }
225 }
226
227 /**
228 * unset default filters.
229 * @param $defaults
230 */
231 public static function unsetFilters(&$defaults) {
232 static $unsetFlag = TRUE;
233 if ($unsetFlag) {
234 foreach ($defaults as $field_name => $field_value) {
235 $newstr = substr($field_name, strrpos($field_name, '_'));
236 if ($newstr == '_value' || $newstr == '_op' ||
237 $newstr == '_min' || $newstr == '_max' ||
238 $newstr == '_from' || $newstr == '_to' ||
239 $newstr == '_relative'
240 ) {
241 unset($defaults[$field_name]);
242 }
243 }
244 $unsetFlag = FALSE;
245 }
246 }
247
248 /**
249 * @param $fieldGrp
250 * @param $defaults
251 */
252 public static function processGroupBy(&$fieldGrp, &$defaults) {
253 // process only group_bys for now
254 $flag = FALSE;
255
256 if (is_array($fieldGrp)) {
257 foreach ($fieldGrp as $tableName => $fields) {
258 if ($groupBys = CRM_Utils_Array::value("gby", $_GET)) {
259 $groupBys = explode(' ', $groupBys);
260 if (!empty($groupBys)) {
261 if (!$flag) {
262 unset($defaults['group_bys']);
263 $flag = TRUE;
264 }
265 foreach ($groupBys as $gby) {
266 if (array_key_exists($gby, $fields)) {
267 $defaults['group_bys'][$gby] = 1;
268 }
269 }
270 }
271 }
272 }
273 }
274 }
275
276 /**
277 * @param $reportFields
278 * @param $defaults
279 */
280 public static function processFields(&$reportFields, &$defaults) {
281 //add filters from url
282 if (is_array($reportFields)) {
283 if ($urlFields = CRM_Utils_Array::value("fld", $_GET)) {
284 $urlFields = explode(',', $urlFields);
285 }
286 if (CRM_Utils_Array::value("ufld", $_GET) == 1) {
287 // unset all display columns
288 $defaults['fields'] = [];
289 }
290 if (!empty($urlFields)) {
291 foreach ($reportFields as $tableName => $fields) {
292 foreach ($urlFields as $fld) {
293 if (array_key_exists($fld, $fields)) {
294 $defaults['fields'][$fld] = 1;
295 }
296 }
297 }
298 }
299 }
300 }
301
302 }