Vtiger_RelationAjax_Action::deleteRelation()   A
last analyzed

Complexity

Conditions 5
Paths 4

Size

Total Lines 23
Code Lines 17

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 30

Importance

Changes 0
Metric Value
eloc 17
dl 0
loc 23
ccs 0
cts 14
cp 0
rs 9.3888
c 0
b 0
f 0
cc 5
nc 4
nop 1
crap 30
1
<?php
2
3
 /* +***********************************************************************************
4
 * The contents of this file are subject to the vtiger CRM Public License Version 1.0
5
 * ("License"); You may not use this file except in compliance with the License
6
 * The Original Code is:  vtiger CRM Open Source
7
 * The Initial Developer of the Original Code is vtiger.
8
 * Portions created by vtiger are Copyright (C) vtiger.
9
 * All Rights Reserved.
10
 * Contributor(s): YetiForce S.A.
11
 * *********************************************************************************** */
12
13
class Vtiger_RelationAjax_Action extends \App\Controller\Action
14
{
15
	use App\Controller\ClearProcess;
16
	use \App\Controller\ExposeMethod;
17
18
	/** {@inheritdoc} */
19
	public function __construct()
20
	{
21
		parent::__construct();
22
		$this->exposeMethod('addRelation');
23
		$this->exposeMethod('deleteRelation');
24
		$this->exposeMethod('massDeleteRelation');
25
		$this->exposeMethod('exportToExcel');
26
		$this->exposeMethod('updateRelation');
27
		$this->exposeMethod('getRelatedListPageCount');
28
		$this->exposeMethod('updateFavoriteForRecord');
29
		$this->exposeMethod('calculate');
30
		$this->exposeMethod('massDownload');
31
		$this->exposeMethod('checkFilesIntegrity');
32
	}
33
34
	/** {@inheritdoc} */
35
	public function checkPermission(App\Request $request)
36
	{
37
		$userPrivilegesModel = Users_Privileges_Model::getCurrentUserPrivilegesModel();
38
		if (!$request->isEmpty('record', true) && !\App\Privilege::isPermitted($request->getModule(), 'DetailView', $request->getInteger('record'))) {
39
			throw new \App\Exceptions\NoPermittedToRecord('ERR_NO_PERMISSIONS_FOR_THE_RECORD', 403);
40
		}
41
		if (!$request->isEmpty('src_record', true) && !\App\Privilege::isPermitted($request->getModule(), 'DetailView', $request->getInteger('src_record'))) {
42
			throw new \App\Exceptions\NoPermittedToRecord('ERR_NO_PERMISSIONS_FOR_THE_RECORD', 403);
43
		}
44
		if (!$request->isEmpty('related_module', true) && !$userPrivilegesModel->hasModulePermission($request->getByType('related_module', 2))) {
45
			throw new \App\Exceptions\NoPermitted('LBL_PERMISSION_DENIED', 403);
46
		}
47
		if (!$request->isEmpty('relatedModule', true) && !\is_array($relatedModule = $request->getByType('relatedModule', 2)) && 'ProductsAndServices' !== $relatedModule) {
48
			if ('ModTracker' === $relatedModule) {
49
				if (!$userPrivilegesModel->hasModuleActionPermission($request->getModule(), 'ModTracker')) {
50
					throw new \App\Exceptions\NoPermitted('LBL_PERMISSION_DENIED', 403);
51
				}
52
			} else {
53
				if (!$userPrivilegesModel->hasModulePermission($relatedModule)) {
54
					throw new \App\Exceptions\NoPermitted('LBL_PERMISSION_DENIED', 403);
55
				}
56
			}
57
		}
58
	}
59
60
	/**
61
	 * Get query for records list from request.
62
	 *
63
	 * @param \App\Request $request
64
	 *
65
	 * @return \App\QueryGenerator|bool
66
	 */
67
	public static function getQuery(App\Request $request)
68
	{
69
		return static::getRelationListModel($request)->getRelationQuery(true)->clearFields();
0 ignored issues
show
Bug introduced by
The method clearFields() does not exist on App\Db\Query. Since you implemented __call, consider adding a @method annotation. ( Ignorable by Annotation )

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

69
		return static::getRelationListModel($request)->getRelationQuery(true)->/** @scrutinizer ignore-call */ clearFields();
Loading history...
Bug Best Practice introduced by
The expression return static::getRelati...ry(true)->clearFields() also could return the type App\Db\Query which is incompatible with the documented return type App\QueryGenerator|boolean.
Loading history...
70
	}
71
72
	public static function getRelationListModel(App\Request $request)
73
	{
74
		$parentRecordModel = \Vtiger_Record_Model::getInstanceById($request->getInteger('record'), $request->getModule());
75
		$relationId = $request->isEmpty('relationId') ? false : $request->getInteger('relationId');
76
		$cvId = $request->isEmpty('cvId', true) ? 0 : $request->getByType('cvId', \App\Purifier::ALNUM);
77
		$relationListView = Vtiger_RelationListView_Model::getInstance($parentRecordModel, $request->getByType('relatedModule', \App\Purifier::ALNUM), $relationId, $cvId);
78
79
		$selectedIds = $request->getArray('selected_ids', \App\Purifier::ALNUM);
80
		if ($selectedIds && 'all' !== $selectedIds[0]) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $selectedIds of type array is implicitly converted to a boolean; are you sure this is intended? If so, consider using ! empty($expr) instead to make it clear that you intend to check for an array without elements.

This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.

Consider making the comparison explicit by using empty(..) or ! empty(...) instead.

Loading history...
81
			$relationListView->getQueryGenerator()->addCondition('id', $selectedIds, 'e');
82
		}
83
		if ($request->has('entityState')) {
84
			$relationListView->set('entityState', $request->getByType('entityState'));
85
		}
86
		$operator = 's';
87
		if (!$request->isEmpty('operator', true)) {
88
			$operator = $request->getByType('operator');
89
			$relationListView->set('operator', $operator);
90
		}
91
		if (!$request->isEmpty('search_key', true)) {
92
			$searchKey = $request->getByType('search_key', \App\Purifier::ALNUM);
93
			$relationListView->set('search_key', $searchKey);
94
			$relationListView->set('search_value', App\Condition::validSearchValue($request->getByType('search_value', 'Text'), $relationListView->getQueryGenerator()->getModule(), $searchKey, $operator));
95
		}
96
		$searchParams = App\Condition::validSearchParams($request->getByType('relatedModule', \App\Purifier::ALNUM), $request->getArray('search_params'));
97
		if (empty($searchParams) || !\is_array($searchParams)) {
98
			$searchParams = [];
99
		}
100
		$relationListView->set('search_params', $relationListView->getQueryGenerator()->parseBaseSearchParamsToCondition($searchParams));
101
		if ($excludedIds = $request->getArray('excluded_ids', \App\Purifier::INTEGER)) {
102
			$relationListView->getQueryGenerator()->addCondition('id', $excludedIds, 'n');
103
		}
104
		if ($request->getBoolean('isSortActive') && !$request->isEmpty('orderby')) {
105
			$relationListView->set('orderby', $request->getArray('orderby', \App\Purifier::STANDARD, [], \App\Purifier::SQL));
106
		}
107
108
		return $relationListView;
109
	}
110
111
	/**
112
	 * Get records list from request.
113
	 *
114
	 * @param \App\Request $request
115
	 *
116
	 * @return int[]
117
	 */
118
	public static function getRecordsListFromRequest(App\Request $request): array
119
	{
120
		$selectedIds = $request->getArray('selected_ids', 2);
121
		if ($selectedIds && 'all' !== $selectedIds[0]) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $selectedIds of type array is implicitly converted to a boolean; are you sure this is intended? If so, consider using ! empty($expr) instead to make it clear that you intend to check for an array without elements.

This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.

Consider making the comparison explicit by using empty(..) or ! empty(...) instead.

Loading history...
122
			return $selectedIds;
123
		}
124
		$queryGenerator = static::getQuery($request);
125
		return $queryGenerator ? $queryGenerator->createQuery()->column() : [];
126
	}
127
128
	/**
129
	 * Function to add relation for specified source record id and related record id list.
130
	 *
131
	 * @param \App\Request $request
132
	 *
133
	 * @throws \App\Exceptions\NoPermittedToRecord
134
	 */
135
	public function addRelation(App\Request $request)
136
	{
137
		$sourceModule = $request->getModule();
138
		$sourceRecordId = $request->getInteger('src_record');
139
		$relatedModule = $request->getByType('related_module', 2);
140
		if (is_numeric($relatedModule)) {
141
			$relatedModule = \App\Module::getModuleName($relatedModule);
142
		}
143
		if (!\App\Privilege::isPermitted($sourceModule, 'DetailView', $sourceRecordId)) {
144
			throw new \App\Exceptions\NoPermittedToRecord('ERR_NO_PERMISSIONS_FOR_THE_RECORD', 406);
145
		}
146
		$sourceModuleModel = Vtiger_Module_Model::getInstance($sourceModule);
147
		if ($request->isEmpty('relationId')) {
148
			$relationModel = Vtiger_Relation_Model::getInstance($sourceModuleModel, Vtiger_Module_Model::getInstance($relatedModule));
149
		} else {
150
			$relationModel = Vtiger_Relation_Model::getInstanceById($request->getInteger('relationId'));
151
		}
152
		foreach ($request->getArray('related_record_list', 'Integer') as $relatedRecordId) {
153
			if (\App\Privilege::isPermitted($relatedModule, 'DetailView', $relatedRecordId)) {
154
				$relationModel->addRelation($sourceRecordId, $relatedRecordId);
155
			}
156
		}
157
		$response = new Vtiger_Response();
158
		$response->setResult(true);
159
		$response->emit();
160
	}
161
162
	/**
163
	 * Function to delete the relation for specified source record id and related record id list.
164
	 *
165
	 * @param \App\Request $request
166
	 *
167
	 * @throws \App\Exceptions\NoPermittedToRecord
168
	 */
169
	public function deleteRelation(App\Request $request)
170
	{
171
		$sourceModule = $request->getModule();
172
		$sourceRecordId = $request->getInteger('src_record');
173
		$relatedModule = $request->getByType('related_module', 2);
174
		$relatedRecordIdList = $request->getArray('related_record_list', 'Integer');
175
		$sourceModuleModel = Vtiger_Module_Model::getInstance($sourceModule);
176
		if ($request->isEmpty('relationId')) {
177
			$relationModel = Vtiger_Relation_Model::getInstance($sourceModuleModel, Vtiger_Module_Model::getInstance($relatedModule));
178
		} else {
179
			$relationModel = Vtiger_Relation_Model::getInstanceById($request->getInteger('relationId'));
180
		}
181
		$result = false;
182
		if ($relationModel->privilegeToDelete()) {
183
			foreach ($relatedRecordIdList as $relatedRecordId) {
184
				if (\App\Privilege::isPermitted($relatedModule, 'DetailView', $relatedRecordId)) {
185
					$result = $relationModel->deleteRelation($sourceRecordId, (int) $relatedRecordId);
186
				}
187
			}
188
		}
189
		$response = new Vtiger_Response();
190
		$response->setResult($result);
191
		$response->emit();
192
	}
193
194
	/**
195
	 * This function removes the relationship associated with the module.
196
	 *
197
	 * @param \App\Request $request
198
	 */
199
	public function massDeleteRelation(App\Request $request)
200
	{
201
		$sourceModule = $request->getModule();
202
		$relatedModuleName = $request->getByType('relatedModule', 2);
203
		$sourceRecordId = $request->getInteger('src_record');
204
		$parentRecordModel = Vtiger_Record_Model::getInstanceById($sourceRecordId, $sourceModule);
205
		$relationId = $request->isEmpty('relationId') ? false : $request->getInteger('relationId');
206
		$cvId = $request->isEmpty('cvId', true) ? 0 : $request->getByType('cvId', 'Alnum');
207
		$relationListView = Vtiger_RelationListView_Model::getInstance($parentRecordModel, $relatedModuleName, $relationId, $cvId);
208
		$relationModel = $relationListView->getRelationModel();
209
		if ($relationModel->privilegeToDelete()) {
210
			$rows = $this->getRecordsListFromRequest($request);
211
			foreach ($rows as $relatedRecordId) {
212
				if (\App\Privilege::isPermitted($relatedModuleName, 'DetailView', $relatedRecordId) && $relationModel->privilegeToDelete(null, $relatedRecordId)) {
213
					$relationModel->deleteRelation((int) $sourceRecordId, (int) $relatedRecordId);
214
				}
215
			}
216
		}
217
218
		$response = new Vtiger_Response();
219
		$response->setResult(['reloadList' => true]);
220
		$response->emit();
221
	}
222
223
	/**
224
	 * Export relations to excel.
225
	 *
226
	 * @param \App\Request $request
227
	 */
228
	public function exportToExcel(App\Request $request)
229
	{
230
		if (!\App\Privilege::isPermitted($request->getByType('relatedModule', \App\Purifier::ALNUM), 'QuickExportToExcel')) {
231
			throw new \App\Exceptions\NoPermitted('LBL_PERMISSION_DENIED', 403);
232
		}
233
		$relationListView = static::getRelationListModel($request);
234
		$relatedModuleName = $relationListView->getRelatedModuleModel()->getName();
235
		$headers = $relationListView->getHeaders();
236
237
		$exportModel = \App\Export\Records::getInstance($relatedModuleName, 'xls')
0 ignored issues
show
Bug introduced by
$relatedModuleName of type boolean is incompatible with the type string expected by parameter $moduleName of App\Export\Records::getInstance(). ( Ignorable by Annotation )

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

237
		$exportModel = \App\Export\Records::getInstance(/** @scrutinizer ignore-type */ $relatedModuleName, 'xls')
Loading history...
238
			->setLimit(\App\Config::performance('MAX_NUMBER_EXPORT_RECORDS'))
239
			->setFormat(\App\Export\Records::USER_FORMAT);
240
		$exportModel->queryGenerator = $relationListView->getRelationQuery(true);
241
		$exportModel->setFields(array_keys($headers));
242
		$exportModel->sendHttpHeader();
243
		$exportModel->exportData();
244
	}
245
246
	/**
247
	 * Function to update the relation for specified source record id and related record id list.
248
	 *
249
	 * @param \App\Request $request
250
	 *
251
	 * @throws \App\Exceptions\NoPermittedToRecord
252
	 * @throws \App\Exceptions\NoPermitted
253
	 */
254
	public function updateRelation(App\Request $request)
255
	{
256
		$sourceModule = $request->getModule();
257
		$sourceRecordId = $request->getInteger('src_record');
258
		$relatedModule = $request->getByType('related_module', 2);
259
		$recordsToRemove = $request->getArray('recordsToRemove', 'Integer');
260
		$recordsToAdd = $request->getArray('recordsToAdd', 'Integer');
261
		$categoryToAdd = $request->getArray('categoryToAdd', 'Alnum');
262
		$categoryToRemove = $request->getArray('categoryToRemove', 'Alnum');
263
		$sourceModuleModel = Vtiger_Module_Model::getInstance($sourceModule);
264
		if ($request->isEmpty('relationId')) {
265
			$relationModel = Vtiger_Relation_Model::getInstance($sourceModuleModel, Vtiger_Module_Model::getInstance($relatedModule));
266
		} else {
267
			$relationModel = Vtiger_Relation_Model::getInstanceById($request->getInteger('relationId'));
268
		}
269
		if (!empty($recordsToAdd)) {
270
			foreach ($recordsToAdd as $relatedRecordId) {
271
				if (\App\Privilege::isPermitted($relatedModule, 'DetailView', $relatedRecordId)) {
272
					$relationModel->addRelation($sourceRecordId, $relatedRecordId);
273
				}
274
			}
275
		}
276
		if (!empty($recordsToRemove)) {
277
			if ($relationModel->privilegeToDelete()) {
278
				foreach ($recordsToRemove as $relatedRecordId) {
279
					$relationModel->deleteRelation((int) $sourceRecordId, (int) $relatedRecordId);
280
				}
281
			} else {
282
				throw new \App\Exceptions\NoPermitted('LBL_PERMISSION_DENIED', 406);
283
			}
284
		}
285
		if (!empty($categoryToAdd) && $relationModel->isTreeRelation()) {
286
			foreach ($categoryToAdd as $category) {
287
				$relationModel->addRelationTree($sourceRecordId, $category);
288
			}
289
		}
290
		if (!empty($categoryToRemove) && $relationModel->isTreeRelation()) {
291
			if ($relationModel->privilegeToTreeDelete()) {
292
				foreach ($categoryToRemove as $category) {
293
					$relationModel->deleteRelationTree($sourceRecordId, $category);
294
				}
295
			} else {
296
				throw new \App\Exceptions\NoPermitted('LBL_PERMISSION_DENIED', 406);
297
			}
298
		}
299
		$response = new Vtiger_Response();
300
		$response->setResult(true);
301
		$response->emit();
302
	}
303
304
	/**
305
	 * Function to get the page count for related list.
306
	 *
307
	 * @param \App\Request $request
308
	 */
309
	public function getRelatedListPageCount(App\Request $request)
310
	{
311
		$moduleName = $request->getModule();
312
		$relatedModuleName = $request->getArray('relatedModule', 'Alnum');
313
		$firstRelatedModuleName = current($relatedModuleName);
314
		$parentId = $request->getInteger('record');
315
		if (!\App\Privilege::isPermitted($moduleName, 'DetailView', $parentId)) {
316
			throw new \App\Exceptions\NoPermittedToRecord('ERR_NO_PERMISSIONS_FOR_THE_RECORD', 406);
317
		}
318
		$relationId = $request->isEmpty('relationId') ? false : $request->getInteger('relationId');
319
		$cvId = $request->isEmpty('cvId', true) ? 0 : $request->getByType('cvId', 'Alnum');
320
		$totalCount = 0;
321
		$pageCount = 0;
322
		if ('ModComments' === $firstRelatedModuleName) {
323
			$totalCount = ModComments_Record_Model::getCommentsCount($parentId);
324
		} elseif ('ModTracker' === $firstRelatedModuleName) {
325
			$count = (int) ($unreviewed = current(ModTracker_Record_Model::getUnreviewed($parentId, false, true))) ? array_sum($unreviewed) : '';
326
			$totalCount = $count ?: '';
327
		} else {
328
			$relModules = !empty($relatedModuleName) && \is_array($relatedModuleName) ? $relatedModuleName : [];
329
			if ('ProductsAndServices' === $firstRelatedModuleName) {
330
				$relModules = ['Products', 'OutsourcedProducts', 'Assets', 'Services', 'OSSOutsourcedServices', 'OSSSoldServices'];
331
			}
332
			$categoryCount = ['Products', 'OutsourcedProducts', 'Services', 'OSSOutsourcedServices'];
333
			$pagingModel = new Vtiger_Paging_Model();
334
			$parentRecordModel = Vtiger_Record_Model::getInstanceById($parentId, $moduleName);
335
			$userPrivilegesModel = Users_Privileges_Model::getCurrentUserPrivilegesModel();
336
			foreach ($relModules as $relModule) {
337
				if (!$userPrivilegesModel->hasModulePermission($relModule)) {
338
					continue;
339
				}
340
				$relationListView = Vtiger_RelationListView_Model::getInstance($parentRecordModel, $relModule, $relationId, $cvId);
341
				if (!$relationListView) {
342
					continue;
343
				}
344
				if ('ProductsAndServices' === $relatedModuleName && \in_array($relModule, $categoryCount)) {
345
					$totalCount += (int) $relationListView->getRelatedTreeEntriesCount();
346
				}
347
				if ('Calendar' === $relatedModuleName && \App\Config::module($relatedModuleName, 'SHOW_ONLY_CURRENT_RECORDS_COUNT')) {
348
					$totalCount += (int) $relationListView->getRelationQuery()->andWhere(['vtiger_activity.status' => Calendar_Module_Model::getComponentActivityStateLabel('current')])->count();
0 ignored issues
show
Bug introduced by
The method count() does not exist on App\QueryGenerator. ( Ignorable by Annotation )

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

348
					$totalCount += (int) $relationListView->getRelationQuery()->andWhere(['vtiger_activity.status' => Calendar_Module_Model::getComponentActivityStateLabel('current')])->/** @scrutinizer ignore-call */ count();

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
Bug introduced by
The method andWhere() does not exist on App\QueryGenerator. ( Ignorable by Annotation )

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

348
					$totalCount += (int) $relationListView->getRelationQuery()->/** @scrutinizer ignore-call */ andWhere(['vtiger_activity.status' => Calendar_Module_Model::getComponentActivityStateLabel('current')])->count();

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
349
				} else {
350
					$totalCount += (int) $relationListView->getRelatedEntriesCount();
351
				}
352
				$pageLimit = $pagingModel->getPageLimit();
353
				$pageCount = ceil((int) $totalCount / (int) $pageLimit);
354
			}
355
		}
356
		if (0 == $pageCount) {
357
			$pageCount = 1;
358
		}
359
		$result = [];
360
		$result['numberOfRecords'] = $totalCount;
361
		$result['page'] = $pageCount;
362
		$response = new Vtiger_Response();
363
		$response->setResult($result);
364
		$response->emit();
365
	}
366
367
	public function updateFavoriteForRecord(App\Request $request)
368
	{
369
		$sourceModuleModel = Vtiger_Module_Model::getInstance($request->getModule());
370
		if ($request->isEmpty('relationId')) {
371
			$relationModel = Vtiger_Relation_Model::getInstance($sourceModuleModel, Vtiger_Module_Model::getInstance($request->getByType('relatedModule', 2)));
372
		} else {
373
			$relationModel = Vtiger_Relation_Model::getInstanceById($request->getInteger('relationId'));
374
		}
375
		if (!empty($relationModel)) {
376
			$result = $relationModel->updateFavoriteForRecord($request->getByType('actionMode'), ['crmid' => $request->getInteger('record'), 'relcrmid' => $request->getInteger('relcrmid')]);
377
		}
378
379
		$response = new Vtiger_Response();
380
		$response->setResult((bool) $result);
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable $result does not seem to be defined for all execution paths leading up to this point.
Loading history...
381
		$response->emit();
382
	}
383
384
	/**
385
	 * Function for calculating values for a list of related records.
386
	 *
387
	 * @param \App\Request $request
388
	 *
389
	 * @throws \App\Exceptions\Security
390
	 * @throws \App\Exceptions\NotAllowedMethod
391
	 */
392
	public function calculate(App\Request $request)
393
	{
394
		$queryGenerator = static::getQuery($request);
395
		$fieldQueryModel = $queryGenerator->getQueryField($request->getByType('fieldName', 2));
396
		$fieldModel = $fieldQueryModel->getField();
397
		if (!$fieldModel->isViewable()) {
398
			throw new \App\Exceptions\Security('ERR_NO_ACCESS_TO_THE_FIELD', 403);
399
		}
400
		if (!$fieldModel->isCalculateField()) {
401
			throw new \App\Exceptions\Security('ERR_NOT_SUPPORTED_FIELD', 406);
402
		}
403
		if ('sum' !== $request->getByType('calculateType')) {
404
			throw new \App\Exceptions\NotAllowedMethod('LBL_PERMISSION_DENIED', 406);
405
		}
406
407
		$columnName = $fieldQueryModel->getColumnName();
408
		$fieldName = $fieldModel->getName();
409
		$query = $queryGenerator->setFields(['id'])->setDistinct(null)->setGroup('id')->createQuery()->select([$fieldName => new \yii\db\Expression("MAX({$columnName})")]);
410
		$value = (new \App\Db\Query())->from(['c' => $query])->sum("c.{$fieldName}");
411
412
		$response = new Vtiger_Response();
413
		$response->setResult($fieldModel->getDisplayValue($value));
414
		$response->emit();
415
	}
416
417
	/**
418
	 * Mass download.
419
	 *
420
	 * @param App\Request $request
421
	 */
422
	public function massDownload(App\Request $request)
423
	{
424
		$relatedModuleName = $request->getByType('relatedModule', 2);
425
		$records = $this->getRecordsListFromRequest($request);
426
		if (1 === \count($records)) {
427
			$documentRecordModel = Vtiger_Record_Model::getInstanceById($records[0], $relatedModuleName);
428
			$documentRecordModel->downloadFile();
0 ignored issues
show
Bug introduced by
The method downloadFile() does not exist on Vtiger_Record_Model. It seems like you code against a sub-type of Vtiger_Record_Model such as Documents_Record_Model. ( Ignorable by Annotation )

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

428
			$documentRecordModel->/** @scrutinizer ignore-call */ 
429
                         downloadFile();
Loading history...
429
			$documentRecordModel->updateDownloadCount();
0 ignored issues
show
Bug introduced by
The method updateDownloadCount() does not exist on Vtiger_Record_Model. It seems like you code against a sub-type of Vtiger_Record_Model such as Documents_Record_Model. ( Ignorable by Annotation )

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

429
			$documentRecordModel->/** @scrutinizer ignore-call */ 
430
                         updateDownloadCount();
Loading history...
430
		} else {
431
			Documents_Record_Model::downloadFiles($records);
432
		}
433
	}
434
435
	/**
436
	 * Check many files integrity.
437
	 *
438
	 * @param App\Request $request
439
	 */
440
	public function checkFilesIntegrity(App\Request $request)
441
	{
442
		$relatedModuleName = $request->getByType('relatedModule', 2);
443
		$fileNotAvailable = [];
444
		$result = ['success' => true];
445
		foreach ($this->getRecordsListFromRequest($request) as $record) {
446
			$documentRecordModel = Vtiger_Record_Model::getInstanceById($record, $relatedModuleName);
447
			$resultVal = $documentRecordModel->checkFileIntegrity();
0 ignored issues
show
Bug introduced by
The method checkFileIntegrity() does not exist on Vtiger_Record_Model. It seems like you code against a sub-type of Vtiger_Record_Model such as Documents_Record_Model. ( Ignorable by Annotation )

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

447
			/** @scrutinizer ignore-call */ 
448
   $resultVal = $documentRecordModel->checkFileIntegrity();
Loading history...
448
			if (!$resultVal) {
449
				$fileNotAvailable[] = $documentRecordModel->get('notes_title');
450
			}
451
		}
452
		if (!empty($fileNotAvailable)) {
453
			$result = ['notify' => ['text' => \App\Language::translate('LBL_FILE_NOT_AVAILABLE', $relatedModuleName) . ': <br>- ' . implode('<br>- ', $fileNotAvailable)]];
454
		}
455
		$response = new Vtiger_Response();
456
		$response->setResult($result);
457
		$response->emit();
458
	}
459
}
460