Passed
Push — developer ( 1116b3...4a3269 )
by Radosław
34:20 queued 19:24
created

Settings_Groups_GetData_View::process()   B

Complexity

Conditions 7
Paths 12

Size

Total Lines 39
Code Lines 31

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 31
c 1
b 0
f 0
dl 0
loc 39
rs 8.4906
cc 7
nc 12
nop 1
1
<?php
2
/**
3
 * Groups get data action file.
4
 *
5
 * @package   Settings.Action
6
 *
7
 * @copyright YetiForce S.A.
8
 * @license YetiForce Public License 5.0 (licenses/LicenseEN.txt or yetiforce.com)
9
 * @author Adrian Kon <[email protected]>
10
 */
11
12
/**
13
 * Groups get data action class.
14
 */
15
class Settings_Groups_GetData_View extends Settings_Vtiger_Index_View
16
{
17
	use \App\Controller\Traits\SettingsPermission;
18
19
	/** @var App\Request request */
20
	private $request;
21
	/** @var Settings_Vtiger_Module_Model */
22
	private $moduleModel;
23
	/** @var string Base index */
24
	private $baseIndex = '';
25
26
	/**
27
	 * Gets groups list.
28
	 *
29
	 * @param App\Request $request
30
	 */
31
	public function process(App\Request $request)
32
	{
33
		$this->request = $request;
34
		$rows = $columns = [];
35
		foreach ($this->request->getArray('columns') as $key => $value) {
36
			$columns[$key] = $value['name'];
37
		}
38
		$this->moduleModel = Settings_Vtiger_Module_Model::getInstance($this->request->getModule(false));
39
		$fields = $this->moduleModel->getListFields();
40
		$table = $this->moduleModel->baseTable;
41
		$this->baseIndex = $this->moduleModel->baseIndex;
42
		$query = (new \App\Db\Query())->select(["{$table}.{$this->baseIndex}"])->from($table);
43
		$query = $this->setConditions($query, $fields);
44
		$query->limit($this->request->getInteger('length'))->offset($this->request->getInteger('start'));
45
		$order = current($this->request->getArray('order', App\Purifier::ALNUM));
46
		if ($order && isset($columns[$order['column']], $fields[$columns[$order['column']]])) {
47
			$field = $fields[$columns[$order['column']]];
48
			$query->orderBy([$field->getColumnName() => \App\Db::ASC === strtoupper($order['dir']) ? \SORT_ASC : \SORT_DESC]);
49
		}
50
		$filter = $query->count("{$table}.{$this->baseIndex}");
51
		$resultData = $query->distinct()->all();
52
53
		foreach ($resultData as $key => $row) {
54
			$recordModel = Settings_Groups_Record_Model::getInstance($row['groupid']);
55
			$data = [];
56
			foreach ($fields as $fieldModel) {
57
				$data[] = $recordModel->getDisplayValue($fieldModel->getName());
58
			}
59
			$data[] = '<span class="js-detail-button d-none" data-recordurl="' . $recordModel->getDetailViewUrl() . '"></span>
60
			<a class="btn btn-primary btn-sm js-no-link" title="' . \App\Language::translate('LBL_EDIT') . '" href="' . $recordModel->getEditViewUrl() . '"><span class="yfi yfi-full-editing-view"></span></a><button type="button" class="btn btn-danger btn-sm ml-1 js-no-link js-show-modal" data-id="' . $row[$this->baseIndex] . '" title="' . \App\Language::translate('LBL_DELETE_RECORD') . '" data-url="' . $recordModel->getDeleteActionUrl() . '"><span class="fas fa-trash-alt js-no-link"></span></button>';
61
			$rows[] = $data;
62
		}
63
		$result = [
64
			'draw' => $this->request->getInteger('draw'),
65
			'iTotalDisplayRecords' => $filter,
66
			'aaData' => $rows
67
		];
68
		header('content-type: text/json; charset=UTF-8');
69
		echo \App\Json::encode($result);
70
	}
71
72
	/**
73
	 * Set conditions.
74
	 *
75
	 * @param App\Db\Query $query
76
	 * @param array        $fields
77
	 *
78
	 * @return App\Db\Query
79
	 */
80
	private function setConditions(App\Db\Query $query, array $fields): App\Db\Query
81
	{
82
		$qualifiedModuleName = $this->request->getModule(false);
83
		$conditions = ['and'];
84
		$users = $groups = $roles = $rolesAndSubordinates = $accessibleGroups = [];
85
		foreach ($fields as $fieldModel) {
86
			$fieldModelName = $fieldModel->getName();
87
			if ($this->request->has($fieldModelName) && '' !== $this->request->get($fieldModelName)) {
88
				$value = $this->moduleModel->getValueFromRequest($fieldModelName, $this->request);
0 ignored issues
show
Bug introduced by
The method getValueFromRequest() does not exist on Settings_Vtiger_Module_Model. It seems like you code against a sub-type of Settings_Vtiger_Module_Model such as Settings_AdminAccess_Module_Model or Settings_Groups_Module_Model. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

88
				/** @scrutinizer ignore-call */ 
89
    $value = $this->moduleModel->getValueFromRequest($fieldModelName, $this->request);
Loading history...
89
				switch ($fieldModelName) {
90
					case 'groupname':
91
						$allGroups = Settings_Groups_Record_Model::getAll();
92
						foreach ($allGroups as $groupId => $group) {
93
							$accessibleGroups[$groupId] = App\Language::translate($group->getName(), $qualifiedModuleName);
94
						}
95
						$quoteValue = preg_quote($value, '/');
96
						$groupIdsContainName = preg_grep("/{$quoteValue}/i", $accessibleGroups);
97
						$conditions[] = [$this->moduleModel->baseTable . '.' . $this->baseIndex => array_keys($groupIdsContainName)];
98
						break;
99
					case 'description':
100
						$conditions[] = ['like', $fieldModel->getColumnName(), $value];
101
						break;
102
					case 'modules':
103
						$query->innerJoin('vtiger_group2modules', 'vtiger_group2modules.groupid = vtiger_groups.groupid');
104
						$conditions[] = ['tabid' => $value];
105
						break;
106
					case 'members':
107
						foreach ($value as $memberTypeId) {
108
							[$type,  $memberId] = explode(':', $memberTypeId);
109
							switch ($type) {
110
								case 'Users':
111
									$users[] = (int) $memberId;
112
									break;
113
								case 'Groups':
114
									$groups[] = (int) $memberId;
115
									break;
116
								case 'Roles':
117
									$roles[] = $memberId;
118
									break;
119
								case 'RoleAndSubordinates':
120
									$rolesAndSubordinates[] = $memberId;
121
									break;
122
							}
123
						}
124
						if ($users) {
125
							$query->innerJoin('vtiger_users2group', 'vtiger_users2group.groupid = vtiger_groups.groupid');
126
							$conditions[] = ['userid' => $users];
127
						}
128
						if ($groups) {
129
							$query->innerJoin('vtiger_group2grouprel', 'vtiger_group2grouprel.groupid = vtiger_groups.groupid');
130
							$conditions[] = ['vtiger_group2grouprel.groupid' => $groups];
131
						}
132
						if ($roles) {
133
							$query->innerJoin('vtiger_group2role', 'vtiger_group2role.groupid = vtiger_groups.groupid');
134
							$conditions[] = ['vtiger_group2role.roleid' => $roles];
135
						}
136
						if ($rolesAndSubordinates) {
137
							$query->innerJoin('vtiger_group2rs', 'vtiger_group2rs.groupid = vtiger_groups.groupid');
138
							$conditions[] = ['vtiger_group2rs.roleandsubid' => $rolesAndSubordinates];
139
						}
140
						break;
141
					default:
142
						$conditions[] = [$fieldModel->getColumnName() => $value];
143
				}
144
			}
145
		}
146
		$query->where($conditions);
147
		return $query;
148
	}
149
}
150