Passed
Push — developer ( 6b5868...bed0f9 )
by Radosław
22:42 queued 03:39
created

getLeadsByIndustry()   B

Complexity

Conditions 6
Paths 24

Size

Total Lines 44
Code Lines 34

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 42

Importance

Changes 0
Metric Value
eloc 34
dl 0
loc 44
ccs 0
cts 28
cp 0
rs 8.7537
c 0
b 0
f 0
cc 6
nc 24
nop 2
crap 42
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 Leads_LeadsByIndustry_Dashboard extends Vtiger_IndexAjax_View
13
{
14
	public function getSearchParams($value, $assignedto, $dates)
15
	{
16
		$listSearchParams = [];
17
		$conditions = [['industry', 'e', $value]];
18
		if ('' != $assignedto) {
19
			array_push($conditions, ['assigned_user_id', 'e', $assignedto]);
20
		}
21
		if (!empty($dates)) {
22
			array_push($conditions, ['createdtime', 'bw', $dates[0] . ' 00:00:00,' . $dates[1] . ' 23:59:59']);
23
		}
24
		$listSearchParams[] = $conditions;
25
		return '&search_params=' . json_encode($listSearchParams);
26
	}
27
28
	/**
29
	 * Function returns Leads grouped by Industry.
30
	 *
31
	 * @param int   $owner
32
	 * @param array $dateFilter
33
	 *
34
	 * @return array
35
	 */
36
	public function getLeadsByIndustry($owner, $dateFilter)
37
	{
38
		$query = new \App\Db\Query();
39
		$query->select([
40
			'industryid' => 'vtiger_industry.industryid',
41
			'count' => new \yii\db\Expression('COUNT(*)'),
42
			'industryvalue' => new \yii\db\Expression("CASE WHEN vtiger_leaddetails.industry IS NULL OR vtiger_leaddetails.industry = '' THEN '' ELSE vtiger_leaddetails.industry END"), ])
43
			->from('vtiger_leaddetails')
44
			->innerJoin('vtiger_crmentity', 'vtiger_leaddetails.leadid = vtiger_crmentity.crmid')
45
			->leftJoin('vtiger_industry', 'vtiger_leaddetails.industry = vtiger_industry.industry')
46
			->where(['vtiger_crmentity.deleted' => 0, 'vtiger_leaddetails.converted' => 0]);
47
		if (!empty($owner)) {
48
			$query->andWhere(['smownerid' => $owner]);
49
		}
50
		if (!empty($dateFilter)) {
51
			$query->andWhere(['between', 'createdtime', $dateFilter[0] . ' 00:00:00', $dateFilter[1] . ' 23:59:59']);
52
		}
53
		\App\PrivilegeQuery::getConditions($query, 'Leads');
54
		$query->groupBy(['industryvalue', 'vtiger_industry.sortorderid', 'vtiger_industry.industryid'])->orderBy('vtiger_industry.sortorderid');
55
		$dataReader = $query->createCommand()->query();
56
		$chartData = [
57
			'labels' => [],
58
			'datasets' => [
59
				[
60
					'data' => [],
61
					'backgroundColor' => [],
62
					'links' => [], // links generated in proccess method
63
					'names' => [] // names for link generation
64
				],
65
			],
66
			'show_chart' => false,
67
		];
68
		$colors = \App\Fields\Picklist::getColors('industry');
69
		while ($row = $dataReader->read()) {
70
			$chartData['labels'][] = \App\Language::translate($row['industryvalue'], 'Leads');
71
			$chartData['datasets'][0]['data'][] = $row['count'];
72
			$chartData['datasets'][0]['backgroundColor'][] = !empty($colors[$row['industryid']]) ? $colors[$row['industryid']] : \App\Colors::getRandomColor($row['industryvalue']);
73
			$chartData['datasets'][0]['names'][] = $row['industryvalue'];
74
		}
75
		$dataReader->close();
76
		if (\count($chartData['datasets'][0]['data']) > 0) {
77
			$chartData['show_chart'] = true;
78
		}
79
		return $chartData;
80
	}
81
82
	public function process(App\Request $request)
83
	{
84
		$currentUserId = \App\User::getCurrentUserId();
85
		$viewer = $this->getViewer($request);
86
		$moduleName = $request->getModule();
87
		$widget = Vtiger_Widget_Model::getInstance($request->getInteger('linkid'), $currentUserId);
88
		if (!$request->has('owner')) {
89
			$owner = Settings_WidgetsManagement_Module_Model::getDefaultUserId($widget, 'Leads');
90
		} else {
91
			$owner = $request->getByType('owner', 2);
92
		}
93
		$ownerForwarded = $owner;
94
		if ('all' == $owner) {
95
			$owner = '';
96
		}
97
		$createdTime = $request->getDateRange('createdtime');
98
		if (empty($createdTime)) {
99
			$createdTime = Settings_WidgetsManagement_Module_Model::getDefaultDateRange($widget);
100
		}
101
		$data = (false === $owner) ? [] : $this->getLeadsByIndustry($owner, $createdTime);
102
		$createdTime = \App\Fields\Date::formatRangeToDisplay($createdTime);
103
		$listViewUrl = Vtiger_Module_Model::getInstance($moduleName)->getListViewUrl();
104
		$leadSIndustryAmount = \count($data['datasets'][0]['names']);
105
		for ($i = 0; $i < $leadSIndustryAmount; ++$i) {
106
			$data['datasets'][0]['links'][] = $listViewUrl . '&viewname=All&entityState=Active' . $this->getSearchParams($data['datasets'][0]['names'][$i], $owner, $createdTime);
107
		}
108
		//Include special script and css needed for this widget
109
		$viewer->assign('WIDGET', $widget);
110
		$viewer->assign('MODULE_NAME', $moduleName);
111
		$viewer->assign('DATA', $data);
112
		$viewer->assign('DTIME', $createdTime);
113
		$viewer->assign('ACCESSIBLE_USERS', \App\Fields\Owner::getInstance('Leads', $currentUserId)->getAccessibleUsersForModule());
114
		$viewer->assign('ACCESSIBLE_GROUPS', \App\Fields\Owner::getInstance('Leads', $currentUserId)->getAccessibleGroupForModule());
115
		$viewer->assign('OWNER', $ownerForwarded);
116
		if ($request->has('content')) {
117
			$viewer->view('dashboards/DashBoardWidgetContents.tpl', $moduleName);
118
		} else {
119
			$viewer->view('dashboards/LeadsByIndustry.tpl', $moduleName);
120
		}
121
	}
122
}
123