Inheritance: extends BaseActiveRecordVersioned
 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";
 }