Ejemplo n.º 1
0
 /**
  * Returns false if the name already exists
  */
 public static function isUnique($facilityName, $id = false)
 {
     $fac = new Facility();
     $select = $fac->select();
     $select->where("facility_name = ?", $facilityName);
     if ($id) {
         $select->where("id != ?", $id);
     }
     if ($fac->fetchRow($select)) {
         return false;
     }
     return true;
 }
 public function facilitiesAction()
 {
     try {
         require_once 'models/table/Facility.php';
         $facilityTable = new Facility();
         $select = $facilityTable->select()->from('facility', array('*'))->setIntegrityCheck(false);
         $rowRay = $facilityTable->fetchAll($select)->toArray();
         $sorted = array();
         foreach ($rowRay as $row) {
             $sorted[$row['id']] = $row;
         }
         /*
         	 $sorted = $facilityTable->_fill_lookup($sorted, 'location_city', 'city_id', 'city_name');
            $sorted = $facilityTable->_fill_lookup($sorted, 'location_district', 'district_id', 'district_name');
            $sorted = $facilityTable->_fill_lookup($sorted, 'location_province', 'province_id', 'province_name');
         */
         $locations = Location::getAll();
         foreach ($sorted as $id => $row) {
             $city_info = Location::getCityInfo($row['location_id'], $this->setting('num_location_tiers'), $locations);
             if (count($city_info)) {
                 if ($city_info[0]) {
                     $sorted[$id]['city_name'] = $city_info[0];
                 }
                 if ($city_info[1]) {
                     $sorted[$id]['province_name'] = $locations[$city_info[1]]['name'];
                 }
                 if ($city_info[2]) {
                     $sorted[$id]['district_name'] = $locations[$city_info[2]]['name'];
                 }
                 if ($city_info[3]) {
                     $sorted[$id]['region_c_name'] = $locations[$city_info[3]]['name'];
                 }
                 if ($city_info[4]) {
                     $sorted[$id]['region_d_name'] = $locations[$city_info[4]]['name'];
                 }
                 if ($city_info[5]) {
                     $sorted[$id]['region_e_name'] = $locations[$city_info[5]]['name'];
                 }
                 if ($city_info[6]) {
                     $sorted[$id]['region_f_name'] = $locations[$city_info[6]]['name'];
                 }
                 if ($city_info[7]) {
                     $sorted[$id]['region_g_name'] = $locations[$city_info[7]]['name'];
                 }
                 if ($city_info[8]) {
                     $sorted[$id]['region_h_name'] = $locations[$city_info[8]]['name'];
                 }
                 if ($city_info[9]) {
                     $sorted[$id]['region_i_name'] = $locations[$city_info[9]]['name'];
                 }
             }
             unset($sorted[$id]['location_id']);
         }
         $sorted = $facilityTable->_fill_lookup($sorted, 'facility_type_option', 'type_option_id', 'facility_type_phrase');
         $sorted = $facilityTable->_fill_lookup($sorted, 'facility_sponsor_option', 'sponsor_option_id', 'facility_sponsor_phrase');
         if ($this->getSanParam('outputType') == 'csv') {
             $this->sendData($this->reportHeaders(false, $sorted));
         }
         $this->view->assign('data', $sorted);
     } catch (Exception $e) {
         echo $e->getMessage();
         error_log($e->getMessage());
     }
 }
 protected function validateAndSave($facilityRow, $checkName = true)
 {
     $districtText = $this->tr('Region B (Health District)');
     $provinceText = $this->tr('Region A (Province)');
     $localRegionText = $this->tr('Region C (Local Region)');
     //validate
     $status = ValidationContainer::instance();
     //check for required fields
     if ($checkName) {
         $status->checkRequired($this, 'facility_name', 'Facility name');
         //check for unique
         if ($this->_getParam('facility_name') and !Facility::isUnique($this->_getParam('facility_name'), $this->_getParam('id'))) {
             $status->addError('facility_name', t('That name already exists.'));
         }
     }
     // validate lat & long
     require_once 'Zend/Validate/Float.php';
     require_once 'Zend/Validate/Between.php';
     $lat = $this->getSanParam('facility_latitude');
     $long = $this->getSanParam('facility_longitude');
     $validator = new Zend_Validate_Float();
     $validbetween = new Zend_Validate_Between('-180', '180');
     if ($lat && (!$validator->isValid($lat) || !$validbetween->isValid($lat))) {
         $status->addError('facility_latitude', t('That latitude and longitude does not appear to be valid.'));
     }
     if ($long && (!$validator->isValid($long) || !$validbetween->isValid($long))) {
         $status->addError('facility_longitude', t('That latitude and longitude does not appear to be valid.'));
     }
     $status->checkRequired($this, 'facility_type_id', t('Facility type'));
     $status->checkRequired($this, 'facility_province_id', $provinceText);
     if ($this->setting('display_region_b')) {
         $status->checkRequired($this, 'facility_district_id', $districtText);
     }
     if ($this->setting('display_region_c')) {
         $status->checkRequired($this, 'facility_region_c_id', $localRegionText);
     }
     //$status->checkRequired ( $this, 'facility_city', t ( "City is required." ) );
     list($location_params, $facility_location_tier, $facility_location_id) = $this->getLocationCriteriaValues(array(), 'facility');
     $city_id = false;
     if ($this->getSanParam('facility_city') && !$this->getSanParam('is_new_city')) {
         $city_id = Location::verifyHierarchy($location_params['facility_city'], $location_params['facility_city_parent_id'], $this->setting('num_location_tiers'));
         if ($city_id === false) {
             $status->addError('facility_city', t("That city does not appear to be located in the chosen region. If you want to create a new city, check the new city box."));
         }
     }
     $sponsor_date_array = $this->getSanParam('sponsor_start_date');
     // may or may not be array
     $sponsor_end_date_array = $this->getSanParam('sponsor_end_date');
     $sponsor_id = $this->getSanParam('facility_sponsor_id') ? $this->getSanParam('facility_sponsor_id') : null;
     if (is_array($sponsor_id)) {
         $sponsor_array = $sponsor_id;
         $sponsor_id = $sponsor_id[0];
     }
     // todo case where multip array and no_allow_multi
     if (@$this->setting('require_sponsor_dates')) {
         $status->checkRequired($this, 'sponsor_option_id', t('Sponsor dates are required.') . "\n");
         if ($this->setting('allow_multi_sponsors')) {
             // and multiple sponsors option
             if (!is_array($this->getSanParam('sponsor_option_id'))) {
                 $status->addError('sponsor_end_date', t('Sponsor dates are required.') . "\n");
             }
             foreach ($sponsor_array as $i => $val) {
                 if (empty($sponsor_date_array[$i]) || !empty($val)) {
                     $status->addError('sponsor_start_date', t('Sponsor dates are required.') . "\n");
                 }
                 if (empty($sponsor_end_date_array[$i]) || !empty($val)) {
                     $status->addError('sponsor_end_date', t('Sponsor dates are required.') . "\n");
                 }
             }
         }
     }
     // end validation
     if ($status->hasError()) {
         $status->setStatusMessage(t('The facility could not be saved.'));
     } else {
         $location_id = null;
         if ($city_id === false && $this->getSanParam('is_new_city')) {
             $location_id = Location::insertIfNotFound($location_params['facility_city'], $location_params['facility_city_parent_id'], $this->setting('num_location_tiers'));
             if ($location_id === false) {
                 $status->addError('facility_city', t('Could not save that city.'));
             }
         } else {
             if ($city_id) {
                 $location_id = $city_id;
             } else {
                 if ($this->setting('display_region_c')) {
                     $location_id = $this->getSanParam('facility_region_c_id');
                 } else {
                     if ($this->setting('display_region_b')) {
                         $location_id = $this->getSanParam('facility_district_id');
                     } else {
                         $location_id = $this->getSanParam('facility_province_id');
                     }
                 }
             }
             if (strstr($location_id, '_')) {
                 $parts = explode('_', $location_id);
                 $location_id = $parts[count($parts) - 1];
             }
         }
         // save row
         if ($location_id) {
             //map db field names to FORM field names
             $facilityRow->facility_name = $this->getSanParam('facility_name');
             $facilityRow->location_id = $location_id;
             $facilityRow->type_option_id = $this->getSanParam('facility_type_id') ? $this->getSanParam('facility_type_id') : null;
             $facilityRow->facility_comments = $this->_getParam('facility_comments');
             $facilityRow->address_1 = $this->getSanParam('facility_address1');
             $facilityRow->address_2 = $this->getSanParam('facility_address2');
             $facilityRow->lat = $lat;
             $facilityRow->long = $long;
             $facilityRow->postal_code = $this->getSanParam('facility_postal_code');
             $facilityRow->phone = $this->getSanParam('facility_phone');
             $facilityRow->fax = $this->getSanParam('facility_fax');
             $facilityRow->sponsor_option_id = $sponsor_id;
             //dupecheck
             $dupe = new Facility();
             $select = $dupe->select()->where('location_id =' . $facilityRow->location_id . ' and facility_name = "' . $facilityRow->facility_name . '"');
             if (!$facilityRow->id && $dupe->fetchRow($select)) {
                 $status->status = '';
                 $status->setStatusMessage(t('The facility could not be saved. A facility with this name already exists in that location.'));
                 return false;
             }
             $obj_id = $facilityRow->save();
             $_SESSION['status'] = t('The facility was saved.');
             if ($obj_id) {
                 if (!Facility::saveSponsors($obj_id, $sponsor_array, $sponsor_date_array, $sponsor_end_date_array)) {
                     $status->setStatusMessage(t('There was an error saving sponsor data though.'));
                     return false;
                 }
                 $status->setStatusMessage(t('The facility was saved.'));
                 $status->setRedirect('/facility/view/id/' . $obj_id);
                 return $obj_id;
             } else {
                 unset($_SESSION['status']);
                 $status->setStatusMessage(t('ERROR: The facility could not be saved.'));
             }
         }
     }
     return false;
 }
 /**
  * Import a facility
  */
 public function importAction()
 {
     $this->view->assign('pageTitle', t('Import a facility'));
     require_once 'models/table/Location.php';
     require_once 'models/table/Facility.php';
     // template redirect
     if ($this->getSanParam('download')) {
         return $this->importFacilityTemplateAction();
     }
     if (!$this->hasACL('import_facility')) {
         $this->doNoAccessError();
     }
     //CSV STUFF
     $filename = $_FILES['upload']['tmp_name'];
     if ($filename) {
         $facilityObj = new Facility();
         $errs = array();
         while ($row = $this->_csv_get_row($filename)) {
             $values = array();
             if (!is_array($row)) {
                 continue;
             }
             // sanity?
             if (!isset($cols)) {
                 // set headers (field names)
                 $cols = $row;
                 // first row is headers (field names)
                 continue;
             }
             $countValidFields = 0;
             if (!empty($row)) {
                 // add
                 foreach ($row as $i => $v) {
                     // proccess each column
                     if (empty($v) && $v !== '0') {
                         continue;
                     }
                     if ($v == 'n/a') {
                         // has to be able to process values from a data export
                         $v = NULL;
                     }
                     $countValidFields++;
                     $delimiter = strpos($v, ',');
                     // is this field a comma seperated list too (or array)?
                     if ($delimiter && $v[$delimiter - 1] != '\\') {
                         // handle arrays as field values(Export), and comma seperated values(import manual entry), and strings or int
                         $values[$cols[$i]] = explode(',', $this->sanitize($v));
                     } else {
                         $values[$cols[$i]] = $this->sanitize($v);
                     }
                 }
             }
             // done now all fields are named and in $values[my_field]
             if ($countValidFields) {
                 //validate
                 if (isset($values['uuid'])) {
                     unset($values['uuid']);
                 }
                 if (isset($values['id'])) {
                     unset($values['id']);
                 }
                 if (isset($values['is_deleted'])) {
                     unset($values['is_deleted']);
                 }
                 if (isset($values['created_by'])) {
                     unset($values['created_by']);
                 }
                 if (isset($values['modified_by'])) {
                     unset($values['modified_by']);
                 }
                 if (isset($values['timestamp_created'])) {
                     unset($values['timestamp_created']);
                 }
                 if (isset($values['timestamp_updated'])) {
                     unset($values['timestamp_updated']);
                 }
                 if (!$this->hasACL('approve_trainings')) {
                     unset($values['approved']);
                 }
                 if ($values['sponsor_option_id']) {
                     $sponsors = $this->_array_me($values['sponsor_option_id']);
                     // could be an array, we dont want one
                     $values['sponsor_option_id'] = $sponsors[0];
                 }
                 //required
                 if (empty($values['facility_name'])) {
                     $errs[] = t('Error adding facility, Facility name cannot be empty.');
                     continue;
                 }
                 if (empty($values['address_1'])) {
                     $values['address_1'] = '';
                 }
                 if (empty($values['address_2'])) {
                     $values['address_2'] = '';
                 }
                 //locations
                 $num_location_tiers = $this->setting('num_location_tiers');
                 $bSuccess = true;
                 $location_id = null;
                 if ($values['location_id']) {
                     $location_id = $values['location_id'];
                 }
                 $tier = 1;
                 if (!$location_id) {
                     for ($i = 0; $i <= $num_location_tiers; $i++) {
                         // insert/find locations
                         $r = 11 + $i;
                         // first location field in csv row // could use this too: $values[t('Region A (Province)')]
                         if (empty($row[$r]) || $bSuccess == false) {
                             continue;
                         }
                         $location_id = Location::insertIfNotFound($row[$r], $location_id, $tier);
                         if (!$location_id) {
                             $bSuccess = false;
                             break;
                         }
                         $tier++;
                     }
                 }
                 if (!$bSuccess) {
                     $errs[] = t('Error locating/creating region or city:') . ' ' . $row[$r] . ' ' . t('Facility') . ': ' . $values['facility_name'];
                     continue;
                     // couldnt save location
                 }
                 $values['location_id'] = $location_id;
                 //dupecheck
                 $dupe = new Facility();
                 $select = $dupe->select()->where('location_id =' . $location_id . ' and facility_name = "' . $values['facility_name'] . '"');
                 if ($dupe->fetchRow($select)) {
                     $errs[] = t('The facility could not be saved. A facility with this name already exists in that location.') . ' ' . t('Facility') . ': ' . $values['facility_name'];
                     $bSuccess = false;
                 }
                 //save
                 if ($bSuccess) {
                     try {
                         $tableObj = $facilityObj->createRow();
                         $tableObj = ITechController::fillFromArray($tableObj, $values);
                         $tableObj->type_option_id = $this->_importHelperFindOrCreate('facility_type_option', 'facility_type_phrase', $tableObj->type_option_id);
                         if ($values['type_option_id'] && !$tableObj->type_option_id) {
                             $errs[] = t("Couldn't save facility type for facility:") . ' ' . $tableObj->facility_name;
                         }
                         $row_id = $tableObj->save();
                     } catch (Exception $e) {
                         $errored = 1;
                         $errs[] = nl2br($e->getMessage()) . ' ' . t('ERROR: The facility could not be saved.');
                     }
                     if (!$row_id) {
                         $errored = 1;
                     }
                     //save linked tables
                     if ($row_id && $this->setting('allow_multi_sponsors')) {
                         if ($sponsors || $values['sponsor_start_date'] || $values['sponsor_end_date']) {
                             $dates1 = $this->_array_me($values['sponsor_start_date']);
                             $dates2 = $this->_array_me($values['sponsor_end_date']);
                             foreach ($sponsors as $i => $phrase) {
                                 // insert or get id
                                 $sponsors[$i] = $this->_importHelperFindOrCreate('facility_sponsor_option', 'facility_sponsor_phrase', $phrase);
                             }
                             //facility_type_option_id multiAssign (insert via helper)
                             if (!Facility::saveSponsors($row_id, $sponsors, $dates1, $dates2)) {
                                 // save
                                 $errs[] = t('There was an error saving sponsor data though.') . ' ' . t('Facility') . ': ' . $tableObj->facility_name;
                             }
                         }
                     }
                 }
                 //sucess - done
             }
             //loop
         }
         // done processing rows
         $_POST['redirect'] = null;
         $status = ValidationContainer::instance();
         if (empty($errored) && empty($errs)) {
             $stat = t('Your changes have been saved.');
         } else {
             $stat = t('Error importing data. Some data may have been imported and some may not have.');
         }
         foreach ($errs as $errmsg) {
             $stat .= '<br>' . 'Error: ' . htmlspecialchars($errmsg, ENT_QUOTES);
         }
         $status->setStatusMessage($stat);
         $this->view->assign('status', $status);
     }
     // done with import
 }