From 2e3cf51ce0922a136681a279b9537a3f0e95adf1 Mon Sep 17 00:00:00 2001 From: Andreas Kristiansen <6977712+AndreasK79@users.noreply.github.com> Date: Sun, 1 Mar 2026 08:17:36 +0100 Subject: [PATCH] [WAE Award] Optimized logic and queries --- application/controllers/Awards.php | 30 +- application/models/Wae.php | 931 +++++++++---------------- application/views/awards/wae/index.php | 384 ++++++---- 3 files changed, 570 insertions(+), 775 deletions(-) diff --git a/application/controllers/Awards.php b/application/controllers/Awards.php index 55fb874c8..36eff999b 100644 --- a/application/controllers/Awards.php +++ b/application/controllers/Awards.php @@ -36,7 +36,6 @@ class Awards extends CI_Controller { public function dok () { - $this->load->model('logbooks_model'); $logbooks_locations_array = $this->logbooks_model->list_logbook_relationships($this->session->userdata('active_station_logbook')); $data['user_map_custom'] = $this->optionslib->get_map_custom(); @@ -205,7 +204,7 @@ class Awards extends CI_Controller { // Render Page $data['page_title'] = sprintf(__("Awards - %s"), __("DXCC")); - $data['posted_band']=$postdata['band']; + $data['posted_band'] = $postdata['band']; $this->load->view('interface_assets/header', $data); $this->load->view('awards/dxcc/index'); $this->load->view('interface_assets/footer'); @@ -2235,17 +2234,14 @@ class Awards extends CI_Controller { $postdata['notworked'] = $this->input->post('notworked') == 0 ? NULL: 1; $postdata['includedeleted'] = $this->security->xss_clean($this->input->post('includedeleted')); - $postdata['Africa'] = $this->security->xss_clean($this->input->post('Africa')); - $postdata['Asia'] = $this->security->xss_clean($this->input->post('Asia')); - $postdata['Europe'] = $this->security->xss_clean($this->input->post('Europe')); - $postdata['NorthAmerica'] = $this->security->xss_clean($this->input->post('NorthAmerica')); - $postdata['SouthAmerica'] = $this->security->xss_clean($this->input->post('SouthAmerica')); - $postdata['Oceania'] = $this->security->xss_clean($this->input->post('Oceania')); - $postdata['Antarctica'] = $this->security->xss_clean($this->input->post('Antarctica')); $postdata['band'] = $this->security->xss_clean($this->input->post('band')); $postdata['mode'] = $this->security->xss_clean($this->input->post('mode')); $postdata['sat'] = $this->security->xss_clean($this->input->post('sats')); $postdata['orbit'] = $this->security->xss_clean($this->input->post('orbits')); + + $postdata['dateFrom'] = $this->security->xss_clean($this->input->post('dateFrom')); + $postdata['dateTo'] = $this->security->xss_clean($this->input->post('dateTo')); + } else { // Setting default values at first load of page $postdata['qsl'] = 1; $postdata['lotw'] = 1; @@ -2255,21 +2251,19 @@ class Awards extends CI_Controller { $postdata['confirmed'] = 1; $postdata['notworked'] = 1; $postdata['includedeleted'] = 0; - $postdata['Africa'] = 1; - $postdata['Asia'] = 1; - $postdata['Europe'] = 1; - $postdata['NorthAmerica'] = 1; - $postdata['SouthAmerica'] = 1; - $postdata['Oceania'] = 1; - $postdata['Antarctica'] = 1; $postdata['band'] = 'All'; $postdata['mode'] = 'All'; $postdata['sat'] = 'All'; $postdata['orbit'] = 'All'; + + $postdata['dateFrom'] = null; + $postdata['dateTo'] = null; } - $data['wae_array'] = $this->wae->get_wae_array($bands, $postdata); - $data['wae_summary'] = $this->wae->get_wae_summary($bands, $postdata); + $result = $this->wae->get_wae_array($bands, $postdata); + $data['wae_array'] = $result['matrix'] ?? null; + $data['wae_summary'] = $result['summary'] ?? null; + $data['posted_band'] = $postdata['band']; // Render Page $data['page_title'] = sprintf(__("Awards - %s"), __("WAE")); diff --git a/application/models/Wae.php b/application/models/Wae.php index 405735116..65b96e589 100644 --- a/application/models/Wae.php +++ b/application/models/Wae.php @@ -7,18 +7,10 @@ class WAE extends CI_Model { // Reference: https://www.darc.de/der-club/referate/dx/diplome/wae-diplom/wae-laenderliste/ // ADIF refrence: https://www.adif.org.uk/315/ADIF_315.htm#Region_Enumeration - // $sql = select * from dxcc_entities where cont = 'EU' and end is null - + // 4U1V (OE for DXCC), JW/b, GM/s, IT, TA1, private $eucountries = '5,7,21,27,40,45,52,54,61,106,114,117,118,122,126,145,146,149,167,179,180,203,206,209,212,214,221,222,223,224,225,227,230,233,236,239,242,245,246,248,251,254,257,259,260,263,265,266,269,272,275,278,279,281,284,287,288,294,295,296,497,499,501,502,503,504,514,522'; - // 4U1V (OE for DXCC), JW/b, GM/s, IT, TA1, - private $waecountries = '206, 248, 259, 279, 390'; - private $region = "'IV', 'SY', 'BI', 'SI', 'ET'"; - - // $sql = select * from dxcc_entities where cont = 'EU' and end is not null - - // Need to handle deleted eu countries // Deleted // Prefix Country valid since valid until // 9S4 Saarland Nov 8, 1947 Mar 31, 1957 @@ -30,6 +22,8 @@ class WAE extends CI_Model { // OK Czechoslovakia Dec 31, 1992 // R1MV Maliy Vysotskij Isl. Feb 17, 2012 + private $validWaeRegions = ['IV', 'SY', 'BI', 'SI', 'ET']; + private $location_list; function __construct() { @@ -41,7 +35,7 @@ class WAE extends CI_Model { $logbooks_locations_array = $this->logbooks_model->list_logbook_relationships($this->session->userdata('active_station_logbook')); if ($logbooks_locations_array) { - // Create the location_list string + // Create the location_list string $this->location_list = "'" . implode("','", $logbooks_locations_array) . "'"; } else { // Handle the case where $logbooks_locations_array is empty or not set @@ -54,239 +48,370 @@ class WAE extends CI_Model { return null; } - $waeCount = array(); // Used for keeping track of which WAE are not worked - - $waeCount['IV']['count'] = 0; - $waeCount['SY']['count'] = 0; - $waeCount['BI']['count'] = 0; - $waeCount['SI']['count'] = 0; - $waeCount['ET']['count'] = 0; - + $qsl = $this->genfunctions->gen_qsl_from_postdata($postdata); $dxccArray = $this->fetchdxcc($postdata, $this->location_list); - $qsl = $this->genfunctions->gen_qsl_from_postdata($postdata); + // WAE special regions + $waeRegions = [ + 'IV' => ['name' => 'ITU Vienna', 'prefix' => '4U1V'], + 'SY' => ['name' => 'Sicily', 'prefix' => 'IT9'], + 'BI' => ['name' => 'Bear Island', 'prefix' => 'JW/b'], + 'SI' => ['name' => 'Shetland Islands', 'prefix' => 'GM/s'], + 'ET' => ['name' => 'European Turkey', 'prefix' => 'TA1'] + ]; - foreach ($bands as $band) { // Looping through bands and entities to generate the array needed for display - foreach ($dxccArray as $dxcc) { - if ($dxcc->adif == '0') { - $dxccMatrix[$dxcc->adif]['name'] = $dxcc->name; - } else { - $dxccMatrix[$dxcc->adif]['name'] = ucwords(strtolower($dxcc->name), "- (/"); - } - $dxccMatrix[$dxcc->adif]['Dxccprefix'] = $dxcc->prefix; - if ($postdata['includedeleted']) - $dxccMatrix[$dxcc->adif]['Deleted'] = isset($dxcc->Enddate) ? 1 : 0; - $dxccMatrix[$dxcc->adif][$band] = '-'; + // Initialize matrix with all DXCC entities and WAE regions + foreach ($dxccArray as $dxcc) { + $adif = $dxcc->adif ?? '0'; + $name = $dxcc->name ?? ''; + $prefix = $dxcc->prefix ?? ''; + $enddate = $dxcc->Enddate ?? null; + + if ($adif == '0') { + $dxccMatrix[$adif]['name'] = $name; + } else { + $dxccMatrix[$adif]['name'] = ucwords(strtolower($name), "- (/"); } - $dxccMatrix['IV']['name'] = 'ITU Vienna'; - $dxccMatrix['IV']['Dxccprefix'] = '4U1V'; - $dxccMatrix['IV'][$band] = '-'; - $dxccMatrix['SY']['name'] = 'Sicily'; - $dxccMatrix['SY']['Dxccprefix'] = 'IT9'; - $dxccMatrix['SY'][$band] = '-'; - $dxccMatrix['BI']['name'] = 'Bear Island'; - $dxccMatrix['BI']['Dxccprefix'] = 'JW/b'; - $dxccMatrix['BI'][$band] = '-'; - $dxccMatrix['SI']['name'] = 'Shetland Islands'; - $dxccMatrix['SI']['Dxccprefix'] = 'GM/s'; - $dxccMatrix['SI'][$band] = '-'; - $dxccMatrix['ET']['name'] = 'European Turkey'; - $dxccMatrix['ET']['Dxccprefix'] = 'TA1'; - $dxccMatrix['ET'][$band] = '-'; - - // If worked is checked, we add worked entities to the array - if ($postdata['worked'] != NULL) { - $workedDXCC = $this->getDxccBandWorked($this->location_list, $band, $postdata); - foreach ($workedDXCC as $wdxcc) { - $dxccMatrix[$wdxcc->dxcc][$band] = '
dxcc.'","'. $band . '","'. $postdata['sat'] . '","' . $postdata['orbit'] . '","'. $postdata['mode'] . '","WAE", "")\'>W
'; - } - - $workedDXCC = $this->getDxccBandWorked($this->location_list, $band, $postdata, true); - foreach ($workedDXCC as $wdxcc) { - $dxccMatrix[$wdxcc->col_region][$band] = '
col_region.'","'. $band . '","'. $postdata['sat'] . '","' . $postdata['orbit'] . '","'. $postdata['mode'] . '","WAE", "")\'>W
'; - $waeCount[$wdxcc->col_region]['count']++; - } + $dxccMatrix[$adif]['Dxccprefix'] = $prefix; + if ($postdata['includedeleted']) { + $dxccMatrix[$adif]['Deleted'] = isset($enddate) ? 1 : 0; } - // If confirmed is checked, we add confirmed entities to the array - if ($postdata['confirmed'] != NULL) { - $confirmedDXCC = $this->getDxccBandConfirmed($this->location_list, $band, $postdata); - foreach ($confirmedDXCC as $cdxcc) { - $dxccMatrix[$cdxcc->dxcc][$band] = '
dxcc.'","'. $band . '","'. $postdata['sat'] . '","'. $postdata['orbit'] . '","' . $postdata['mode'] . '","WAE","'.$qsl.'")\'>C
'; + // Initialize all bands to dash + foreach ($bands as $band) { + $dxccMatrix[$adif][$band] = '-'; + } + } + + // Initialize WAE regions + foreach ($waeRegions as $region => $info) { + $dxccMatrix[$region]['name'] = $info['name']; + $dxccMatrix[$region]['Dxccprefix'] = $info['prefix']; + foreach ($bands as $band) { + $dxccMatrix[$region][$band] = '-'; + } + } + + // Initialize summary counters only for the bands passed in + foreach ($bands as $band) { + $summary['worked'][$band] = 0; + $summary['confirmed'][$band] = 0; + } + $summary['worked']['Total'] = 0; + $summary['confirmed']['Total'] = 0; + + // Track unique entity/band combinations for totals + $workedEntities = []; // [band][entity] => true + $confirmedEntities = []; // [band][entity] => true + + // Track worked status for each entity + $entityWorkedStatus = []; // [entity] => count + + // Create a lookup array for valid bands + $validBands = array_flip($bands); + + // Get all WAE data in efficient queries + $waeData = $this->getWaeData($this->location_list, $postdata); + $waeDataSat = $this->getWaeDataSat($this->location_list, $postdata); + + foreach ($waeData as $wae) { + // Skip if this band is not in our requested bands list + if (!isset($validBands[$wae->col_band])) { + continue; + } + + // Use region only if it's a valid WAE region, otherwise use DXCC + $entityKey = (!empty($wae->col_region) && in_array($wae->col_region, $this->validWaeRegions)) ? $wae->col_region : (string)$wae->dxcc; + + // Track worked status for this entity + if (!isset($entityWorkedStatus[$entityKey])) { + $entityWorkedStatus[$entityKey] = 0; + } + $entityWorkedStatus[$entityKey]++; + + // Check if confirmed based on the confirmation types selected in postdata + $isConfirmed = false; + $confirmationLetters = ''; + if (isset($postdata['qsl']) && $postdata['qsl'] == 1 && $wae->qsl > 0) { + $isConfirmed = true; + $confirmationLetters .= 'Q'; + } + if (isset($postdata['lotw']) && $postdata['lotw'] == 1 && $wae->lotw > 0) { + $isConfirmed = true; + $confirmationLetters .= 'L'; + } + if (isset($postdata['eqsl']) && $postdata['eqsl'] == 1 && $wae->eqsl > 0) { + $isConfirmed = true; + $confirmationLetters .= 'E'; + } + if (isset($postdata['qrz']) && $postdata['qrz'] == 1 && $wae->qrz > 0) { + $isConfirmed = true; + $confirmationLetters .= 'Z'; + } + if (isset($postdata['clublog']) && $postdata['clublog'] == 1 && $wae->clublog > 0) { + $isConfirmed = true; + $confirmationLetters .= 'C'; + } + + if ($isConfirmed) { + $dxccMatrix[$entityKey][$wae->col_band] = '
col_band . '","'. $postdata['sat'] . '","'. $postdata['orbit'] . '","'. $postdata['mode'] . '","WAE","'.$qsl.'","'.$postdata['dateFrom'].'","'.$postdata['dateTo'].'")\'>'.$confirmationLetters.'
'; + // Track confirmed entities for summary + if (!isset($confirmedEntities[$wae->col_band][$entityKey])) { + $confirmedEntities[$wae->col_band][$entityKey] = true; + $summary['confirmed'][$wae->col_band]++; } - $confirmedDXCC = $this->getDxccBandConfirmed($this->location_list, $band, $postdata, true); - foreach ($confirmedDXCC as $cdxcc) { - $dxccMatrix[$cdxcc->col_region][$band] = '
col_region.'","'. $band . '","'. $postdata['sat'] . '","'. $postdata['orbit'] . '","' . $postdata['mode'] . '","WAE","'.$qsl.'")\'>C
'; - $waeCount[$cdxcc->col_region]['count']++; + } else { + $dxccMatrix[$entityKey][$wae->col_band] = '
col_band . '","'. $postdata['sat'] . '","'. $postdata['orbit'] . '","'. $postdata['mode'] . '","WAE", "", "'.$postdata['dateFrom'].'", "'.$postdata['dateTo'].'")\'>W
'; + } + + // Track worked entities for summary + if (!isset($workedEntities[$wae->col_band][$entityKey])) { + $workedEntities[$wae->col_band][$entityKey] = true; + $summary['worked'][$wae->col_band]++; + } + } + + foreach ($waeDataSat as $wae) { + // Skip if this band is not in our requested bands list + if (!isset($validBands['SAT'])) { + continue; + } + + // Use region only if it's a valid WAE region, otherwise use DXCC + $entityKey = (!empty($wae->col_region) && in_array($wae->col_region, $this->validWaeRegions)) ? $wae->col_region : (string)$wae->dxcc; + + // Track worked status for this entity + if (!isset($entityWorkedStatus[$entityKey])) { + $entityWorkedStatus[$entityKey] = 0; + } + $entityWorkedStatus[$entityKey]++; + + // Check if confirmed based on the confirmation types selected in postdata + $isConfirmed = false; + $confirmationLetters = ''; + if (isset($postdata['qsl']) && $postdata['qsl'] == 1 && $wae->qsl > 0) { + $isConfirmed = true; + $confirmationLetters .= 'Q'; + } + if (isset($postdata['lotw']) && $postdata['lotw'] == 1 && $wae->lotw > 0) { + $isConfirmed = true; + $confirmationLetters .= 'L'; + } + if (isset($postdata['eqsl']) && $postdata['eqsl'] == 1 && $wae->eqsl > 0) { + $isConfirmed = true; + $confirmationLetters .= 'E'; + } + if (isset($postdata['qrz']) && $postdata['qrz'] == 1 && $wae->qrz > 0) { + $isConfirmed = true; + $confirmationLetters .= 'Z'; + } + if (isset($postdata['clublog']) && $postdata['clublog'] == 1 && $wae->clublog > 0) { + $isConfirmed = true; + $confirmationLetters .= 'C'; + } + + if ($isConfirmed) { + $dxccMatrix[$entityKey]['SAT'] = '
'.$confirmationLetters.'
'; + // Track confirmed entities for summary + if (!isset($confirmedEntities['SAT'][$entityKey])) { + $confirmedEntities['SAT'][$entityKey] = true; + $summary['confirmed']['SAT']++; + } + } else { + $dxccMatrix[$entityKey]['SAT'] = '
W
'; + } + + // Track worked entities for summary + if (!isset($workedEntities['SAT'][$entityKey])) { + $workedEntities['SAT'][$entityKey] = true; + $summary['worked']['SAT']++; + } + } + + // Calculate totals across all bands (excluding SAT) + $totalWorkedEntities = []; + $totalConfirmedEntities = []; + foreach ($workedEntities as $band => $entities) { + // Skip SAT for totals + if ($band === 'SAT') { + continue; + } + foreach ($entities as $entity => $true) { + if (!isset($totalWorkedEntities[$entity])) { + $totalWorkedEntities[$entity] = true; + $summary['worked']['Total']++; + } + } + } + foreach ($confirmedEntities as $band => $entities) { + // Skip SAT for totals + if ($band === 'SAT') { + continue; + } + foreach ($entities as $entity => $true) { + if (!isset($totalConfirmedEntities[$entity])) { + $totalConfirmedEntities[$entity] = true; + $summary['confirmed']['Total']++; } } } - // We want to remove the worked dxcc's in the list, since we do not want to display them - if ($postdata['worked'] == NULL) { - $workedDxcc = $this->getDxccWorked($this->location_list, $postdata); - foreach ($workedDxcc as $wdxcc) { - if (array_key_exists($wdxcc->dxcc, $dxccMatrix)) { - unset($dxccMatrix[$wdxcc->dxcc]); - } + // Remove entities based on postdata filters + foreach ($dxccMatrix as $entity => $data) { + // Remove not-worked entities if filter is disabled + if ($postdata['notworked'] == NULL && !isset($entityWorkedStatus[$entity])) { + unset($dxccMatrix[$entity]); + continue; } - $workedWae = $this->getDxccWorked($this->location_list, $postdata, true); - foreach ($workedWae as $wdxcc) { - if (array_key_exists($wdxcc->col_region, $dxccMatrix)) { - unset($dxccMatrix[$wdxcc->col_region]); - } + + // Remove worked-only entities if filter is disabled + if ($postdata['worked'] == NULL && isset($entityWorkedStatus[$entity]) && !isset($totalConfirmedEntities[$entity])) { + unset($dxccMatrix[$entity]); + continue; + } + + // Remove confirmed entities if filter is disabled + if ($postdata['confirmed'] == NULL && isset($totalConfirmedEntities[$entity])) { + unset($dxccMatrix[$entity]); + continue; } } - // We want to remove the confirmed dxcc's in the list, since we do not want to display them - if ($postdata['confirmed'] == NULL) { - $confirmedDxcc = $this->getDxccConfirmed($this->location_list, $postdata); - foreach ($confirmedDxcc as $cdxcc) { - if (array_key_exists($cdxcc->dxcc, $dxccMatrix)) { - unset($dxccMatrix[$cdxcc->dxcc]); - } - } - - $confirmedWae = $this->getDxccConfirmed($this->location_list, $postdata, true); - foreach ($confirmedWae as $cdxcc) { - if (array_key_exists($cdxcc->col_region, $dxccMatrix)) { - unset($dxccMatrix[$cdxcc->col_region]); - } - } - } - - if ($postdata['notworked'] == NULL) { - if ($waeCount['IV']['count'] == 0) { - unset($dxccMatrix['IV']); - }; - if ($waeCount['SY']['count'] == 0) { - unset($dxccMatrix['SY']); - }; - if ($waeCount['BI']['count'] == 0) { - unset($dxccMatrix['BI']); - }; - if ($waeCount['SI']['count'] == 0) { - unset($dxccMatrix['SI']); - }; - if ($waeCount['ET']['count'] == 0) { - unset($dxccMatrix['ET']); - }; - } - - if (isset($dxccMatrix)) { + if (isset($dxccMatrix) && !empty($dxccMatrix)) { // Convert associative array to indexed array for sorting $dxccIndexed = array_values($dxccMatrix); - // Sort the indexed array by the 'name' key + // Sort the indexed array by the 'Dxccprefix' key usort($dxccIndexed, function ($a, $b) { - return strcmp($a['Dxccprefix'], $b['Dxccprefix']); + $aPrefix = $a['Dxccprefix'] ?? ''; + $bPrefix = $b['Dxccprefix'] ?? ''; + return strcmp($aPrefix, $bPrefix); }); - // Optionally reindex the sorted array back to associative format - $dxccSorted = []; - foreach ($dxccIndexed as $item) { - $key = array_search($item, $dxccMatrix); - $dxccSorted[$key] = $item; - } - return $dxccSorted; + // Return both the matrix data and summary + return ['matrix' => $dxccIndexed, 'summary' => $summary]; } else { - return 0; + return ['matrix' => [], 'summary' => $summary ?? []]; } } - function getDxccBandConfirmed($location_list, $band, $postdata, $wae = false) { + /* + * Gets all WAE data with confirmation status in efficient query using MAX aggregation + */ + function getWaeData($location_list, $postdata) { $bindings = []; - $sql = "select adif as dxcc, name, x.col_region from dxcc_entities - join ( - select col_region, col_dxcc from ".$this->config->item('table_name')." thcv - LEFT JOIN satellite on thcv.COL_SAT_NAME = satellite.name - where station_id in (" . $location_list . ")"; - if ($wae) { - $sql .= ' and col_dxcc in ( '. $this->waecountries . ') and col_region in ('. $this->region.')'; - } else { - $sql .= " and col_dxcc in ( ". $this->eucountries . ") and coalesce(col_region, '') = ''"; - } + $sql = "SELECT + COALESCE(thcv.col_region, CAST(thcv.col_dxcc AS CHAR)) as entity_key, + thcv.col_dxcc as dxcc, + thcv.col_region, + thcv.col_band, + MAX(case when thcv.col_lotw_qsl_rcvd ='Y' then 1 else 0 end) as lotw, + MAX(case when thcv.col_qsl_rcvd = 'Y' then 1 else 0 end) as qsl, + MAX(case when thcv.col_eqsl_qsl_rcvd = 'Y' then 1 else 0 end) as eqsl, + MAX(case when thcv.COL_QRZCOM_QSO_DOWNLOAD_STATUS= 'Y' then 1 else 0 end) as qrz, + MAX(case when thcv.COL_CLUBLOG_QSO_DOWNLOAD_STATUS = 'Y' then 1 else 0 end) as clublog + FROM " . $this->config->item('table_name') . " thcv + JOIN dxcc_entities d ON thcv.col_dxcc = d.adif + WHERE station_id IN (" . $location_list . ")"; - $sql .= $this->genfunctions->addBandToQuery($band,$bindings); - if ($band == 'SAT') { - if ($postdata['sat'] != 'All') { - $sql .= " and col_sat_name = ?"; - $bindings[] = $postdata['sat']; - } - } + // Filter for European DXCC entities and WAE regions + $sql .= " AND thcv.col_dxcc IN (" . $this->eucountries . ") AND d.end IS NULL"; + // Mode filter if ($postdata['mode'] != 'All') { - $sql .= " and (col_mode = ? or col_submode = ?)"; + $sql .= " AND (thcv.col_mode = ? OR thcv.col_submode = ?)"; $bindings[] = $postdata['mode']; $bindings[] = $postdata['mode']; } - $sql .= $this->addOrbitToQuery($postdata,$bindings); - - $sql .= $this->genfunctions->addQslToQuery($postdata); - - $sql .= " group by col_dxcc, col_region - ) x on dxcc_entities.adif = x.col_dxcc"; - - // if ($postdata['includedeleted'] == NULL) { - $sql .= " and dxcc_entities.end is null"; - // } - - if ($wae) { - $sql .= ' and dxcc_entities.adif in ( '. $this->waecountries . ')'; - } else { - $sql .= ' and dxcc_entities.adif in (' . $this->eucountries . ')'; + // Date filters + if ($postdata['dateFrom'] != NULL) { + $sql .= " AND thcv.col_time_on >= ?"; + $bindings[] = $postdata['dateFrom'] . ' 00:00:00'; } - $query = $this->db->query($sql,$bindings); + if ($postdata['dateTo'] != NULL) { + $sql .= " AND thcv.col_time_on <= ?"; + $bindings[] = $postdata['dateTo'] . ' 23:59:59'; + } + $sql .= " AND thcv.col_prop_mode != 'SAT'"; + + // Orbit filter + $sql .= $this->addOrbitToQuery($postdata, $bindings); + + $sql .= " GROUP BY COALESCE(thcv.col_region, CAST(thcv.col_dxcc AS CHAR)), thcv.col_dxcc, thcv.col_region, thcv.col_band"; + + $query = $this->db->query($sql, $bindings); return $query->result(); } - function getDxccBandWorked($location_list, $band, $postdata, $wae = false) { - $bindings=[]; - $sql = "select adif as dxcc, name, x.col_region from dxcc_entities - join ( - select col_region, col_dxcc from ".$this->config->item('table_name')." thcv - LEFT JOIN satellite on thcv.COL_SAT_NAME = satellite.name - where station_id in (" . $location_list . ")"; - if ($wae) { - $sql .= ' and col_dxcc in ( '. $this->waecountries . ') and col_region in ('. $this->region.')'; - } else { - $sql .= " and col_dxcc in ( ". $this->eucountries . ") and coalesce(col_region, '') = ''"; - } + function getWaeDataSat($location_list, $postdata) { + $bindings = []; + $sql = "SELECT + COALESCE(thcv.col_region, CAST(thcv.col_dxcc AS CHAR)) as entity_key, + thcv.col_dxcc as dxcc, + thcv.col_region, + 'SAT' as col_band, + MAX(case when thcv.col_lotw_qsl_rcvd ='Y' then 1 else 0 end) as lotw, + MAX(case when thcv.col_qsl_rcvd = 'Y' then 1 else 0 end) as qsl, + MAX(case when thcv.col_eqsl_qsl_rcvd = 'Y' then 1 else 0 end) as eqsl, + MAX(case when thcv.COL_QRZCOM_QSO_DOWNLOAD_STATUS= 'Y' then 1 else 0 end) as qrz, + MAX(case when thcv.COL_CLUBLOG_QSO_DOWNLOAD_STATUS = 'Y' then 1 else 0 end) as clublog + FROM " . $this->config->item('table_name') . " thcv + JOIN dxcc_entities d ON thcv.col_dxcc = d.adif + LEFT JOIN satellite ON thcv.COL_SAT_NAME = satellite.name + WHERE station_id IN (" . $location_list . ")"; - $sql .= $this->genfunctions->addBandToQuery($band,$bindings); - if ($band == 'SAT') { - if ($postdata['sat'] != 'All') { - $sql .= " and col_sat_name = ?"; - $bindings[] = $postdata['sat']; - } - } + // Filter for European DXCC entities and WAE regions + $sql .= " AND thcv.col_dxcc IN (" . $this->eucountries . ") AND d.end IS NULL"; + + // Mode filter if ($postdata['mode'] != 'All') { - $sql .= " and (col_mode = ? or col_submode = ?)"; + $sql .= " AND (thcv.col_mode = ? OR thcv.col_submode = ?)"; $bindings[] = $postdata['mode']; $bindings[] = $postdata['mode']; } - $sql .= $this->addOrbitToQuery($postdata,$bindings); - $sql .= " group by col_dxcc, col_region - ) x on dxcc_entities.adif = x.col_dxcc";; - - // if ($postdata['includedeleted'] == NULL) { - $sql .= " and dxcc_entities.end is null"; - // } - - if ($wae) { - $sql .= ' and dxcc_entities.adif in ( '. $this->waecountries . ')'; - } else { - $sql .= ' and dxcc_entities.adif in (' . $this->eucountries . ')'; + // Date filters + if ($postdata['dateFrom'] != NULL) { + $sql .= " AND thcv.col_time_on >= ?"; + $bindings[] = $postdata['dateFrom'] . ' 00:00:00'; } - $query = $this->db->query($sql,$bindings); + if ($postdata['dateTo'] != NULL) { + $sql .= " AND thcv.col_time_on <= ?"; + $bindings[] = $postdata['dateTo'] . ' 23:59:59'; + } + + // Satellite filter + if ($postdata['sat'] != 'All') { + $sql .= " AND thcv.col_sat_name = ?"; + $bindings[] = $postdata['sat']; + } + + // Orbit filter + $sql .= $this->addOrbitToQuery($postdata, $bindings); + + $sql .= " AND thcv.col_prop_mode = 'SAT'"; + + $sql .= " GROUP BY COALESCE(thcv.col_region, CAST(thcv.col_dxcc AS CHAR)), thcv.col_dxcc, thcv.col_region"; + + $query = $this->db->query($sql, $bindings); return $query->result(); } + // Adds orbit type to query + function addOrbitToQuery($postdata,&$binding) { + $sql = ''; + if ($postdata['orbit'] != 'All') { + $sql .= ' AND satellite.orbit = ?'; + $binding[] = $postdata['orbit']; + } + + return $sql; + } + function fetchDxcc($postdata, $location_list) { $bindings = []; @@ -339,425 +464,5 @@ class WAE extends CI_Model { return $query->result(); } - function getDxccWorked($location_list, $postdata, $wae = false) { - $bindings = []; - - $sql = "SELECT adif as dxcc, ll.col_region FROM dxcc_entities - join ( - select col_dxcc, col_region - from ".$this->config->item('table_name')." thcv - LEFT JOIN satellite on thcv.COL_SAT_NAME = satellite.name - where station_id in (" . $location_list . ")"; - if ($wae) { - $sql .= ' and col_dxcc in ( '. $this->waecountries . ') and col_region in ('. $this->region.')'; - } else { - $sql .= " and col_dxcc in ( ". $this->eucountries . ") and coalesce(col_region, '') = ''"; - } - $sql .= $this->genfunctions->addBandToQuery($postdata['band'],$bindings); - if ($postdata['band'] == 'SAT') { - if ($postdata['sat'] != 'All') { - $sql .= " and col_sat_name = ?"; - $bindings[] = $postdata['sat']; - } - } - - $sql .= $this->addOrbitToQuery($postdata,$bindings); - - if ($postdata['mode'] != 'All') { - $sql .= " and (col_mode = ? or col_submode = ?)"; - $bindings[] = $postdata['mode']; - $bindings[] = $postdata['mode']; - } - - $sql .= " and not exists (select 1 from ".$this->config->item('table_name')." where station_id in (". $location_list .") and col_dxcc = thcv.col_dxcc"; - if ($wae) { - $sql .= ' and col_dxcc in ( '. $this->waecountries . ') and col_region in ('. $this->region.')'; - } else { - $sql .= " and col_dxcc in ( ". $this->eucountries . ") and coalesce(col_region, '') = ''"; - } - - $sql .= $this->genfunctions->addBandToQuery($postdata['band'],$bindings); - - if ($postdata['band'] == 'SAT') { - if ($postdata['sat'] != 'All') { - $sql .= " and col_sat_name = ?"; - $bindings[] = $postdata['sat']; - } - } - - $sql .= $this->addOrbitToQuery($postdata,$bindings); - - if ($postdata['mode'] != 'All') { - $sql .= " and (col_mode = ? or col_submode = ?)"; - $bindings[] = $postdata['mode']; - $bindings[] = $postdata['mode']; - } - - $sql .= $this->genfunctions->addQslToQuery($postdata); - - $sql .= ')'; - $sql .= " group by col_dxcc, col_region - ) ll on dxcc_entities.adif = ll.col_dxcc - where 1=1"; - - // if ($postdata['includedeleted'] == NULL) { - $sql .= " and dxcc_entities.end is null"; - // } - - if ($wae) { - $sql .= ' and dxcc_entities.adif in ( '. $this->waecountries . ')'; - } else { - $sql .= ' and dxcc_entities.adif in (' . $this->eucountries . ')'; - } - - $query = $this->db->query($sql,$bindings); - return $query->result(); - } - - function getDxccConfirmed($location_list, $postdata, $wae = false) { - $bindings = []; - - $sql = "SELECT adif as dxcc, ll.col_region FROM dxcc_entities - join ( - select col_dxcc, col_region - from ".$this->config->item('table_name')." thcv - LEFT JOIN satellite on thcv.COL_SAT_NAME = satellite.name - where station_id in (" . $location_list . ")"; - if ($wae) { - $sql .= ' and col_dxcc in ( '. $this->waecountries . ') and col_region in ('. $this->region.')'; - } else { - $sql .= " and col_dxcc in ( ". $this->eucountries . ") and coalesce(col_region, '') = ''"; - } - - $sql .= $this->genfunctions->addBandToQuery($postdata['band'],$bindings); - if ($postdata['band'] == 'SAT') { - if ($postdata['sat'] != 'All') { - $sql .= " and col_sat_name = ?"; - $bindings[] = $postdata['sat']; - } - } - - if ($postdata['mode'] != 'All') { - $sql .= " and (col_mode = ? or col_submode = ?)"; - $bindings[] = $postdata['mode']; - $bindings[] = $postdata['mode']; - } - - $sql .= $this->addOrbitToQuery($postdata,$bindings); - - $sql .= $this->genfunctions->addQslToQuery($postdata); - - $sql .= " group by col_dxcc, col_region - ) ll on dxcc_entities.adif = ll.col_dxcc - where 1=1"; - - // if ($postdata['includedeleted'] == NULL) { - $sql .= " and dxcc_entities.end is null"; - // } - - if ($wae) { - $sql .= ' and col_dxcc in ( '. $this->waecountries . ') and col_region in ('. $this->region.')'; - } else { - $sql .= " and col_dxcc in ( ". $this->eucountries . ") and coalesce(col_region, '') = ''"; - } - - $query = $this->db->query($sql,$bindings); - - return $query->result(); - } - - /* - * Function gets worked and confirmed summary on each band on the active stationprofile - */ - function get_wae_summary($bands, $postdata) { - if ($this->location_list == '') { - return null; - } - - foreach ($bands as $band) { - $dxccSummary['worked'][$band] = 0; - $dxccSummary['confirmed'][$band] = 0; - } - - $this->load->model('bands'); - - $bandslots = $this->bands->get_worked_bands('dxcc'); - - //WAE - $confirmed = $this->getSummaryConfirmed($postdata, $this->location_list, true); - - foreach ($confirmed as $c) { - if (isset($dxccSummary['confirmed'][$c->col_band])) { - $dxccSummary['confirmed'][$c->col_band] += $c->regioncount; - } - } - - $confirmed = ''; - - // EU DXCC - $confirmed = $this->getSummaryConfirmed($postdata, $this->location_list); - - foreach ($confirmed as $c) { - if (isset($dxccSummary['confirmed'][$c->col_band])) { - $dxccSummary['confirmed'][$c->col_band] += $c->count; - } - } - - // EU DXCC - $worked = $this->getSummary($postdata, $this->location_list); - - foreach ($worked as $w) { - if (isset($dxccSummary['worked'][$w->col_band])) { - $dxccSummary['worked'][$w->col_band] += $w->count; - } - } - - $worked = ''; - - //WAE - $worked = $this->getSummary($postdata, $this->location_list, true); - - foreach ($worked as $w) { - if (isset($dxccSummary['worked'][$w->col_band])) { - $dxccSummary['worked'][$w->col_band] += $w->regioncount; - } - } - - if (isset($dxccSummary['worked']['SAT'])) { - $workedSat = $this->getSummaryByBand('SAT', $postdata, $this->location_list, $bandslots, true); - $dxccSummary['worked']['SAT'] += $workedSat[0]->regioncount; - $workedSat = $this->getSummaryByBand('SAT', $postdata, $this->location_list, $bandslots); - $dxccSummary['worked']['SAT'] += $workedSat[0]->count; - } - - if (isset($dxccSummary['confirmed']['SAT'])) { - $confirmedSat = $this->getSummaryByBandConfirmed('SAT', $postdata, $this->location_list, $bandslots, true); - $dxccSummary['confirmed']['SAT'] += $confirmedSat[0]->regioncount; - - $confirmedSat = $this->getSummaryByBandConfirmed('SAT', $postdata, $this->location_list, $bandslots); - $dxccSummary['confirmed']['SAT'] += $confirmedSat[0]->count; - } - - $dxccSummary['worked']['Total'] = 0; - $dxccSummary['confirmed']['Total'] = 0; - - $workedTotal = $this->getSummaryByBand($postdata['band'], $postdata, $this->location_list, $bandslots); - $confirmedTotal = $this->getSummaryByBandConfirmed($postdata['band'], $postdata, $this->location_list, $bandslots); - - $dxccSummary['worked']['Total'] += $workedTotal[0]->count; - $dxccSummary['confirmed']['Total'] += $confirmedTotal[0]->count; - - $workedTotal = $this->getSummaryByBand($postdata['band'], $postdata, $this->location_list, $bandslots, true); - $confirmedTotal = $this->getSummaryByBandConfirmed($postdata['band'], $postdata, $this->location_list, $bandslots, true); - - $dxccSummary['worked']['Total'] += $workedTotal[0]->regioncount; - $dxccSummary['confirmed']['Total'] += $confirmedTotal[0]->regioncount; - - return $dxccSummary; - } - - function getSummary($postdata, $location_list, $wae = false) { - $bindings = []; - - $sql = "SELECT count(distinct thcv.col_dxcc) as count, count(distinct thcv.col_region) regioncount, col_band FROM " . $this->config->item('table_name') . " thcv"; - $sql .= " LEFT JOIN satellite on thcv.COL_SAT_NAME = satellite.name"; - $sql .= " join dxcc_entities d on thcv.col_dxcc = d.adif"; - - $sql .= " where station_id in (" . $location_list . ")"; - if ($wae) { - $sql .= ' and col_dxcc in ( '. $this->waecountries . ') and col_region in ('. $this->region.')'; - } else { - $sql .= " and col_dxcc in ( ". $this->eucountries . ") and coalesce(col_region, '') = ''"; - } - - if ($postdata['mode'] != 'All') { - $sql .= " and (col_mode = ? or col_submode = ?)"; - $bindings[] = $postdata['mode']; - $bindings[] = $postdata['mode']; - } - - $sql .= " and thcv.col_prop_mode !='SAT'"; - - // if ($postdata['includedeleted'] == NULL) { - $sql .= " and d.end is null"; - // } - - if ($wae) { - $sql .= ' and d.adif in ( '. $this->waecountries . ')'; - } else { - $sql .= ' and d.adif in (' . $this->eucountries . ')'; - } - - $sql .= $this->addOrbitToQuery($postdata,$bindings); - - $sql .= ' group by col_band'; - - $query = $this->db->query($sql,$bindings); - - return $query->result(); - } - - function getSummaryByBand($band, $postdata, $location_list, $bandslots, $wae = false) { - $bindings = []; - $sql = "SELECT count(distinct thcv.col_dxcc) as count, count(distinct thcv.col_region) regioncount FROM " . $this->config->item('table_name') . " thcv"; - $sql .= " LEFT JOIN satellite on thcv.COL_SAT_NAME = satellite.name"; - $sql .= " join dxcc_entities d on thcv.col_dxcc = d.adif"; - - $sql .= " where station_id in (" . $location_list . ")"; - if ($wae) { - $sql .= ' and col_dxcc in ( '. $this->waecountries . ') and col_region in ('. $this->region.')'; - } else { - $sql .= " and col_dxcc in ( ". $this->eucountries . ") and coalesce(col_region, '') = ''"; - } - - if ($band == 'SAT') { - $sql .= " and thcv.col_prop_mode ='" . $band . "'"; - if ($band != 'All' && $postdata['sat'] != 'All') { - $sql .= " and col_sat_name = ?"; - $bindings[] = $postdata['sat']; - } - } else if ($band == 'All') { - $bandslots_list = "'".implode("','",$bandslots)."'"; - - $sql .= " and thcv.col_band in (" . $bandslots_list . ")" . - " and thcv.col_prop_mode !='SAT'"; - } else { - $sql .= " and thcv.col_prop_mode !='SAT'"; - $sql .= " and thcv.col_band = ?"; - $bindings[] = $band; - } - - if ($postdata['mode'] != 'All') { - $sql .= " and (col_mode = ? or col_submode = ?)"; - $bindings[] = $postdata['mode']; - $bindings[] = $postdata['mode']; - } - - // if ($postdata['includedeleted'] == NULL) { - $sql .= " and d.end is null"; - // } - - if ($wae) { - $sql .= ' and d.adif in ( '. $this->waecountries . ')'; - } else { - $sql .= ' and d.adif in (' . $this->eucountries . ')'; - } - - $sql .= $this->addOrbitToQuery($postdata,$bindings); - - $query = $this->db->query($sql,$bindings); - - return $query->result(); - } - - // Adds orbit type to query - function addOrbitToQuery($postdata,&$binding) { - $sql = ''; - if ($postdata['orbit'] != 'All') { - $sql .= ' AND satellite.orbit = ?'; - $binding[] = $postdata['orbit']; - } - - return $sql; - } - - function getSummaryConfirmed($postdata, $location_list, $wae = false) { - $bindings = []; - - $sql = "SELECT count(distinct thcv.col_dxcc) as count, count(distinct thcv.col_region) regioncount, thcv.col_band FROM " . $this->config->item('table_name') . " thcv"; - $sql .= " LEFT JOIN satellite on thcv.COL_SAT_NAME = satellite.name"; - $sql .= " join dxcc_entities d on thcv.col_dxcc = d.adif"; - - $sql .= " where station_id in (" . $location_list . ")"; - if ($wae) { - $sql .= ' and col_dxcc in ( '. $this->waecountries . ') and col_region in ('. $this->region.')'; - } else { - $sql .= " and col_dxcc in ( ". $this->eucountries . ") and coalesce(col_region, '') = ''"; - } - - if ($postdata['mode'] != 'All') { - $sql .= " and (col_mode = ? or col_submode = ?)"; - $bindings[] = $postdata['mode']; - $bindings[] = $postdata['mode']; - } - - $sql .= " and thcv.col_prop_mode !='SAT'"; - - $sql .= $this->genfunctions->addQslToQuery($postdata); - - $sql .= $this->addOrbitToQuery($postdata,$bindings); - - // if ($postdata['includedeleted'] == NULL) { - $sql .= " and d.end is null"; - // } - - if ($wae) { - $sql .= ' and d.adif in ( '. $this->waecountries . ')'; - } else { - $sql .= ' and d.adif in (' . $this->eucountries . ')'; - } - - $sql .= ' group by thcv.col_band'; - - $query = $this->db->query($sql,$bindings); - - return $query->result(); - } - - function getSummaryByBandConfirmed($band, $postdata, $location_list, $bandslots, $wae = false) { - $bindings=[]; - $sql = "SELECT count(distinct thcv.col_dxcc) as count, count(distinct thcv.col_region) regioncount FROM " . $this->config->item('table_name') . " thcv"; - $sql .= " LEFT JOIN satellite on thcv.COL_SAT_NAME = satellite.name"; - $sql .= " join dxcc_entities d on thcv.col_dxcc = d.adif"; - - $sql .= " where station_id in (" . $location_list . ")"; - if ($wae) { - $sql .= ' and col_dxcc in ( '. $this->waecountries . ') and col_region in ('. $this->region.')'; - } else { - $sql .= " and col_dxcc in ( ". $this->eucountries . ") and coalesce(col_region, '') = ''"; - } - - if ($band == 'SAT') { - $sql .= " and thcv.col_prop_mode = ?"; - $bindings[] = $band; - if ($postdata['sat'] != 'All') { - $sql .= " and col_sat_name = ?"; - $bindings[] = $postdata['sat']; - } - } else if ($band == 'All') { - $bandslots_list = "'".implode("','",$bandslots)."'"; - - $sql .= " and thcv.col_band in (" . $bandslots_list . ")" . - " and thcv.col_prop_mode !='SAT'"; - } else { - $sql .= " and thcv.col_prop_mode !='SAT'"; - $sql .= " and thcv.col_band = ?"; - $bindings[] = $band; - } - - if ($postdata['mode'] != 'All') { - $sql .= " and (col_mode = ? or col_submode = ?)"; - $bindings[] = $postdata['mode']; - $bindings[] = $postdata['mode']; - } - - $sql .= $this->genfunctions->addQslToQuery($postdata); - - $sql .= $this->addOrbitToQuery($postdata,$bindings); - - // if ($postdata['includedeleted'] == NULL) { - $sql .= " and d.end is null"; - // } - - if ($wae) { - $sql .= ' and d.adif in ( '. $this->waecountries . ')'; - } else { - $sql .= ' and d.adif in (' . $this->eucountries . ')'; - } - - $query = $this->db->query($sql,$bindings); - - return $query->result(); - } } ?> diff --git a/application/views/awards/wae/index.php b/application/views/awards/wae/index.php index 4334137ec..99a6b0c8a 100644 --- a/application/views/awards/wae/index.php +++ b/application/views/awards/wae/index.php @@ -1,3 +1,14 @@ +

@@ -16,151 +27,179 @@
-
- -
-
-
- input->post('includedeleted')) echo ' checked="checked"'; ?> > - -
-
-
*/ -?> - -
-
-
-
- input->post('worked') || $this->input->method() !== 'post') echo ' checked="checked"'; ?> > - -
-
- input->post('confirmed') || $this->input->method() !== 'post') echo ' checked="checked"'; ?> > - -
-
- input->post('notworked') || $this->input->method() !== 'post') echo ' checked="checked"'; ?> > - -
-
-
+
+