bug fixes (#2051)
[openemr.git] / services / PatientService.php
blob74bfe7c1edd42382e4aa6a0140dfd1bac59a83a8
1 <?php
2 /**
3 * Patient Service
5 * @package OpenEMR
6 * @link http://www.open-emr.org
7 * @author Victor Kofia <victor.kofia@gmail.com>
8 * @author Brady Miller <brady.g.miller@gmail.com>
9 * @copyright Copyright (c) 2017 Victor Kofia <victor.kofia@gmail.com>
10 * @copyright Copyright (c) 2018 Brady Miller <brady.g.miller@gmail.com>
11 * @license https://github.com/openemr/openemr/blob/master/LICENSE GNU General Public License 3
15 namespace OpenEMR\Services;
17 use Particle\Validator\Validator;
19 class PatientService
22 /**
23 * In the case where a patient doesn't have a picture uploaded,
24 * this value will be returned so that the document controller
25 * can return an empty response.
27 private $patient_picture_fallback_id = -1;
29 private $pid;
31 /**
32 * Default constructor.
34 public function __construct()
38 public function validate($patient)
40 $validator = new Validator();
42 $validator->required('fname')->lengthBetween(2, 255);
43 $validator->required('lname')->lengthBetween(2, 255);
44 $validator->required('sex')->lengthBetween(4, 30);
45 $validator->required('dob')->datetime('Y-m-d');
48 return $validator->validate($patient);
51 public function setPid($pid)
53 $this->pid = $pid;
56 public function getPid()
58 return $this->pid;
61 /**
62 * TODO: This should go in the ChartTrackerService and doesn't have to be static.
63 * @param $pid unique patient id
64 * @return recordset
66 public static function getChartTrackerInformationActivity($pid)
68 $sql = "SELECT ct.ct_when,
69 ct.ct_userid,
70 ct.ct_location,
71 u.username,
72 u.fname,
73 u.mname,
74 u.lname
75 FROM chart_tracker AS ct
76 LEFT OUTER JOIN users AS u ON u.id = ct.ct_userid
77 WHERE ct.ct_pid = ?
78 ORDER BY ct.ct_when DESC";
79 return sqlStatement($sql, array($pid));
82 /**
83 * TODO: This should go in the ChartTrackerService and doesn't have to be static.
84 * @return recordset
86 public static function getChartTrackerInformation()
88 $sql = "SELECT ct.ct_when,
89 u.username,
90 u.fname AS ufname,
91 u.mname AS umname,
92 u.lname AS ulname,
93 p.pubpid,
94 p.fname,
95 p.mname,
96 p.lname
97 FROM chart_tracker AS ct
98 JOIN cttemp ON cttemp.ct_pid = ct.ct_pid AND cttemp.ct_when = ct.ct_when
99 LEFT OUTER JOIN users AS u ON u.id = ct.ct_userid
100 LEFT OUTER JOIN patient_data AS p ON p.pid = ct.ct_pid
101 WHERE ct.ct_userid != 0
102 ORDER BY p.pubpid";
103 return sqlStatement($sql);
106 public function getFreshPid()
108 $pid = sqlQuery("SELECT MAX(pid)+1 AS pid FROM patient_data");
110 return $pid['pid'] === null ? 1 : $pid['pid'];
113 public function insert($data)
115 $fresh_pid = $this->getFreshPid();
117 $sql = " INSERT INTO patient_data SET";
118 $sql .= " pid=?,";
119 $sql .= " title=?,";
120 $sql .= " fname=?,";
121 $sql .= " mname=?,";
122 $sql .= " lname=?,";
123 $sql .= " street=?,";
124 $sql .= " postal_code=?,";
125 $sql .= " city=?,";
126 $sql .= " state=?,";
127 $sql .= " country_code=?,";
128 $sql .= " phone_contact=?,";
129 $sql .= " dob=?,";
130 $sql .= " sex=?,";
131 $sql .= " race=?,";
132 $sql .= " ethnicity=?";
134 $results = sqlInsert(
135 $sql,
136 array(
137 $fresh_pid,
138 $data["title"],
139 $data["fname"],
140 $data["mname"],
141 $data["lname"],
142 $data["street"],
143 $data["postal_code"],
144 $data["city"],
145 $data["state"],
146 $data["country_code"],
147 $data["phone_contact"],
148 $data["dob"],
149 $data["sex"],
150 $data["race"],
151 $data["ethnicity"]
155 if ($results) {
156 return $fresh_pid;
159 return $results;
162 public function update($pid, $data)
164 $sql = " UPDATE patient_data SET";
165 $sql .= " title=?,";
166 $sql .= " fname=?,";
167 $sql .= " mname=?,";
168 $sql .= " lname=?,";
169 $sql .= " street=?,";
170 $sql .= " postal_code=?,";
171 $sql .= " city=?,";
172 $sql .= " state=?,";
173 $sql .= " country_code=?,";
174 $sql .= " phone_contact=?,";
175 $sql .= " dob=?,";
176 $sql .= " sex=?,";
177 $sql .= " race=?,";
178 $sql .= " ethnicity=?";
179 $sql .= " where pid=?";
181 return sqlStatement(
182 $sql,
183 array(
184 $data["title"],
185 $data["fname"],
186 $data["mname"],
187 $data["lname"],
188 $data["street"],
189 $data["postal_code"],
190 $data["city"],
191 $data["state"],
192 $data["country_code"],
193 $data["phone_contact"],
194 $data["dob"],
195 $data["sex"],
196 $data["race"],
197 $data["ethnicity"],
198 $pid
203 public function getAll($search)
205 $sqlBindArray = array();
207 $sql = "SELECT id,
208 pid,
209 pubpid,
210 title,
211 fname,
212 mname,
213 lname,
214 street,
215 postal_code,
216 city,
217 state,
218 country_code,
219 phone_contact,
220 email
221 dob,
222 sex,
223 race,
224 ethnicity
225 FROM patient_data";
227 if ($search['name'] || $search['fname'] || $search['lname'] || $search['dob']) {
228 $sql .= " WHERE ";
230 $whereClauses = array();
231 if ($search['name']) {
232 $search['name'] = '%' . $search['name'] . '%';
233 array_push($whereClauses, "CONCAT(lname,' ', fname) LIKE ?");
234 array_push($sqlBindArray, $search['name']);
236 if ($search['fname']) {
237 array_push($whereClauses, "fname=?");
238 array_push($sqlBindArray, $search['fname']);
240 if ($search['lname']) {
241 array_push($whereClauses, "lname=?");
242 array_push($sqlBindArray, $search['lname']);
244 if ($search['dob'] || $search['birthdate']) {
245 $search['dob'] = !empty($search['dob']) ? $search['dob'] : $search['birthdate'];
246 array_push($whereClauses, "dob=?");
247 array_push($sqlBindArray, $search['dob']);
250 $sql .= implode(" AND ", $whereClauses);
253 $statementResults = sqlStatement($sql, $sqlBindArray);
255 $results = array();
256 while ($row = sqlFetchArray($statementResults)) {
257 array_push($results, $row);
260 return $results;
263 public function getOne()
265 $sql = "SELECT id,
266 pid,
267 pubpid,
268 title,
269 fname,
270 mname,
271 lname,
272 street,
273 postal_code,
274 city,
275 state,
276 country_code,
277 phone_contact,
278 email
279 dob,
280 sex,
281 race,
282 ethnicity
283 FROM patient_data
284 WHERE pid = ?";
286 return sqlQuery($sql, $this->pid);
290 * @return number
292 public function getPatientPictureDocumentId()
294 $sql = "SELECT doc.id AS id
295 FROM documents doc
296 JOIN categories_to_documents cate_to_doc
297 ON doc.id = cate_to_doc.document_id
298 JOIN categories cate
299 ON cate.id = cate_to_doc.category_id
300 WHERE cate.name LIKE ? and doc.foreign_id = ?";
302 $result = sqlQuery($sql, array($GLOBALS['patient_photo_category_name'], $this->pid));
304 if (empty($result) || empty($result['id'])) {
305 return $this->patient_picture_fallback_id;
308 return $result['id'];