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

OSSTimeControl_AllTimeControl_Dashboard::process()   A

Complexity

Conditions 4
Paths 8

Size

Total Lines 27
Code Lines 23

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 20

Importance

Changes 0
Metric Value
eloc 23
dl 0
loc 27
ccs 0
cts 14
cp 0
rs 9.552
c 0
b 0
f 0
cc 4
nc 8
nop 1
crap 20
1
<?php
2
3
/**
4
 * Wdiget to show work time.
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 OSSTimeControl_AllTimeControl_Dashboard extends Vtiger_IndexAjax_View
12
{
13
	public function getSearchParams($assignedto, $date)
14
	{
15
		$conditions = [];
16
		$listSearchParams = [];
17
		if ('' != $assignedto) {
18
			array_push($conditions, ['assigned_user_id', 'e', $assignedto]);
19
		}
20
		if (!empty($date)) {
21
			array_push($conditions, ['due_date', 'bw', implode(',', $date)]);
22
		}
23
		$listSearchParams[] = $conditions;
24
		return '&search_params=' . urlencode(json_encode($listSearchParams));
25
	}
26
27
	public function getWidgetTimeControl($user, $date)
28
	{
29
		if (!$date) {
30
			return ['show_chart' => false];
31
		}
32
33
		$moduleName = 'OSSTimeControl';
34
		$queryGenerator = new \App\QueryGenerator($moduleName);
35
		$queryGenerator->setFields(['timecontrol_type', 'assigned_user_id'])
36
			->setCustomColumn(['sum_time' => new \yii\db\Expression('SUM(sum_time)')])
37
			->addCondition('due_date', implode(',', $date), 'bw')
38
			->setGroup('assigned_user_id')->setGroup('timecontrol_type')->setOrder('assigned_user_id');
39
		if ('all' !== $user) {
40
			$queryGenerator->addCondition('assigned_user_id', $user, 'e');
41
		} else {
42
			$queryGenerator->addNativeCondition([$queryGenerator->getColumnName('assigned_user_id') => \App\Fields\Owner::getInstance()->getQueryInitUsers(false, 'Active')->select(['id'])]);
43
		}
44
45
		$data = $queryGenerator->createQuery()->all();
46
		$colors = \App\Fields\Picklist::getColors('timecontrol_type', false);
47
		$chartData = [
48
			'show_chart' => false,
49
		];
50
51
		$listViewUrl = Vtiger_Module_Model::getInstance($moduleName)->getListViewUrl();
52
		$sumValuePerXAxisData = [];
53
		$xAxisData = array_values(array_unique(array_column($data, 'assigned_user_id')));
54
		$types = array_values(array_unique(array_column($data, 'timecontrol_type')));
55
		foreach ($data as $row) {
56
			$ownerId = $row['assigned_user_id'];
57
			$type = $row['timecontrol_type'];
58
			$sumTime = $row['sum_time'];
59
			$sumValuePerXAxisData[$type] = ($sumValuePerXAxisData[$type] ?? 0) + (float) $sumTime;
60
			$seriesIndex = array_search($type, $types);
61
62
			if (empty($chartData['series'][$seriesIndex])) {
63
				foreach (array_keys($xAxisData) as $statusIndex) {
64
					$chartData['series'][$seriesIndex]['data'][$statusIndex] = ['value' => null];
65
				}
66
			}
67
			$statusIndex = array_search($ownerId, $xAxisData);
68
69
			$color = $colors[$type] ?? \App\Colors::getRandomColor($type);
70
			$link = $listViewUrl . '&viewname=All&entityState=Active' . $this->getSearchParams($ownerId, $date);
71
			$label = $type ? \App\Language::translate($type, $moduleName, null, false) : '(' . \App\Language::translate('LBL_EMPTY', 'Home', null, false) . ')';
72
73
			$chartData['series'][$seriesIndex]['name'] = $label;
74
			$chartData['series'][$seriesIndex]['type'] = 'bar';
75
			$chartData['series'][$seriesIndex]['stack'] = 'total';
76
			$chartData['series'][$seriesIndex]['color'] = $color;
77
			$chartData['series'][$seriesIndex]['label'] = ['show' => false];
78
			$chartData['tooltip'] = ['trigger' => 'axis', 'axisPointer' => ['type' => 'shadow']];
79
			$chartData['labelLayout'] = ['hideOverlap' => false];
80
			$chartData['series'][$seriesIndex]['data'][$statusIndex] = ['value' => round($sumTime / 60, 2), 'itemStyle' => ['color' => $color], 'link' => $link, 'fullLabel' => \App\Fields\Owner::getLabel($ownerId), 'fullValue' => \App\Fields\RangeTime::displayElapseTime($sumTime), 'seriesLabel' => $label];
81
82
			$chartData['show_chart'] = true;
83
		}
84
85
		foreach ($xAxisData as $ownerId) {
86
			$chartData['xAxis']['data'][] = \App\Utils::getInitials(\App\Fields\Owner::getLabel($ownerId));
87
		}
88
89
		foreach ($sumValuePerXAxisData as $type => $value) {
90
			if (!$value) {
91
				continue;
92
			}
93
			$seriesIndex = array_search($type, $types);
94
			$chartData['series'][$seriesIndex]['name'] .= ': ' . \App\Fields\RangeTime::displayElapseTime($value);
95
		}
96
97
		return $chartData;
98
	}
99
100
	public function process(App\Request $request)
101
	{
102
		$currentUserId = \App\User::getCurrentUserId();
103
		$viewer = $this->getViewer($request);
104
		$moduleName = $request->getModule();
105
		$user = $request->getByType('owner', 2);
106
		$time = $request->getDateRange('time');
107
		$widget = Vtiger_Widget_Model::getInstance($request->getInteger('linkid'), $currentUserId);
108
		if (empty($time)) {
109
			$time = Settings_WidgetsManagement_Module_Model::getDefaultDateRange($widget);
110
		}
111
		if (empty($user)) {
112
			$user = Settings_WidgetsManagement_Module_Model::getDefaultUserId($widget);
113
		}
114
		$viewer->assign('TCPMODULE_MODEL', Settings_TimeControlProcesses_Module_Model::getCleanInstance()->getConfigInstance());
115
		$viewer->assign('OWNER', $user);
116
		$viewer->assign('DTIME', \App\Fields\Date::formatRangeToDisplay($time));
117
		$viewer->assign('DATA', $this->getWidgetTimeControl($user, $time));
118
		$viewer->assign('WIDGET', $widget);
119
		$viewer->assign('MODULE_NAME', $moduleName);
120
		$viewer->assign('LOGGEDUSERID', $currentUserId);
121
		$viewer->assign('ACCESSIBLE_USERS', \App\Fields\Owner::getInstance($moduleName, $currentUserId)->getAccessibleUsersForModule());
122
		$viewer->assign('ACCESSIBLE_GROUPS', \App\Fields\Owner::getInstance($moduleName, $currentUserId)->getAccessibleGroupForModule());
123
		if ($request->has('content')) {
124
			$viewer->view('dashboards/TimeControlContents.tpl', $moduleName);
125
		} else {
126
			$viewer->view('dashboards/AllTimeControl.tpl', $moduleName);
127
		}
128
	}
129
}
130