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);
}
}
}
}