function save_congregation_callback() { // determine if this a save existing or save new situation $CongregationPIN = $_POST['PIN']; $Congregation = new Congregation(); $saveType = $_POST['savetype']; // populate the object with the posted data $Congregation->PIN = $CongregationPIN; $Congregation->CongregationName = trim($_POST['CongregationName']); $Congregation->EIN = trim($_POST['EIN']); $Congregation->Address1 = trim($_POST['Address1']); $Congregation->Address2 = trim($_POST['Address2']); $Congregation->City = trim($_POST['City']); $Congregation->State = trim($_POST['State']); $Congregation->PostalCode = trim($_POST['PostalCode']); $Congregation->Phone = trim($_POST['Phone']); $Congregation->Email = trim($_POST['Email']); $Congregation->Website = trim($_POST['Website']); $Congregation->Region = trim($_POST['Region']); $Congregation->Latitude = trim($_POST['Latitude']); $Congregation->Longitude = trim($_POST['Longitude']); $Congregation->DoNotAutoUpdate = $_POST['DoNotAutoUpdate']; if ($saveType == 'existing') { $SavedResult = $Congregation->save_current_congregation(); } else { $SavedResult = $Congregation->save_new_congregation(); } $ResultResponse['result'] = $SavedResult; echo json_encode($ResultResponse); die; }
function processView() { $GLOBALS['system']->includeDBClass('family'); $GLOBALS['system']->includeDBClass('person'); $GLOBALS['system']->includeDBClass('person_group'); $GLOBALS['system']->includeDBClass('congregation'); $GLOBALS['system']->includeDBClass('person_note'); if (!empty($_REQUEST['done'])) { $this->_stage = 'done'; } else { if (!empty($_POST['confirm_import'])) { ini_set('memory_limit', '256M'); ini_set('max_execution_time', 60 * 10); ini_set('zlib.output_compression', 'Off'); // read from session and create $GLOBALS['system']->doTransaction('BEGIN'); $group = $GLOBALS['system']->getDBObject('person_group', $_SESSION['import']['groupid']); $this->_captureErrors(); $done = 0; ?> <h1 style="position: absolute; text-align: center; top: 40%; color: #ccc; width: 100%">Importing...</h1> <div style="border: 1px solid; width: 50%; height: 30px; top: 50%; left: 25%; position: absolute"><div id="progress" style="background: blue; height: 30px; width: 2%; overflow: visible; line-height: 30px; text-align: center; color: white" /></div> <p style="text-align: center; color: #888">If this indicator stops making progress, your import may still be running in the background.<br />You should <a href="<?php echo build_url(array('view' => 'persons__list_all')); ?> ">check your system for the imported persons</a> before running the import again.</p> <?php foreach ($_SESSION['import']['families'] as $familydata) { $members = $familydata['members']; unset($familydata['members']); $family = new Family(); $family->populate(0, $familydata); if ($family->create()) { foreach ($members as $persondata) { $notetext = null; if (!empty($persondata['note'])) { $notetext = $persondata['note']; unset($persondata['note']); } $person = new Person(); $person->populate(0, $persondata); $person->setValue('familyid', $family->id); if ($person->create()) { $group->addMember($person->id); if ($notetext) { $note = new Person_Note(); $note->setValue('subject', 'Import note'); $note->setvalue('details', $notetext); $note->setValue('personid', $person->id); $note->create(); unset($note); } unset($person); } } $done++; if ($done % 20 == 0) { ?> <script>var d = document.getElementById('progress'); d.innerHTML = 'Importing family <?php echo $done . ' of ' . $_SESSION['import']['total_families']; ?> '; d.style.width = '<?php echo (int) ($done / $_SESSION['import']['total_families'] * 100); ?> %'</script><?php echo str_repeat(' ', 1024 * 4); } flush(); unset($family); } } if ($errors = $this->_getErrors()) { $msg = 'Errors during import - import aborted. <ul><li>' . implode('</li></li>', $errors) . '</li></ul>'; add_message($msg, 'failure', true); $GLOBALS['system']->doTransaction('ROLLBACK'); } else { add_message('Import complete', 'success'); $GLOBALS['system']->doTransaction('COMMIT'); } ?> <script>document.location = '<?php echo build_url(array()); ?> &done=1';</script> <?php exit; } else { if (!empty($_FILES['import'])) { if (empty($_REQUEST['groupid'])) { add_message("You must choose a group first", 'error'); $this->stage = 'begin'; return; } if (empty($_FILES['import']) || empty($_FILES['import']['tmp_name'])) { add_message("You must upload a file", 'error'); return; } $this->_dummy_family = new Family(); $this->_dummy_person = new Person(); // read the csv and save to session $fp = fopen($_FILES['import']['tmp_name'], 'r'); if (!$fp) { add_message("There was a problem reading your CSV file. Please try again.", 'error'); $this->stage = 'begin'; return; } $map = fgetcsv($fp, 0, ",", '"'); $_SESSION['import']['groupid'] = (int) $_POST['groupid']; $_SESSION['import']['families'] = array(); $_SESSION['import']['total_families'] = 0; $_SESSION['import']['total_persons'] = 0; $_SESSION['import']['total_notes'] = 0; $row_errors = array(); $family = NULL; $i = 1; while ($rawrow = fgetcsv($fp, 0, ",", '"')) { $row = array(); foreach ($map as $index => $fieldname) { $row[$fieldname] = array_get($rawrow, $index); } if ($this->_isEmptyRow($row)) { // Blank row = start a new family for the next row unset($family); continue; } if (!isset($family) || $this->_isNewFamily($row, $family)) { // Add family $this->_dummy_family->values = array(); $this->_dummy_family->setValue('status', 'current'); $this->_captureErrors(); $familyrow = $row; unset($familyrow['status']); $this->_dummy_family->fromCsvRow($familyrow); if ($errors = $this->_getErrors()) { $row_errors[$i] = $errors; } else { $_SESSION['import']['families'][] = $this->_dummy_family->values; $family =& $_SESSION['import']['families'][count($_SESSION['import']['families']) - 1]; $_SESSION['import']['total_families']++; } } else { // see if there's anything to update // eg if the second family member has a home tel foreach ($family as $fi => $fv) { if ($family[$fi] === '' && $row[$fi] !== '') { $family[$fi] = $row[$fi]; } } } $this->_captureErrors(); // Add a person and note $this->_dummy_person->values = array(); $this->_dummy_person->setValue('familyid', '-1'); if (!empty($row['congregation'])) { $row['congregationid'] = Congregation::findByName($row['congregation']); } $this->_dummy_person->fromCsvRow($row); if ($errors = $this->_getErrors()) { $row_errors[$i] = array_merge(array_get($row_errors, $i, array()), $errors); } else { $member = $this->_dummy_person->values + array('congregation' => $this->_dummy_person->getFormattedValue('congregationid')); if (!empty($row['note'])) { $member['note'] = $row['note']; $_SESSION['import']['total_notes']++; } $family['members'][] = $member; $_SESSION['import']['total_persons']++; } $i++; } if (!empty($row_errors)) { $msg = 'Your import file is not valid. Please correct the following errors and try again:<ul>'; foreach ($row_errors as $line => $errors) { $msg .= '<li>Row ' . ($line + 1) . ': ' . implode('; ', $errors) . '</li>'; } $msg .= '</ul>'; add_message($msg, 'failure', true); $this->_stage = 'begin'; } else { $this->_stage = 'confirm'; } } } } }
function initInitialEntities() { foreach ($_POST['congregation_name'] as $cname) { if (empty($cname)) { continue; } $c = new Congregation(); $c->setValue('name', $cname); $c->setValue('long_name', $cname); $this->congregations[] = $c; if (!$c->validateFields()) { return FALSE; } } $this->user = new Staff_Member(); foreach ($this->initial_person_fields as $field) { $this->user->processFieldInterface($field, 'install_'); } $this->user->setValue('status', 0); $this->user->setValue('permissions', PERM_SYSADMIN); if (!$this->user->validateFields()) { return FALSE; } $this->family = new Family(); $this->family->setValue('family_name', $this->user->getValue('last_name')); $this->family->setValue('creator', 0); if (!$this->family->validateFields()) { return FALSE; } return TRUE; }
function update_congregation_rows($KeyArray, $RawDataFile) { $UpdateResults['errors'] = 0; $UpdateResults['updates'] = 0; $UpdateResults['ignored'] = 0; $UpdateResults['deleted'] = 0; while (!feof($RawDataFile)) { $newRow = fgetcsv($RawDataFile); // loop through the arrays to create a new // associative array $newArray = array(); $LoopCount = count($KeyArray); for ($loop = 0; $loop < $LoopCount; $loop++) { $newArray = array_push_assoc($newArray, $KeyArray[$loop], $newRow[$loop]); } // create the congregation class $UpdateCongregation = new Congregation(); // check to see if we need to delete it first if (strtolower($newArray['updatecode']) == 'd') { // check to see if it even exists, otherwise, ignore it. if ($UpdateCongregation->get_congregation_by_PIN($newArray['pin'])) { // check to see if it has been flagged for no auto updates if ($UpdateCongregation->DoNotAutoUpdate) { // marked to not update - log it and stop. add_congregation_search_update_log('INFO', 'Congregation ' . $newArray['pin'] . ' is locked to not allow updates. Delete request ignored.'); $UpdateResults['ignored']++; } elseif (delete_congregation($newArray['pin'])) { add_congregation_search_update_log('DELETE', 'Congregation ' . $newArray['pin'] . ' was deleted.'); $UpdateResults['deleted']++; } else { add_congregation_search_update_log('ERROR', 'Congregation ' . $newArray['pin'] . ' could not be deleted.'); $UpdateResults['errors']++; } } } else { // first see if the congregation exists and make certain we d if (!$UpdateCongregation->get_congregation_by_PIN($newArray['pin'])) { // if false, this is a new congregation - lets create it $UpdateCongregation->PIN = $newArray['pin']; $UpdateCongregation->CongregationName = $newArray['congregationname']; $UpdateCongregation->EIN = $newArray['ein']; $UpdateCongregation->Address1 = $newArray['address1']; $UpdateCongregation->Address2 = $newArray['address2']; $UpdateCongregation->City = $newArray['city']; $UpdateCongregation->State = $newArray['state']; $UpdateCongregation->PostalCode = $newArray['postalcode']; $UpdateCongregation->Phone = $newArray['phone']; $UpdateCongregation->Email = $newArray['email']; $UpdateCongregation->Website = $newArray['website']; $UpdateCongregation->Region = $newArray['region']; if (array_key_exists('latitude', $newArray) && array_key_exists('longitude', $newArray)) { // if latitude and longitude were provided then add them $UpdateCongregation->Latitude = $newArray['latitude']; $UpdateCongregation->Longitude = $newArray['longitude']; } else { if ($UpdateCongregation->Address1 != '' && $UpdateCongregation->City != '' && $UpdateCongregation->State != '') { //geocode the address and add it to the record $newLatLong = get_congregation_city_state_latlong($UpdateCongregation->Address1 . ', ' . $UpdateCongregation->City . ', ' . $UpdateCongregation->State); if ($newLatLong != null) { $UpdateCongregation->Latitude = $newLatLong['location']['lat']; $UpdateCongregation->Longitude = $newLatLong['location']['long']; add_congregation_search_update_log('GEOCODE_SUCCESS', 'Congregation ' . $newArray['pin'] . ' was successfully geocoded.'); } else { add_congregation_search_update_log('GEOCODE_FAILURE', 'Congregation ' . $newArray['pin'] . ' could not be geocoded.'); } } } // save and log the result $SavedCongregationResults = $UpdateCongregation->save_new_congregation(); if ($SavedCongregationResults) { add_congregation_search_update_log('ADDED', 'Congregation ' . $newArray['pin'] . ' was added.'); $UpdateResults['updates']++; } else { add_congregation_search_update_log('ERROR', 'Congregation ' . $newArray['pin'] . ' could not be added: ' . $SavedCongregationResults); $UpdateResults['errors']++; } } else { // first checked to see if it's been flagged to not update, // then check to see if the updated data is more recent // than the current data in the database // We do this because update file contain updated for the last 7 days, // in case a previous update execution created an error that // precented some data from being updated. // check for no auto updates to this congregation if ($UpdateCongregation->DoNotAutoUpdate) { add_congregation_search_update_log('INFO', 'Congregation ' . $newArray['pin'] . ' is locked to not allow updated. Update request ignored.'); $UpdateResults['ignored']++; } elseif (strtotime($UpdateCongregation->DateUpdated) < strtotime($newArray['lastupdated'])) { $UpdateCongregation->CongregationName = $newArray['congregationname']; $UpdateCongregation->EIN = $newArray['ein']; $UpdateCongregation->Address1 = $newArray['address1']; $UpdateCongregation->Address2 = $newArray['address2']; $UpdateCongregation->City = $newArray['city']; $UpdateCongregation->State = $newArray['state']; $UpdateCongregation->PostalCode = $newArray['postalcode']; $UpdateCongregation->Phone = $newArray['phone']; $UpdateCongregation->Email = $newArray['email']; $UpdateCongregation->Website = $newArray['website']; $UpdateCongregation->Region = $newArray['region']; if (array_key_exists('latitude', $newArray) && array_key_exists('longitude', $newArray)) { // now check to see if they exist in the database. If not, don't overwrite the data // as site-side lat/long data might be overwritten if ($newArray['latitude'] != '' && $newArray['longitude'] != '') { $UpdateCongregation->Latitude = $newArray['latitude']; $UpdateCongregation->Longitude = $newArray['longitude']; } } else { if ($UpdateCongregation->Latitude == 0.0 || $UpdateCongregation->Longitude == 0.0) { //geocode the address and add it to the record $newLatLong = get_congregation_city_state_latlong($UpdateCongregation->Address1 . ', ' . $UpdateCongregation->City . ', ' . $UpdateCongregation->State); if ($newLatLong != null) { $UpdateCongregation->Latitude = $newLatLong['location']['lat']; $UpdateCongregation->Longitude = $newLatLong['location']['long']; add_congregation_search_update_log('GEOCODE_SUCCESS', 'Congregation ' . $newArray['pin'] . ' was successfully geocoded.'); } else { add_congregation_search_update_log('GEOCODE_FAILURE', 'Congregation ' . $newArray['pin'] . ' could not be geocoded.'); } } } $UpdateCongregationResults = $UpdateCongregation->save_current_congregation(); if ($UpdateCongregationResults) { add_congregation_search_update_log('UPDATED', 'Congregation ' . $newArray['pin'] . ' was updated.'); $UpdateResults['updates']++; } else { add_congregation_search_update_log('ERROR', 'Congregation ' . $newArray['pin'] . ' could not be updated:' . $UpdateCongregationResults); $UpdateResults['errors']++; } } } } } // end while // close the data file fclose($RawDataFile); return $UpdateResults; }
/** * Return a congregation by ID. * * @param integer $id The ID of the congregation. * * @return Congregation A congregation if found, otherwise null. */ public static function getCongregation($id) { Log::info('Get congregation.', compact('id')); return Congregation::find($id); }