diff --git a/application/controllers/Adif.php b/application/controllers/Adif.php index 00cc48a6c..b73f0d0d1 100644 --- a/application/controllers/Adif.php +++ b/application/controllers/Adif.php @@ -385,7 +385,9 @@ class adif extends CI_Controller { while($record = $this->adif_parser->get_record()) { // Handle slashed zeros - $record['call'] = str_replace('Ø', "0", $record['call']); + if (isset($record['call'])) { + $record['call'] = str_replace('Ø', "0", $record['call']); + } if (($record['operator'] ?? '') != '') { $record['operator'] = str_replace('Ø', "0", $record['operator']); } diff --git a/application/controllers/Calltester.php b/application/controllers/Calltester.php index 8da8f79bd..899aea5c5 100644 --- a/application/controllers/Calltester.php +++ b/application/controllers/Calltester.php @@ -1,6 +1,8 @@ load->model('logbook_model'); + $callarray = $this->getQsos(null); + $this->load->model('stations'); - $sql = 'select distinct col_country, col_call, col_dxcc, date(col_time_on) date from ' . $this->config->item('table_name'); - $query = $this->db->query($sql); + $data['station_profile'] = $this->stations->all_of_user(); - $callarray = $query->result(); + $footerData = []; + $footerData['scripts'] = [ + 'assets/js/sections/calltester.js?' . filemtime(realpath(__DIR__ . "/../../assets/js/sections/calltester.js")) + ]; - $result = array(); + $data['page_title'] = __("Call Tester"); + $this->load->view('interface_assets/header', $data); + $this->load->view('calltester/index'); + $this->load->view('interface_assets/footer', $footerData); + } - $i = 0; + function doDxccCheck() { + set_time_limit(3600); + $de = $this->input->post('de', true); + $compare = $this->input->post('compare', true); + + if ($compare == "true") { + $result = $this->doClassCheck($de); + $result2 = $this->doDxccCheckModel($de); + + return $this->compareDxccChecks($result, $result2); + } + + $result = $this->doClassCheck($de); + $this->loadView($result); + } + + /* Uses DXCC Class. Much faster */ + function doClassCheck($de) { + $i = 0; + $result = array(); + + $callarray = $this->getQsos($de); + + // Starting clock time in seconds + $start_time = microtime(true); + $dxccobj = new Dxcc(null); + + foreach ($callarray->result() as $call) { - foreach ($callarray as $call) { $i++; - $dxcc = $this->logbook_model->dxcc_lookup($call->col_call, $call->date); + //$dxcc = $this->logbook_model->dxcc_lookup($call->col_call, $call->date); + $dxcc = $dxccobj->dxcc_lookup($call->col_call, $call->date); $dxcc['adif'] = (isset($dxcc['adif'])) ? $dxcc['adif'] : 0; - $dxcc['entity'] = (isset($dxcc['entity'])) ? $dxcc['entity'] : 0; + $dxcc['entity'] = (isset($dxcc['entity'])) ? $dxcc['entity'] : 'None'; if ($call->col_dxcc != $dxcc['adif']) { $result[] = array( - 'Callsign' => $call->col_call, - 'Expected country' => $call->col_country, - 'Expected adif' => $call->col_dxcc, - 'Result country' => ucwords(strtolower($dxcc['entity']), "- (/"), - 'Result adif' => $dxcc['adif'], + 'callsign' => $call->col_call, + 'qso_date' => $call->date, + 'station_profile' => $call->station_profile_name, + 'existing_dxcc' => $call->col_country, + 'existing_adif' => $call->col_dxcc, + 'result_country' => ucwords(strtolower($dxcc['entity']), "- (/"), + 'result_adif' => $dxcc['adif'], + 'id' => $call->col_primary_key, ); } } @@ -53,16 +92,117 @@ class Calltester extends CI_Controller { // Calculate script execution time $execution_time = ($end_time - $start_time); - echo " Execution time of script = ".$execution_time." sec
"; - echo $i . " calls tested.
"; - $count = 0; - - if ($result) { - $this->array_to_table($result); - } + $data['execution_time'] = $execution_time; + $data['calls_tested'] = $i; + $data['result'] = $result; + return $data; } + /* Uses Logbook_model and the normal dxcc lookup, which is slow */ + function doDxccCheckModel($de) { + $this->load->model('logbook_model'); + $i = 0; + $result = array(); + + $callarray = $this->getQsos($de); + + // Starting clock time in seconds + $start_time = microtime(true); + + foreach ($callarray->result() as $call) { + $i++; + $dxcc = $this->logbook_model->dxcc_lookup($call->col_call, $call->date); + + $dxcc['adif'] = (isset($dxcc['adif'])) ? $dxcc['adif'] : 0; + $dxcc['entity'] = (isset($dxcc['entity'])) ? $dxcc['entity'] : 0; + + if ($call->col_dxcc != $dxcc['adif']) { + $result[] = array( + 'callsign' => $call->col_call, + 'qso_date' => $call->date, + 'station_profile' => $call->station_profile_name, + 'existing_dxcc' => $call->col_country, + 'existing_adif' => $call->col_dxcc, + 'result_country' => ucwords(strtolower($dxcc['entity']), "- (/"), + 'result_adif' => $dxcc['adif'], + 'id' => $call->col_primary_key, + ); + } + } + + // End clock time in seconds + $end_time = microtime(true); + + // Calculate script execution time + $execution_time = ($end_time - $start_time); + + $data['execution_time'] = $execution_time; + $data['calls_tested'] = $i; + $data['result'] = $result; + + return $data; + } + + function loadView($data) { + $this->load->view('calltester/result', $data); + } + + function compareDxccChecks($result, $result2) { + // Convert arrays to comparable format using callsign, qso_date, and id as unique keys + $classCheckItems = []; + $modelCheckItems = []; + + // Create associative arrays for easier comparison + foreach ($result['result'] as $item) { + $key = $item['callsign'] . '|' . $item['qso_date'] . '|' . $item['id']; + $classCheckItems[$key] = $item; + } + + foreach ($result2['result'] as $item) { + $key = $item['callsign'] . '|' . $item['qso_date'] . '|' . $item['id']; + $modelCheckItems[$key] = $item; + } + + // Find items that are in class check but not in model check + $onlyInClass = array_diff_key($classCheckItems, $modelCheckItems); + + // Find items that are in model check but not in class check + $onlyInModel = array_diff_key($modelCheckItems, $classCheckItems); + + // Prepare comparison data + $comparisonData = []; + $comparisonData['class_execution_time'] = $result['execution_time']; + $comparisonData['model_execution_time'] = $result2['execution_time']; + $comparisonData['class_calls_tested'] = $result['calls_tested']; + $comparisonData['model_calls_tested'] = $result2['calls_tested']; + $comparisonData['class_total_issues'] = count($result['result']); + $comparisonData['model_total_issues'] = count($result2['result']); + $comparisonData['only_in_class'] = $onlyInClass; + $comparisonData['only_in_model'] = $onlyInModel; + $comparisonData['common_issues'] = array_intersect_key($classCheckItems, $modelCheckItems); + + $this->load->view('calltester/comparison_result', $comparisonData); + } + + function getQsos($station_id) { + $sql = 'select distinct col_country, col_call, col_dxcc, date(col_time_on) date, 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 = ?'; + $params[] = array($this->session->userdata('user_id')); + + if ($station_id && is_numeric($station_id)) { + $sql .= ' and ' . $this->config->item('table_name') . '.station_id = ?'; + $params[] = $station_id; + } + + $sql .= ' order by station_profile.station_profile_name asc, date desc'; + + $query = $this->db->query($sql, $params); + + return $query; + } function array_to_table($table) { echo '