protected function afterSave() { foreach (SecondaryDiagnosis::model()->findAll('patient_id=? and disorder_id=?', array($this->patient_id, $this->disorder_id)) as $sd) { if ($this->eye_id == $sd->eye_id || $this->eye_id == 3 && in_array($sd->eye_id, array(1, 2))) { $sd->delete(); } elseif (in_array($this->eye_id, array(1, 2)) && $sd->eye_id == 3) { $sd->eye_id = $this->eye_id == 1 ? 2 : 1; $sd->save(); } } }
public function actionValidateAddDiagnosis() { $errors = array(); if (!($patient = Patient::model()->findByPk(@$_POST['patient_id']))) { throw new Exception("Patient not found: " . @$_POST['patient_id']); } if (isset($_POST['DiagnosisSelection']['ophthalmic_disorder_id'])) { $disorder_id = $_POST['DiagnosisSelection']['ophthalmic_disorder_id']; } elseif (isset($_POST['DiagnosisSelection']['systemic_disorder_id'])) { $disorder_id = $_POST['DiagnosisSelection']['systemic_disorder_id']; } $sd = new SecondaryDiagnosis(); $sd->patient_id = $patient->id; $sd->date = $this->processFuzzyDate(); $sd->disorder_id = @$disorder_id; $sd->eye_id = @$_POST['diagnosis_eye']; $errors = array(); if (!$sd->validate()) { foreach ($sd->getErrors() as $field => $_errors) { $errors[$field] = $_errors[0]; } } // Check the diagnosis isn't currently set at the episode level for this patient foreach ($patient->episodes as $episode) { if ($episode->disorder_id == $sd->disorder_id && ($episode->eye_id == $sd->eye_id || $episode->eye_id == 3 || $sd->eye_id == 3)) { $errors['disorder_id'] = "The disorder is already set at the episode level for this patient"; } } // Check that the date isn't in the future if (@$_POST['fuzzy_year'] == date('Y')) { if (@$_POST['fuzzy_month'] > date('n')) { $errors['date'] = "The date cannot be in the future."; } elseif (@$_POST['fuzzy_month'] == date('n')) { if (@$_POST['fuzzy_day'] > date('j')) { $errors['date'] = "The date cannot be in the future."; } } } // Check that the date is valid $v = new OEFuzzyDateValidator(); $v->validateAttribute($sd, 'date'); echo json_encode($errors); }
/** * Update the diagnoses for this element using a hash structure of * [{ * 'disorder_id' => integer, * 'eye_id' => \Eye::LEFT|\Eye::RIGHT|\Eye::BOTH, * 'principal' => boolean * }, ... ] * * @param $update_disorders * @throws Exception */ public function updateDiagnoses($update_disorders) { $current_diagnoses = OphCiExamination_Diagnosis::model()->findAll('element_diagnoses_id=?', array($this->id)); $curr_by_disorder_id = array(); $secondary_disorder_ids = array(); foreach ($current_diagnoses as $cd) { $curr_by_disorder_id[$cd->disorder_id] = $cd; } foreach ($update_disorders as $u_disorder) { if (!($curr = @$curr_by_disorder_id[$u_disorder['disorder_id']])) { $curr = new OphCiExamination_Diagnosis(); $curr->element_diagnoses_id = $this->id; $curr->disorder_id = $u_disorder['disorder_id']; } else { unset($curr_by_disorder_id[$u_disorder['disorder_id']]); } if ($curr->eye_id != $u_disorder['eye_id'] || $curr->principal != $u_disorder['principal']) { // need to update & save $curr->eye_id = $u_disorder['eye_id']; $curr->principal = $u_disorder['principal']; if (!$curr->save()) { throw new \Exception("save failed" . print_r($curr->getErrors(), true)); } } if ($u_disorder['principal']) { $this->event->episode->setPrincipalDiagnosis($u_disorder['disorder_id'], $u_disorder['eye_id']); } else { //add a secondary diagnosis // Note that this may be creating duplicate diagnoses, but that is okay as the dates on them will differ $this->event->episode->patient->addDiagnosis($u_disorder['disorder_id'], $u_disorder['eye_id'], substr($this->event->created_date, 0, 10)); // and track $secondary_disorder_ids[] = $u_disorder['disorder_id']; } } // remove any current diagnoses no longer needed foreach ($curr_by_disorder_id as $curr) { if (!$curr->delete()) { throw new \Exception('Unable to remove old disorder'); } } // ensure secondary diagnoses are consistent // FIXME: ongoing discussion as to whether we should be removing diagnosis from the patient here // particularly if this is a save of an older examination record. foreach (\SecondaryDiagnosis::model()->findAll('patient_id=?', array($this->event->episode->patient_id)) as $sd) { if ($sd->disorder->specialty && $sd->disorder->specialty->code == 130) { if (!in_array($sd->disorder_id, $secondary_disorder_ids)) { $this->event->episode->patient->removeDiagnosis($sd->id); } } } }
public function getSdl() { $criteria = new CDbCriteria(); $criteria->compare('patient_id', $this->id); $criteria->order = 'created_date asc'; $diagnoses = array(); foreach (SecondaryDiagnosis::model()->findAll('patient_id=?', array($this->id)) as $i => $sd) { if ($sd->disorder->specialty && $sd->disorder->specialty->code == 130) { $diagnoses[] = strtolower(($sd->eye ? $sd->eye->adjective . ' ' : '') . $sd->disorder->term); } } return Helper::formatList($diagnoses); }
/** * if a secondary diagnosis disorder id has been set, we need to ensure its created on the patient. * * @see parent::beforeSave() */ public function beforeSave() { $curr_sd = $this->_getSecondaryDiagnosis(); if ($this->secondarydiagnosis_disorder_id && $curr_sd && $curr_sd->disorder_id != $this->secondarydiagnosis_disorder_id) { // looks like this is an edit and the previous secondary diagnosis should be removed // so we can set the correct value $curr_disorder = $curr_sd->disorder; $curr_sd->delete(); $curr_sd = null; Yii::app()->user->setFlash('warning.alert', "Disorder '" . $curr_disorder->term . "' has been removed because DR Grading diagnosis was updated."); } if (!$curr_sd) { // need to determine if we are setting a specific disorder on the patient, or a generic diabetes // diagnosis (which is implied by recording DR) $patient = $this->event->episode->patient; $sd = null; if ($this->secondarydiagnosis_disorder_id) { // no secondary diagnosis has been set by this element yet but one has been // assigned (i.e. the element is being created with a diabetes type) // final check to ensure nothing has changed whilst processing if (!$patient->hasDisorderTypeByIds(array_merge(\Disorder::$SNOMED_DIABETES_TYPE_I_SET, \Disorder::$SNOMED_DIABETES_TYPE_II_SET))) { $sd = new \SecondaryDiagnosis(); $sd->patient_id = $patient->id; $sd->disorder_id = $this->secondarydiagnosis_disorder_id; } else { // clear out the secondarydiagnosis_disorder_id $this->secondarydiagnosis_disorder_id = null; // reset required flag as patient now has a diabetes type $this->secondarydiagnosis_disorder_required = false; } } elseif (!$patient->hasDisorderTypeByIds(\Disorder::$SNOMED_DIABETES_SET)) { // Set the patient to have diabetes $sd = new \SecondaryDiagnosis(); $sd->patient_id = $patient->id; $sd->disorder_id = \Disorder::SNOMED_DIABETES; } if ($sd !== null) { $sd->save(); \Audit::add('SecondaryDiagnosis', 'add', $sd->id, null, array('patient_id' => $patient->id)); $this->secondarydiagnosis_id = $sd->id; Yii::app()->user->setFlash('info.info', "Disorder '" . $sd->disorder->term . "' has been added to patient by DR Grading."); } } return parent::beforeSave(); }
/** * Reset diagnosis data on the event based on the diagnosis set on this element. */ protected function afterSave() { if (!$this->event->episode->eye && !$this->event->episode->disorder_id) { $this->event->episode->setPrincipalDiagnosis($this->disorder_id, $this->eye_id); if ($sd = SecondaryDiagnosis::model()->find('patient_id=? and disorder_id=? and eye_id = ?', array($this->event->episode->patient_id, $this->disorder_id, 3))) { $this->event->episode->patient->removeDiagnosis($sd->id); if (in_array($this->eye_id, array(1, 2))) { $this->event->episode->patient->addDiagnosis($this->disorder_id, $this->eye_id == 1 ? 2 : 1); } } } else { if (!SecondaryDiagnosis::model()->find('patient_id=? and disorder_id=? and eye_id in (' . $this->eye_id . ',3)', array($this->event->episode->patient_id, $this->disorder_id))) { if (!Episode::model()->find('patient_id=? and disorder_id=? and eye_id in (' . $this->eye_id . ',3)', array($this->event->episode->patient_id, $this->disorder_id))) { $this->event->episode->patient->addDiagnosis($this->disorder_id, $this->eye_id); } } } return parent::afterSave(); }