From d00c1876e5437ed79c946afe5ea30454591fbd62 Mon Sep 17 00:00:00 2001 From: int2001 Date: Wed, 4 Feb 2026 07:32:07 +0000 Subject: [PATCH] Combine dailystats with QSLs --- application/controllers/Dashboard.php | 54 ++++++++-------- application/controllers/Visitor.php | 32 +++++----- application/models/Logbook_model.php | 92 +++++++++++++++++++++++---- 3 files changed, 122 insertions(+), 56 deletions(-) diff --git a/application/controllers/Dashboard.php b/application/controllers/Dashboard.php index 1dd2c3092..6a0dca6de 100644 --- a/application/controllers/Dashboard.php +++ b/application/controllers/Dashboard.php @@ -111,38 +111,38 @@ class Dashboard extends CI_Controller { $data['current_streak']=0; } - // Load Countries Breakdown data into array (combined query) - $CountriesBreakdown = $this->logbook_model->total_countries_breakdown_batch($logbooks_locations_array); + // Load Dashboard stats (countries + QSL stats in one query) + $stats = $this->logbook_model->dashboard_stats_batch($logbooks_locations_array); - $data['total_countries'] = $CountriesBreakdown['Countries_Worked']; - $data['total_countries_confirmed_paper'] = $CountriesBreakdown['Countries_Worked_QSL']; - $data['total_countries_confirmed_eqsl'] = $CountriesBreakdown['Countries_Worked_EQSL']; - $data['total_countries_confirmed_lotw'] = $CountriesBreakdown['Countries_Worked_LOTW']; - $current = $CountriesBreakdown['Countries_Current']; + // Country stats + $data['total_countries'] = $stats['Countries_Worked']; + $data['total_countries_confirmed_paper'] = $stats['Countries_Worked_QSL']; + $data['total_countries_confirmed_eqsl'] = $stats['Countries_Worked_EQSL']; + $data['total_countries_confirmed_lotw'] = $stats['Countries_Worked_LOTW']; + $current = $stats['Countries_Current']; - $QSLStatsBreakdownArray = $this->logbook_model->get_QSLStats($logbooks_locations_array); + // QSL stats + $data['total_qsl_sent'] = $stats['QSL_Sent']; + $data['total_qsl_rcvd'] = $stats['QSL_Received']; + $data['total_qsl_requested'] = $stats['QSL_Requested']; + $data['qsl_sent_today'] = $stats['QSL_Sent_today']; + $data['qsl_rcvd_today'] = $stats['QSL_Received_today']; + $data['qsl_requested_today'] = $stats['QSL_Requested_today']; - $data['total_qsl_sent'] = $QSLStatsBreakdownArray['QSL_Sent']; - $data['total_qsl_rcvd'] = $QSLStatsBreakdownArray['QSL_Received']; - $data['total_qsl_requested'] = $QSLStatsBreakdownArray['QSL_Requested']; - $data['qsl_sent_today'] = $QSLStatsBreakdownArray['QSL_Sent_today']; - $data['qsl_rcvd_today'] = $QSLStatsBreakdownArray['QSL_Received_today']; - $data['qsl_requested_today'] = $QSLStatsBreakdownArray['QSL_Requested_today']; + $data['total_eqsl_sent'] = $stats['eQSL_Sent']; + $data['total_eqsl_rcvd'] = $stats['eQSL_Received']; + $data['eqsl_sent_today'] = $stats['eQSL_Sent_today']; + $data['eqsl_rcvd_today'] = $stats['eQSL_Received_today']; - $data['total_eqsl_sent'] = $QSLStatsBreakdownArray['eQSL_Sent']; - $data['total_eqsl_rcvd'] = $QSLStatsBreakdownArray['eQSL_Received']; - $data['eqsl_sent_today'] = $QSLStatsBreakdownArray['eQSL_Sent_today']; - $data['eqsl_rcvd_today'] = $QSLStatsBreakdownArray['eQSL_Received_today']; + $data['total_lotw_sent'] = $stats['LoTW_Sent']; + $data['total_lotw_rcvd'] = $stats['LoTW_Received']; + $data['lotw_sent_today'] = $stats['LoTW_Sent_today']; + $data['lotw_rcvd_today'] = $stats['LoTW_Received_today']; - $data['total_lotw_sent'] = $QSLStatsBreakdownArray['LoTW_Sent']; - $data['total_lotw_rcvd'] = $QSLStatsBreakdownArray['LoTW_Received']; - $data['lotw_sent_today'] = $QSLStatsBreakdownArray['LoTW_Sent_today']; - $data['lotw_rcvd_today'] = $QSLStatsBreakdownArray['LoTW_Received_today']; - - $data['total_qrz_sent'] = $QSLStatsBreakdownArray['QRZ_Sent']; - $data['total_qrz_rcvd'] = $QSLStatsBreakdownArray['QRZ_Received']; - $data['qrz_sent_today'] = $QSLStatsBreakdownArray['QRZ_Sent_today']; - $data['qrz_rcvd_today'] = $QSLStatsBreakdownArray['QRZ_Received_today']; + $data['total_qrz_sent'] = $stats['QRZ_Sent']; + $data['total_qrz_rcvd'] = $stats['QRZ_Received']; + $data['qrz_sent_today'] = $stats['QRZ_Sent_today']; + $data['qrz_rcvd_today'] = $stats['QRZ_Received_today']; $data['last_qso_count'] = empty($this->session->userdata('dashboard_last_qso_count')) ? DASHBOARD_DEFAULT_QSOS_COUNT : $this->session->userdata('dashboard_last_qso_count'); $data['last_qsos_list'] = $this->logbook_model->get_last_qsos( diff --git a/application/controllers/Visitor.php b/application/controllers/Visitor.php index 9ce5eacea..bde637c96 100644 --- a/application/controllers/Visitor.php +++ b/application/controllers/Visitor.php @@ -105,29 +105,29 @@ class Visitor extends CI_Controller { $data['user_map_custom'] = $this->optionslib->get_map_custom(true,$public_slug); - // Load Countries Breakdown data into array (combined query) - $CountriesBreakdown = $this->logbook_model->total_countries_breakdown_batch($logbooks_locations_array); + // Load Dashboard stats (countries + QSL stats in one query) + $stats = $this->logbook_model->dashboard_stats_batch($logbooks_locations_array); - $data['total_countries'] = $CountriesBreakdown['Countries_Worked']; - $data['total_countries_confirmed_paper'] = $CountriesBreakdown['Countries_Worked_QSL']; - $data['total_countries_confirmed_eqsl'] = $CountriesBreakdown['Countries_Worked_EQSL']; - $data['total_countries_confirmed_lotw'] = $CountriesBreakdown['Countries_Worked_LOTW']; - $current = $CountriesBreakdown['Countries_Current']; + // Country stats + $data['total_countries'] = $stats['Countries_Worked']; + $data['total_countries_confirmed_paper'] = $stats['Countries_Worked_QSL']; + $data['total_countries_confirmed_eqsl'] = $stats['Countries_Worked_EQSL']; + $data['total_countries_confirmed_lotw'] = $stats['Countries_Worked_LOTW']; + $current = $stats['Countries_Current']; $dxcc = $this->dxcc->list_current(); $data['total_countries_needed'] = count($dxcc->result()) - $current; - $QSLStatsBreakdownArray =$this->logbook_model->get_QSLStats($logbooks_locations_array); + // QSL stats + $data['total_qsl_sent'] = $stats['QSL_Sent']; + $data['total_qsl_rcvd'] = $stats['QSL_Received']; + $data['total_qsl_requested'] = $stats['QSL_Requested']; - $data['total_qsl_sent'] = $QSLStatsBreakdownArray['QSL_Sent']; - $data['total_qsl_rcvd'] = $QSLStatsBreakdownArray['QSL_Received']; - $data['total_qsl_requested'] = $QSLStatsBreakdownArray['QSL_Requested']; + $data['total_eqsl_sent'] = $stats['eQSL_Sent']; + $data['total_eqsl_rcvd'] = $stats['eQSL_Received']; - $data['total_eqsl_sent'] = $QSLStatsBreakdownArray['eQSL_Sent']; - $data['total_eqsl_rcvd'] = $QSLStatsBreakdownArray['eQSL_Received']; - - $data['total_lotw_sent'] = $QSLStatsBreakdownArray['LoTW_Sent']; - $data['total_lotw_rcvd'] = $QSLStatsBreakdownArray['LoTW_Received']; + $data['total_lotw_sent'] = $stats['LoTW_Sent']; + $data['total_lotw_rcvd'] = $stats['LoTW_Received']; $data['results'] = $this->logbook_model->get_qsos($this->qso_per_page,$this->uri->segment(3),$logbooks_locations_array); diff --git a/application/models/Logbook_model.php b/application/models/Logbook_model.php index 0c4f2ded4..c65267ef1 100644 --- a/application/models/Logbook_model.php +++ b/application/models/Logbook_model.php @@ -4357,8 +4357,8 @@ class Logbook_model extends CI_Model { } } - /* Return combined countries breakdown: worked, confirmed (QSL/eQSL/LOTW), and current */ - function total_countries_breakdown_batch($StationLocationsArray = null) { + /* Return combined countries breakdown + QSL stats in one query */ + function dashboard_stats_batch($StationLocationsArray = null) { if ($StationLocationsArray == null) { $this->load->model('logbooks_model'); $logbooks_locations_array = $this->logbooks_model->list_logbook_relationships($this->session->userdata('active_station_logbook')); @@ -4367,38 +4367,104 @@ class Logbook_model extends CI_Model { } if (!empty($logbooks_locations_array)) { + $todayStart = date('Y-m-d 00:00:00'); + $tomorrowStart = date('Y-m-d 00:00:00', strtotime('+1 day')); + $todayStartSql = $this->db->escape($todayStart); + $tomorrowStartSql = $this->db->escape($tomorrowStart); + + $location_list = "'" . implode("','", $logbooks_locations_array) . "'"; + $sql = "SELECT - COUNT(DISTINCT t.COL_DXCC) as Countries_Worked, - COUNT(DISTINCT IF(t.COL_QSL_RCVD = 'Y', t.COL_DXCC, NULL)) as Countries_Worked_QSL, - COUNT(DISTINCT IF(t.COL_EQSL_QSL_RCVD = 'Y', t.COL_DXCC, NULL)) as Countries_Worked_EQSL, - COUNT(DISTINCT IF(t.COL_LOTW_QSL_RCVD = 'Y', t.COL_DXCC, NULL)) as Countries_Worked_LOTW, - COUNT(DISTINCT IF(d.end IS NULL AND d.adif != 0, t.COL_DXCC, NULL)) as Countries_Current + -- Country stats (COUNT DISTINCT - filtered to valid DXCC only) + COUNT(DISTINCT CASE WHEN t.COL_COUNTRY != 'Invalid' AND t.COL_DXCC > 0 THEN t.COL_DXCC END) as Countries_Worked, + COUNT(DISTINCT CASE WHEN t.COL_QSL_RCVD = 'Y' AND t.COL_COUNTRY != 'Invalid' AND t.COL_DXCC > 0 THEN t.COL_DXCC END) as Countries_Worked_QSL, + COUNT(DISTINCT CASE WHEN t.COL_EQSL_QSL_RCVD = 'Y' AND t.COL_COUNTRY != 'Invalid' AND t.COL_DXCC > 0 THEN t.COL_DXCC END) as Countries_Worked_EQSL, + COUNT(DISTINCT CASE WHEN t.COL_LOTW_QSL_RCVD = 'Y' AND t.COL_COUNTRY != 'Invalid' AND t.COL_DXCC > 0 THEN t.COL_DXCC END) as Countries_Worked_LOTW, + COUNT(DISTINCT CASE WHEN d.end IS NULL AND d.adif != 0 AND t.COL_COUNTRY != 'Invalid' AND t.COL_DXCC > 0 THEN t.COL_DXCC END) as Countries_Current, + -- QSL stats (SUM - no filtering, all QSOs) + SUM(CASE WHEN t.COL_QSL_SENT = 'Y' THEN 1 ELSE 0 END) as QSL_Sent, + SUM(CASE WHEN t.COL_QSL_RCVD = 'Y' THEN 1 ELSE 0 END) as QSL_Received, + SUM(CASE WHEN t.COL_QSL_SENT IN ('Q', 'R') THEN 1 ELSE 0 END) as QSL_Requested, + SUM(CASE WHEN t.COL_EQSL_QSL_SENT = 'Y' THEN 1 ELSE 0 END) as eQSL_Sent, + SUM(CASE WHEN t.COL_EQSL_QSL_RCVD = 'Y' THEN 1 ELSE 0 END) as eQSL_Received, + SUM(CASE WHEN t.COL_LOTW_QSL_SENT = 'Y' THEN 1 ELSE 0 END) as LoTW_Sent, + SUM(CASE WHEN t.COL_LOTW_QSL_RCVD = 'Y' THEN 1 ELSE 0 END) as LoTW_Received, + SUM(CASE WHEN t.COL_QRZCOM_QSO_UPLOAD_STATUS = 'Y' THEN 1 ELSE 0 END) as QRZ_Sent, + SUM(CASE WHEN t.COL_QRZCOM_QSO_DOWNLOAD_STATUS = 'Y' THEN 1 ELSE 0 END) as QRZ_Received, + -- Today's stats (SUM - no filtering, all QSOs) + SUM(CASE WHEN t.COL_QSL_SENT = 'Y' AND t.COL_QSLSDATE >= " . $todayStartSql . " AND t.COL_QSLSDATE < " . $tomorrowStartSql . " THEN 1 ELSE 0 END) as QSL_Sent_today, + SUM(CASE WHEN t.COL_QSL_RCVD = 'Y' AND t.COL_QSLRDATE >= " . $todayStartSql . " AND t.COL_QSLRDATE < " . $tomorrowStartSql . " THEN 1 ELSE 0 END) as QSL_Received_today, + SUM(CASE WHEN t.COL_QSL_SENT IN ('Q', 'R') AND t.COL_QSLSDATE >= " . $todayStartSql . " AND t.COL_QSLSDATE < " . $tomorrowStartSql . " THEN 1 ELSE 0 END) as QSL_Requested_today, + SUM(CASE WHEN t.COL_EQSL_QSL_SENT = 'Y' AND t.COL_EQSL_QSLSDATE >= " . $todayStartSql . " AND t.COL_EQSL_QSLSDATE < " . $tomorrowStartSql . " THEN 1 ELSE 0 END) as eQSL_Sent_today, + SUM(CASE WHEN t.COL_EQSL_QSL_RCVD = 'Y' AND t.COL_EQSL_QSLRDATE >= " . $todayStartSql . " AND t.COL_EQSL_QSLRDATE < " . $tomorrowStartSql . " THEN 1 ELSE 0 END) as eQSL_Received_today, + SUM(CASE WHEN t.COL_LOTW_QSL_SENT = 'Y' AND t.COL_LOTW_QSLSDATE >= " . $todayStartSql . " AND t.COL_LOTW_QSLSDATE < " . $tomorrowStartSql . " THEN 1 ELSE 0 END) as LoTW_Sent_today, + SUM(CASE WHEN t.COL_LOTW_QSL_RCVD = 'Y' AND t.COL_LOTW_QSLRDATE >= " . $todayStartSql . " AND t.COL_LOTW_QSLRDATE < " . $tomorrowStartSql . " THEN 1 ELSE 0 END) as LoTW_Received_today, + SUM(CASE WHEN t.COL_QRZCOM_QSO_UPLOAD_STATUS = 'Y' AND t.COL_QRZCOM_QSO_UPLOAD_DATE >= " . $todayStartSql . " AND t.COL_QRZCOM_QSO_UPLOAD_DATE < " . $tomorrowStartSql . " THEN 1 ELSE 0 END) as QRZ_Sent_today, + SUM(CASE WHEN t.COL_QRZCOM_QSO_DOWNLOAD_STATUS = 'Y' AND t.COL_QRZCOM_QSO_DOWNLOAD_DATE >= " . $todayStartSql . " AND t.COL_QRZCOM_QSO_DOWNLOAD_DATE < " . $tomorrowStartSql . " THEN 1 ELSE 0 END) as QRZ_Received_today FROM " . $this->config->item('table_name') . " t LEFT JOIN dxcc_entities d ON d.adif = t.col_dxcc - WHERE t.station_id IN (" . str_repeat('?,', count($logbooks_locations_array) - 1) . "?) - AND t.COL_COUNTRY != 'Invalid' - AND t.COL_DXCC > 0"; + WHERE t.station_id IN (" . $location_list . ")"; - $query = $this->db->query($sql, $logbooks_locations_array); + $query = $this->db->query($sql); if ($query->num_rows() > 0) { $row = $query->row(); return [ + // Country stats 'Countries_Worked' => $row->Countries_Worked, 'Countries_Worked_QSL' => $row->Countries_Worked_QSL, 'Countries_Worked_EQSL' => $row->Countries_Worked_EQSL, 'Countries_Worked_LOTW' => $row->Countries_Worked_LOTW, - 'Countries_Current' => $row->Countries_Current + 'Countries_Current' => $row->Countries_Current, + // QSL stats + 'QSL_Sent' => $row->QSL_Sent, + 'QSL_Received' => $row->QSL_Received, + 'QSL_Requested' => $row->QSL_Requested, + 'eQSL_Sent' => $row->eQSL_Sent, + 'eQSL_Received' => $row->eQSL_Received, + 'LoTW_Sent' => $row->LoTW_Sent, + 'LoTW_Received' => $row->LoTW_Received, + 'QRZ_Sent' => $row->QRZ_Sent, + 'QRZ_Received' => $row->QRZ_Received, + // Today's stats + 'QSL_Sent_today' => $row->QSL_Sent_today, + 'QSL_Received_today' => $row->QSL_Received_today, + 'QSL_Requested_today' => $row->QSL_Requested_today, + 'eQSL_Sent_today' => $row->eQSL_Sent_today, + 'eQSL_Received_today' => $row->eQSL_Received_today, + 'LoTW_Sent_today' => $row->LoTW_Sent_today, + 'LoTW_Received_today' => $row->LoTW_Received_today, + 'QRZ_Sent_today' => $row->QRZ_Sent_today, + 'QRZ_Received_today' => $row->QRZ_Received_today ]; } } + // Return zero values if no data return [ 'Countries_Worked' => 0, 'Countries_Worked_QSL' => 0, 'Countries_Worked_EQSL' => 0, 'Countries_Worked_LOTW' => 0, - 'Countries_Current' => 0 + 'Countries_Current' => 0, + 'QSL_Sent' => 0, + 'QSL_Received' => 0, + 'QSL_Requested' => 0, + 'eQSL_Sent' => 0, + 'eQSL_Received' => 0, + 'LoTW_Sent' => 0, + 'LoTW_Received' => 0, + 'QRZ_Sent' => 0, + 'QRZ_Received' => 0, + 'QSL_Sent_today' => 0, + 'QSL_Received_today' => 0, + 'QSL_Requested_today' => 0, + 'eQSL_Sent_today' => 0, + 'eQSL_Received_today' => 0, + 'LoTW_Sent_today' => 0, + 'LoTW_Received_today' => 0, + 'QRZ_Sent_today' => 0, + 'QRZ_Received_today' => 0 ]; }