diff --git a/application/models/Logbookadvanced_model.php b/application/models/Logbookadvanced_model.php index a2a05b5d5..ef2e4ef62 100644 --- a/application/models/Logbookadvanced_model.php +++ b/application/models/Logbookadvanced_model.php @@ -1549,10 +1549,54 @@ 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; } } + 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, + ( + 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') . " join station_profile on " . $this->config->item('table_name') . ".station_id = station_profile.station_id @@ -1980,4 +2024,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..5ae33b3d6 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; @@ -154,3 +163,189 @@ function check_dxcc($result, $custom_date_format) { ?> +
+ ' . htmlspecialchars($result['message']) . ''; + return; + } + if ($result) { ?> + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
col_primary_key . ')">' . htmlspecialchars($qso->col_call) . ''; ?>col_time_on)); ?>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); + } + ?> +
+
+ + +
+ + + + ' . __("Date") . ' + ' . __("Time") . ' + ' . __("Callsign") . ' + ' . __("Mode") . ' + ' . __("Band") . ' + ' . __("Gridsquare") . ' + ' . __("CQ Zone") . ' + ' . __("DXCC CQ Zone") . ' + ' . __("DXCC") . ' + ' . __("Station") . ' + + '; + + $i = 0; + + foreach ($result as $qso) { + echo ''; + echo ''; $timestamp = strtotime($qso->COL_TIME_ON); echo date($custom_date_format, $timestamp); echo ''; + echo ''; $timestamp = strtotime($qso->COL_TIME_ON); echo date('H:i', $timestamp); echo ''; + echo '' . str_replace("0","Ø",strtoupper($qso->COL_CALL)) . ''; + echo ''; echo $qso->COL_SUBMODE==null?$qso->COL_MODE:$qso->COL_SUBMODE; echo ''; + echo ''; if($qso->COL_SAT_NAME != null) { echo $qso->COL_SAT_NAME; } else { echo strtolower($qso->COL_BAND); }; echo ''; + echo ''; echo strlen($qso->COL_GRIDSQUARE ?? '')==0?$qso->COL_VUCC_GRIDS:$qso->COL_GRIDSQUARE; echo ''; + echo '' . $qso->COL_CQZ . ''; + echo '' . $qso->correctcqzone . ''; + echo '' . ucwords(strtolower($qso->COL_COUNTRY), "- (/") . ''; + echo '' . $qso->station_profile_name . ''; + echo ''; + } + + echo ' + + + + + + + + + + + + + + + '; + ?> + + ' . __("No incorrect CQ Zones were found.") . ''; + } +} + +function check_incorrect_itu_zones($result, $custom_date_format) { ?> +
+ + + + ' . __("Date") . ' + ' . __("Time") . ' + ' . __("Callsign") . ' + ' . __("Mode") . ' + ' . __("Band") . ' + ' . __("Gridsquare") . ' + ' . __("ITU Zone") . ' + ' . __("DXCC ITU Zone") . ' + ' . __("DXCC") . ' + ' . __("Station") . ' + + '; + + $i = 0; + + foreach ($result as $qso) { + echo ''; + echo ''; $timestamp = strtotime($qso->COL_TIME_ON); echo date($custom_date_format, $timestamp); echo ''; + echo ''; $timestamp = strtotime($qso->COL_TIME_ON); echo date('H:i', $timestamp); echo ''; + echo '' . str_replace("0","Ø",strtoupper($qso->COL_CALL)) . ''; + echo ''; echo $qso->COL_SUBMODE==null?$qso->COL_MODE:$qso->COL_SUBMODE; echo ''; + echo ''; if($qso->COL_SAT_NAME != null) { echo $qso->COL_SAT_NAME; } else { echo strtolower($qso->COL_BAND); }; echo ''; + echo ''; echo strlen($qso->COL_GRIDSQUARE ?? '')==0?$qso->COL_VUCC_GRIDS:$qso->COL_GRIDSQUARE; echo ''; + echo '' . $qso->COL_ITUZ . ''; + echo '' . $qso->correctituzone . ''; + echo '' . ucwords(strtolower($qso->COL_COUNTRY), "- (/") . ''; + echo '' . $qso->station_profile_name . ''; + echo ''; + } + + echo ' + + + + + + + + + + + + + + + '; + ?> + + ' . __("No incorrect CQ Zones were found.") . ''; + } +} diff --git a/application/views/logbookadvanced/dbtoolsdialog.php b/application/views/logbookadvanced/dbtoolsdialog.php index 149a43cda..e67884cee 100644 --- a/application/views/logbookadvanced/dbtoolsdialog.php +++ b/application/views/logbookadvanced/dbtoolsdialog.php @@ -17,6 +17,17 @@ +
+
+
+

+
+
+ +
+
@@ -30,6 +41,30 @@
+
+
+
+

+
+
+ +
+
+ +
+
+
+

+
+
+ +
+
+
diff --git a/application/views/logbookadvanced/index.php b/application/views/logbookadvanced/index.php index 1f999da0e..6b5d55385 100644 --- a/application/views/logbookadvanced/index.php +++ b/application/views/logbookadvanced/index.php @@ -74,6 +74,10 @@ let lang_gen_advanced_logbook_dupe_search = ''; let lang_gen_advanced_logbook_search = ''; + let lang_gen_advanced_logbook_show_more = ''; + let lang_gen_advanced_logbook_show_less = ''; + + let homegrid =''; '); + $('#checkGridsBtn').prop("disabled", false).removeClass("running"); $('#closeButton').prop('disabled', false); - let errorMsg = 'Error checking continent information'; - if (xhr.responseJSON && xhr.responseJSON.message) { - errorMsg += ': ' + xhr.responseJSON.message; - } - - BootstrapDialog.alert({ - title: 'Error', - message: errorMsg, - type: BootstrapDialog.TYPE_DANGER - }); + $('.result').html(error); } }); } @@ -2532,19 +2523,125 @@ function saveOptions() { rebind_checkbox_trigger_dxcc(); }, error: function(xhr, status, error) { - $('#checkDxccBtn').prop('disabled', false).text(''); + $('#checkDxccBtn').prop("disabled", false).removeClass("running"); $('#closeButton').prop('disabled', false); + $('.result').html(error); + } + }); + } - let errorMsg = 'Error checking DXCC information'; - if (xhr.responseJSON && xhr.responseJSON.message) { - errorMsg += ': ' + xhr.responseJSON.message; - } + function checkIncorrectCqZones() { + $('#checkIncorrectCqZonesBtn').prop("disabled", true).addClass("running"); + $('#closeButton').prop("disabled", true); - BootstrapDialog.alert({ - title: 'Error', - message: errorMsg, - type: BootstrapDialog.TYPE_DANGER + $.ajax({ + url: base_url + 'index.php/logbookadvanced/checkDb', + data: { + type: 'checkincorrectcqzones' + }, + type: 'POST', + success: function(response) { + $('#checkIncorrectCqZonesBtn').prop("disabled", false).removeClass("running"); + $('#closeButton').prop("disabled", false); + $('.result').html(response); + $('#incorrectcqzonetable').DataTable({ + "pageLength": 25, + responsive: false, + ordering: false, + "scrollY": "510px", + "scrollCollapse": true, + "paging": false, + "scrollX": false, + "language": { + url: getDataTablesLanguageUrl(), + }, + initComplete: function () { + this.api() + .columns('.select-filter') + .every(function () { + var column = this; + var select = $('') + .appendTo($(column.footer()).empty()) + .on('change', function () { + var val = $.fn.dataTable.util.escapeRegex($(this).val()); + + column.search(val ? '^' + val + '$' : '', true, false).draw(); + }); + + column + .data() + .unique() + .sort() + .each(function (d, j) { + select.append(''); + }); + }); + }, }); + + }, + error: function(xhr, status, error) { + $('#checkIncorrectCqZonesBtn').prop("disabled", false).removeClass("running"); + $('#closeButton').prop('disabled', false); + $('.result').html(error); + } + }); + } + + function checkIncorrectItuZones() { + $('#checkIncorrectItuZonesBtn').prop("disabled", true).addClass("running"); + $('#closeButton').prop("disabled", true); + + $.ajax({ + url: base_url + 'index.php/logbookadvanced/checkDb', + data: { + type: 'checkincorrectituzones' + }, + type: 'POST', + success: function(response) { + $('#checkIncorrectItuZonesBtn').prop("disabled", false).removeClass("running"); + $('#closeButton').prop("disabled", false); + $('.result').html(response); + $('#incorrectituzonetable').DataTable({ + "pageLength": 25, + responsive: false, + ordering: false, + "scrollY": "510px", + "scrollCollapse": true, + "paging": false, + "scrollX": false, + "language": { + url: getDataTablesLanguageUrl(), + }, + initComplete: function () { + this.api() + .columns('.select-filter') + .every(function () { + var column = this; + var select = $('') + .appendTo($(column.footer()).empty()) + .on('change', function () { + var val = $.fn.dataTable.util.escapeRegex($(this).val()); + + column.search(val ? '^' + val + '$' : '', true, false).draw(); + }); + + column + .data() + .unique() + .sort() + .each(function (d, j) { + select.append(''); + }); + }); + }, + }); + + }, + error: function(xhr, status, error) { + $('#checkIncorrectItuZonesBtn').prop("disabled", false).removeClass("running"); + $('#closeButton').prop('disabled', false); + $('.result').html(error); } }); } @@ -2619,3 +2716,76 @@ function saveOptions() { } }); } + + function checkIncorrectGridsquares() { + $('#checkIncorrectGridsquaresBtn').prop("disabled", true).addClass("running"); + $('#closeButton').prop("disabled", true); + + $.ajax({ + url: base_url + 'index.php/logbookadvanced/checkDb', + data: { + type: 'checkincorrectgridsquares' + }, + type: 'POST', + success: function(response) { + $('#checkIncorrectGridsquaresBtn').prop("disabled", false).removeClass("running"); + $('#closeButton').prop("disabled", false); + $('.result').html(response); + $('#gridsquareCheckTable').DataTable({ + "pageLength": 25, + responsive: false, + ordering: false, + "scrollY": "510px", + "scrollCollapse": true, + "paging": false, + "scrollX": false, + "language": { + url: getDataTablesLanguageUrl(), + }, + initComplete: function () { + this.api() + .columns('.select-filter') + .every(function () { + var column = this; + var select = $('') + .appendTo($(column.footer()).empty()) + .on('change', function () { + var val = $.fn.dataTable.util.escapeRegex($(this).val()); + + column.search(val ? '^' + val + '$' : '', true, false).draw(); + }); + + column + .data() + .unique() + .sort() + .each(function (d, j) { + select.append(''); + }); + }); + }, + }); + }, + error: function(xhr, status, error) { + $('#checkIncorrectGridsquaresBtn').prop("disabled", false).removeClass("running"); + $('#closeButton').prop('disabled', false); + $('.result').html(error); + } + }); + } + + function toggleGridsquare(id) { + const shortSpan = document.getElementById(id + '-short'); + const fullSpan = document.getElementById(id + '-full'); + const link = document.getElementById(id + '-link'); + + if (shortSpan.style.display === 'none') { + shortSpan.style.display = 'inline'; + fullSpan.style.display = 'none'; + link.textContent = lang_gen_advanced_logbook_show_more; + } else { + shortSpan.style.display = 'none'; + fullSpan.style.display = 'inline'; + link.textContent = lang_gen_advanced_logbook_show_less; + } + }