public function run() { $va_unit_id = @$_GET[$this->va_unit_input] ?: models\Element_OphCiExamination_VisualAcuity::model()->getSetting('unit_id'); $this->va_unit = models\OphCiExamination_VisualAcuityUnit::model()->findByPk($va_unit_id); $chart = $this->configureChart(); $this->addData($chart); $this->render(get_class($this), array('va_unit' => $this->va_unit, 'chart' => $chart)); }
/** * Create an examination event. * * @param $episodeId * @param $userId * @param $examination * @param $eventType * @param $eyeIds * @param $refractionType * @param $opNoteEventId * * @return \Event * * @throws \CDbException * @throws \Exception */ public function save($episodeId, $userId, $examination, $eventType, $eyeIds, $refractionType, $opNoteEventId = null) { $examinationEvent = $this->createExamination($episodeId, $userId, $examination, $eventType); if ($examinationEvent->save(true, null, true)) { $examinationEvent->refresh(); $refraction = new \OEModule\OphCiExamination\models\Element_OphCiExamination_Refraction(); $refraction->event_id = $examinationEvent->id; $refraction->created_user_id = $refraction->last_modified_user_id = $userId; $iop = $this->createIop($userId, $eyeIds, $examinationEvent); $complications = $this->createComplications($userId, $eyeIds, $examinationEvent); $this->createComments($userId, $examination, $examinationEvent); $this->createMessage($episodeId, $userId, $examination, $examinationEvent); if (count($examination['patient']['eyes'][0]['reading'][0]['visual_acuity']) || count($examination['patient']['eyes'][0]['reading'][0]['near_visual_acuity'])) { $this->createVisualFunction($userId, $eyeIds, $examinationEvent); if (count($examination['patient']['eyes'][0]['reading'][0]['visual_acuity'])) { $measure = $examination['patient']['eyes'][0]['reading'][0]['visual_acuity'][0]['measure']; $unit = \OEModule\OphCiExamination\models\OphCiExamination_VisualAcuityUnit::model()->find('name = :measure', array('measure' => $measure)); $visualAcuity = $this->createVisualAcuity($userId, $eyeIds, $examinationEvent, $unit); } if (count($examination['patient']['eyes'][0]['reading'][0]['near_visual_acuity'])) { $nearMeasure = $examination['patient']['eyes'][0]['reading'][0]['near_visual_acuity'][0]['measure']; $nearUnit = \OEModule\OphCiExamination\models\OphCiExamination_VisualAcuityUnit::model()->find('name = :measure', array('measure' => $nearMeasure)); $nearVisualAcuity = $this->createVisualAcuity($userId, $eyeIds, $examinationEvent, $nearUnit, true); } } foreach ($examination['patient']['eyes'] as $eye) { $eyeLabel = strtolower($eye['label']); $refractionReading = $eye['reading'][0]['refraction']; $typeSide = $eyeLabel . '_type_id'; $sphereSide = $eyeLabel . '_sphere'; $cylinderSide = $eyeLabel . '_cylinder'; $axisSide = $eyeLabel . '_axis'; $refraction->{$typeSide} = $refractionType['id']; $refraction->{$sphereSide} = $refractionReading['sphere']; $refraction->{$cylinderSide} = $refractionReading['cylinder']; $refraction->{$axisSide} = $refractionReading['axis']; foreach ($eye['reading'][0]['visual_acuity'] as $vaData) { $this->addVisualAcuityReading($userId, $visualAcuity, $unit, $vaData, $eyeLabel); } foreach ($eye['reading'][0]['near_visual_acuity'] as $vaData) { $this->addVisualAcuityReading($userId, $nearVisualAcuity, $nearUnit, $vaData, $eyeLabel, true); } $this->addIop($eyeIds, $eye, $iop, $eyeLabel); $this->addComplication($userId, $eyeIds, $opNoteEventId, $eye, $complications, $eyeLabel); } $refraction->eye_id = $eyeIds['both']; if (!$refraction->save(true, null, true)) { throw new \CDbException('Refraction failed: ' . print_r($iop->getErrors(), true)); } return $examinationEvent; } else { throw new \CDbException('Examination failed: ' . print_r($examinationEvent->getErrors(), true)); } }
/** * get the list of possible unit values for Visual Acuity * * currently operates on the assumption there is always Snellen Metre available as a VA unit, and provides this * exclusively. * */ public function getVAList() { $criteria = new \CDbCriteria(); $criteria->addCondition('name = :nm'); $criteria->params = array(':nm' => 'Snellen Metre'); $unit = models\OphCiExamination_VisualAcuityUnit::model()->find($criteria); $res = array(); foreach ($unit->selectableValues as $uv) { $res[$uv->base_value] = $uv->value; } return $res; }
/** * @param $baseValue * * @return float */ protected function convertVisualAcuity($baseValue) { $logMar = OphCiExamination_VisualAcuityUnit::model()->find('name = "logMAR"'); $reading = new OphCiExamination_VisualAcuity_Reading(); return (double) $reading->convertTo($baseValue, $logMar['id']); }
/** * returns the default letter string for the va readings. Converts all readings to Snellen Metre * as this is assumed to be the standard for correspondence. * * @TODO: The units for correspondence should become a configuration variable * * @throws Exception * @return string */ public function getLetter_string() { if (!($unit = OphCiExamination_VisualAcuityUnit::model()->find('name = ?', array(Yii::app()->params['ophciexamination_visualacuity_correspondence_unit'])))) { throw new Exception("Configured visual acuity correspondence unit was not found: " . Yii::app()->params['ophciexamination_visualacuity_correspondence_unit']); } $text = "Visual acuity:\n"; if ($this->hasRight()) { $text .= "Right Eye: "; if ($this->getCombined('right')) { $text .= $this->getCombined('right', $unit->id); } else { $text .= $this->getTextForSide('right'); } } else { $text .= "Right Eye: not recorded"; } $text .= "\n"; if ($this->hasLeft()) { $text .= "Left Eye: "; if ($this->getCombined('left')) { $text .= $this->getCombined('left', $unit->id); } else { $text .= $this->getTextForSide('left'); } } else { $text .= "Left Eye: not recorded"; } return $text . "\n"; }