Passed
Pull Request — developer (#16883)
by
unknown
14:53
created

Settings_Groups_GetData_Action::process()   B

Complexity

Conditions 7
Paths 12

Size

Total Lines 43
Code Lines 31

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 31
dl 0
loc 43
rs 8.4906
c 1
b 0
f 0
cc 7
nc 12
nop 1
1
<?php
2
3
/**
4
 * Groups get data action file.
5
 *
6
 * @package   Settings.Action
7
 *
8
 * @copyright YetiForce S.A.
9
 * @license YetiForce Public License 5.0 (licenses/LicenseEN.txt or yetiforce.com)
10
 * @author Adrian Kon <[email protected]>
11
 */
12
13
/**
14
 * Groups get data action class.
15
 */
16
class Settings_Groups_GetData_Action extends \App\Controller\Action
17
{
18
	use \App\Controller\Traits\SettingsPermission;
19
20
	private $request;
21
	private $moduleModel;
22
	private $baseIndex = '';
23
24
	/**
25
	 * Gets groups list.
26
	 *
27
	 * @param App\Request $request
28
	 */
29
	public function process(App\Request $request)
30
	{
31
		$this->request = $request;
32
		$rows = $columns = [];
33
		foreach ($this->request->getArray('columns') as $key => $value) {
34
			$columns[$key] = $value['name'];
35
		}
36
37
		$this->moduleModel = Settings_Vtiger_Module_Model::getInstance($this->request->getModule(false));
38
		$fields = $this->moduleModel->getListFields();
39
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
62
			$rows[] = $data;
63
		}
64
		$result = [
65
			'draw' => $this->request->getInteger('draw'),
66
			'iTotalDisplayRecords' => $filter,
67
			'aaData' => $rows
68
		];
69
70
		header('content-type: text/json; charset=UTF-8');
71
		echo \App\Json::encode($result);
72
	}
73
74
	private function setConditions(App\Db\Query $query, array $fields): App\Db\Query
75
	{
76
		$qualifiedModuleName = $this->request->getModule(false);
77
		$conditions = ['and'];
78
		$users = $groups = $roles = $rolesAndSubordinates = [];
79
		foreach ($fields as $fieldModel) {
80
			$fieldModelName = $fieldModel->getName();
81
			if ($this->request->has($fieldModelName) && '' !== $this->request->get($fieldModelName)) {
82
				$value = $this->moduleModel->getValueFromRequest($fieldModelName, $this->request);
83
				switch ($fieldModelName) {
84
					case 'groupname':
85
						$accessibleGroups = (new \App\Db\Query())->select(['groupid', 'groupname'])->from('vtiger_groups')->createCommand()->queryAllByGroup(0);
86
						foreach ($accessibleGroups as $groupId => $groupName) {
87
							$accessibleGroups[$groupId] = App\Language::translate($groupName, $qualifiedModuleName);
88
						}
89
						$groupIdsContainName = preg_grep("/{$value}/i", $accessibleGroups);
90
						$conditions[] = [$this->moduleModel->baseTable . '.' . $this->baseIndex => array_keys($groupIdsContainName)];
91
						break;
92
					case 'description':
93
						$conditions[] = ['like', $fieldModel->getColumnName(), $value];
94
						break;
95
					case 'modules':
96
						$query->innerJoin('vtiger_group2modules', 'vtiger_group2modules.groupid = vtiger_groups.groupid');
97
						$conditions[] = ['tabid' => $value];
98
						break;
99
					case 'members':
100
						foreach ($value as $memberTypeId) {
101
							[$type,  $memberId] = explode(':', $memberTypeId);
102
							switch ($type) {
103
								case 'Users':
104
									$users[] = (int) $memberId;
105
									break;
106
								case 'Groups':
107
									$groups[] = (int) $memberId;
108
									break;
109
								case 'Roles':
110
									$roles[] = $memberId;
111
									break;
112
								case 'RoleAndSubordinates':
113
									$rolesAndSubordinates[] = $memberId;
114
									break;
115
								default:
116
									break;
117
							}
118
						}
119
						if ($users) {
120
							$query->innerJoin('vtiger_users2group', 'vtiger_users2group.groupid = vtiger_groups.groupid');
121
							$conditions[] = ['userid' => $users];
122
						}
123
						if ($groups) {
124
							$query->innerJoin('vtiger_group2grouprel', 'vtiger_group2grouprel.groupid = vtiger_groups.groupid');
125
							$conditions[] = ['vtiger_group2grouprel.groupid' => $groups];
126
						}
127
						if ($roles) {
128
							$query->innerJoin('vtiger_group2role', 'vtiger_group2role.groupid = vtiger_groups.groupid');
129
							$conditions[] = ['vtiger_group2role.roleid' => $roles];
130
						}
131
						if ($rolesAndSubordinates) {
132
							$query->innerJoin('vtiger_group2rs', 'vtiger_group2rs.groupid = vtiger_groups.groupid');
133
							$conditions[] = ['vtiger_group2rs.roleandsubid' => $rolesAndSubordinates];
134
						}
135
						break;
136
					default:
137
					$conditions[] = [$fieldModel->getColumnName() => $value];
138
				}
139
			}
140
		}
141
		$query->where($conditions);
142
		return $query;
143
	}
144
}
145