Statistics::getReviewsDate()   A
last analyzed

Complexity

Conditions 3
Paths 3

Size

Total Lines 15
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 9
nc 3
nop 0
dl 0
loc 15
c 0
b 0
f 0
cc 3
rs 9.9666
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
 * Build Json data for statistics pages
18
 */
19
class Statistics {
20
21
	public $studyObject;
22
	private $studyVisitManager;
23
24
	public function __construct(Study $study, String $modalityType) {
25
		$this->studyObject=$study;
26
		$this->studyVisitManager=$this->studyObject->getStudySpecificGroupManager($modalityType);
27
	}
28
29
	/**
30
	 * List review one by one with user and date
31
	 * @return array
32
	 */
33
	public function getReviewsDate() {
34
		$reviewdetailsMap=$this->studyObject->getReviewManager()->getReviewsDetailsByVisit();
35
36
		$result=[];
37
		
38
		foreach ($reviewdetailsMap as $visitType=>$details) {
39
			$review=[];
40
			foreach ($details['reviewDetailsArray'] as $detail) {
41
				$review['username']=$detail['user'];
42
				$review['date']=$detail['date'];
43
				$result[]=$review;
44
45
			}
46
		}
47
		return $result;
48
	}
49
50
	/**
51
	 * Provide uploadedFraction of patient in position 0 and upload delay in position 1
52
	 * @return array
53
	 */
54
	public function getUploadFractionAndDelay() {
55
56
		$allPatientStatus=$this->studyVisitManager->getPatientsAllVisitsStatus();
57
		$results[0]=$this->getUploadedFraction($allPatientStatus);
0 ignored issues
show
Comprehensibility Best Practice introduced by
$results was never initialized. Although not strictly required by PHP, it is generally a good practice to add $results = array(); before regardless.
Loading history...
58
		$results[1]=$this->getUploadDelay($allPatientStatus);
59
60
		return $results;
61
		
62
	}
63
	
64
	/**
65
	 * Return the uploaded fraction of patients
66
	 * @param array $allPatientStatus
67
	 * @return array
68
	 */
69
	private function getUploadedFraction($allPatientStatus) {
70
		$resultArray=[];
71
		
72
		
73
		foreach ($allPatientStatus as $visitType => $patients) {
74
			
75
			foreach ($patients as $patientCode=>$patientDetails) {
76
				
77
				if ($patientDetails['status'] == Patient_Visit_Manager::DONE || $patientDetails['status'] == Patient_Visit_Manager::SHOULD_BE_DONE) {
78
					$visit['status']=$patientDetails['status'];
79
					$visit['uploadStatus']=$patientDetails['upload_status'];
80
					$visit['visitType']=$visitType;
81
					$visit['country']=$patientDetails['country'];
82
					$visit['center']=$patientDetails['center'];
83
					$resultArray[]=$visit;
84
				}
85
			}
86
		}
87
88
		return $resultArray;
89
		
90
	}
91
	
92
	/**
93
	 * Calculate upload delay (from declared visit date and upload date)
94
	 * @param array $allPatientStatus
95
	 * @return array
96
	 */
97
	private function getUploadDelay($allPatientStatus) {
98
99
		$resultArray=[];
100
	    
101
		foreach ($allPatientStatus as $visitType => $patients) {
102
			foreach ($patients as $patientCode=>$patientDetails) {
103
	            
104
				if ($patientDetails['status'] == Patient_Visit_Manager::DONE && $patientDetails['state_investigator_form'] == Patient_Visit_Manager::DONE) {
105
	                
106
					$acquisitionDate=new DateTimeImmutable($patientDetails['acquisition_date']);
107
					$uploadDate=new DateTimeImmutable($patientDetails['upload_date']);
108
					$uploadDelay=($uploadDate->getTimestamp()-$acquisitionDate->getTimestamp())/(3600*24);
109
					$visit['uploadDelay']=$uploadDelay;
110
					$visit['acquisitionCompliancy']=$patientDetails['compliancy'];
111
					$visit['visitType']=$visitType;
112
					$visit['idVisit']=$patientDetails['id_visit'];
113
					$visit['center']=$patientDetails['center'];
114
					$visit['country']=$patientDetails['country'];
115
					$resultArray[]=$visit;
116
				}
117
			}
118
		}
119
	    
120
		return $resultArray;
121
		
122
	
123
	}
124
	
125
	/**
126
	 * Return QC time (in days) for each visit (from upload date to QC)
127
	 * @return array
128
	 */
129
	public function getQCTime() {
130
		
131
		$uploadedVisitArray=$this->studyVisitManager->getUploadedVisits();
132
		
133
		$responseDelayArray=[];
134
		
135
		foreach ($uploadedVisitArray as $visit) {
136
			$responseQcArrayDetails=[];
137
			if ($visit->qcStatus != Visit::QC_NOT_DONE) {
138
				$uploadDate=new DateTimeImmutable($visit->uploadDate);
139
				$qcDate=new DateTimeImmutable($visit->controlDate);
140
				$qcDelay=($qcDate->getTimestamp()-$uploadDate->getTimestamp())/(3600*24);
141
142
				if ($visit->correctiveActionDate == null) {
143
					$hasCorrectiveAction=false;
144
				}else {
145
					$hasCorrectiveAction=true;
146
				}
147
148
				$responseQcArrayDetails['idVisit']=$visit->id_visit;
149
				$responseQcArrayDetails['qcDelay']=$qcDelay;
150
				$responseQcArrayDetails['hasCorrectiveAction']=$hasCorrectiveAction;
151
			}
152
			$responseDelayArray[]=$responseQcArrayDetails;
153
		}
154
		
155
		return $responseDelayArray;
156
		
157
	}
158
	
159
	/**
160
	 * Output the time to reach the review conclusion (from QC date to Review Done status)
161
	 * @return array[]
162
	 */
163
	public function getConclusionTime() {
164
		
165
		$uploadedVisitArray=$this->studyVisitManager->getUploadedVisits();
166
		
167
		$responseDelayArray=[];
168
		
169
		foreach ($uploadedVisitArray as $visit) {
170
			if ($visit->reviewStatus == Visit::REVIEW_DONE) {
171
				$qcDate=new DateTimeImmutable($visit->controlDate);
172
				$conclusionDate=new DateTimeImmutable($visit->reviewConclusionDate);
173
				$conclusionDelay=($conclusionDate->getTimestamp()-$qcDate->getTimestamp())/(3600*24);
174
				
175
				$responseConclusionArrayDetails['idVisit']=$visit->id_visit;
176
				$responseConclusionArrayDetails['conclusionDelay']=$conclusionDelay;
177
				
178
				$responseDelayArray[]=$responseConclusionArrayDetails;
179
			}
180
		}
181
		
182
		return $responseDelayArray;
183
		
184
	}
185
	
186
	/**
187
	 * Return all review status for each visit
188
	 * @return array
189
	 */
190
	public function getReviewStatus() {
191
		
192
		$uploadedVisitArray=$this->studyVisitManager->getUploadedVisits();
193
		
194
		$responseReviewArray=[];
195
		
196
		foreach ($uploadedVisitArray as $visit) {
197
			$responseReviewArrayElement=[];
198
			if ($visit->statusDone == Visit::DONE) {
199
				$responseReviewArrayElement['status']=$visit->reviewStatus;
200
				if ($visit->reviewStatus == Visit::DONE) {
201
					$responseReviewArrayElement['visitType']=$visit->visitType;
202
					$responseReviewArrayElement['conclusionValue']=$visit->reviewConclusion;
203
				}
204
			}
205
			$responseReviewArray[]=$responseReviewArrayElement;
206
		}
207
		
208
		return $responseReviewArray;
209
		
210
	}
211
	
212
	/**
213
	 * Return array of each visit's QC status
214
	 * @return string
215
	 */
216
	public function getQcStatus() {
217
		
218
		$uploadedVisitArray=$this->studyVisitManager->getUploadedVisits();
219
		
220
		$responseQcArray=[];
221
		
222
		foreach ($uploadedVisitArray as $visit) {
223
			$responseQcArrayDetails=[];
224
			if ($visit->statusDone == Visit::DONE) {
225
				$patientObject=$visit->getPatient();
226
				$center=$patientObject->getPatientCenter();
227
				if ($visit->correctiveActionDate == null) {
228
					$hasCorrectiveAction=false;
229
				}else {
230
					$hasCorrectiveAction=true;
231
				}
232
				$responseQcArrayDetails['qcStatus']=$visit->qcStatus;
233
				$responseQcArrayDetails['hasCorrectiveAction']=$hasCorrectiveAction;
234
				$responseQcArrayDetails['center']=$center->name;
235
				$responseQcArrayDetails['country']=$center->countryName;
236
			}
237
			$responseQcArray[]=$responseQcArrayDetails;
238
		}
239
		
240
		return $responseQcArray;
0 ignored issues
show
Bug Best Practice introduced by
The expression return $responseQcArray returns the type array|array<mixed,array> which is incompatible with the documented return type string.
Loading history...
241
		
242
	}
243
	
244
	
245
	/**
246
	 * Return array of delay between injection time and acquisition time.
247
	 * Will only return the first PET series found for each visit
248
	 * @return array|number
249
	 */
250
	public function getAcquisitionPetDelay() {
251
		
252
		$uploadedVisitArray=$this->studyVisitManager->getUploadedVisits();
253
		
254
		$delayArray=array();
255
		foreach ($uploadedVisitArray as $visit) {
256
			$uploadedSeries=$visit->getSeriesDetails();
257
			foreach ($uploadedSeries as $serie) {
258
259
				if ($serie->acquisitionDateTime == null || $serie->injectedDateTime == null) {
260
					continue;
261
				}
262
				
263
				$acquisitionTime=new DateTimeImmutable($serie->acquisitionDateTime);
264
				$injectionTime=new DateTimeImmutable($serie->injectedDateTime);
265
				if ($acquisitionTime != null && $injectionTime != null) {
266
					$acquisitionDelay=($acquisitionTime->getTimestamp()-$injectionTime->getTimestamp())/60;
267
					$relatedPatient=$visit->getPatient();
268
					$patientCenter=$relatedPatient->getPatientCenter();
269
					$delayDetails['country']=$patientCenter->countryName;
270
					$delayDetails['idVisit']=$visit->id_visit;
271
					$delayDetails['center']=$patientCenter->name;
272
					$delayDetails['patientNumber']=$relatedPatient->patientCode;
273
					$delayDetails['visitType']=$visit->visitType;
274
					$delayDetails['delayAcquisition']=$acquisitionDelay;
275
					
276
					$delayArray[]=$delayDetails;
277
					break;
278
				}
279
			}
280
		}
281
282
		return $delayArray;
283
		
284
	}
285
	
286
	/**
287
	 * Return specific data of all reviews
288
	 * @return array[]
289
	 */
290
	public function getReviewData() {
291
	    
292
		$createdVisits=$this->studyVisitManager->getUploadedVisits();
293
        
294
		$reviewsJson=[];
295
		foreach ($createdVisits as $visit) {
296
297
					$reviews=[];
298
299
					try {
300
						$reviews[]=$visit->getReviewsObject(true);
301
					}catch (Exception $e) { }
0 ignored issues
show
Coding Style Comprehensibility introduced by
Consider adding a comment why this CATCH block is empty.
Loading history...
302
303
					try {
304
						$reviewsReviewers=$visit->getReviewsObject(false);
305
						foreach ($reviewsReviewers as $expertReview) {
306
							$reviews[]=$expertReview;
307
						}
308
					}catch (Exception $e) { }
0 ignored issues
show
Coding Style Comprehensibility introduced by
Consider adding a comment why this CATCH block is empty.
Loading history...
309
310
311
			foreach ($reviews as $review) {
312
313
						if ($review->validated) {
314
								$specificData=$review->getSpecificData();
315
								$parentVisit=$review->getParentVisitObject();
316
								$visitType=$parentVisit->visitType;
317
								$reviewResult=$specificData;
318
								$reviewResult['_reviewDate']=$review->reviewDate;
319
								$reviewResult['_localForm']=boolval($review->isLocal);
320
								$reviewResult['_adjudicationForm']=boolval($review->isAdjudication);
321
								$reviewResult['_username']=$review->username;
322
								$reviewResult['_center']=$parentVisit->getPatient()->getPatientCenter()->name;
323
								$reviewResult['_visitType']=$visitType;
324
								
325
								$reviewsJson['data'][$visitType][]=$reviewResult;
326
						}
327
328
			}
329
		}
330
		
331
		$visitTypePossible=$this->studyVisitManager->getVisitGroupObject()->getAllVisitTypesOfGroup();
332
		foreach ($visitTypePossible as $visitType) {
333
			$inputType=$visitType->getSpecificTableInputType();
334
			$dataDetails[$visitType->name]=$inputType;
335
		}
336
        
337
		$reviewsJson['structureDetails']=$dataDetails;
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable $dataDetails seems to be defined by a foreach iteration on line 332. Are you sure the iterator is never empty, otherwise this variable is not defined?
Loading history...
338
        
339
		return $reviewsJson;
340
	}
341
	   
342
	
343
}
344