Study::getAllAwaitingReviewImagingVisit()   A
last analyzed

Complexity

Conditions 3
Paths 3

Size

Total Lines 15
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 7
nc 3
nop 1
dl 0
loc 15
c 0
b 0
f 0
cc 3
rs 10
1
<?php
2
/**
3
 Copyright (C) 2018-2020 KANOUN Salim
4
 This program is free software; you can redistribute it and/or modify
5
 it under the terms of the Affero GNU General Public v.3 License as published by
6
 the Free Software Foundation;
7
 This program is distributed in the hope that it will be useful,
8
 but WITHOUT ANY WARRANTY; without even the implied warranty of
9
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10
 Affero GNU General Public Public for more details.
11
 You should have received a copy of the Affero GNU General Public Public along
12
 with this program; if not, write to the Free Software Foundation, Inc.,
13
 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
14
 */
15
16
/**
17
 * Access data for a study
18
 */
19
20
Class Study {
21
    
22
	private $linkpdo;
23
	public $study;
24
	public $patientCodePrefix;
25
    
26
	public function __construct(String $study, PDO $linkpdo) {
27
28
		$this->linkpdo=$linkpdo;
29
		$connecter=$this->linkpdo->prepare('SELECT * FROM studies WHERE name=:study');
30
		$connecter->execute(array(
31
				"study" => $study,
32
		));
33
		$result=$connecter->fetch(PDO::FETCH_ASSOC);
34
35
		$this->study=$result['name'];
36
		$this->patientCodePrefix=$result['patient_code_prefix'];
37
        
38
        
39
	}
40
41
	public function getPatientsLinkedToUserCenters($username)
42
	{
43
		$patients=$this->linkpdo->prepare(' SELECT patients.code
44
            FROM   patients
45
            WHERE  patients.center IN (SELECT affiliated_centers.center
46
                FROM   affiliated_centers
47
                WHERE  affiliated_centers.username = :username
48
                UNION
49
                SELECT users.center
50
                FROM   users
51
                WHERE  users.username = :username)
52
                AND study = :study
53
                GROUP  BY patients.code');
54
55
		$patients->execute(array(
56
			'username' => $username,
57
			'study' => $this->study
58
		));
59
60
		$patientsCodes=$patients->fetchAll(PDO::FETCH_COLUMN);
61
62
		$patientObjectsArray=[];
63
64
		foreach ($patientsCodes as $patientCode) {
65
			$patientObjectsArray[]=new Patient($patientCode, $this->linkpdo);
66
		}
67
68
		return $patientObjectsArray;
69
	}
70
71
	public function getAllCreatedVisits(bool $deleted=false) {
72
73
		$possibleStudyGroups=$this->getAllPossibleVisitGroups();
74
75
		$visitsObjectArray=[];
76
77
		foreach ($possibleStudyGroups as $studyGroup) {
78
			$createdVisits=$studyGroup->getStudyVisitManager()->getCreatedVisits($deleted);
79
			array_push($visitsObjectArray, ...$createdVisits);
80
		}
81
82
		return $visitsObjectArray;
83
84
	}
85
86
	public function getAllAwaitingUploadImagingVisit() {
87
88
		$possibleStudyGroups=$this->getAllPossibleVisitGroups();
89
		$visitsObjectArray=[];
90
91
		foreach ($possibleStudyGroups as $studyGroup) {
92
			if (in_array($studyGroup->groupModality, array(Visit_Group::GROUP_MODALITY_CT, Visit_Group::GROUP_MODALITY_MR, Visit_Group::GROUP_MODALITY_PET, Visit_Group::GROUP_MODALITY_RTSTRUCT))) {
93
				$awaitingUploadVisits=$studyGroup->getStudyVisitManager()->getAwaitingUploadVisit();
94
				array_push($visitsObjectArray, ...$awaitingUploadVisits);
95
			}
96
            
97
            
98
		}
99
        
100
		return $visitsObjectArray;
101
102
	}
103
104
	public function getAllAwaitingReviewImagingVisit($username=null) {
105
106
		$possibleStudyGroups=$this->getAllPossibleVisitGroups();
107
		$visitsObjectArray=[];
108
109
		foreach ($possibleStudyGroups as $studyGroup) {
110
			if (in_array($studyGroup->groupModality, array(Visit_Group::GROUP_MODALITY_CT, Visit_Group::GROUP_MODALITY_MR, Visit_Group::GROUP_MODALITY_PET, Visit_Group::GROUP_MODALITY_RTSTRUCT))) {
111
				$awaitingReviewVisits=$studyGroup->getStudyVisitManager()->getAwaitingReviewVisit($username);
112
				array_push($visitsObjectArray, ...$awaitingReviewVisits);
113
			}
114
            
115
            
116
		}
117
        
118
		return $visitsObjectArray;
119
120
	}
121
122
	public function getAllUploadedImagingVisits() {
123
124
		$possibleStudyGroups=$this->getAllPossibleVisitGroups();
125
		$visitsObjectArray=[];
126
127
		foreach ($possibleStudyGroups as $studyGroup) {
128
			if (in_array($studyGroup->groupModality, array(Visit_Group::GROUP_MODALITY_CT, Visit_Group::GROUP_MODALITY_MR, Visit_Group::GROUP_MODALITY_PET, Visit_Group::GROUP_MODALITY_RTSTRUCT))) {
129
				$uploadedVisits=$studyGroup->getStudyVisitManager()->getUploadedVisits();
130
				array_push($visitsObjectArray, ...$uploadedVisits);
131
			}
132
            
133
            
134
		}
135
        
136
		return $visitsObjectArray;
137
138
	}
139
140
	public function isHavingAwaitingReviewImagingVisit($username=null) {
141
		$awaitingVisits=$this->getAllAwaitingReviewImagingVisit($username);
142
		$havingAwaitingReview=(sizeof($awaitingVisits) > 0);
143
		return $havingAwaitingReview;
144
	}
145
146
147
148
	public function getAllPossibleVisitGroups() {
149
150
		$allGroupsType=$this->linkpdo->prepare('SELECT id FROM visit_group WHERE study = :study');
151
		$allGroupsType->execute(array('study' => $this->study));
152
		$allGroupsIds=$allGroupsType->fetchall(PDO::FETCH_COLUMN);
153
        
154
		$visitGroupArray=[];
155
		foreach ($allGroupsIds as $groupId) {
156
			$visitGroupArray[]=new Visit_Group($this->linkpdo, $groupId);
157
		}
158
        
159
		return $visitGroupArray;
160
161
	}
162
163
	public function getSpecificGroup(String $groupModality) : Visit_Group {
164
165
		$groupQuery=$this->linkpdo->prepare('SELECT id FROM visit_group WHERE study = :study AND group_modality=:groupModality');
166
		$groupQuery->execute(array('study' => $this->study, 'groupModality'=> $groupModality));
167
		$groupId=$groupQuery->fetch(PDO::FETCH_COLUMN);
168
        
169
		return new Visit_Group($this->linkpdo, $groupId);
170
171
	}
172
173
	public function getStudySpecificGroupManager(String $groupModality) : Group_Visit_Manager {
174
175
		$visitGroup=$this->getSpecificGroup($groupModality);
176
        
177
		return new Group_Visit_Manager($this, $visitGroup, $this->linkpdo);
178
179
	}
180
181
	public function getReviewManager() : Study_Review_Manager {
182
		return new Study_Review_Manager($this);
183
	}
184
185
	public function getExportStudyData() : Export_Study_Data{
186
		return new Export_Study_Data($this);
187
	}
188
    
189
	public function getAllPatientsInStudy() {
190
		$allPatientQuery=$this->linkpdo->prepare('SELECT code FROM patients WHERE study = :study');
191
		$allPatientQuery->execute(array('study' => $this->study));
192
		$allPatients=$allPatientQuery->fetchall(PDO::FETCH_COLUMN);
193
        
194
		$patientObjectArray=[];
195
		foreach ($allPatients as $patient) {
196
			$patientObjectArray[]=new Patient($patient, $this->linkpdo);
197
		}
198
        
199
		return $patientObjectArray;
200
        
201
	}
202
    
203
	public function getDocumentation(String $role) {
204
		if ($role == User::SUPERVISOR) {
205
			$documentationQuery=$this->linkpdo->prepare("SELECT id_documentation FROM documentation
206
                                                    WHERE study = :study");
207
            
208
		}else {
209
			$documentationQuery=$this->linkpdo->prepare("SELECT id_documentation FROM documentation
210
                                                    WHERE study = :study
211
                                                    AND ".$role."= 1 AND deleted=0");
212
            
213
		}
214
        
215
		$documentationQuery->execute(array('study' => $this->study));
216
		$documentationAnswers=$documentationQuery->fetchAll(PDO::FETCH_COLUMN);
217
        
218
		$documentationObjects=[];
219
		foreach ($documentationAnswers as $documentationId) {
220
			$documentationObjects[]=new Documentation($this->linkpdo, $documentationId);
221
		}
222
		return $documentationObjects;
223
	}
224
    
225
	/**
226
	 * Return userObject array for all users having role in the study
227
	 * @return User[]
228
	 */
229
	public function getUsersWithRoleInStudy() {
230
		$req=$this->linkpdo->prepare('SELECT DISTINCT users.username FROM roles,users
231
                                  WHERE roles.username=users.username
232
                                  AND roles.study=:study');
233
		$req->execute(array('study' => $this->study));
234
		$answers=$req->fetchAll(PDO::FETCH_COLUMN);
235
        
236
		$usersObjects=[];
237
		foreach ($answers as $username) {
238
			$usersObjects[]=new User($username, $this->linkpdo);
239
		}
240
		return $usersObjects;
241
        
242
	}
243
    
244
	public function getUsersByRoleInStudy(String $role) {
245
		$req=$this->linkpdo->prepare('SELECT username FROM roles
246
									   WHERE study=:study AND name=:role ');
247
		$req->execute(array('study' => $this->study, 'role'=>$role));
248
		$answers=$req->fetchAll(PDO::FETCH_COLUMN);
249
        
250
		$usersObjects=[];
251
		foreach ($answers as $username) {
252
			$usersObjects[]=new User($username, $this->linkpdo);
253
		}
254
		return $usersObjects;
255
        
256
	}
257
    
258
	public function getAllRolesByUsers() {
259
		$roles_query=$this->linkpdo->prepare('SELECT * FROM roles WHERE study=:study');
260
		$roles_query->execute(array('study'=>$this->study));
261
		$definedRoles=$roles_query->fetchall(PDO::FETCH_ASSOC);
262
        
263
		foreach ($definedRoles as $role) {
264
			$rolesList[$role['username']][]=$role['name'];
265
		}
266
		return $rolesList;
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable $rolesList seems to be defined by a foreach iteration on line 263. Are you sure the iterator is never empty, otherwise this variable is not defined?
Loading history...
267
	}
268
269
	public function getStatistics(String $modality) {
270
		return new Statistics($this, $modality);
271
	}
272
    
273
	public function changeStudyActivation(bool $activated) {
274
		$req=$this->linkpdo->prepare('UPDATE studies SET
275
    								active = :active
276
						        WHERE name = :study');
277
		$req->execute(array('study'=> $this->study, 'active'=>intval($activated)));
278
	}
279
    
280
	public function isOriginalOrthancNeverKnown($anonFromOrthancStudyId) {
281
282
		$connecter=$this->linkpdo->prepare('SELECT Study_Orthanc_ID FROM visits 
283
                                                INNER JOIN visit_type ON 
284
                                                (visit_type.id=visits.visit_type_id 
285
                                                AND visit_type.group_id IN (SELECT id FROM visit_group WHERE study = :study))
286
                                                INNER JOIN orthanc_studies ON (orthanc_studies.id_visit=visits.id_visit) 
287
                                            AND orthanc_studies.Anon_From_Orthanc_ID=:Anon_From_Orthanc_ID 
288
                                            AND orthanc_studies.deleted=0 
289
                                            AND visits.deleted=0'
290
											);
291
		$connecter->execute(array(
292
			"study" => $this->study,
293
			"Anon_From_Orthanc_ID"=>$anonFromOrthancStudyId
294
		));
295
		$result=$connecter->fetchAll(PDO::FETCH_COLUMN);
296
        
297
		if (count($result) > 0) return false; else return true;
298
        
299
	}
300
    
301
	public static function createStudy(string $studyName, $patientCodePrefix, PDO $linkpdo) {
302
        
303
		$req=$linkpdo->prepare('INSERT INTO studies (name, patient_code_prefix) VALUES(:studyName, :patientCodePrefix) ');
304
        
305
		$req->execute(array(
306
			'studyName' => $studyName,
307
			'patientCodePrefix' => $patientCodePrefix
308
		));
309
        
310
	}
311
    
312
}