Passed
Pull Request — developer (#17141)
by Radosław
17:17
created

Accounts_AccountsByIndustry_Dashboard::process()   A

Complexity

Conditions 5
Paths 16

Size

Total Lines 33
Code Lines 27

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 30

Importance

Changes 0
Metric Value
eloc 27
dl 0
loc 33
ccs 0
cts 26
cp 0
rs 9.1768
c 0
b 0
f 0
cc 5
nc 16
nop 1
crap 30
1
<?php
2
3
/**
4
 * Widget show accounts by industry.
5
 *
6
 * @copyright YetiForce S.A.
7
 * @license YetiForce Public License 5.0 (licenses/LicenseEN.txt or yetiforce.com)
8
 * @author Tomasz Kur <[email protected]>
9
 * @author Radosław Skrzypczak <[email protected]>
10
 */
11
class Accounts_AccountsByIndustry_Dashboard extends Vtiger_IndexAjax_View
12
{
13
	/**
14
	 * Function to get params to searching in listview.
15
	 *
16
	 * @param string $industry
17
	 * @param int    $assignedto
18
	 * @param array  $dates
19
	 *
20
	 * @return string
21
	 */
22
	public function getSearchParams($industry, $assignedto, $dates)
23
	{
24
		$listSearchParams = [];
25
		$conditions = [['industry', 'e', $industry]];
26
		if ($assignedto) {
27
			array_push($conditions, ['assigned_user_id', 'e', $assignedto]);
28
		}
29
		if (!empty($dates)) {
30
			array_push($conditions, ['createdtime', 'bw', implode(',', $dates)]);
31
		}
32
		$listSearchParams[] = $conditions;
33
		return '&search_params=' . urlencode(App\Json::encode($listSearchParams));
34
	}
35
36
	/**
37
	 * Function to get data to display chart.
38
	 *
39
	 * @param int   $owner
40
	 * @param array $dateFilter
41
	 *
42
	 * @return array
43
	 */
44
	public function getAccountsByIndustry($owner, $dateFilter)
45
	{
46
		$moduleName = 'Accounts';
47
		$query = new \App\Db\Query();
48
		$query->select([
49
			'industryid' => 'vtiger_industry.industryid',
50
			'count' => new \yii\db\Expression('COUNT(*)'),
51
			'industryvalue' => new \yii\db\Expression("CASE WHEN vtiger_account.industry IS NULL OR vtiger_account.industry = '' THEN '' ELSE vtiger_account.industry END"), ])
52
			->from('vtiger_account')
53
			->innerJoin('vtiger_crmentity', 'vtiger_account.accountid = vtiger_crmentity.crmid')
54
			->leftJoin('vtiger_industry', 'vtiger_account.industry = vtiger_industry.industry')
55
			->where(['deleted' => 0]);
56
		if (!empty($owner)) {
57
			$query->andWhere(['smownerid' => $owner]);
58
		}
59
		if (!empty($dateFilter)) {
60
			$dateFilter[0] .= ' 00:00:00';
61
			$dateFilter[1] .= ' 23:59:59';
62
			$query->andWhere(['between', 'createdtime', $dateFilter[0], $dateFilter[1]]);
63
		}
64
		\App\PrivilegeQuery::getConditions($query, $moduleName);
65
		$query->groupBy(['vtiger_industry.sortorderid', 'industryvalue', 'vtiger_industry.industryid'])->orderBy('vtiger_industry.sortorderid');
66
67
		$date = \App\Fields\DateTime::formatRangeToDisplay($dateFilter);
68
		$dataReader = $query->createCommand()->query();
69
70
		$chartData = [
71
			'dataset' => [],
72
			'show_chart' => false,
73
			'color' => []
74
		];
75
		$chartData['series'][0]['colorBy'] = 'data';
76
		$listViewUrl = Vtiger_Module_Model::getInstance($moduleName)->getListViewUrl();
77
		$colors = \App\Fields\Picklist::getColors('industry');
78
		while ($row = $dataReader->read()) {
79
			$status = $row['industryvalue'];
80
			$link = $listViewUrl . '&viewname=All&entityState=Active' . $this->getSearchParams($status, $owner, $date);
81
			$label = $status ? \App\Language::translate($status, $moduleName, null, false) : ('(' . \App\Language::translate('LBL_EMPTY', 'Home', null, false) . ')');
82
			$chartData['dataset']['source'][] = [$label, round($row['count'], 2), ['link' => $link]];
83
			$chartData['color'][] = $colors[$row['industryid']] ?? \App\Colors::getRandomColor($status);
84
			$chartData['show_chart'] = true;
85
		}
86
		$dataReader->close();
87
88
		return $chartData;
89
	}
90
91
	/**
92
	 * Process.
93
	 *
94
	 * @param \App\Request $request
95
	 */
96
	public function process(App\Request $request)
97
	{
98
		$currentUserId = \App\User::getCurrentUserId();
99
		$viewer = $this->getViewer($request);
100
		$moduleName = $request->getModule();
101
		$widget = Vtiger_Widget_Model::getInstance($request->getInteger('linkid'), $currentUserId);
102
		if (!$request->has('owner')) {
103
			$owner = Settings_WidgetsManagement_Module_Model::getDefaultUserId($widget, 'Accounts');
104
		} else {
105
			$owner = $request->getByType('owner', 2);
106
		}
107
		$ownerForwarded = $owner;
108
		if ('all' === $owner) {
109
			$owner = '';
110
		}
111
		$createdTime = $request->getDateRange('createdtime');
112
		if (empty($createdTime)) {
113
			$createdTime = Settings_WidgetsManagement_Module_Model::getDefaultDateRange($widget);
114
		}
115
116
		$data = $this->getAccountsByIndustry($owner, $createdTime);
117
		$createdTime = \App\Fields\Date::formatRangeToDisplay($createdTime);
118
		$viewer->assign('WIDGET', $widget);
119
		$viewer->assign('MODULE_NAME', $moduleName);
120
		$viewer->assign('DATA', $data);
121
		$viewer->assign('DTIME', $createdTime);
122
		$viewer->assign('ACCESSIBLE_USERS', \App\Fields\Owner::getInstance('Accounts', $currentUserId)->getAccessibleUsersForModule());
123
		$viewer->assign('ACCESSIBLE_GROUPS', \App\Fields\Owner::getInstance('Accounts', $currentUserId)->getAccessibleGroupForModule());
124
		$viewer->assign('OWNER', $ownerForwarded);
125
		if ($request->has('content')) {
126
			$viewer->view('dashboards/DashBoardWidgetContents.tpl', $moduleName);
127
		} else {
128
			$viewer->view('dashboards/AccountsByIndustry.tpl', $moduleName);
129
		}
130
	}
131
}
132