Passed
Push — developer ( 5f736c...9195d5 )
by Mariusz
18:14
created

Reservations_Calendar_Model::getSideBarLinks()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 12
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
eloc 9
dl 0
loc 12
ccs 0
cts 10
cp 0
rs 9.9666
c 0
b 0
f 0
cc 1
nc 1
nop 1
crap 2
1
<?php
2
3
/**
4
 * Reservations calendar model file.
5
 *
6
 * @package   Model
7
 *
8
 * @copyright YetiForce S.A.
9
 * @license   YetiForce Public License 5.0 (licenses/LicenseEN.txt or yetiforce.com)
10
 * @author    Mariusz Krzaczkowski <[email protected]>
11
 */
12
/**
13
 * Reservations calendar model class.
14
 */
15
class Reservations_Calendar_Model extends Vtiger_Calendar_Model
16
{
17
	/** {@inheritdoc} */
18
	public function getCalendarTypes(): array
19
	{
20
		$calendarTypes = [];
21
		$moduleField = $this->getModule()->getFieldByName('type');
22
		if ($moduleField && $moduleField->isActiveField()) {
23
			$calendarTypes = (new App\Db\Query())->select(['tree', 'label'])->from('vtiger_trees_templates_data')
24
				->where(['templateid' => $moduleField->getFieldParams()])
25
				->createCommand()->queryAllByGroup(0);
26
		}
27
		return $calendarTypes;
28
	}
29
30
	/**
31
	 * Get query.
32
	 *
33
	 * @return \App\Db\Query
34
	 */
35
	public function getQuery()
36
	{
37
		$queryGenerator = new App\QueryGenerator($this->getModuleName());
38
		if ($this->has('customFilter')) {
39
			$queryGenerator->initForCustomViewById($this->get('customFilter'));
40
		}
41
		$queryGenerator->setFields(['id', 'date_start', 'time_start', 'time_end', 'due_date', 'title', 'assigned_user_id', 'reservations_status']);
42
		if ($types = $this->get('types')) {
43
			$queryGenerator->addCondition('type', implode('##', $types), 'e');
44
		}
45
		if ($this->get('start') && $this->get('end')) {
46
			$dbStartDateOject = DateTimeField::convertToDBTimeZone($this->get('start'));
47
			$dbStartDateTime = $dbStartDateOject->format('Y-m-d H:i:s');
48
			$dbStartDate = $dbStartDateOject->format('Y-m-d');
49
			$dbEndDateObject = DateTimeField::convertToDBTimeZone($this->get('end'));
50
			$dbEndDateTime = $dbEndDateObject->format('Y-m-d H:i:s');
51
			$dbEndDate = $dbEndDateObject->format('Y-m-d');
52
			$queryGenerator->addNativeCondition([
53
				'or',
54
				[
55
					'and',
56
					['>=', new \yii\db\Expression("CONCAT(vtiger_reservations.date_start, ' ', vtiger_reservations.time_start)"), $dbStartDateTime],
57
					['<=', new \yii\db\Expression("CONCAT(vtiger_reservations.date_start, ' ', vtiger_reservations.time_start)"), $dbEndDateTime],
58
				],
59
				[
60
					'and',
61
					['>=', new \yii\db\Expression("CONCAT(vtiger_reservations.due_date, ' ', vtiger_reservations.time_end)"), $dbStartDateTime],
62
					['<=', new \yii\db\Expression("CONCAT(vtiger_reservations.due_date, ' ', vtiger_reservations.time_end)"), $dbEndDateTime],
63
				],
64
				[
65
					'and',
66
					['<', 'vtiger_reservations.date_start', $dbStartDate],
67
					['>', 'vtiger_reservations.due_date', $dbEndDate],
68
				],
69
			]);
70
		}
71
72
		$query = $queryGenerator->createQuery();
73
		if ($this->has('filters')) {
74
			foreach ($this->get('filters') as $filter) {
75
				$filterClassName = Vtiger_Loader::getComponentClassName('CalendarFilter', $filter['name'], $this->getModuleName());
76
				$filterInstance = new $filterClassName();
77
				if ($filterInstance->checkPermissions() && $conditions = $filterInstance->getCondition($filter['value'])) {
78
					$query->andWhere($conditions);
79
				}
80
			}
81
		}
82
		$conditions = [];
83
		if (!empty($this->get('user')) && isset($this->get('user')['selectedIds'][0])) {
84
			$selectedUsers = $this->get('user');
85
			$selectedIds = $selectedUsers['selectedIds'];
86
			if ('all' !== $selectedIds[0]) {
87
				$conditions[] = ['vtiger_crmentity.smownerid' => $selectedIds];
88
				$subQuery = (new \App\Db\Query())->select(['crmid'])->from('u_#__crmentity_showners')->where(['userid' => $selectedIds]);
89
				$conditions[] = ['vtiger_crmentity.crmid' => $subQuery];
90
			}
91
			if (isset($selectedUsers['excludedIds']) && 'all' === $selectedIds[0]) {
92
				$conditions[] = ['not in', 'vtiger_crmentity.smownerid', $selectedUsers['excludedIds']];
93
			}
94
		}
95
		if ($conditions) {
96
			$query->andWhere(array_merge(['or'], $conditions));
97
		}
98
		$query->orderBy(['vtiger_reservations.date_start' => SORT_ASC, 'vtiger_reservations.time_start' => SORT_ASC]);
99
100
		return $query;
101
	}
102
103
	/**
104
	 * Function to get records.
105
	 *
106
	 * @return array
107
	 */
108
	public function getEntity()
109
	{
110
		$dataReader = $this->getQuery()->createCommand()->query();
111
		$result = [];
112
		$moduleModel = Vtiger_Module_Model::getInstance($this->getModuleName());
113
		$isSummaryViewSupported = $moduleModel->isSummaryViewSupported();
114
		$colors = \App\Fields\Picklist::getColors('reservations_status', false);
115
		while ($record = $dataReader->read()) {
116
			$item = [];
117
			$item['id'] = $record['id'];
118
			$item['title'] = \App\Purifier::encodeHtml($record['title']);
119
120
			$dateTimeInstance = new DateTimeField($record['date_start'] . ' ' . $record['time_start']);
0 ignored issues
show
Bug introduced by
$record['date_start'] . .... $record['time_start'] of type string is incompatible with the type type expected by parameter $value of DateTimeField::__construct(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

120
			$dateTimeInstance = new DateTimeField(/** @scrutinizer ignore-type */ $record['date_start'] . ' ' . $record['time_start']);
Loading history...
121
			$item['start'] = DateTimeField::convertToUserTimeZone($record['date_start'] . ' ' . $record['time_start'])->format('Y-m-d') . ' ' . $dateTimeInstance->getFullcalenderTime();
122
			$item['start_display'] = $dateTimeInstance->getDisplayDateTimeValue();
123
124
			$dateTimeInstance = new DateTimeField($record['due_date'] . ' ' . $record['time_end']);
125
			$item['end'] = DateTimeField::convertToUserTimeZone($record['due_date'] . ' ' . $record['time_end'])->format('Y-m-d') . ' ' . $dateTimeInstance->getFullcalenderTime();
126
			$item['end_display'] = $dateTimeInstance->getDisplayDateTimeValue();
127
128
			$item['borderColor'] = $colors[$record['reservations_status']] ?? '';
129
			$item['className'] = 'js-popover-tooltip--record ownerCBg_' . $record['assigned_user_id'];
130
			if ($isSummaryViewSupported) {
131
				$item['url'] = 'index.php?module=' . $this->getModuleName() . '&view=Detail&record=' . $record['id'];
132
				$item['className'] .= ' js-show-modal';
133
			} else {
134
				$item['url'] = $moduleModel->getDetailViewUrl($record['id']);
135
			}
136
			$result[] = $item;
137
		}
138
		$dataReader->close();
139
		return $result;
140
	}
141
}
142