| 
									
										
										
										
											2025-08-24 04:11:36 +08:00
										 |  |  | <?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 
 | 
					
						
							| 
									
										
										
										
											2025-08-24 04:21:01 +08:00
										 |  |  |                     CASE  | 
					
						
							| 
									
										
										
										
											2025-08-24 17:54:17 +08:00
										 |  |  |                         WHEN col_call REGEXP '/[PMAQLBR]$|/MM$|/AM$|/QRP$|/LH$|/BCN$' THEN  | 
					
						
							| 
									
										
										
										
											2025-08-24 04:21:01 +08:00
										 |  |  |                             SUBSTRING(col_call, 1, LOCATE('/', col_call) - 1) | 
					
						
							|  |  |  |                         ELSE  | 
					
						
							|  |  |  |                             col_call  | 
					
						
							|  |  |  |                     END as callsign, | 
					
						
							| 
									
										
										
										
											2025-08-24 04:11:36 +08:00
										 |  |  |                     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) . "'"; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-08-24 04:21:01 +08:00
										 |  |  |         $sql .= " GROUP BY CASE 
 | 
					
						
							| 
									
										
										
										
											2025-08-24 17:54:17 +08:00
										 |  |  |                         WHEN col_call REGEXP '/[PMAQLBR]$|/MM$|/AM$|/QRP$|/LH$|/BCN$' THEN  | 
					
						
							| 
									
										
										
										
											2025-08-24 04:21:01 +08:00
										 |  |  |                             SUBSTRING(col_call, 1, LOCATE('/', col_call) - 1) | 
					
						
							|  |  |  |                         ELSE  | 
					
						
							|  |  |  |                             col_call  | 
					
						
							|  |  |  |                     END | 
					
						
							| 
									
										
										
										
											2025-08-24 04:11:36 +08:00
										 |  |  |                   HAVING contact_count >= " . $min_qsos . " | 
					
						
							| 
									
										
										
										
											2025-08-24 04:21:01 +08:00
										 |  |  |                   ORDER BY contact_count DESC, callsign ASC";
 | 
					
						
							| 
									
										
										
										
											2025-08-24 04:11:36 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $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(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } |