2024-05-24 10:32:56 +02:00
|
|
|
<?php if (!defined('BASEPATH')) exit('No direct script access allowed');
|
2011-04-25 16:24:01 +01:00
|
|
|
|
2025-01-09 09:02:58 +01:00
|
|
|
class Dashboard extends CI_Controller {
|
2025-01-08 12:48:15 +01:00
|
|
|
|
2026-02-06 05:20:52 +00:00
|
|
|
function __construct() {
|
|
|
|
|
parent::__construct();
|
|
|
|
|
|
|
|
|
|
if (!$this->user_model->authorize(2)) {
|
2021-11-08 15:22:17 +00:00
|
|
|
redirect('user/login');
|
|
|
|
|
}
|
2026-02-06 05:20:52 +00:00
|
|
|
}
|
2023-10-30 12:23:55 +01:00
|
|
|
|
2026-02-06 05:20:52 +00:00
|
|
|
public function index() {
|
2024-07-02 22:12:48 +02:00
|
|
|
// Database connections
|
|
|
|
|
$this->load->model('logbook_model');
|
2025-04-28 11:46:28 +02:00
|
|
|
|
2024-07-02 22:12:48 +02:00
|
|
|
// LoTW infos
|
2024-07-04 06:59:58 +02:00
|
|
|
$this->load->model('Lotw_model');
|
2024-07-02 22:12:48 +02:00
|
|
|
$current_date = date('Y-m-d H:i:s');
|
2024-07-04 06:59:58 +02:00
|
|
|
$data['lotw_cert_expired'] = $this->Lotw_model->lotw_cert_expired($this->session->userdata('user_id'), $current_date);
|
|
|
|
|
$data['lotw_cert_expiring'] = $this->Lotw_model->lotw_cert_expiring($this->session->userdata('user_id'), $current_date);
|
2025-10-24 11:23:58 +02:00
|
|
|
$data['lotw_cert_qsoenddate_expired'] = $this->Lotw_model->lotw_cert_qsoenddate_expired($this->session->userdata('user_id'), $current_date);
|
|
|
|
|
$data['lotw_cert_qsoenddate_expiring'] = $this->Lotw_model->lotw_cert_qsoenddate_expiring($this->session->userdata('user_id'), $current_date);
|
2025-04-28 11:46:28 +02:00
|
|
|
|
|
|
|
|
|
2022-02-17 14:20:32 +00:00
|
|
|
$this->load->model('logbooks_model');
|
|
|
|
|
$logbooks_locations_array = $this->logbooks_model->list_logbook_relationships($this->session->userdata('active_station_logbook'));
|
2024-07-02 22:16:05 +02:00
|
|
|
|
2025-04-28 11:46:28 +02:00
|
|
|
|
2024-08-31 18:16:50 +00:00
|
|
|
if (($logbooks_locations_array[0]>-1) && (!(in_array($this->stations->find_active(),$logbooks_locations_array)))) {
|
|
|
|
|
$data['active_not_linked']=true;
|
|
|
|
|
} else {
|
|
|
|
|
$data['active_not_linked']=false;
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-18 09:00:48 +01:00
|
|
|
if ($logbooks_locations_array[0] === -1) {
|
2024-08-31 13:46:04 +00:00
|
|
|
$data['linkedCount']=0;
|
|
|
|
|
} else {
|
|
|
|
|
$data['linkedCount']=sizeof($logbooks_locations_array);
|
|
|
|
|
}
|
2012-11-30 16:16:43 +00:00
|
|
|
// Calculate Lat/Lng from Locator to use on Maps
|
2024-05-24 10:32:56 +02:00
|
|
|
if ($this->session->userdata('user_locator')) {
|
2024-07-15 05:59:47 +02:00
|
|
|
if(!$this->load->is_loaded('Qra')) {
|
|
|
|
|
$this->load->library('Qra');
|
|
|
|
|
}
|
2024-07-02 22:16:05 +02:00
|
|
|
|
2024-05-24 10:32:56 +02:00
|
|
|
$qra_position = $this->qra->qra2latlong($this->session->userdata('user_locator'));
|
|
|
|
|
if ($qra_position) {
|
|
|
|
|
$data['qra'] = "set";
|
|
|
|
|
$data['qra_lat'] = $qra_position[0];
|
|
|
|
|
$data['qra_lng'] = $qra_position[1];
|
|
|
|
|
} else {
|
2012-11-30 16:16:43 +00:00
|
|
|
$data['qra'] = "none";
|
2024-05-24 10:32:56 +02:00
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
$data['qra'] = "none";
|
2012-11-30 16:16:43 +00:00
|
|
|
}
|
2024-07-02 22:16:05 +02:00
|
|
|
|
2024-08-16 10:05:59 +02:00
|
|
|
// We need the form_helper for the layout/messages
|
|
|
|
|
$this->load->helper('form');
|
|
|
|
|
|
2019-10-03 12:56:25 +01:00
|
|
|
$this->load->model('stations');
|
2023-10-30 12:23:55 +01:00
|
|
|
$this->load->model('setup_model');
|
2024-07-02 22:16:05 +02:00
|
|
|
|
2023-10-30 12:23:55 +01:00
|
|
|
$data['countryCount'] = $this->setup_model->getCountryCount();
|
|
|
|
|
$data['logbookCount'] = $this->setup_model->getLogbookCount();
|
|
|
|
|
$data['locationCount'] = $this->setup_model->getLocationCount();
|
2024-07-02 22:16:05 +02:00
|
|
|
|
2019-10-03 12:56:25 +01:00
|
|
|
$data['current_active'] = $this->stations->find_active();
|
2024-07-02 22:16:05 +02:00
|
|
|
|
2024-01-16 01:44:50 +01:00
|
|
|
$data['themesWithoutMode'] = $this->setup_model->checkThemesWithoutMode();
|
2025-02-18 05:58:19 +00:00
|
|
|
if (($this->session->userdata('user_dashboard_map') ?? '') != '') {
|
|
|
|
|
$data['dashboard_map'] = $this->session->userdata('user_dashboard_map') ?? 'Y';
|
2025-02-17 12:22:57 +00:00
|
|
|
} else {
|
2025-02-18 05:58:19 +00:00
|
|
|
$data['dashboard_map'] = 'N';
|
2025-02-17 12:22:57 +00:00
|
|
|
}
|
2024-07-02 22:16:05 +02:00
|
|
|
|
2025-04-28 11:46:28 +02:00
|
|
|
if (($this->session->userdata('user_dashboard_banner') ?? '') != '') {
|
|
|
|
|
$data['dashboard_banner'] = $this->session->userdata('user_dashboard_banner') ?? 'Y';
|
|
|
|
|
} else {
|
|
|
|
|
$data['dashboard_banner'] = 'N';
|
|
|
|
|
}
|
|
|
|
|
|
2025-09-23 00:33:52 +02:00
|
|
|
// Check user preferrence to show Solar Data on Dashboard
|
|
|
|
|
// Default to not show
|
|
|
|
|
if (($this->session->userdata('user_dashboard_solar') ?? '') != '') {
|
2025-09-24 10:24:57 +02:00
|
|
|
$data['dashboard_solar'] = $this->session->userdata('user_dashboard_solar') ?? 'N';
|
2025-09-23 00:33:52 +02:00
|
|
|
} else {
|
2025-09-24 10:24:57 +02:00
|
|
|
$data['dashboard_solar'] = 'N'; // Default to not show
|
2025-09-23 00:33:52 +02:00
|
|
|
}
|
|
|
|
|
|
2024-05-31 15:45:32 +02:00
|
|
|
$data['user_map_custom'] = $this->optionslib->get_map_custom();
|
2024-07-02 22:16:05 +02:00
|
|
|
|
2024-05-24 10:32:56 +02:00
|
|
|
$this->load->model('cat');
|
|
|
|
|
$this->load->model('vucc');
|
2025-10-04 05:03:03 +00:00
|
|
|
$this->load->model('dayswithqso_model');
|
2024-07-02 22:16:05 +02:00
|
|
|
|
2024-05-24 10:32:56 +02:00
|
|
|
$data['radio_status'] = $this->cat->recent_status();
|
2024-07-02 22:16:05 +02:00
|
|
|
|
2026-07-10 15:12:37 +02:00
|
|
|
$this->load->is_loaded('worker') ?: $this->load->library('worker');
|
|
|
|
|
$data['worker_enabled'] = $this->worker->is_enabled(); // without this line the worker.js is not loaded!
|
2026-07-11 00:37:05 +02:00
|
|
|
$data['radios_user_worker'] = null;
|
2026-07-10 15:12:37 +02:00
|
|
|
if ($this->worker->is_enabled()) {
|
2026-07-11 00:37:05 +02:00
|
|
|
$topic = 'radios_user.' . $this->session->userdata('user_id');
|
|
|
|
|
$this->worker->register_topic($topic);
|
|
|
|
|
$data['radios_user_worker'] = ['topic' => $topic, 'token' => $this->worker->create_token($topic)];
|
2026-07-10 15:12:37 +02:00
|
|
|
}
|
|
|
|
|
|
2026-02-04 05:34:33 +00:00
|
|
|
$qso_counts = $this->logbook_model->get_qso_counts($logbooks_locations_array);
|
|
|
|
|
$data['todays_qsos'] = $qso_counts['today'];
|
|
|
|
|
$data['total_qsos'] = $qso_counts['total'];
|
|
|
|
|
$data['month_qsos'] = $qso_counts['month'];
|
|
|
|
|
$data['year_qsos'] = $qso_counts['year'];
|
2022-02-17 11:58:09 +00:00
|
|
|
|
2026-06-01 10:36:54 +02:00
|
|
|
$rawstreak = $this->dayswithqso_model->getCurrentStreak();
|
2025-10-04 05:03:03 +00:00
|
|
|
if (is_array($rawstreak)) {
|
2026-06-01 10:36:54 +02:00
|
|
|
$data['current_streak'] = $rawstreak['highstreak'];
|
2025-10-04 05:03:03 +00:00
|
|
|
} else {
|
2026-06-01 10:36:54 +02:00
|
|
|
$rawstreak = $this->dayswithqso_model->getAlmostCurrentStreak();
|
|
|
|
|
if (is_array($rawstreak)) {
|
|
|
|
|
$data['current_streak'] = $rawstreak['highstreak'];
|
|
|
|
|
} else {
|
|
|
|
|
$data['current_streak'] = 0;
|
|
|
|
|
}
|
2025-10-04 05:03:03 +00:00
|
|
|
}
|
|
|
|
|
|
2026-06-01 10:36:54 +02:00
|
|
|
$data['almost_current_streak'] = $data['current_streak'];
|
|
|
|
|
|
2026-02-04 07:32:07 +00:00
|
|
|
// Load Dashboard stats (countries + QSL stats in one query)
|
|
|
|
|
$stats = $this->logbook_model->dashboard_stats_batch($logbooks_locations_array);
|
|
|
|
|
|
|
|
|
|
// Country stats
|
|
|
|
|
$data['total_countries'] = $stats['Countries_Worked'];
|
2026-08-12 14:59:24 +02:00
|
|
|
$data['total_deleted_countries'] = $stats['Countries_Deleted_Worked'];
|
2026-08-08 23:29:58 +02:00
|
|
|
$data['unique_callsigns'] = $stats['Unique_Callsigns'];
|
2026-02-04 07:32:07 +00:00
|
|
|
$data['total_countries_confirmed_paper'] = $stats['Countries_Worked_QSL'];
|
2026-08-12 18:29:12 +02:00
|
|
|
$data['total_deleted_countries_confirmed_paper'] = $stats['Countries_Deleted_Worked_QSL'];
|
2026-02-04 07:32:07 +00:00
|
|
|
$data['total_countries_confirmed_lotw'] = $stats['Countries_Worked_LOTW'];
|
2026-08-12 18:29:12 +02:00
|
|
|
$data['total_deleted_countries_confirmed_lotw'] = $stats['Countries_Deleted_Worked_LOTW'];
|
2026-08-08 23:29:58 +02:00
|
|
|
$confirmed = $stats['Countries_Worked_Confirmed'];
|
2026-02-04 07:32:07 +00:00
|
|
|
|
|
|
|
|
// 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_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_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_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'];
|
2020-10-12 16:14:28 +01:00
|
|
|
|
2026-03-22 09:06:03 +00:00
|
|
|
$data['total_clublog_sent'] = $stats['ClubLog_Sent'];
|
|
|
|
|
$data['total_clublog_rcvd'] = $stats['ClubLog_Received'];
|
|
|
|
|
$data['clublog_sent_today'] = $stats['ClubLog_Sent_today'];
|
|
|
|
|
$data['clublog_rcvd_today'] = $stats['ClubLog_Received_today'];
|
|
|
|
|
|
2025-01-30 13:47:06 +01:00
|
|
|
$data['last_qso_count'] = empty($this->session->userdata('dashboard_last_qso_count')) ? DASHBOARD_DEFAULT_QSOS_COUNT : $this->session->userdata('dashboard_last_qso_count');
|
2025-01-29 21:09:05 +01:00
|
|
|
$data['last_qsos_list'] = $this->logbook_model->get_last_qsos(
|
2025-01-30 13:47:06 +01:00
|
|
|
$data['last_qso_count'],
|
|
|
|
|
$logbooks_locations_array
|
2025-01-29 21:09:05 +01:00
|
|
|
);
|
2022-09-10 11:39:59 +02:00
|
|
|
|
2024-05-24 10:32:56 +02:00
|
|
|
$data['vucc'] = $this->vucc->fetchVuccSummary();
|
|
|
|
|
$data['vuccSAT'] = $this->vucc->fetchVuccSummary('SAT');
|
2020-10-12 16:14:28 +01:00
|
|
|
|
2024-06-08 11:01:59 +02:00
|
|
|
$data['page_title'] = __("Dashboard");
|
2020-10-16 20:02:54 +02:00
|
|
|
|
2024-05-24 10:32:56 +02:00
|
|
|
$this->load->model('dxcc');
|
|
|
|
|
$dxcc = $this->dxcc->list_current();
|
2020-10-16 20:02:54 +02:00
|
|
|
|
2025-01-03 09:28:07 +01:00
|
|
|
$footerData['scripts'] = [
|
2026-02-13 16:58:57 +01:00
|
|
|
'assets/js/sections/dashboard.js',
|
2025-01-03 09:28:07 +01:00
|
|
|
];
|
|
|
|
|
|
|
|
|
|
// First Login Wizard
|
|
|
|
|
$fl_wiz_value = $this->session->userdata('FirstLoginWizard') ?? null;
|
|
|
|
|
$show_fl_wiz = false;
|
|
|
|
|
|
|
|
|
|
// if the value is empty, we check if the user has any station locations
|
|
|
|
|
if ($fl_wiz_value === null) {
|
|
|
|
|
$this->load->model('stations');
|
|
|
|
|
if ($this->stations->all_of_user()->num_rows() == 0) {
|
|
|
|
|
$show_fl_wiz = true;
|
|
|
|
|
} else {
|
|
|
|
|
$this->user_options_model->set_option('FirstLoginWizard', 'shown', ['boolean' => 1]);
|
|
|
|
|
$this->session->set_userdata('FirstLoginWizard', 1);
|
|
|
|
|
}
|
|
|
|
|
} elseif ($fl_wiz_value == 0) {
|
|
|
|
|
$show_fl_wiz = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$data['is_first_login'] = $show_fl_wiz;
|
|
|
|
|
$data['firstloginwizard'] = '';
|
2025-01-07 07:15:47 +01:00
|
|
|
if ($this->session->userdata('impersonate') == 0 && // Don't show to impersonated user
|
2025-01-03 09:28:07 +01:00
|
|
|
$this->session->userdata('clubstation') == 0 && // Don't show to Clubstation
|
|
|
|
|
$data['is_first_login']) { // Don't show if already done
|
|
|
|
|
|
|
|
|
|
$this->load->model('dxcc');
|
|
|
|
|
$viewdata['dxcc_list'] = $this->dxcc->list();
|
|
|
|
|
|
2026-02-13 16:58:57 +01:00
|
|
|
$footerData['scripts'][] = 'assets/js/bootstrap-multiselect.js';
|
2025-01-03 09:28:07 +01:00
|
|
|
|
|
|
|
|
$this->load->library('form_validation');
|
|
|
|
|
|
|
|
|
|
$data['firstloginwizard'] = $this->load->view('user/modals/first_login_wizard', $viewdata, true);
|
|
|
|
|
}
|
|
|
|
|
|
2026-08-08 23:29:58 +02:00
|
|
|
$data['total_countries_needed'] = max(0, count($dxcc->result()) - $confirmed);
|
2011-11-04 17:32:03 +00:00
|
|
|
|
2025-09-23 00:33:52 +02:00
|
|
|
// Check user preferrence to show Solar Data on Dashboard and load data if yes
|
|
|
|
|
// Default to not show
|
2026-06-30 10:43:13 +02:00
|
|
|
if (in_array($data['dashboard_solar'], ['top', 'bottom', 'Y'], true)) {
|
2025-09-23 00:33:52 +02:00
|
|
|
$this->load->model('Hamqsl_model'); // Load HAMQSL model
|
|
|
|
|
|
|
|
|
|
if (!$this->Hamqsl_model->set_solardata()) {
|
|
|
|
|
// Problem getting data, set to null
|
|
|
|
|
$data['solar_bandconditions'] = null;
|
|
|
|
|
$data['solar_solardata'] = null;
|
|
|
|
|
} else {
|
|
|
|
|
// Load data into arrays
|
|
|
|
|
$data['solar_bandconditions'] = $this->Hamqsl_model->get_bandconditions_array();
|
|
|
|
|
$data['solar_solardata'] = $this->Hamqsl_model->get_solarinformation_array();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2026-06-06 14:26:50 +02:00
|
|
|
// Active Expeditions and Contests for Dashboard cards
|
2026-06-08 19:28:08 +02:00
|
|
|
$data['dashboard_show_dxpeditions'] = ($this->session->userdata('user_dashboard_show_dxpeditions') ?? '0') == '1' ? true : false;
|
|
|
|
|
$data['dashboard_show_contests'] = ($this->session->userdata('user_dashboard_show_contests') ?? '0') == '1' ? true : false;
|
2026-06-30 10:43:13 +02:00
|
|
|
$data['dashboard_show_kpi_stats'] = ($this->session->userdata('user_dashboard_show_kpi_stats') ?? '1') == '1' ? true : false;
|
2026-06-08 11:02:08 +02:00
|
|
|
$data['active_dxpeditions'] = false;
|
|
|
|
|
$data['active_contests'] = false;
|
|
|
|
|
|
|
|
|
|
if ($data['dashboard_show_dxpeditions'] || $data['dashboard_show_contests']) {
|
|
|
|
|
$this->load->model('Calendar_model');
|
|
|
|
|
$data['active_dxpeditions'] = $data['dashboard_show_dxpeditions'] ? $this->Calendar_model->get_active_dxpeditions() : false;
|
|
|
|
|
$data['active_contests'] = $data['dashboard_show_contests'] ? $this->Calendar_model->get_contests_today() : false;
|
|
|
|
|
}
|
2026-06-06 14:26:50 +02:00
|
|
|
|
2025-09-23 00:33:52 +02:00
|
|
|
// Load the views
|
2024-05-24 10:32:56 +02:00
|
|
|
$this->load->view('interface_assets/header', $data);
|
|
|
|
|
$this->load->view('dashboard/index');
|
2025-01-03 09:28:07 +01:00
|
|
|
$this->load->view('interface_assets/footer', $footerData);
|
2011-04-25 16:24:01 +01:00
|
|
|
}
|
2023-10-30 12:23:55 +01:00
|
|
|
|
2026-02-06 05:20:52 +00:00
|
|
|
function radio_display_component() {
|
2026-08-12 15:11:19 +02:00
|
|
|
session_write_close();
|
|
|
|
|
|
2023-05-28 15:02:15 +01:00
|
|
|
$this->load->model('cat');
|
|
|
|
|
|
|
|
|
|
$data['radio_status'] = $this->cat->recent_status();
|
|
|
|
|
$this->load->view('components/radio_display_table', $data);
|
|
|
|
|
}
|
2024-05-24 10:32:56 +02:00
|
|
|
}
|