diff --git a/application/models/Logbookadvanced_model.php b/application/models/Logbookadvanced_model.php index 6892f27f8..a489c265c 100644 --- a/application/models/Logbookadvanced_model.php +++ b/application/models/Logbookadvanced_model.php @@ -1549,9 +1549,56 @@ class Logbookadvanced_model extends CI_Model { return $this->check_missing_itu_zones(); case 'checkgrids': return $this->getMissingGridQsos(); + case 'checkincorrectgridsquares': + return $this->getIncorrectGridsquares(); + case 'checkincorrectcqzones': + return $this->getIncorrectCqZones(); + case 'checkincorrectituzones': + return $this->getIncorrectItuZones(); return null; } } + /* + * Get list of QSOs with gridsquares that do not match the gridsquares listed for the DXCC. + * The data comes from the TQSL published Gridsquare list for DXCCs. + */ + public function getIncorrectGridsquares() { + $sqlcheck = "select count(*) as count from vuccgrids";; + $querycheck = $this->db->query($sqlcheck); + $rowcheck = $querycheck->row(); + if ($rowcheck->count == 0) { + return ['status' => 'error', 'message' => __("VuccGrids table is empty. Please import the VUCC grids data first.")]; + } + + $sql = "select col_primary_key, col_time_on, col_call, col_band, col_gridsquare, col_dxcc, col_country, station_profile_name, col_lotw_qsl_rcvd, col_mode, col_submode, + ( + select group_concat(distinct gridsquare order by gridsquare separator ', ') + from vuccgrids + where adif = thcv.col_dxcc + order by gridsquare asc + ) as correctgridsquare + from " . $this->config->item('table_name') . " thcv + join station_profile on thcv.station_id = station_profile.station_id + join dxcc_entities on dxcc_entities.adif = thcv.COL_DXCC + where station_profile.user_id = ? + and thcv.col_dxcc > 0 + and not exists ( + select 1 + from vuccgrids + where adif = thcv.col_dxcc + and gridsquare = substr(thcv.col_gridsquare, 1, 4) + ) + and exists (select 1 from vuccgrids where adif = thcv.col_dxcc) + and thcv.col_dxcc > 0 + and thcv.col_gridsquare is not null + and thcv.col_gridsquare <> '' + order by station_profile_name, col_time_on desc"; + + $bindings[] = [$this->session->userdata('user_id')]; + + $query = $this->db->query($sql, $bindings); + return $query->result(); + } public function check_missing_dxcc() { $sql = "select count(*) as count from " . $this->config->item('table_name') . " @@ -1811,6 +1858,10 @@ class Logbookadvanced_model extends CI_Model { return $query->result(); } + /* + Function to run batch fixes on the logbook. + Used in dbtools section. + */ function batchFix($type) { switch ($type) { case 'dxcc': @@ -1833,6 +1884,7 @@ class Logbookadvanced_model extends CI_Model { /* Another function moved from update to the advanced logbook, to be used in the dbtools section. It did not have filter on user or location. + This function will check all QSOs with missing grid square and try to fill them using the callbook lookup. */ public function check_missing_grid() { $result = $this->getMissingGridQsos(); @@ -1891,6 +1943,9 @@ class Logbookadvanced_model extends CI_Model { return $query->result(); } + /* + Check all QSOs DXCC against current DXCC database + */ public function check_dxcc() { $i = 0; @@ -1914,6 +1969,10 @@ class Logbookadvanced_model extends CI_Model { $result[] = array( 'callsign' => $call->col_call, 'qso_date' => $call->date, + 'mode' => isset($call->col_mode) ? $call->col_mode : '', + 'submode' => isset($call->col_submode) ? $call->col_submode : '', + 'band' => isset($call->col_band) ? $call->col_band : '', + 'lotw_qsl_rcvd' => isset($call->col_lotw_qsl_rcvd) ? $call->col_lotw_qsl_rcvd : '', 'station_profile' => $call->station_profile_name, 'existing_dxcc' => $call->col_country, 'existing_adif' => $call->col_dxcc, @@ -1938,7 +1997,7 @@ class Logbookadvanced_model extends CI_Model { } function getQsos() { - $sql = 'select distinct col_country, col_call, col_dxcc, date(col_time_on) date, station_profile.station_profile_name, col_primary_key + $sql = 'select distinct col_country, col_call, col_dxcc, date(col_time_on) date, col_mode, col_submode, col_band, col_lotw_qsl_rcvd, station_profile.station_profile_name, col_primary_key from ' . $this->config->item('table_name') . ' join station_profile on ' . $this->config->item('table_name') . '.station_id = station_profile.station_id where station_profile.user_id = ?'; @@ -1980,4 +2039,44 @@ class Logbookadvanced_model extends CI_Model { $result['count'] = $count; return $result; } + + function getIncorrectCqZones() { + if(!clubaccess_check(9)) return; + + $sql = "select *, (select group_concat(distinct cqzone order by cqzone separator ', ') from dxcc_master where countrycode = thcv.col_dxcc and cqzone <> '' order by cqzone asc) as correctcqzone + from " . $this->config->item('table_name') . " thcv + join station_profile on thcv.station_id = station_profile.station_id + where station_profile.user_id = ? + and not exists (select 1 from dxcc_master where countrycode = thcv.col_dxcc and cqzone = col_cqz) and col_dxcc > 0 + "; + + $params[] = $this->session->userdata('user_id'); + + $sql .= " order by station_profile.station_profile_name, thcv.col_time_on desc + limit 5000"; + + $query = $this->db->query($sql, $params); + + return $query->result(); + } + + function getIncorrectItuZones() { + if(!clubaccess_check(9)) return; + + $sql = "select *, (select group_concat(distinct ituzone order by ituzone separator ', ') from dxcc_master where countrycode = thcv.col_dxcc and ituzone <> '' order by ituzone asc) as correctituzone + from " . $this->config->item('table_name') . " thcv + join station_profile on thcv.station_id = station_profile.station_id + where station_profile.user_id = ? + and not exists (select 1 from dxcc_master where countrycode = thcv.col_dxcc and ituzone = col_ituz) and col_dxcc > 0 + "; + + $params[] = $this->session->userdata('user_id'); + + $sql .= " order by station_profile.station_profile_name, thcv.col_time_on desc + limit 5000"; + + $query = $this->db->query($sql, $params); + + return $query->result(); + } } diff --git a/application/views/logbookadvanced/checkresult.php b/application/views/logbookadvanced/checkresult.php index a7ce37d6b..621d38cca 100644 --- a/application/views/logbookadvanced/checkresult.php +++ b/application/views/logbookadvanced/checkresult.php @@ -31,6 +31,15 @@ switch ($type) { case 'checkdxcc': check_dxcc($result, $custom_date_format); break; + case 'checkincorrectgridsquares': + check_incorrect_gridsquares($result, $custom_date_format); + break; + case 'checkincorrectcqzones': + check_incorrect_cq_zones($result, $custom_date_format); + break; + case 'checkincorrectituzones': + check_incorrect_itu_zones($result, $custom_date_format); + break; default: // Invalid type break; @@ -132,8 +141,11 @@ function check_dxcc($result, $custom_date_format) { ?>
| = __("Callsign"); ?> | += __("QSO Date"); ?> | += __("Band"); ?> | += __("Mode"); ?> | += __("LoTW"); ?> | += __("Station Profile"); ?> | += __("DXCC"); ?> | += __("Gridsquare"); ?> | += __("DXCC Gridsquare"); ?> | +
|---|---|---|---|---|---|---|---|---|
| col_primary_key . ')">' . htmlspecialchars($qso->col_call) . ''; ?> | +col_time_on)); ?> | +col_band); ?> | +col_submode ? $qso->col_submode : $qso->col_mode); ?> | +col_lotw_qsl_rcvd == 'Y' ? __('Yes') : __('No'); ?> | +station_profile_name; ?> | +col_country), "- (/"), ENT_QUOTES, 'UTF-8'); ?> | +col_gridsquare; ?> | ++ correctgridsquare; + $maxChars = 50; + if (strlen($gridsquare) > $maxChars) { + $truncated = substr($gridsquare, 0, $maxChars); + $uniqueId = 'gridsquare-' . $qso->col_primary_key; + echo '' . htmlspecialchars($truncated) . '... '; + echo ' '; + echo '' . __('Show more') . ''; + } else { + echo htmlspecialchars($gridsquare); + } + ?> + | +
| + | + | + | + | + | + | + | + | + |
= __("Warning. This tool can be dangerous to your data, and should only be used if you know what you are doing.") ?>
= __("Use Wavelog to determine CQ Zone for all QSOs.") ?>
+= __("Use Wavelog to determine ITU Zone for all QSOs.") ?>
+= __("Check gridsquares that does not match the DXCC") ?>
+