Add DXCC satellite contact tracking and display

Introduces 'workedViaSatellite' status to DXCC tracking in both controller and model, including batch queries for satellite contacts. Updates the DXCC list view to show a badge when a country has been worked via satellite, improving visibility of satellite achievements.
pull/3320/head
Peter Goodhall 2025-08-11 16:08:06 +01:00
rodzic 12127b8d85
commit d1bb6ff3ea
3 zmienionych plików z 111 dodań i 6 usunięć

Wyświetl plik

@ -69,7 +69,11 @@ class Workabledxcc extends CI_Controller
// Get DXCC status for this callsign
$entity = $dxccEntities[$index] ?? null;
$worked = $entity && isset($dxccStatus[$entity]) ? $dxccStatus[$entity] : ['workedBefore' => false, 'confirmed' => false];
$worked = $entity && isset($dxccStatus[$entity]) ? $dxccStatus[$entity] : [
'workedBefore' => false,
'confirmed' => false,
'workedViaSatellite' => false
];
$requiredData[] = array(
'clean_date' => $item['0'],
@ -80,6 +84,7 @@ class Workabledxcc extends CI_Controller
'callsign' => $item['callsign'],
'workedBefore' => $worked['workedBefore'],
'confirmed' => $worked['confirmed'],
'workedViaSatellite' => $worked['workedViaSatellite'],
);
}
@ -93,6 +98,7 @@ class Workabledxcc extends CI_Controller
$return = [
"workedBefore" => false,
"confirmed" => false,
"workedViaSatellite" => false,
];
$user_default_confirmation = $this->session->userdata('user_default_confirmation');
@ -101,6 +107,7 @@ class Workabledxcc extends CI_Controller
$this->load->model('logbook_model');
if (!empty($logbooks_locations_array)) {
// Check terrestrial contacts
$this->db->where('COL_PROP_MODE !=', 'SAT');
$this->db->where_in('station_id', $logbooks_locations_array);
@ -112,6 +119,16 @@ class Workabledxcc extends CI_Controller
$return['workedBefore'] = true;
}
// Check satellite contacts
$this->db->where('COL_PROP_MODE', 'SAT');
$this->db->where_in('station_id', $logbooks_locations_array);
$this->db->where('UPPER(COL_COUNTRY) = UPPER(?)', urldecode($country));
$query = $this->db->get($this->config->item('table_name'), 1, 0);
foreach ($query->result() as $satelliteRow) {
$return['workedViaSatellite'] = true;
}
$extrawhere = '';
if (isset($user_default_confirmation) && strpos($user_default_confirmation, 'Q') !== false) {
$extrawhere = "COL_QSL_RCVD='Y'";

Wyświetl plik

@ -47,7 +47,11 @@ class Workabledxcc_model extends CI_Model
$logbooks_locations_array = $this->logbooks_model->list_logbook_relationships($this->session->userdata('active_station_logbook'));
if (empty($logbooks_locations_array)) {
return array_fill_keys($entities, ['workedBefore' => false, 'confirmed' => false]);
return array_fill_keys($entities, [
'workedBefore' => false,
'confirmed' => false,
'workedViaSatellite' => false
]);
}
$results = array();
@ -55,23 +59,80 @@ class Workabledxcc_model extends CI_Model
// Build confirmation criteria once
$confirmationCriteria = $this->buildConfirmationCriteria($user_default_confirmation);
// Batch query for worked status
// Debug: Log entities being checked
log_message('debug', 'Workable DXCC: Checking entities: ' . implode(', ', $entities));
// Batch query for worked status (terrestrial)
$workedResults = $this->batchWorkedQuery($entities, $logbooks_locations_array);
// Batch query for confirmed status
// Batch query for confirmed status (terrestrial)
$confirmedResults = $this->batchConfirmedQuery($entities, $logbooks_locations_array, $confirmationCriteria);
// Batch query for satellite contacts
$satelliteResults = $this->batchSatelliteQuery($entities, $logbooks_locations_array);
// Debug: Log results
log_message('debug', 'Workable DXCC: Worked results: ' . json_encode($workedResults));
log_message('debug', 'Workable DXCC: Confirmed results: ' . json_encode($confirmedResults));
log_message('debug', 'Workable DXCC: Satellite results: ' . json_encode($satelliteResults));
// Combine results
foreach ($entities as $entity) {
$results[$entity] = [
'workedBefore' => isset($workedResults[$entity]),
'confirmed' => isset($confirmedResults[$entity])
'confirmed' => isset($confirmedResults[$entity]),
'workedViaSatellite' => isset($satelliteResults[$entity])
];
}
return $results;
}
/**
* Batch query to check which entities have been worked via satellite
*/
private function batchSatelliteQuery($entities, $logbooks_locations_array)
{
// Create case-insensitive matching for DXCC entities
$whereConditions = array();
foreach ($entities as $entity) {
$whereConditions[] = "UPPER(COL_COUNTRY) = UPPER('" . $this->db->escape_str($entity) . "')";
}
if (empty($whereConditions)) {
return array();
}
$whereClause = '(' . implode(' OR ', $whereConditions) . ')';
$this->db->select('COL_COUNTRY')
->distinct()
->from($this->config->item('table_name'))
->where('COL_PROP_MODE', 'SAT') // Only satellite contacts
->where_in('station_id', $logbooks_locations_array)
->where($whereClause);
$query = $this->db->get();
// Debug: Log the SQL query
log_message('debug', 'Workable DXCC satellite query: ' . $this->db->last_query());
$results = array();
foreach ($query->result() as $row) {
// Store with the original entity case for lookup
foreach ($entities as $entity) {
if (strtoupper($row->COL_COUNTRY) === strtoupper($entity)) {
$results[$entity] = true;
log_message('debug', 'Workable DXCC: Found satellite match: ' . $entity . ' matches ' . $row->COL_COUNTRY);
break;
}
}
}
return $results;
}
/**
* Build confirmation criteria SQL based on user preferences
*/
@ -120,6 +181,10 @@ class Workabledxcc_model extends CI_Model
->where($whereClause);
$query = $this->db->get();
// Debug: Log the SQL query
log_message('debug', 'Workable DXCC worked query: ' . $this->db->last_query());
$results = array();
foreach ($query->result() as $row) {
@ -127,6 +192,7 @@ class Workabledxcc_model extends CI_Model
foreach ($entities as $entity) {
if (strtoupper($row->COL_COUNTRY) === strtoupper($entity)) {
$results[$entity] = true;
log_message('debug', 'Workable DXCC: Found worked match: ' . $entity . ' matches ' . $row->COL_COUNTRY);
break;
}
}
@ -243,10 +309,15 @@ class Workabledxcc_model extends CI_Model
// Get DXCC status for this callsign
$entity = $dxccEntities[$index] ?? null;
$worked = $entity && isset($dxccStatus[$entity]) ? $dxccStatus[$entity] : ['workedBefore' => false, 'confirmed' => false];
$worked = $entity && isset($dxccStatus[$entity]) ? $dxccStatus[$entity] : [
'workedBefore' => false,
'confirmed' => false,
'workedViaSatellite' => false
];
$record['workedBefore'] = $worked['workedBefore'];
$record['confirmed'] = $worked['confirmed'];
$record['workedViaSatellite'] = $worked['workedViaSatellite'];
$thisWeekRecords[] = $record;
}
@ -260,6 +331,7 @@ class Workabledxcc_model extends CI_Model
$return = [
"workedBefore" => false,
"confirmed" => false,
"workedViaSatellite" => false,
];
$user_default_confirmation = $this->session->userdata('user_default_confirmation');
@ -268,6 +340,7 @@ class Workabledxcc_model extends CI_Model
$this->load->model('logbook_model');
if (!empty($logbooks_locations_array)) {
// Check for terrestrial contacts
$this->db->where('COL_PROP_MODE !=', 'SAT');
$this->db->where_in('station_id', $logbooks_locations_array);
@ -279,6 +352,16 @@ class Workabledxcc_model extends CI_Model
$return['workedBefore'] = true;
}
// Check for satellite contacts
$this->db->where('COL_PROP_MODE', 'SAT');
$this->db->where_in('station_id', $logbooks_locations_array);
$this->db->where('UPPER(COL_COUNTRY) = UPPER(?)', urldecode($country));
$query = $this->db->get($this->config->item('table_name'), 1, 0);
foreach ($query->result() as $satelliteRow) {
$return['workedViaSatellite'] = true;
}
$extrawhere = '';
if (isset($user_default_confirmation) && strpos($user_default_confirmation, 'Q') !== false) {
$extrawhere = "COL_QSL_RCVD='Y'";

Wyświetl plik

@ -49,6 +49,11 @@ foreach ($grouped as $month => $dxccs) {
echo '<span class="badge bg-primary">Confirmed</span>';
}
// Add satellite badge if worked via satellite
if (isset($dxcc['workedViaSatellite']) && $dxcc['workedViaSatellite']) {
echo '<span class="badge bg-info">Worked via Satellite</span>';
}
echo '</td>
<td>' . $dxcc['notes'] . '</td>
</tr>';