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
![]() |
|||
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 | } |