Group_Visit_Manager   A
last analyzed

Complexity

Total Complexity 22

Size/Duplication

Total Lines 285
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 94
dl 0
loc 285
rs 10
c 0
b 0
f 0
wmc 22

11 Methods

Rating   Name   Duplication   Size   Complexity  
A getAwaitingUploadVisit() 0 24 2
A __construct() 0 5 1
A getVisitGroupObject() 0 3 1
A getUploadedVisits() 0 22 2
A getVisitForControllerAction() 0 26 2
A getPatientsAllVisitsStatus() 0 17 2
A getCreatedVisits() 0 23 2
A getVisitsMissingInvestigatorForm() 0 23 2
A getVisitWithQCStatus() 0 23 2
A getAwaitingReviewVisit() 0 33 4
A getPatientVisitStatusForVisitType() 0 27 2
1
<?php
2
3
/**
4
 Copyright (C) 2018-2020 KANOUN Salim
5
 This program is free software; you can redistribute it and/or modify
6
 it under the terms of the Affero GNU General Public v.3 License as published by
7
 the Free Software Foundation;
8
 This program is distributed in the hope that it will be useful,
9
 but WITHOUT ANY WARRANTY; without even the implied warranty of
10
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
 Affero GNU General Public Public for more details.
12
 You should have received a copy of the Affero GNU General Public Public along
13
 with this program; if not, write to the Free Software Foundation, Inc.,
14
 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
15
 */
16
17
/**
18
 * Manage visit for a group level of a study
19
 */
20
21
class Group_Visit_Manager
22
{
23
24
	private Study $studyObject;
25
	private Visit_Group $visitGroupObject;
26
	private PDO $linkpdo;
27
28
29
	public function __construct(Study $studyObject, Visit_Group $visitGroupObject, PDO $linkpdo)
30
	{
31
		$this->linkpdo=$linkpdo;
32
		$this->studyObject=$studyObject;
33
		$this->visitGroupObject=$visitGroupObject;
34
	}
35
36
	public function getVisitGroupObject(): Visit_Group
37
	{
38
		return $this->visitGroupObject;
39
	}
40
41
	/**
42
	 * Return uploaded and non deleted visit Objects (visit Done and Upload status done)
43
	 */
44
	public function getUploadedVisits(): array
45
	{
46
47
		$uploadedVisitQuery=$this->linkpdo->prepare('SELECT id_visit FROM visits 
48
                                                                    INNER JOIN visit_type ON 
49
                                                                        (visit_type.id=visits.visit_type_id 
50
                                                                        AND visit_type.group_id = :visitGroupId)
51
                                                                WHERE deleted=0
52
                                                                    AND upload_status="Done" ');
53
54
		$uploadedVisitQuery->execute(array(
55
			'visitGroupId' => $this->visitGroupObject->groupId
56
		));
57
58
		$uploadedVisitIds=$uploadedVisitQuery->fetchall(PDO::FETCH_COLUMN);
59
60
		$visitObjectArray=[];
61
		foreach ($uploadedVisitIds as $id_visit) {
62
			$visitObjectArray[]=new Visit($id_visit, $this->linkpdo);
63
		}
64
65
		return $visitObjectArray;
66
	}
67
68
	/**
69
	 * Get visits with a awaiting upload status (Visit Done but upload status not done)
70
	 */
71
	public function getAwaitingUploadVisit(): array
72
	{
73
74
		$uploadedVisitQuery=$this->linkpdo->prepare("SELECT id_visit FROM visits 
75
                                                                    INNER JOIN visit_type ON 
76
                                                                         (visit_type.id=visits.visit_type_id 
77
                                                                            AND visit_type.group_id = :visitGroupId)
78
                                                                WHERE deleted=0
79
														        AND upload_status = 'Not Done'
80
														        AND status_done = 'Done' ");
81
82
		$uploadedVisitQuery->execute(
83
			array(
84
				'visitGroupId' => $this->visitGroupObject->groupId
85
			)
86
		);
87
		$uploadedVisitIds=$uploadedVisitQuery->fetchAll(PDO::FETCH_COLUMN);
88
89
		$visitObjectArray=[];
90
		foreach ($uploadedVisitIds as $id_visit) {
91
			$visitObjectArray[]=new Visit($id_visit, $this->linkpdo);
92
		}
93
94
		return $visitObjectArray;
95
	}
96
97
	/**
98
	 * Get Visits awaiting review
99
	 * Optionally visit awaiting review can be specific to an username
100
	 * @param string $username
101
	 * @return Visit[]
102
	 */
103
	public function getAwaitingReviewVisit(string $username=null): array
104
	{
105
106
		//Query visit to analyze visit awaiting a review
107
		$idVisitsQuery=$this->linkpdo->prepare('SELECT id_visit FROM visits 
108
                                                                    INNER JOIN visit_type ON 
109
                                                                        (visit_type.id=visits.visit_type_id 
110
                                                                        AND visit_type.group_id = :visitGroupId)
111
                                                                WHERE deleted=0
112
                                                                AND review_available=1 
113
                                                                ORDER BY visit_type.visit_order ');
114
115
		$idVisitsQuery->execute(array(
116
			'visitGroupId' => $this->visitGroupObject->groupId
117
		));
118
119
		$visitList=$idVisitsQuery->fetchAll(PDO::FETCH_COLUMN);
120
121
		$visitObjectArray=[];
122
123
		foreach ($visitList as $visitId) {
124
			$visitObject=new Visit($visitId, $this->linkpdo);
125
126
			if (!empty($username)) {
127
				if ($visitObject->isAwaitingReviewForReviewerUser($username)) {
128
					$visitObjectArray[]=$visitObject;
129
				}
130
			}else {
131
				$visitObjectArray[]=$visitObject;
132
			}
133
		}
134
135
		return $visitObjectArray;
136
	}
137
138
	/**
139
	 * For controller tree
140
	 * List all visits that awaiting QC Action (QC not done or waiting definitive conclusion)
141
	 */
142
	public function getVisitForControllerAction(): array
143
	{
144
145
		$visitsQuery=$this->linkpdo->prepare('SELECT id_visit FROM visits 
146
                                                    INNER JOIN visit_type ON 
147
                                                        (visit_type.id=visits.visit_type_id 
148
                                                        AND visit_type.group_id = :visitGroupId)
149
                                                    WHERE deleted=0
150
                                                    AND status_done = "Done"
151
                                                    AND upload_status= "Done"
152
                                                    AND state_investigator_form = "Done"
153
                                                    AND (state_quality_control = "Not Done"
154
                                                        OR state_quality_control = "Wait Definitive Conclusion")
155
                                                    ORDER BY visit_type.visit_order');
156
		$visitsQuery->execute(array(
157
			'visitGroupId' => $this->visitGroupObject->groupId
158
		));
159
160
		$visits=$visitsQuery->fetchAll(PDO::FETCH_COLUMN);
161
162
		$visitObjectArray=[];
163
		foreach ($visits as $visit) {
164
			$visitObjectArray[]=new Visit($visit, $this->linkpdo);
165
		}
166
167
		return $visitObjectArray;
168
	}
169
170
	/**
171
	 * Return visits with a specific QC Status
172
	 */
173
	public function getVisitWithQCStatus($qcStatus): array
174
	{
175
176
		$visitQuery=$this->linkpdo->prepare("SELECT id_visit FROM visits 
177
                                                        INNER JOIN visit_type ON 
178
                                                            (visit_type.id=visits.visit_type_id 
179
                                                            AND visit_type.group_id = :visitGroupId)
180
                                                        WHERE deleted=0
181
                                                        AND state_quality_control=:qcStatus");
182
183
		$visitQuery->execute(array(
184
			'study' => $this->study,
0 ignored issues
show
Bug introduced by
The property study does not exist on Group_Visit_Manager. Did you mean studyObject?
Loading history...
185
			'qcStatus' => $qcStatus,
186
			'visitGroupId' => $this->visitGroupObject->groupId
187
		));
188
		$visitIds=$visitQuery->fetchall(PDO::FETCH_COLUMN);
189
190
		$visitObjectArray=[];
191
		foreach ($visitIds as $id_visit) {
192
			$visitObjectArray[]=new Visit($id_visit, $this->linkpdo);
193
		}
194
195
		return $visitObjectArray;
196
	}
197
198
	/**
199
	 * Get Visits with image uploaded status but investigator form missing
200
	 */
201
	public function getVisitsMissingInvestigatorForm(): array
202
	{
203
204
		$visitQuery=$this->linkpdo->prepare("SELECT id_visit FROM visits 
205
                                                            INNER JOIN visit_type ON 
206
                                                                (visit_type.id=visits.visit_type_id 
207
                                                                AND visit_type.group_id = :visitGroupId)
208
                                                            WHERE deleted=0 
209
                                                            AND state_investigator_form !='Done' 
210
                                                            AND upload_status='Done'");
211
212
		$visitQuery->execute(array(
213
			'visitGroupId' => $this->visitGroupObject->groupId
214
		));
215
216
		$visitIds=$visitQuery->fetchAll(PDO::FETCH_COLUMN);
217
218
		$visitObjectArray=[];
219
		foreach ($visitIds as $id_visit) {
220
			$visitObjectArray[]=new Visit($id_visit, $this->linkpdo);
221
		}
222
223
		return $visitObjectArray;
224
	}
225
226
	/**
227
	 * Return studie's created visits
228
	 */
229
	public function getCreatedVisits(bool $deleted=false): array
230
	{
231
232
		$uploadedVisitQuery=$this->linkpdo->prepare('SELECT id_visit FROM visits 
233
                                                    INNER JOIN visit_type ON 
234
                                                        (visit_type.id=visits.visit_type_id 
235
                                                        AND visit_type.group_id = :visitGroupId)
236
                                                    AND deleted = :deleted 
237
                                                    ORDER BY patient_code, visit_type.visit_order');
238
239
		$uploadedVisitQuery->execute(array(
240
			'deleted' => intval($deleted),
241
			'visitGroupId' => $this->visitGroupObject->groupId
242
		));
243
244
		$uploadedVisitIds=$uploadedVisitQuery->fetchAll(PDO::FETCH_COLUMN);
245
246
		$visitObjectArray=[];
247
		foreach ($uploadedVisitIds as $id_visit) {
248
			$visitObjectArray[]=new Visit($id_visit, $this->linkpdo);
249
		}
250
251
		return $visitObjectArray;
252
	}
253
254
	/**
255
	 * Determine all patient status for a specific visitType
256
	 */
257
	public function getPatientVisitStatusForVisitType(Visit_Type $visitType)
258
	{
259
260
		//Get patients list in this study
261
		$allPatients=$this->studyObject->getAllPatientsInStudy();
262
263
		$results=[];
264
265
		foreach ($allPatients as $patient) {
266
267
			$patientCenter=$patient->getPatientCenter();
268
			$visitManager=$patient->getPatientVisitManager($this->visitGroupObject);
269
270
			$patientData=[];
271
			$patientData['center']=$patientCenter->name;
272
			$patientData['country']=$patientCenter->countryName;
273
			$patientData['firstname']=$patient->patientFirstName;
274
			$patientData['lastname']=$patient->patientLastName;
275
			$patientData['birthdate']=$patient->patientBirthDate;
276
			$patientData['registration_date']=$patient->patientRegistrationDate;
277
278
			$visitStatus=$visitManager->determineVisitStatus($visitType->name);
279
280
			$results[$patient->patientCode]=array_merge($patientData, $visitStatus);
281
		}
282
283
		return $results;
284
	}
285
286
	/**
287
	 * Determine all visits status for all visit type for all patients
288
	 */
289
	public function getPatientsAllVisitsStatus()
290
	{
291
292
		//Get ordered list of possible visits in this study
293
		$allVisitsType=$this->visitGroupObject->getAllVisitTypesOfGroup();
294
295
		$results=[];
296
297
		foreach ($allVisitsType as $visitType) {
298
299
			$allPatientStatus=$this->getPatientVisitStatusForVisitType($visitType);
300
301
			$results[$visitType->name]=$allPatientStatus;
302
			//array_push($results, ...$allPatientStatus);
303
		}
304
305
		return $results;
306
	}
307
}
308