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

getLeadsByIndustry()   A

Complexity

Conditions 5
Paths 12

Size

Total Lines 41
Code Lines 33

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 30

Importance

Changes 0
Metric Value
eloc 33
dl 0
loc 41
ccs 0
cts 26
cp 0
rs 9.0808
c 0
b 0
f 0
cc 5
nc 12
nop 2
crap 30
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', \App\Fields\DateTime::formatToDisplay($dates[0] . ' 00:00:00') . ',' . \App\Fields\DateTime::formatToDisplay($dates[1] . ' 23:59:59')]);
23
		}
24
		$listSearchParams[] = $conditions;
25
		return '&search_params=' . urlencode(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
57
		$chartData = [
58
			'dataset' => [],
59
			'show_chart' => false,
60
			'color' => []
61
		];
62
		$chartData['series'][0]['colorBy'] = 'data';
63
		$moduleName = 'Leads';
64
		$listViewUrl = Vtiger_Module_Model::getInstance($moduleName)->getListViewUrl();
65
		$colors = \App\Fields\Picklist::getColors('industry');
66
		while ($row = $dataReader->read()) {
67
			$industry = $row['industryvalue'];
68
			$link = $listViewUrl . '&viewname=All&entityState=Active' . $this->getSearchParams($industry, $owner, $dateFilter);
69
			$label = $industry ? \App\Language::translate($industry, $moduleName, null, false) : ('(' . \App\Language::translate('LBL_EMPTY', 'Home', null, false) . ')');
70
			$chartData['dataset']['source'][] = [$label, (int) $row['count'], ['link' => $link]];
71
			$chartData['color'][] = $colors[$row['industryid']] ?? \App\Colors::getRandomColor($industry);
72
			$chartData['show_chart'] = true;
73
		}
74
		$dataReader->close();
75
76
		return $chartData;
77
	}
78
79
	public function process(App\Request $request)
80
	{
81
		$currentUserId = \App\User::getCurrentUserId();
82
		$viewer = $this->getViewer($request);
83
		$moduleName = $request->getModule();
84
		$widget = Vtiger_Widget_Model::getInstance($request->getInteger('linkid'), $currentUserId);
85
		if (!$request->has('owner')) {
86
			$owner = Settings_WidgetsManagement_Module_Model::getDefaultUserId($widget, 'Leads');
87
		} else {
88
			$owner = $request->getByType('owner', 2);
89
		}
90
		$ownerForwarded = $owner;
91
		if ('all' == $owner) {
92
			$owner = '';
93
		}
94
		$createdTime = $request->getDateRange('createdtime');
95
		if (empty($createdTime)) {
96
			$createdTime = Settings_WidgetsManagement_Module_Model::getDefaultDateRange($widget);
97
		}
98
		$data = (false === $owner) ? [] : $this->getLeadsByIndustry($owner, $createdTime);
99
		$createdTime = \App\Fields\Date::formatRangeToDisplay($createdTime);
100
101
		$viewer->assign('WIDGET', $widget);
102
		$viewer->assign('MODULE_NAME', $moduleName);
103
		$viewer->assign('DATA', $data);
104
		$viewer->assign('DTIME', $createdTime);
105
		$viewer->assign('ACCESSIBLE_USERS', \App\Fields\Owner::getInstance('Leads', $currentUserId)->getAccessibleUsersForModule());
106
		$viewer->assign('ACCESSIBLE_GROUPS', \App\Fields\Owner::getInstance('Leads', $currentUserId)->getAccessibleGroupForModule());
107
		$viewer->assign('OWNER', $ownerForwarded);
108
		if ($request->has('content')) {
109
			$viewer->view('dashboards/DashBoardWidgetContents.tpl', $moduleName);
110
		} else {
111
			$viewer->view('dashboards/LeadsByIndustry.tpl', $moduleName);
112
		}
113
	}
114
}
115