Cloudlog/application/models/Mostworked_model.php
Peter Goodhall 76f55f7f27 Add Most Worked Callsigns feature
Introduces a new 'Most Worked Callsigns' page, controller, model, and view to display callsigns worked multiple times from the active logbook. Adds language support for this feature in multiple languages and updates the navigation menu to include a link to the new page. Also includes DataTables integration and filter options for bands, modes, satellites, date range, and minimum QSOs.
2025-08-23 21:11:36 +01:00

206 行
7.3 KiB
PHP

<?php
if (!defined('BASEPATH')) exit('No direct script access allowed');
class Mostworked_model extends CI_Model
{
/*
* Get callsigns worked more than a minimum number of times from the active logbook
*/
function get_most_worked_callsigns($filters = array())
{
$CI =& get_instance();
$CI->load->model('logbooks_model');
$logbooks_locations_array = $CI->logbooks_model->list_logbook_relationships($this->session->userdata('active_station_logbook'));
if (!$logbooks_locations_array) {
return array();
}
$location_list = "'" . implode("','", $logbooks_locations_array) . "'";
// Set defaults
$min_qsos = isset($filters['min_qsos']) ? intval($filters['min_qsos']) : 5;
$band = isset($filters['band']) ? $filters['band'] : 'all';
$mode = isset($filters['mode']) ? $filters['mode'] : 'all';
$satellite = isset($filters['satellite']) ? $filters['satellite'] : 'all';
$fromdate = isset($filters['fromdate']) ? $filters['fromdate'] : '';
$todate = isset($filters['todate']) ? $filters['todate'] : '';
$sql = "SELECT
col_call as callsign,
COUNT(*) as contact_count,
MIN(col_time_on) as first_qso,
MAX(col_time_on) as last_qso,
GROUP_CONCAT(DISTINCT col_band ORDER BY col_band) as bands,
GROUP_CONCAT(DISTINCT COALESCE(col_submode, col_mode) ORDER BY col_mode) as modes
FROM " . $this->config->item('table_name') . "
WHERE station_id IN (" . $location_list . ")
AND col_call IS NOT NULL
AND col_call != ''";
// Apply filters
if ($band != 'all') {
if ($band == 'SAT') {
$sql .= " AND col_prop_mode = 'SAT'";
} else {
$sql .= " AND col_band = '" . $this->db->escape_str($band) . "'";
$sql .= " AND (col_prop_mode != 'SAT' OR col_prop_mode IS NULL)";
}
}
if ($mode != 'all') {
$sql .= " AND (col_mode = '" . $this->db->escape_str($mode) . "' OR col_submode = '" . $this->db->escape_str($mode) . "')";
}
if ($satellite != 'all') {
$sql .= " AND col_sat_name = '" . $this->db->escape_str($satellite) . "'";
}
if (!empty($fromdate)) {
$sql .= " AND DATE(col_time_on) >= '" . $this->db->escape_str($fromdate) . "'";
}
if (!empty($todate)) {
$sql .= " AND DATE(col_time_on) <= '" . $this->db->escape_str($todate) . "'";
}
$sql .= " GROUP BY col_call
HAVING contact_count >= " . $min_qsos . "
ORDER BY contact_count DESC, col_call ASC";
$query = $this->db->query($sql);
return $query->result();
}
/*
* Get list of modes from the active logbook
*/
function get_modes()
{
$CI =& get_instance();
$CI->load->model('logbooks_model');
$logbooks_locations_array = $CI->logbooks_model->list_logbook_relationships($this->session->userdata('active_station_logbook'));
if (!$logbooks_locations_array) {
return array();
}
$location_list = "'" . implode("','", $logbooks_locations_array) . "'";
$sql = "SELECT DISTINCT COALESCE(col_submode, col_mode) as mode
FROM " . $this->config->item('table_name') . "
WHERE station_id IN (" . $location_list . ")
AND COALESCE(col_submode, col_mode) IS NOT NULL
AND COALESCE(col_submode, col_mode) != ''
ORDER BY mode";
$query = $this->db->query($sql);
return $query->result();
}
/*
* Get list of satellites from the active logbook
*/
function get_satellites()
{
$CI =& get_instance();
$CI->load->model('logbooks_model');
$logbooks_locations_array = $CI->logbooks_model->list_logbook_relationships($this->session->userdata('active_station_logbook'));
if (!$logbooks_locations_array) {
return array();
}
$location_list = "'" . implode("','", $logbooks_locations_array) . "'";
$sql = "SELECT DISTINCT col_sat_name as satellite
FROM " . $this->config->item('table_name') . "
WHERE station_id IN (" . $location_list . ")
AND col_sat_name IS NOT NULL
AND col_sat_name != ''
ORDER BY col_sat_name";
$query = $this->db->query($sql);
return $query->result();
}
/*
* Get list of bands from the active logbook
*/
function get_bands()
{
$CI =& get_instance();
$CI->load->model('logbooks_model');
$logbooks_locations_array = $CI->logbooks_model->list_logbook_relationships($this->session->userdata('active_station_logbook'));
if (!$logbooks_locations_array) {
return array();
}
$location_list = "'" . implode("','", $logbooks_locations_array) . "'";
$sql = "SELECT DISTINCT col_band as band
FROM " . $this->config->item('table_name') . "
WHERE station_id IN (" . $location_list . ")
AND col_band IS NOT NULL
AND col_band != ''
AND (col_prop_mode != 'SAT' OR col_prop_mode IS NULL)
ORDER BY
CASE col_band
WHEN '160m' THEN 1
WHEN '80m' THEN 2
WHEN '60m' THEN 3
WHEN '40m' THEN 4
WHEN '30m' THEN 5
WHEN '20m' THEN 6
WHEN '17m' THEN 7
WHEN '15m' THEN 8
WHEN '12m' THEN 9
WHEN '10m' THEN 10
WHEN '6m' THEN 11
WHEN '4m' THEN 12
WHEN '2m' THEN 13
WHEN '1.25m' THEN 14
WHEN '70cm' THEN 15
ELSE 999
END, col_band";
$query = $this->db->query($sql);
$results = array();
foreach($query->result() as $row) {
$results[] = $row->band;
}
return $results;
}
/*
* Get detailed contact information for a specific callsign
*/
function get_callsign_details($callsign)
{
$CI =& get_instance();
$CI->load->model('logbooks_model');
$logbooks_locations_array = $CI->logbooks_model->list_logbook_relationships($this->session->userdata('active_station_logbook'));
if (!$logbooks_locations_array) {
return array();
}
$location_list = "'" . implode("','", $logbooks_locations_array) . "'";
$this->db->select('col_time_on, col_band, col_mode, col_submode, col_rst_sent, col_rst_rcvd, col_country, col_qsl_sent, col_qsl_rcvd');
$this->db->from($this->config->item('table_name'));
$this->db->where('station_id IN (' . $location_list . ')', NULL, FALSE);
$this->db->where('col_call', $callsign);
$this->db->order_by('col_time_on', 'DESC');
$query = $this->db->get();
return $query->result();
}
}