コード例 #1
0
ファイル: TestCase.php プロジェクト: dragonlet/clearhealth
 public function testPrepare()
 {
     $this->_initSequenceTables();
     // test audit first
     $audit = new Audit();
     $audit->_ormPersist = true;
     $audit->objectClass = 'StdClass';
     $audit->persist();
     $this->assertTrue($audit->auditId > 0, 'Audit: Failed to persist');
     if ($audit->auditId > 0) {
         $audit->setPersistMode(WebVista_Model_ORM::DELETE);
         $audit->persist();
     }
     $auditValue = new AuditValue();
     $auditValue->_ormPersist = true;
     $auditValue->key = 'Key';
     $auditValue->value = 'Value';
     $auditValue->persist();
     $this->assertTrue($auditValue->auditValueId > 0, 'AuditValue: Failed to persist');
     if ($auditValue->auditValueId > 0) {
         $auditValue->setPersistMode(WebVista_Model_ORM::DELETE);
         $auditValue->persist();
     }
     if ($this->_autoLoggedIn) {
         $this->_setupAutoLogin();
     }
 }
コード例 #2
0
ファイル: Logout.php プロジェクト: lucianobenetti/clearhealth
 public static function hookExpiredSession($sessionContents)
 {
     if (session_decode($sessionContents)) {
         if (Zend_Auth::getInstance()->hasIdentity()) {
             $identity = Zend_Auth::getInstance()->getIdentity();
             $audit = new Audit();
             $audit->objectClass = 'Logout';
             $audit->userId = (int) $identity->personId;
             $audit->message = __('user') . ': ' . $identity->username . ' ' . __('was logged out due to session expiration');
             $audit->dateTime = date('Y-m-d H:i:s');
             $audit->_ormPersist = true;
             $audit->persist();
         }
     }
 }
コード例 #3
0
 public function testUserLoggedOut()
 {
     $this->_objects = GeneralAlertHandler::generateUserLoggedOut();
     $objects = array();
     $db = Zend_Registry::get('dbAdapter');
     $audit = new Audit();
     $audit->_ormPersist = true;
     $audit->objectClass = 'Logout';
     $audit->objectId = 0;
     $audit->dateTime = date('Y-m-d H:i:s');
     $audit->type = WebVista_Model_ORM::REPLACE;
     $audit->userId = (int) Zend_Auth::getInstance()->getIdentity()->personId;
     $audit->persist();
     $objects['audit'] = $audit;
     $clinicalNote = new ClinicalNote();
     $clinicalNote->personId = $this->_objects['person']->person_id;
     $clinicalNote->visitId = 100;
     $clinicalNote->clinicalNoteDefinitionId = 19;
     $clinicalNote->dateTime = date('Y-m-d H:i:s');
     $clinicalNote->eSignatureId = (int) Zend_Auth::getInstance()->getIdentity()->personId;
     $clinicalNote->persist();
     $objects['clinicalNote'] = $clinicalNote;
     $eSign = new ESignature();
     // cleanup all generalAlerts
     $db->query('DELETE FROM ' . $eSign->_table);
     $eSign->dateTime = date('Y-m-d H:i:s');
     $eSign->signedDateTime = '0000-00-00 00:00:00';
     $eSign->signingUserId = (int) Zend_Auth::getInstance()->getIdentity()->personId;
     $eSign->objectId = $clinicalNote->clinicalNoteId;
     $eSign->objectClass = get_class($clinicalNote);
     $eSign->summary = ' **Unsigned**';
     $eSign->persist();
     $objects['eSignature'] = $eSign;
     // cleanup all generalAlerts
     $generalAlert = new GeneralAlert();
     $db->query('DELETE FROM ' . $generalAlert->_table);
     $process = Processingd::getInstance();
     $process->clearProcesses();
     $process->addProcess(new ProcessAlert());
     $process->startProcessing(false);
     $generalAlertIterator = $generalAlert->getIterator();
     $ctr = 0;
     foreach ($generalAlertIterator as $alert) {
         $objects['generalAlert' . $ctr++] = $alert;
     }
     $this->assertEquals($ctr, 1, 'No alert created even with signed items');
     $this->_cleanUpObjects($objects);
 }
コード例 #4
0
 public function processAction()
 {
     $authAdapter = new Zend_Auth_Adapter_DbTable(Zend_Registry::get('dbAdapter'));
     $authAdapter->setTableName('user')->setIdentityColumn('username')->setCredentialColumn('password')->setIdentity($_POST['username'])->setCredential($_POST['password']);
     $auth = Zend_Auth::getInstance();
     $result = $auth->authenticate($authAdapter);
     $audit = new Audit();
     $audit->objectClass = 'Login';
     $audit->objectId = 0;
     $data = array();
     if ($result->isValid()) {
         unset($this->_session->messages);
         $identity = $auth->getIdentity();
         $user = new User();
         $user->username = $identity;
         $user->populateWithUsername();
         Zend_Auth::getInstance()->getStorage()->write($user);
         //$this->_redirect('login/complete');
         //$this->_forward('index','main');
         $data['msg'] = __("Login successful.");
         $data['code'] = 200;
         $audit->message = __('user') . ': ' . $_POST['username'] . ' ' . __('login successful');
         $audit->userId = $user->userId;
     } else {
         $auth->clearIdentity();
         $this->_session->messages = $result->getMessages();
         //$this->_redirect('login');
         $data['err'] = __("Invalid username/password.");
         $data['code'] = 404;
         $audit->message = __('user') . ': ' . $_POST['username'] . ' ' . __('login failed due to bad password');
     }
     $audit->dateTime = date('Y-m-d H:i:s');
     $audit->_ormPersist = true;
     $audit->persist();
     header('Content-Type: application/xml;');
     $this->view->data = $data;
     $this->completeAction();
     //$this->render();
 }
コード例 #5
0
 public function indexAction()
 {
     if (Zend_Auth::getInstance()->hasIdentity()) {
         $identity = Zend_Auth::getInstance()->getIdentity();
         $audit = new Audit();
         $audit->objectClass = 'Logout';
         $audit->userId = (int) $identity->personId;
         $audit->message = __('user') . ': ' . $identity->username . ' ' . __('logged out');
         $audit->dateTime = date('Y-m-d H:i:s');
         $audit->_ormPersist = true;
         $audit->persist();
         // audit only if logged in to avoid multiple logouts
     }
     $noRedirect = (int) $this->_getParam('noRedirection', 0);
     Zend_Auth::getInstance()->clearIdentity();
     // comment-out session destroy to give way the session expiration in WebVista_Session_SaveHandler hook
     //Zend_Session::destroy(true);
     if ($noRedirect === 0) {
         $this->_redirect('');
     }
     exit;
 }
コード例 #6
0
ファイル: ORM.php プロジェクト: jakedorst/ch3-dev-preview
 /** 
  * Store changes to the audit log
  */
 function audit($obj)
 {
     $audit = new Audit();
     $audit->objectClass = get_class($obj);
     $classObjectIdKey = lcfirst($audit->objectClass);
     $objectIdKey = $classObjectIdKey . "Id";
     $objectLegacyIdKey = strtolower(preg_replace('/([A-Z]{1})/', '_\\1', $classObjectIdKey)) . "_id";
     if (!isset($obj->{$objectIdKey}) && !isset($obj->{$objectLegacyIdKey})) {
         //trigger_error("objIdKey not found: $objectIdKey for " . get_class($obj),E_USER_NOTICE);
         return false;
     }
     $audit->objectId = $obj->{$objectIdKey};
     $audit->userId = (int) Zend_Auth::getInstance()->getIdentity()->personId;
     $audit->type = $obj->_persistMode;
     $audit->dateTime = date('Y-m-d H:i:s');
     $audit->persist();
     if ($obj instanceof ORM) {
         foreach ($obj->ORMFields() as $field) {
             $auditValue = new AuditValue();
             $auditValue->auditId = $audit->auditId;
             $auditValue->key = $field;
             if (is_object($obj->{$field})) {
                 $auditValue->value = get_class($obj->{$field});
             } else {
                 $auditValue->value = (string) $obj->{$field};
             }
             $auditValue->persist();
         }
     }
 }
コード例 #7
0
 public function processResendOutboundFaxAction()
 {
     $messagingId = (int) $this->_getParam('messagingId');
     $faxNumber = $this->_getParam('faxNumber');
     $messaging = new Messaging();
     if ($messagingId > 0) {
         $messaging->messagingId = $messagingId;
         $messaging->populate();
     }
     if ($messagingId->auditId > 0) {
         $messaging->faxNumber = '';
         if (is_numeric($faxNumber) && strlen($faxNumber) > 9) {
             $messaging->faxNumber = $faxNumber;
         }
         $messaging->resend = 1;
         $messaging->persist();
         $audit = new Audit();
         $audit->auditId = $messagingAudit->auditId;
         $audit->populate();
         $audit->startProcessing = '0000-00-00 00:00:00';
         $audit->endProcessing = '0000-00-00 00:00:00';
         $audit->persist();
     }
     $json = Zend_Controller_Action_HelperBroker::getStaticHelper('json');
     $json->suppressExit = true;
     $json->direct(true);
 }
コード例 #8
0
 public function install()
 {
     $filename = $this->getUploadFilename();
     if (file_exists($filename)) {
         $size = sprintf("%u", filesize($filename));
         $units = array('B', 'KB', 'MB', 'GB', 'TB');
         $pow = floor(($size ? log($size) : 0) / log(1024));
         $pow = min($pow, count($units) - 1);
         $size /= pow(1024, $pow);
         if ($pow == 2 && round($size, 1) > 10 || $pow > 2) {
             // queue if > 10 MB
             $this->queue = 1;
             $this->status = 'Pending';
             $this->persist();
         }
     }
     $audit = new Audit();
     $audit->objectClass = 'UpdateManager';
     $audit->userId = (int) Zend_Auth::getInstance()->getIdentity()->personId;
     $audit->message = 'License of update file ' . $this->name . ' from ' . $this->channel . ' channel was accepted';
     $audit->dateTime = date('Y-m-d H:i:s');
     if ($this->queue) {
         $audit->message .= ' and updates pending to apply.';
         $ret = true;
     } else {
         $this->queue = 0;
         $alterTable = new AlterTable();
         $ret = $alterTable->generateSqlChanges($filename);
         if ($ret === true) {
             $alterTable->executeSqlChanges();
             //$this->active = 0;
             $this->status = 'Completed';
             $this->persist();
             $audit->message .= ' and updates applied successfully.';
         } else {
             $audit->message .= ' and updates failed to apply.';
             $this->status = 'Error: ' . $ret;
             $this->persist();
         }
     }
     $audit->persist();
 }
コード例 #9
0
 public static function auditAccess($controllerName, $actionName)
 {
     $audit = new Audit();
     $audit->objectClass = 'AccessRecord';
     $audit->message = 'IP Address ' . $_SERVER['REMOTE_ADDR'] . ' accessing ' . $controllerName . '/' . $actionName;
     $audit->dateTime = date('Y-m-d H:i:s');
     $audit->persist();
 }
コード例 #10
0
 public static function auditAccess($controllerName, $actionName)
 {
     $audit = new Audit();
     $audit->objectClass = 'AccessRecord';
     $audit->message = 'Accessed ' . $controllerName . '/' . $actionName;
     if (isset($_GET['person_id']) && $_GET['person_id'] > 0) {
         $audit->patientId = (int) $_GET['person_id'];
     }
     if (isset($_GET['patient_id']) && $_GET['patient_id'] > 0) {
         $audit->patientId = (int) $_GET['patient_id'];
     }
     if (isset($_GET['personId']) && $_GET['personId'] > 0) {
         $audit->patientId = (int) $_GET['personId'];
     }
     if (isset($_GET['patientId']) && $_GET['patientId'] > 0) {
         $audit->patientId = (int) $_GET['patientId'];
     }
     //trigger_error($audit->message . $audit->patientId,E_USER_NOTICE);
     $audit->dateTime = date('Y-m-d H:i:s');
     $audit->persist();
 }
コード例 #11
0
    public static function generateTestTetanus()
    {
        $objects = array();
        $person = new Person();
        $person->last_name = 'ClearHealth';
        $person->first_name = 'Test';
        $person->middle_name = 'I';
        $person->active = 1;
        $person->persist();
        $objects['person'] = $person;
        $patient = new Patient();
        $patient->person->_cascadePersist = false;
        // to avoid persist() calls on person
        $patient->person_id = $person->person_id;
        $patient->recordNumber = 1000;
        $patient->persist();
        $objects['patient'] = $patient;
        $medication = new Medication();
        $medication->_shouldAudit = false;
        // do not audit
        $medication->hipaaNDC = 'hipaaNDC';
        $medication->personId = $patient->person_id;
        $medication->persist();
        $objects['medication'] = $medication;
        $audit = new Audit();
        $audit->_ormPersist = true;
        $audit->objectClass = get_class($medication);
        $audit->objectId = $medication->medicationId;
        $audit->dateTime = date('Y-m-d H:i:s');
        $audit->type = WebVista_Model_ORM::REPLACE;
        $audit->userId = (int) Zend_Auth::getInstance()->getIdentity()->personId;
        $audit->persist();
        $objects['audit'] = $audit;
        $handler = new HealthStatusHandler();
        $handler->name = 'Tetanus Shots Handler ' . NSDR::create_guid();
        $handler->active = 1;
        $handler->timeframe = '+1 month';
        //$handler->condition = $audit->auditId;
        $handlerName = Handler::normalizeHandlerName($handler->name);
        $handler->handlerObject = <<<EOL

class {$handlerName}HealthStatusHandlerObject extends HealthStatusHandlerObjectAbstract {
\t//abstract requires at least this method
\tpublic static function matchAudit(HealthStatusHandler \$handler,Audit \$auditOrm) {
\t\t// check if the patientId of the item referenced by the audit is subscribed to the handler, if not return false (no match)
\t\t\$objectClass = \$auditOrm->objectClass;
\t\t\$obj = new \$objectClass();
\t\tforeach (\$obj->_primaryKeys as \$key) {
\t\t\t\$obj->\$key = \$auditOrm->objectId;
\t\t}
\t\t\$obj->populate();
\t\t\$patientId = \$obj->personId;
\t\tif (!HealthStatusHandlerPatient::isPatientSubscribed(\$handler->healthStatusHandlerId,\$patientId)) {
\t\t\treturn false;
\t\t}
\t\tif (\$auditOrm->objectClass == '{$audit->objectClass}' && \$auditOrm->type == '{$audit->type}') {
\t\t\treturn true;
\t\t}
\t\treturn false;
\t}

\tpublic static function fulfill(HealthStatusHandler \$handler,\$patientId) {
\t\t// fulfill sees if current patient has any open alerts linked to this handler
\t\t\$alert = new HealthStatusAlert();
\t\t\$alert->populateByHandlerPatientId(\$handler->healthStatusHandlerId,\$patientId);
\t\t// if there are open alerts then calls patientMatch again
\t\tif (strlen(\$alert->status) > 0) {
\t\t\t// if patientMatch returns FALSE then marks alerts as fulfilled if patientMatch return non-false alerts stay as is
\t\t\t// sees if any alerts exist for the patient that are for this handler and marks then as fulfilled if the same condition in patientMatch is reversed
\t\t\tif (self::patientMatch(\$handler,\$patientId) === false) {
\t\t\t\t\$alert->status = 'fulfilled';
\t\t\t\t\$alert->persist();
\t\t\t}
\t\t}
\t}

\tpublic static function patientMatch(HealthStatusHandler \$handler,\$patientId) {
 \t\t// check if the patient does not have any record of a tetanus immunization (preferably by using NSDR)
\t\t// if it has, add the timeframe to the date of that immunization and check if that date is greater than today, if so then return true
\t\t// \$immunization = NSDR::populate(\$patientId.'::com.clearhealth.immunization');
\t\t// temporarily superseded NSDR
\t\t\$alert = new HealthStatusAlert();
\t\t\$alert->populateByHandlerPatientId(\$handler->healthStatusHandlerId,\$patientId);
\t\tif (!strlen(\$alert->status) > 0) {
\t\t\t// no existing alert, return true
\t\t\treturn true;
\t\t}
\t\t// would test to see if the date of a given patients last tetanus shot plus the timeframe is less than today
\t\t// if (strtotime(\$handler->timeframe,strtotime(\$alert->dateTime)) < strtotime(date('m/d/Y h:i A',strtotime('+1 month')))) {
\t\tif (\$alert->status == 'active') {
\t\t\tif (strtotime(\$alert->dateDue) < strtotime(date('m/d/Y h:i A',strtotime('+5 weeks')))) {
\t\t\t\t//self::fulfill(\$handler,\$patientId);
\t\t\t\treturn false;
\t\t\t}
\t\t\t// patientMatch checks if patient 1234 has NOT had a tetanus when date of last tetanus + timeframe < today and generates an alert
\t\t\treturn true;
\t\t}
\t\t/* \$alert->lastOccurence
\t\tif (\$alert->status == 'active' || \$alert->status == 'fulfilled' || \$alert->status == 'ignored') {
\t\t\t// would not match if patient already has an active, fulfilled or ignored alert
\t\t\treturn false;
\t\t}
\t\t*/
\t\treturn true;
\t}
}

EOL;
        $handler->datasource = $handler->generateDefaultDatasource();
        $handler->template = $handler->generateDefaultTemplate();
        $handler->persist();
        $objects['healthStatusHandler'] = $handler;
        // subscribe patient to handler
        $handlerPatient = new HealthStatusHandlerPatient();
        $handlerPatient->healthStatusHandlerId = $handler->healthStatusHandlerId;
        $handlerPatient->personId = $patient->personId;
        $handlerPatient->persist();
        $objects['healthStatusHandlerPatient'] = $handler;
        return $objects;
    }
コード例 #12
0
 public function testTetanusShotsFulfillWithAudit()
 {
     $this->_objects = HealthStatusHandler::generateTestTetanus();
     $objects = array();
     $timeTrigger = date('h:i A', strtotime('-10 minutes'));
     $processHSA = new ProcessHSA($timeTrigger);
     $process = Processingd::getInstance();
     $process->clearProcesses();
     $process->addProcess($processHSA);
     $process->startProcessing(false);
     $audit = new Audit();
     $audit->_ormPersist = true;
     $audit->objectClass = get_class($this->_objects['medication']);
     $audit->objectId = $this->_objects['medication']->medicationId;
     $audit->dateTime = date('Y-m-d H:i:s');
     $audit->type = WebVista_Model_ORM::REPLACE;
     $audit->userId = (int) Zend_Auth::getInstance()->getIdentity()->personId;
     $audit->persist();
     $objects['audit'] = $audit;
     $time = date('h:i A', strtotime('-2 minutes'));
     // advance the time to 2 minutes due to fast processing
     $processHSA->setCurrentTime($time);
     $process->clearProcesses();
     $process->addProcess($processHSA);
     $process->startProcessing(false);
     $healthStatusAlert = new HealthStatusAlert();
     $healthStatusAlert->populateByHandlerPatientId($this->_objects['healthStatusHandler']->healthStatusHandlerId, $this->_objects['patient']->personId);
     $objects['healthStatusAlert'] = $healthStatusAlert;
     $this->_cleanUpObjects($objects);
     $this->assertTrue(strlen($healthStatusAlert->status) > 0, 'No alert created');
     $this->assertEquals($healthStatusAlert->status, 'fulfilled', 'Alert is not fulfilled');
     $this->assertEquals(date('Y-m-d', strtotime($healthStatusAlert->dateDue)), date('Y-m-d', strtotime('+1 month')), 'Due date is invalid');
 }
コード例 #13
0
 public function processApplyAction()
 {
     $updateFileId = (int) $this->_getParam('updateFileId');
     $updateFile = new UpdateFile();
     $updateFile->updateFileId = $updateFileId;
     $updateFile->populate();
     $data = $updateFile->data;
     $alterTable = new AlterTable();
     $ret = $alterTable->generateSqlChanges($data);
     if ($ret === true) {
         $alterTable->executeSqlChanges();
         $updateFile->active = 0;
         $updateFile->persist();
         $audit = new Audit();
         $audit->objectClass = 'UpdateManager';
         $audit->userId = (int) Zend_Auth::getInstance()->getIdentity()->personId;
         $audit->message = 'License of update file ' . $updateFile->name . ' from ' . $updateFile->channel . ' channel was accepted and updates applied successfully.';
         $audit->dateTime = date('Y-m-d H:i:s');
         $audit->persist();
     }
     $json = Zend_Controller_Action_HelperBroker::getStaticHelper('json');
     $json->suppressExit = true;
     $json->direct($ret);
 }
コード例 #14
0
ファイル: User.php プロジェクト: dragonlet/clearhealth
 public static function processLogin($username, $password, Zend_Auth_Adapter_Interface $authAdapter = null)
 {
     if ($authAdapter === null) {
         $authAdapter = new Zend_Auth_Adapter_DbTable(Zend_Registry::get('dbAdapter'));
     }
     $authAdapter->setTableName('user')->setIdentityColumn('username')->setCredentialColumn('password')->setIdentity($username)->setCredential($password);
     $auth = Zend_Auth::getInstance();
     $result = $auth->authenticate($authAdapter);
     $audit = new Audit();
     $audit->objectClass = 'Login';
     $audit->objectId = 0;
     if ($result->isValid()) {
         $identity = $auth->getIdentity();
         $user = new User();
         $user->username = $identity;
         $user->populateWithUsername();
         if ($user->person->active) {
             $auth->getStorage()->write($user);
             $audit->userId = $user->userId;
             $message = __('user') . ': ' . $user->username . ' ' . __('login successful');
         } else {
             $auth->clearIdentity();
             $message = __('user') . ': ' . $username . ' ' . __('login failed due to inactive user');
             $result = new Exception('Login failed due to inactive user');
         }
     } else {
         $auth->clearIdentity();
         $message = __('user') . ': ' . $username . ' ' . __('login failed due to bad password');
         $result = new Exception('Invalid username/password');
     }
     $audit->message = $message;
     $audit->dateTime = date('Y-m-d H:i:s');
     $audit->_ormPersist = true;
     $audit->persist();
     return $result;
 }
コード例 #15
0
    public static function generateClinicalNoteHandler()
    {
        $objects = self::_generatePatient();
        $audit = new Audit();
        $audit->_ormPersist = true;
        $audit->objectClass = 'ClinicalNote';
        $audit->objectId = $objects['patient']->person_id;
        $audit->dateTime = date('Y-m-d H:i:s');
        $audit->type = WebVista_Model_ORM::REPLACE;
        $audit->userId = (int) Zend_Auth::getInstance()->getIdentity()->personId;
        $audit->persist();
        $objects['audit'] = $audit;
        $handler = new GeneralAlertHandler();
        $handler->name = 'Clinical Notes Handler ' . NSDR::create_guid();
        $handler->active = 1;
        $handler->condition = $audit->auditId;
        $handler->handlerObject = $handler->generateDefaultHandlerObject();
        $handlerName = Handler::normalizeHandlerName($handler->name);
        $handler->datasource = <<<EOL

class {$handlerName}GeneralAlertDatasource extends GeneralAlertDatasourceAbstract {
\t//abstract requires at least this method
\tpublic static function sourceData(Audit \$audit) {
\t\t\$eSignIterator = new ESignatureIterator();
\t\t\$eSignIterator->setFilter(\$audit->userId,'signList');
\t\t\$ret = array();
\t\tforeach (\$eSignIterator as \$eSign) {
\t\t\t\$objectClass = \$eSign->objectClass;
\t\t\t\$obj = new \$objectClass();
\t\t\tforeach (\$obj->_primaryKeys as \$key) {
\t\t\t\t\$obj->\$key = \$eSign->objectId;
\t\t\t}
\t\t\t\$obj->populate();
\t\t\t\$personId = \$obj->personId;
\t\t\t\$patient = new Patient();
\t\t\t\$patient->personId = \$personId;
\t\t\t\$patient->populate();
\t\t\t\$teamId = \$patient->teamId;

\t\t\t\$row = array();
\t\t\t\$row['teamId'] = \$teamId;
\t\t\t\$row['signingUserId'] = \$eSign->signingUserId;
\t\t\t\$row['objectId'] = \$eSign->objectId;
\t\t\t\$row['objectClass'] = \$eSign->objectClass;
\t\t\t\$ret[] = \$row;
\t\t}
\t\treturn \$ret;
\t}
}

EOL;
        $handler->template = $handler->generateDefaultTemplate();
        $handler->persist();
        $objects['generalAlertHandler'] = $handler;
        return $objects;
    }