Passed
Push — developer ( 884b36...3fc379 )
by Radosław
32:13 queued 16:24
created

HelpDesk_TicketsByStatus_Dashboard   A

Complexity

Total Complexity 14

Size/Duplication

Total Lines 116
Duplicated Lines 0 %

Test Coverage

Coverage 0%

Importance

Changes 0
Metric Value
wmc 14
eloc 78
dl 0
loc 116
ccs 0
cts 72
cp 0
rs 10
c 0
b 0
f 0

3 Methods

Rating   Name   Duplication   Size   Complexity  
A getSearchParams() 0 9 2
B getTicketsByStatus() 0 67 7
A process() 0 25 5
1
<?php
2
/* +**********************************************************************************
3
 * The contents of this file are subject to the vtiger CRM Public License Version 1.1
4
 * ("License"); You may not use this file except in compliance with the License
5
 * The Original Code is:  vtiger CRM Open Source
6
 * The Initial Developer of the Original Code is vtiger.
7
 * Portions created by vtiger are Copyright (C) vtiger.
8
 * All Rights Reserved.
9
 * Contributor(s): YetiForce S.A.
10
 * ********************************************************************************** */
11
12
class HelpDesk_TicketsByStatus_Dashboard extends Vtiger_IndexAjax_View
13
{
14
	private $conditions = false;
15
16
	public function getSearchParams($value, $assignedto = '')
17
	{
18
		$listSearchParams = [];
19
		$conditionsArray = [['ticketstatus', 'e', $value]];
20
		if (!empty($assignedto)) {
21
			array_push($conditionsArray, ['assigned_user_id', 'e', $assignedto]);
22
		}
23
		$listSearchParams[] = $conditionsArray;
24
		return '&entityState=Active&viewname=All&search_params=' . urlencode(json_encode($listSearchParams));
25
	}
26
27
	/**
28
	 * Function returns Tickets grouped by Status.
29
	 *
30
	 * @param int $owner
31
	 *
32
	 * @return array
33
	 */
34
	public function getTicketsByStatus($owner)
35
	{
36
		$moduleName = 'HelpDesk';
37
		$ticketStatus = Settings_SupportProcesses_Module_Model::getTicketStatusNotModify();
38
		$query = new \App\Db\Query();
39
		$query->select([
40
			'vtiger_troubletickets.priority',
41
			'vtiger_ticketpriorities.ticketpriorities_id',
42
			'count' => new \yii\db\Expression('COUNT(*)'),
43
			'statusvalue' => new \yii\db\Expression("CASE WHEN vtiger_troubletickets.status IS NULL OR vtiger_troubletickets.status = '' THEN '' ELSE vtiger_troubletickets.status END"), ])
44
			->from('vtiger_troubletickets')
45
			->innerJoin('vtiger_crmentity', 'vtiger_troubletickets.ticketid = vtiger_crmentity.crmid')
46
			->innerJoin('vtiger_ticketstatus', 'vtiger_troubletickets.status = vtiger_ticketstatus.ticketstatus')
47
			->leftJoin('vtiger_ticketpriorities', 'vtiger_troubletickets.priority = vtiger_ticketpriorities.ticketpriorities')
48
			->where(['vtiger_crmentity.deleted' => 0]);
49
50
		if (!empty($owner)) {
51
			$query->andWhere(['smownerid' => $owner]);
52
		}
53
		if (!empty($ticketStatus)) {
54
			$query->andWhere(['not in', 'vtiger_troubletickets.status', $ticketStatus]);
55
			$this->conditions = ['condition' => ['not in', 'vtiger_troubletickets.status', $ticketStatus]];
56
		}
57
		\App\PrivilegeQuery::getConditions($query, $moduleName);
58
		$query->groupBy(['statusvalue', 'vtiger_troubletickets.priority', 'vtiger_ticketpriorities.ticketpriorities_id', 'vtiger_ticketstatus.sortorderid'])->orderBy('vtiger_ticketstatus.sortorderid');
59
60
		$colors = \App\Fields\Picklist::getColors('ticketpriorities');
61
		$chartData = [
62
			'show_chart' => false,
63
		];
64
65
		$data = $query->all();
66
		$statuses = array_values(array_unique(array_column($data, 'statusvalue')));
67
		$chartData['xAxis']['data'] = array_map(fn ($value) => \App\Language::translate($value, $moduleName), $statuses);
68
		$priorities = array_values(array_unique(array_column($data, 'priority')));
69
		$listViewUrl = Vtiger_Module_Model::getInstance($moduleName)->getListViewUrl();
70
71
		foreach ($data as $row) {
72
			$status = $row['statusvalue'];
73
			$priority = $row['priority'];
74
			$count = $row['count'];
75
			$seriesIndex = array_search($priority, $priorities);
76
77
			if (empty($chartData['series'][$seriesIndex])) {
78
				foreach (array_keys($statuses) as $statusIndex) {
79
					$chartData['series'][$seriesIndex]['data'][$statusIndex] = ['value' => null];
80
				}
81
			}
82
83
			$statusIndex = array_search($status, $statuses);
84
			$color = $colors[$row['ticketpriorities_id']] ?? \App\Colors::getRandomColor($priority);
85
			$link = $listViewUrl . $this->getSearchParams($status, $owner);
86
			$label = $priority ? \App\Language::translate($priority, $moduleName, null, false) : '(' . \App\Language::translate('LBL_EMPTY', 'Home', null, false) . ')';
87
88
			$chartData['series'][$seriesIndex]['name'] = $label;
89
			$chartData['series'][$seriesIndex]['type'] = 'bar';
90
			$chartData['series'][$seriesIndex]['stack'] = 'total';
91
			$chartData['series'][$seriesIndex]['color'] = $color;
92
			$chartData['series'][$seriesIndex]['label'] = ['show' => true, 'position' => 'inside'];
93
			$chartData['tooltip'] = ['trigger' => 'axis', 'axisPointer' => ['type' => 'shadow']];
94
			$chartData['labelLayout'] = ['hideOverlap' => false];
95
			$chartData['series'][$seriesIndex]['data'][$statusIndex] = ['value' => $count, 'itemStyle' => ['color' => $color], 'link' => $link];
96
97
			$chartData['show_chart'] = true;
98
		}
99
100
		return $chartData;
101
	}
102
103
	public function process(App\Request $request)
104
	{
105
		$viewer = $this->getViewer($request);
106
		$moduleName = $request->getModule();
107
		$widget = Vtiger_Widget_Model::getInstance($request->getInteger('linkid'), \App\User::getCurrentUserId());
108
		if (!$request->has('owner')) {
109
			$owner = Settings_WidgetsManagement_Module_Model::getDefaultUserId($widget, $moduleName);
110
		} else {
111
			$owner = $request->getByType('owner', 2);
112
		}
113
		$ownerForwarded = $owner;
114
		if ('all' == $owner) {
115
			$owner = '';
116
		}
117
		$data = (false === $owner) ? [] : $this->getTicketsByStatus($owner);
118
119
		$viewer->assign('USER_CONDITIONS', $this->conditions);
120
		$viewer->assign('WIDGET', $widget);
121
		$viewer->assign('MODULE_NAME', $moduleName);
122
		$viewer->assign('DATA', $data);
123
		$viewer->assign('OWNER', $ownerForwarded);
124
		if ($request->has('content')) {
125
			$viewer->view('dashboards/DashBoardWidgetContents.tpl', $moduleName);
126
		} else {
127
			$viewer->view('dashboards/TicketsByStatus.tpl', $moduleName);
128
		}
129
	}
130
}
131