From f5313eca635b530e02ab92d8474e82337e101fc2 Mon Sep 17 00:00:00 2001 From: int2001 Date: Thu, 7 Dec 2023 16:30:40 +0000 Subject: [PATCH] Added QRZ-Support to Cloudlog --- application/config/migration.php | 2 +- application/controllers/Dashboard.php | 5 + application/controllers/Qrz.php | 434 +++++++++++++----- application/index.html | 4 +- application/models/Logbook_model.php | 71 ++- application/models/User_model.php | 10 + application/views/dashboard/index.php | 27 +- application/views/qrz/export.php | 20 +- .../views/search/search_result_ajax.php | 33 ++ application/views/view_log/partial/log.php | 7 + .../views/view_log/partial/log_ajax.php | 10 + assets/css/blue_wide/overrides.css | 2 +- assets/css/cosmo_wide/overrides.css | 2 +- assets/css/cyborg_wide/overrides.css | 2 +- assets/css/darkly_wide/overrides.css | 2 +- assets/css/default_wide/overrides.css | 2 +- assets/css/general.css | 12 + assets/css/superhero_wide/overrides.css | 2 +- 18 files changed, 499 insertions(+), 148 deletions(-) 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 = ""; + $tableheaders .= ""; + $tableheaders .= ""; + $tableheaders .= ""; + $tableheaders .= ""; + $tableheaders .= ""; + $tableheaders .= ""; + $tableheaders .= ""; + $tableheaders .= ""; + $tableheaders .= ""; + + $table = ""; + while($record = $this->adif_parser->get_record()) { + if ((!(isset($record['app_qrzlog_qsldate']))) || (!(isset($record['qso_date'])))) { + continue; + } + $time_on = date('Y-m-d', strtotime($record['qso_date'])) ." ".date('H:i', strtotime($record['time_on'])); + + $qsl_date = date('Y-m-d', strtotime($record['app_qrzlog_qsldate'])); + + if (isset($record['time_off'])) { + $time_off = date('Y-m-d', strtotime($record['qso_date'])) ." ".date('H:i', strtotime($record['time_off'])); + } else { + $time_off = date('Y-m-d', strtotime($record['qso_date'])) ." ".date('H:i', strtotime($record['time_on'])); + } + + // If we have a positive match from LoTW, record it in the DB according to the user's preferences + if ($record['app_qrzlog_status'] == "C") { + $record['qsl_rcvd'] = $config['qrz_rcvd_mark']; + } + + $status = $this->logbook_model->import_check($time_on, $record['call'], $record['band'], $record['mode'], $record['station_callsign']); + + if($status[0] == "Found") { + $qrz_status = $this->logbook_model->qrz_update($time_on, $record['call'], $record['band'], $qsl_date, $record['qsl_rcvd'],$record['station_callsign']); + + $table .= ""; + $table .= ""; + $table .= ""; + $table .= ""; + $table .= ""; + $table .= ""; + $table .= ""; + $table .= ""; + $table .= ""; + } else { + $table .= ""; + $table .= ""; + $table .= ""; + $table .= ""; + $table .= ""; + $table .= ""; + $table .= ""; + $table .= ""; + } + } + + if ($table != "") + { + $table .= "
Station CallsignQSO DateCallModeQRZ QSL ReceivedQRZ ConfirmedLog Status
".$record['station_callsign']."".$time_on."".$record['call']."".$record['mode']."".$record['qsl_rcvd']."".$qsl_date."QSO Record: ".$status[0]."
".$record['station_callsign']."".$time_on."".$record['call']."".$record['mode']."".$record['qsl_rcvd']."QSO Record: ".$status[0]."
"; + $data['qrz_table_headers'] = $tableheaders; + $data['qrz_table'] = $table; + } + + unlink($filepath); + + $this->load->model('user_model'); + if ($this->user_model->authorize(2)) { // Only Output results if authorized User + if(isset($tableheaders)) { + if($display_view == TRUE) { + $data['page_title'] = "QRZ ADIF Information"; + $this->load->view('interface_assets/header', $data); + $this->load->view('qrz/analysis'); + $this->load->view('interface_assets/footer'); + } else { + return $tableheaders.$table; + } + } else { + echo "Downloaded QRZ report contains no matches."; + } + } + } + } diff --git a/application/index.html b/application/index.html index c942a79ce..e417a11c4 100644 --- a/application/index.html +++ b/application/index.html @@ -4,7 +4,7 @@ -

Directory access is forbidden.

+

Directory access is forbidden here.

- \ No newline at end of file + diff --git a/application/models/Logbook_model.php b/application/models/Logbook_model.php index b22ccb008..0a480249d 100755 --- a/application/models/Logbook_model.php +++ b/application/models/Logbook_model.php @@ -408,17 +408,23 @@ class Logbook_model extends CI_Model { case 'EQSLSDATE': $this->db->where('date(COL_EQSL_QSLSDATE)=date(SYSDATE())'); break; - case 'LOTWRDATE': + case 'lotwrdate': $this->db->where('date(COL_LOTW_QSLRDATE)=date(SYSDATE())'); break; - case 'LOTWSDATE': + case 'lotwsdate': $this->db->where('date(COL_LOTW_QSLSDATE)=date(SYSDATE())'); break; + case 'qrzrdate': + $this->db->where('date(COL_QRZCOM_QSO_DOWNLOAD_DATE)=date(SYSDATE())'); + break; + case 'qrzsdate': + $this->db->where('date(COL_QRZCOM_QSO_UPLOAD_DATE)=date(SYSDATE())'); + break; } $this->db->where_in($this->config->item('table_name').'.station_id', $logbooks_locations_array); - if ($band != 'All') { + if (strtolower($band) != 'all') { if($band != "SAT") { $this->db->where('COL_PROP_MODE !=', 'SAT'); $this->db->where('COL_BAND', $band); @@ -442,7 +448,7 @@ class Logbook_model extends CI_Model { $this->db->where($sql); } - if ($mode != 'All' && $mode != '') { + if (strtolower($mode) != 'all' && $mode != '') { $this->db->where("(COL_MODE='" . $mode . "' OR COL_SUBMODE='" . $mode ."')"); } $this->db->order_by("COL_TIME_ON", "desc"); @@ -1728,9 +1734,9 @@ class Logbook_model extends CI_Model { /* * Function returns all the station_id's with QRZ API Key's */ - function get_station_id_with_qrz_api() { - $sql = 'select station_id, qrzapikey from station_profile - where coalesce(qrzapikey, "") <> ""'; + function get_qrz_apikeys() { + $sql = 'select distinct qrzapikey, station_callsign,user_id from station_profile + where coalesce(qrzapikey, "") <> "" order by qrzapikey, station_callsign'; $query = $this->db->query($sql); @@ -2451,13 +2457,17 @@ function check_if_callsign_worked_in_logbook($callsign, $StationLocationsArray = COUNT(IF(COL_EQSL_QSL_RCVD="Y",COL_EQSL_QSL_RCVD,null)) as eQSL_Received, COUNT(IF(COL_LOTW_QSL_SENT="Y",COL_LOTW_QSL_SENT,null)) as LoTW_Sent, COUNT(IF(COL_LOTW_QSL_RCVD="Y",COL_LOTW_QSL_RCVD,null)) as LoTW_Received, + COUNT(IF(COL_QRZCOM_QSO_UPLOAD_STATUS="Y",COL_QRZCOM_QSO_UPLOAD_STATUS,null)) as QRZ_Sent, + COUNT(IF(COL_QRZCOM_QSO_DOWNLOAD_STATUS="Y",COL_QRZCOM_QSO_DOWNLOAD_STATUS,null)) as QRZ_Received, COUNT(IF(COL_QSL_SENT="Y" and DATE(COL_QSLSDATE)=DATE(SYSDATE()),COL_QSL_SENT,null)) as QSL_Sent_today, COUNT(IF(COL_QSL_RCVD="Y" and DATE(COL_QSLRDATE)=DATE(SYSDATE()),COL_QSL_RCVD,null)) as QSL_Received_today, COUNT(IF(COL_QSL_SENT IN("Q", "R") and DATE(COL_QSLSDATE)=DATE(SYSDATE()) ,COL_QSL_SENT,null)) as QSL_Requested_today, COUNT(IF(COL_EQSL_QSL_SENT="Y" and DATE(COL_EQSL_QSLSDATE)=DATE(SYSDATE()),COL_EQSL_QSL_SENT,null)) as eQSL_Sent_today, COUNT(IF(COL_EQSL_QSL_RCVD="Y" and DATE(COL_EQSL_QSLRDATE)=DATE(SYSDATE()),COL_EQSL_QSL_RCVD,null)) as eQSL_Received_today, COUNT(IF(COL_LOTW_QSL_SENT="Y" and DATE(COL_LOTW_QSLSDATE)=DATE(SYSDATE()),COL_LOTW_QSL_SENT,null)) as LoTW_Sent_today, - COUNT(IF(COL_LOTW_QSL_RCVD="Y" and DATE(COL_LOTW_QSLRDATE)=DATE(SYSDATE()),COL_LOTW_QSL_RCVD,null)) as LoTW_Received_today + COUNT(IF(COL_LOTW_QSL_RCVD="Y" and DATE(COL_LOTW_QSLRDATE)=DATE(SYSDATE()),COL_LOTW_QSL_RCVD,null)) as LoTW_Received_today, + COUNT(IF(COL_QRZCOM_QSO_UPLOAD_STATUS="Y" and DATE(COL_QRZCOM_QSO_UPLOAD_DATE)=DATE(SYSDATE()),COL_QRZCOM_QSO_UPLOAD_STATUS,null)) as QRZ_Sent_today, + COUNT(IF(COL_QRZCOM_QSO_DOWNLOAD_STATUS="Y" and DATE(COL_QRZCOM_QSO_DOWNLOAD_DATE)=DATE(SYSDATE()),COL_QRZCOM_QSO_DOWNLOAD_STATUS,null)) as QRZ_Received_today '); $this->db->where_in('station_id', $logbooks_locations_array); @@ -2471,6 +2481,8 @@ function check_if_callsign_worked_in_logbook($callsign, $StationLocationsArray = $QSLBreakdown['eQSL_Received'] = $row->eQSL_Received; $QSLBreakdown['LoTW_Sent'] = $row->LoTW_Sent; $QSLBreakdown['LoTW_Received'] = $row->LoTW_Received; + $QSLBreakdown['QRZ_Sent'] = $row->QRZ_Sent; + $QSLBreakdown['QRZ_Received'] = $row->QRZ_Received; $QSLBreakdown['QSL_Sent_today'] = $row->QSL_Sent_today; $QSLBreakdown['QSL_Received_today'] = $row->QSL_Received_today; $QSLBreakdown['QSL_Requested_today'] = $row->QSL_Requested_today; @@ -2478,6 +2490,8 @@ function check_if_callsign_worked_in_logbook($callsign, $StationLocationsArray = $QSLBreakdown['eQSL_Received_today'] = $row->eQSL_Received_today; $QSLBreakdown['LoTW_Sent_today'] = $row->LoTW_Sent_today; $QSLBreakdown['LoTW_Received_today'] = $row->LoTW_Received_today; + $QSLBreakdown['QRZ_Sent_today'] = $row->QRZ_Sent_today; + $QSLBreakdown['QRZ_Received_today'] = $row->QRZ_Received_today; } return $QSLBreakdown; @@ -2878,7 +2892,31 @@ function check_if_callsign_worked_in_logbook($callsign, $StationLocationsArray = } } - function lotw_update($datetime, $callsign, $band, $qsl_date, $qsl_status, $state, $qsl_gridsquare, $qsl_vucc_grids, $iota, $cnty, $cqz, $ituz, $station_callsign) { + function qrz_update($datetime, $callsign, $band, $qsl_date, $qsl_status, $station_callsign) { + + $data = array( + 'COL_QRZCOM_QSO_DOWNLOAD_DATE' => $qsl_date, + 'COL_QRZCOM_QSO_DOWNLOAD_STATUS' => $qsl_status, + ); + + + $this->db->where('date_format(COL_TIME_ON, \'%Y-%m-%d %H:%i\') = "'.$datetime.'"'); + $this->db->where('COL_CALL', $callsign); + $this->db->where('COL_BAND', $band); + $this->db->where('COL_STATION_CALLSIGN', $station_callsign); + + if ($this->db->update($this->config->item('table_name'), $data)) { + unset($data); + return "Updated"; + } else { + unset($data); + return "Not updated"; + } + + + } + +function lotw_update($datetime, $callsign, $band, $qsl_date, $qsl_status, $state, $qsl_gridsquare, $qsl_vucc_grids, $iota, $cnty, $cqz, $ituz, $station_callsign) { $data = array( 'COL_LOTW_QSLRDATE' => $qsl_date, @@ -2961,7 +2999,20 @@ function check_if_callsign_worked_in_logbook($callsign, $StationLocationsArray = return "Updated"; } - function lotw_last_qsl_date($user_id) { + function qrz_last_qsl_date($user_id) { + $sql="SELECT date_format(MAX(COALESCE(COL_QRZCOM_QSO_DOWNLOAD_DATE, str_to_date('1900-01-01','%Y-%m-%d'))),'%Y-%m-%d') MAXDATE + FROM ".$this->config->item('table_name')." INNER JOIN station_profile ON (".$this->config->item('table_name').".station_id = station_profile.station_id) + WHERE station_profile.user_id=? and station_profile.qrzapikey is not null and COL_QRZCOM_QSO_DOWNLOAD_DATE is not null"; + $query = $this->db->query($sql,$user_id); + $row = $query->row(); + if (isset($row) && ($row->MAXDATE ?? '' != '')) { + return $row->MAXDATE; + } else { + return '1900-01-01'; + } + } + +function lotw_last_qsl_date($user_id) { $sql="SELECT MAX(COALESCE(COL_LOTW_QSLRDATE, '1900-01-01 00:00:00')) MAXDATE FROM ".$this->config->item('table_name')." INNER JOIN station_profile ON (".$this->config->item('table_name').".station_id = station_profile.station_id) WHERE station_profile.user_id=".$user_id." and COL_LOTW_QSLRDATE is not null"; diff --git a/application/models/User_model.php b/application/models/User_model.php index 0bb24d90c..f80ffbc5c 100644 --- a/application/models/User_model.php +++ b/application/models/User_model.php @@ -87,6 +87,15 @@ class User_Model extends CI_Model { return $r->user_email; } + function hasQrzKey($user_id) { + $this->db->where('station_profile.qrzapikey is not null'); + $this->db->join('station_profile', 'station_profile.user_id = '.$user_id); + $query = $this->db->get($this->config->item('auth_table')); + + $ret = $query->row(); + return $ret->user_email; + } + function get_email_address($station_id) { $this->db->where('station_id', $station_id); $this->db->join('station_profile', 'station_profile.user_id = '.$this->config->item('auth_table').'.user_id'); @@ -366,6 +375,7 @@ class User_Model extends CI_Model { 'active_station_logbook' => $u->row()->active_station_logbook, 'language' => isset($u->row()->language) ? $u->row()->language: 'english', 'isWinkeyEnabled' => $u->row()->winkey, + 'hasQrzKey' => $this->hasQrzKey($u->row()->user_id), ); $this->session->set_userdata($userdata); diff --git a/application/views/dashboard/index.php b/application/views/dashboard/index.php index fcd4c5ee8..c860a4605 100644 --- a/application/views/dashboard/index.php +++ b/application/views/dashboard/index.php @@ -286,7 +286,7 @@ function echoQrbCalcLink($mygrid, $grid, $vucc) { - config->item('use_auth') && ($this->session->userdata('user_type') >= 2)) || $this->config->item('use_auth') === FALSE) && ($total_lotw_sent != 0 || $total_lotw_rcvd != 0)) { ?> + config->item('use_auth') && ($this->session->userdata('user_type') >= 2)) || $this->config->item('use_auth') === false) && ($total_lotw_sent != 0 || $total_lotw_rcvd != 0)) { ?> @@ -296,13 +296,34 @@ function echoQrbCalcLink($mygrid, $grid, $vucc) { - + - + + +
+ + + config->item('use_auth') && ($this->session->userdata('user_type') >= 2)) || $this->config->item('use_auth') === false) && ($total_qrz_sent != 0 || $total_qrz_rcvd != 0)) { ?> + + + + + + + + + + + + + + + +
QRZ.com
diff --git a/application/views/qrz/export.php b/application/views/qrz/export.php index 20de0ca47..6d64af5b7 100644 --- a/application/views/qrz/export.php +++ b/application/views/qrz/export.php @@ -9,6 +9,9 @@ + @@ -57,7 +60,22 @@ ?> -
+
+ +
+

Warning If no startdate is given then all QSOs after last confirmation will be downloaded/updated!

+
+
+ + +
+
+
+ +
+
+ +