diff --git a/application/config/migration.php b/application/config/migration.php index 7d6a86d17..f3d00a072 100644 --- a/application/config/migration.php +++ b/application/config/migration.php @@ -22,7 +22,7 @@ $config['migration_enabled'] = TRUE; | */ -$config['migration_version'] = 157; +$config['migration_version'] = 158; /* |-------------------------------------------------------------------------- diff --git a/application/controllers/Dashboard.php b/application/controllers/Dashboard.php index 1036dc77f..c627c4311 100644 --- a/application/controllers/Dashboard.php +++ b/application/controllers/Dashboard.php @@ -107,6 +107,11 @@ class Dashboard extends CI_Controller { $data['lotw_sent_today'] = $QSLStatsBreakdownArray['LoTW_Sent_today']; $data['lotw_rcvd_today'] = $QSLStatsBreakdownArray['LoTW_Received_today']; + $data['total_qrz_sent'] = $QSLStatsBreakdownArray['QRZ_Sent']; + $data['total_qrz_rcvd'] = $QSLStatsBreakdownArray['QRZ_Received']; + $data['qrz_sent_today'] = $QSLStatsBreakdownArray['QRZ_Sent_today']; + $data['qrz_rcvd_today'] = $QSLStatsBreakdownArray['QRZ_Received_today']; + $data['last_five_qsos'] = $this->logbook_model->get_last_qsos('18', $logbooks_locations_array); $data['vucc'] = $this->vucc->fetchVuccSummary(); diff --git a/application/controllers/Qrz.php b/application/controllers/Qrz.php index 7dce6900f..096dd42a1 100644 --- a/application/controllers/Qrz.php +++ b/application/controllers/Qrz.php @@ -2,155 +2,157 @@ /* Controller to interact with the QRZ.com API -*/ + */ class Qrz extends CI_Controller { - // Show frontend if there is one - public function index() { - $this->config->load('config'); - } + // Show frontend if there is one + public function index() { + $this->config->load('config'); + } - /* - * Upload QSO to QRZ.com - * When called from the url cloudlog/qrz/upload, the function loops through all station_id's with a qrz api key defined. - * All QSOs not previously uploaded, will then be uploaded, one at a time - */ - public function upload() { - $this->setOptions(); + /* + * Upload QSO to QRZ.com + * When called from the url cloudlog/qrz/upload, the function loops through all station_id's with a qrz api key defined. + * All QSOs not previously uploaded, will then be uploaded, one at a time + */ + public function upload() { + $this->setOptions(); - $this->load->model('logbook_model'); + $this->load->model('logbook_model'); - $station_ids = $this->logbook_model->get_station_id_with_qrz_api(); + $station_ids = $this->logbook_model->get_station_id_with_qrz_api(); - if ($station_ids) { - foreach ($station_ids as $station) { - $qrz_api_key = $station->qrzapikey; - if($this->mass_upload_qsos($station->station_id, $qrz_api_key, true)) { - echo "QSOs have been uploaded to QRZ.com."; - log_message('info', 'QSOs have been uploaded to QRZ.com.'); - } else{ - echo "No QSOs found for upload."; - log_message('info', 'No QSOs found for upload.'); - } - } - } else { - echo "No station profiles with a QRZ API Key found."; - log_message('error', "No station profiles with a QRZ API Key found."); - } + if ($station_ids) { + foreach ($station_ids as $station) { + $qrz_api_key = $station->qrzapikey; + if($this->mass_upload_qsos($station->station_id, $qrz_api_key, true)) { + echo "QSOs have been uploaded to QRZ.com."; + log_message('info', 'QSOs have been uploaded to QRZ.com.'); + } else{ + echo "No QSOs found for upload."; + log_message('info', 'No QSOs found for upload.'); + } + } + } else { + echo "No station profiles with a QRZ API Key found."; + log_message('error', "No station profiles with a QRZ API Key found."); + } - } + } - function setOptions() { - $this->config->load('config'); - ini_set('memory_limit', '-1'); - ini_set('display_errors', 1); - ini_set('display_startup_errors', 1); - error_reporting(E_ALL); - } + function setOptions() { + $this->config->load('config'); + ini_set('memory_limit', '-1'); + ini_set('display_errors', 1); + ini_set('display_startup_errors', 1); + error_reporting(E_ALL); + } - /* - * Function gets all QSOs from given station_id, that are not previously uploaded to qrz. - * Adif is build for each qso, and then uploaded, one at a time - */ - function mass_upload_qsos($station_id, $qrz_api_key, $trusted = false) { - $i = 0; - $data['qsos'] = $this->logbook_model->get_qrz_qsos($station_id, $trusted); - $errormessages=array(); + /* + * Function gets all QSOs from given station_id, that are not previously uploaded to qrz. + * Adif is build for each qso, and then uploaded, one at a time + */ + function mass_upload_qsos($station_id, $qrz_api_key, $trusted = false) { + $i = 0; + $data['qsos'] = $this->logbook_model->get_qrz_qsos($station_id, $trusted); + $errormessages=array(); - $CI =& get_instance(); - $CI->load->library('AdifHelper'); + $CI =& get_instance(); + $CI->load->library('AdifHelper'); - if ($data['qsos']) { - foreach ($data['qsos']->result() as $qso) { - $adif = $CI->adifhelper->getAdifLine($qso); + if ($data['qsos']) { + foreach ($data['qsos']->result() as $qso) { + $adif = $CI->adifhelper->getAdifLine($qso); - if ($qso->COL_QRZCOM_QSO_UPLOAD_STATUS == 'M') { - $result = $this->logbook_model->push_qso_to_qrz($qrz_api_key, $adif, true); - } else { - $result = $this->logbook_model->push_qso_to_qrz($qrz_api_key, $adif); - } + if ($qso->COL_QRZCOM_QSO_UPLOAD_STATUS == 'M') { + $result = $this->logbook_model->push_qso_to_qrz($qrz_api_key, $adif, true); + } else { + $result = $this->logbook_model->push_qso_to_qrz($qrz_api_key, $adif); + } - if ( ($result['status'] == 'OK') || ( ($result['status'] == 'error') && ($result['message'] == 'STATUS=FAIL&REASON=Unable to add QSO to database: duplicate&EXTENDED=')) ){ - $this->markqso($qso->COL_PRIMARY_KEY); - $i++; - } elseif ( ($result['status']=='error') && (substr($result['message'],0,11) == 'STATUS=AUTH')) { - log_message('error', 'QRZ upload failed for qso: Call: ' . $qso->COL_CALL . ' Band: ' . $qso->COL_BAND . ' Mode: ' . $qso->COL_MODE . ' Time: ' . $qso->COL_TIME_ON); - log_message('error', 'QRZ upload failed with the following message: ' .$result['message']); - log_message('error', 'QRZ upload stopped for Station_ID: ' .$station_id); - $errormessages[] = $result['message'] . ' Call: ' . $qso->COL_CALL . ' Band: ' . $qso->COL_BAND . ' Mode: ' . $qso->COL_MODE . ' Time: ' . $qso->COL_TIME_ON; - break; /* If key is invalid, immediate stop syncing for more QSOs of this station */ - } else { - log_message('error', 'QRZ upload failed for qso: Call: ' . $qso->COL_CALL . ' Band: ' . $qso->COL_BAND . ' Mode: ' . $qso->COL_MODE . ' Time: ' . $qso->COL_TIME_ON); - log_message('error', 'QRZ upload failed with the following message: ' .$result['message']); - $errormessages[] = $result['message'] . ' Call: ' . $qso->COL_CALL . ' Band: ' . $qso->COL_BAND . ' Mode: ' . $qso->COL_MODE . ' Time: ' . $qso->COL_TIME_ON; - } - } - $result['status'] = 'OK'; - $result['count'] = $i; - $result['errormessages'] = $errormessages; - return $result; - } else { - $result['status'] = 'Error'; - $result['count'] = $i; - $result['errormessages'] = $errormessages; - return $result; - } - } + if ( ($result['status'] == 'OK') || ( ($result['status'] == 'error') && ($result['message'] == 'STATUS=FAIL&REASON=Unable to add QSO to database: duplicate&EXTENDED=')) ){ + $this->markqso($qso->COL_PRIMARY_KEY); + $i++; + } elseif ( ($result['status']=='error') && (substr($result['message'],0,11) == 'STATUS=AUTH')) { + log_message('error', 'QRZ upload failed for qso: Call: ' . $qso->COL_CALL . ' Band: ' . $qso->COL_BAND . ' Mode: ' . $qso->COL_MODE . ' Time: ' . $qso->COL_TIME_ON); + log_message('error', 'QRZ upload failed with the following message: ' .$result['message']); + log_message('error', 'QRZ upload stopped for Station_ID: ' .$station_id); + $errormessages[] = $result['message'] . ' Call: ' . $qso->COL_CALL . ' Band: ' . $qso->COL_BAND . ' Mode: ' . $qso->COL_MODE . ' Time: ' . $qso->COL_TIME_ON; + break; /* If key is invalid, immediate stop syncing for more QSOs of this station */ + } else { + log_message('error', 'QRZ upload failed for qso: Call: ' . $qso->COL_CALL . ' Band: ' . $qso->COL_BAND . ' Mode: ' . $qso->COL_MODE . ' Time: ' . $qso->COL_TIME_ON); + log_message('error', 'QRZ upload failed with the following message: ' .$result['message']); + $errormessages[] = $result['message'] . ' Call: ' . $qso->COL_CALL . ' Band: ' . $qso->COL_BAND . ' Mode: ' . $qso->COL_MODE . ' Time: ' . $qso->COL_TIME_ON; + } + } + $result['status'] = 'OK'; + $result['count'] = $i; + $result['errormessages'] = $errormessages; + return $result; + } else { + $result['status'] = 'Error'; + $result['count'] = $i; + $result['errormessages'] = $errormessages; + return $result; + } + } - /* - * Function marks QSO with given primarykey as uploaded to qrz - */ - function markqso($primarykey) { - $this->logbook_model->mark_qrz_qsos_sent($primarykey); - } + /* + * Function marks QSO with given primarykey as uploaded to qrz + */ + function markqso($primarykey) { + $this->logbook_model->mark_qrz_qsos_sent($primarykey); + } - /* - * Used for displaying the uid for manually selecting log for upload to qrz - */ - public function export() { - $this->load->model('stations'); + /* + * Used for displaying the uid for manually selecting log for upload to qrz + */ + public function export() { + $this->load->model('stations'); - $data['page_title'] = "QRZ Logbook"; + $data['page_title'] = "QRZ Logbook"; $data['station_profiles'] = $this->stations->all_of_user(); - $data['station_profile'] = $this->stations->stations_with_qrz_api_key(); + $data['station_profile'] = $this->stations->stations_with_qrz_api_key(); + $this->load->model('Stations'); + $data['callsigns'] = $this->Stations->callsigns_of_user($this->session->userdata('user_id')); - $this->load->view('interface_assets/header', $data); - $this->load->view('qrz/export'); - $this->load->view('interface_assets/footer'); - } + $this->load->view('interface_assets/header', $data); + $this->load->view('qrz/export'); + $this->load->view('interface_assets/footer'); + } - /* - * Used for ajax-function when selecting log for upload to qrz - */ - public function upload_station() { - $this->setOptions(); - $this->load->model('stations'); + /* + * Used for ajax-function when selecting log for upload to qrz + */ + public function upload_station() { + $this->setOptions(); + $this->load->model('stations'); - $postData = $this->input->post(); + $postData = $this->input->post(); - $this->load->model('logbook_model'); - $result = $this->logbook_model->exists_qrz_api_key($postData['station_id']); - $qrz_api_key = $result->qrzapikey; - header('Content-type: application/json'); - $result = $this->mass_upload_qsos($postData['station_id'], $qrz_api_key); - if ($result['status'] == 'OK') { - $stationinfo = $this->stations->stations_with_qrz_api_key(); - $info = $stationinfo->result(); + $this->load->model('logbook_model'); + $result = $this->logbook_model->exists_qrz_api_key($postData['station_id']); + $qrz_api_key = $result->qrzapikey; + header('Content-type: application/json'); + $result = $this->mass_upload_qsos($postData['station_id'], $qrz_api_key); + if ($result['status'] == 'OK') { + $stationinfo = $this->stations->stations_with_qrz_api_key(); + $info = $stationinfo->result(); - $data['status'] = 'OK'; - $data['info'] = $info; - $data['infomessage'] = $result['count'] . " QSOs are now uploaded to QRZ.com"; - $data['errormessages'] = $result['errormessages']; - echo json_encode($data); - } else { - $data['status'] = 'Error'; - $data['info'] = 'Error: No QSOs found to upload.'; - $data['errormessages'] = $result['errormessages']; - echo json_encode($data); - } - } + $data['status'] = 'OK'; + $data['info'] = $info; + $data['infomessage'] = $result['count'] . " QSOs are now uploaded to QRZ.com"; + $data['errormessages'] = $result['errormessages']; + echo json_encode($data); + } else { + $data['status'] = 'Error'; + $data['info'] = 'Error: No QSOs found to upload.'; + $data['errormessages'] = $result['errormessages']; + echo json_encode($data); + } + } public function mark_qrz() { // Set memory limit to unlimited to allow heavy usage @@ -173,4 +175,186 @@ class Qrz extends CI_Controller { $this->load->view('qrz/mark_qrz', $data); $this->load->view('interface_assets/footer'); } + + public function import_qrz() { + $this->load->model('user_model'); + if(!$this->user_model->authorize(2)) { $this->session->set_flashdata('notice', 'You\'re not allowed to do that!'); redirect('dashboard'); } + + $data['page_title'] = "QRZ QSL Import"; + + $this->load->model('logbook_model'); + + $customDate = $this->input->post('from'); + if ($customDate != NULL) { + $qrz_last_date = date($customDate); + } else { + // Query the logbook to determine when the last LoTW confirmation was + $qrz_last_date = null; + } + $this->download($this->session->userdata('user_id'),$qrz_last_date,true); + } // end function + + function download($user_id_to_load = null, $lastqrz = null, $show_views = false) { + $this->load->model('user_model'); + $this->load->model('logbook_model'); + + + $api_keys = $this->logbook_model->get_qrz_apikeys(); + + if ($api_keys) { + foreach ($api_keys as $station) { + if (($user_id_to_load != null) && ($user_id_to_load != $station->user_id)) { // Skip User if we're called with a specific user_id + continue; + } + if ($lastqrz == null) { + $lastqrz = $this->logbook_model->qrz_last_qsl_date($station->user_id); + } + $qrz_api_key = $station->qrzapikey; + $result=($this->mass_download_qsos($station->station_callsign, $qrz_api_key, $lastqrz, true, $show_views)); + } + } else { + echo "No station profiles with a QRZ API Key found."; + log_message('error', "No station profiles with a QRZ API Key found."); + } + } + + function mass_download_qsos($call = null,$qrz_api_key = '', $lastqrz = '1900-01-01', $trusted = false, $show_views = true) { + $config['upload_path'] = './uploads/'; + $file = $config['upload_path'] . 'qrzcom_download_report.adi'; + if (file_exists($file) && ! is_writable($file)) { + $result = "Temporary download file ".$file." is not writable. Aborting!"; + return false; + } + $url = 'http://logbook.qrz.com/api'; + + $post_data['KEY'] = $qrz_api_key; + $post_data['ACTION'] = 'FETCH'; + $post_data['OPTION'] = 'MODSINCE:'.$lastqrz.', CALL:'.$call.', STATUS:CONFIRMED, TYPE:ADIF'; + + $ch = curl_init( $url ); + curl_setopt( $ch, CURLOPT_POST, true); + curl_setopt( $ch, CURLOPT_POSTFIELDS, $post_data); + curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1); + curl_setopt( $ch, CURLOPT_HEADER, 0); + curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true); + + $content = htmlspecialchars_decode(curl_exec($ch)); + file_put_contents($file, $content); + if (strlen(file_get_contents($file, false, null, 0, 100))!=100) { + $result = "QRZ downloading failed for ".$call." either due to it being down or incorrect logins."; + return "false"; + } + + ini_set('memory_limit', '-1'); + $result = $this->loadFromFile($file, $show_views); + + return $result; + } + +/* + |-------------------------------------------------------------------------- + | Function: loadFromFile + |-------------------------------------------------------------------------- + | + | $filepath is the ADIF file, $display_view is used to hide the output if its internal script + | + | Internal function that takes the QRZ ADIF and imports into the log + | + */ + private function loadFromFile($filepath, $display_view = "TRUE") { + + // Figure out how we should be marking QSLs confirmed via LoTW + $config['qrz_rcvd_mark'] = 'Y'; + + ini_set('memory_limit', '-1'); + set_time_limit(0); + + $this->load->library('adif_parser'); + + $this->adif_parser->load_from_file($filepath); + + $this->adif_parser->initialize(); + $tableheaders = "
| Station Callsign | "; + $tableheaders .= "QSO Date | "; + $tableheaders .= "Call | "; + $tableheaders .= "Mode | "; + $tableheaders .= "QRZ QSL Received | "; + $tableheaders .= "QRZ Confirmed | "; + $tableheaders .= "Log Status | "; + $tableheaders .= "
| ".$record['station_callsign']." | "; + $table .= "".$time_on." | "; + $table .= "".$record['call']." | "; + $table .= "".$record['mode']." | "; + $table .= "".$record['qsl_rcvd']." | "; + $table .= "".$qsl_date." | "; + $table .= "QSO Record: ".$status[0]." | "; + $table .= "
| ".$record['station_callsign']." | "; + $table .= "".$time_on." | "; + $table .= "".$record['call']." | "; + $table .= "".$record['mode']." | "; + $table .= "".$record['qsl_rcvd']." | "; + $table .= "QSO Record: ".$status[0]." | "; + $table .= "
Directory access is forbidden.
+Directory access is forbidden here.
-