From af36d9b87ce4f311ab340295a4705cd785cfd64f Mon Sep 17 00:00:00 2001 From: Andreas Kristiansen <6977712+AndreasK79@users.noreply.github.com> Date: Thu, 19 Dec 2024 14:24:15 +0100 Subject: [PATCH] Framework for WAE --- application/controllers/Awards.php | 80 +++ application/models/Wae.php | 480 ++++++++++++++++++ application/views/awards/wae/index.php | 218 ++++++++ application/views/interface_assets/footer.php | 2 +- application/views/interface_assets/header.php | 2 + 5 files changed, 781 insertions(+), 1 deletion(-) create mode 100644 application/models/Wae.php create mode 100644 application/views/awards/wae/index.php diff --git a/application/controllers/Awards.php b/application/controllers/Awards.php index 71974e94f..62139489a 100644 --- a/application/controllers/Awards.php +++ b/application/controllers/Awards.php @@ -1917,4 +1917,84 @@ class Awards extends CI_Controller { $this->load->view('interface_assets/footer'); } + public function wae () { + $this->load->model('wae'); + $this->load->model('modes'); + $this->load->model('bands'); + + $data['orbits'] = $this->bands->get_worked_orbits(); + $data['sats_available'] = $this->bands->get_worked_sats(); + $data['user_default_band'] = $this->session->userdata('user_default_band'); + + $data['worked_bands'] = $this->bands->get_worked_bands('dxcc'); // Used in the view for band select + $data['modes'] = $this->modes->active(); // Used in the view for mode select + + if ($this->input->post('band') != NULL) { // Band is not set when page first loads. + if ($this->input->post('band') == 'All') { // Did the user specify a band? If not, use all bands + $bands = $data['worked_bands']; + } else { + $bands[] = $this->security->xss_clean($this->input->post('band')); + } + } else { + $bands = $data['worked_bands']; + } + + $data['bands'] = $bands; // Used for displaying selected band(s) in the table in the view + + if($this->input->method() === 'post') { + $postdata['qsl'] = $this->input->post('qsl') == 0 ? NULL: 1; + $postdata['lotw'] = $this->input->post('lotw') == 0 ? NULL: 1; + $postdata['eqsl'] = $this->input->post('eqsl') == 0 ? NULL: 1; + $postdata['qrz'] = $this->input->post('qrz') == 0 ? NULL: 1; + $postdata['clublog'] = $this->input->post('clublog') == 0 ? NULL: 1; + $postdata['worked'] = $this->input->post('worked') == 0 ? NULL: 1; + $postdata['confirmed'] = $this->input->post('confirmed') == 0 ? NULL: 1; + $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')); + } else { // Setting default values at first load of page + $postdata['qsl'] = 1; + $postdata['lotw'] = 1; + $postdata['eqsl'] = 0; + $postdata['qrz'] = 0; + $postdata['worked'] = 1; + $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'; + } + + $dxcclist = $this->wae->fetchdxcc($postdata); + + $data['wae_array'] = $this->wae->get_wae_array($dxcclist, $bands, $postdata); + $data['wae_summary'] = $this->wae->get_wae_summary($bands, $postdata); + + // Render Page + $data['page_title'] = sprintf(__("Awards - %s"), __("WAE")); + $this->load->view('interface_assets/header', $data); + $this->load->view('awards/wae/index'); + $this->load->view('interface_assets/footer'); + } + } diff --git a/application/models/Wae.php b/application/models/Wae.php new file mode 100644 index 000000000..4f152fab0 --- /dev/null +++ b/application/models/Wae.php @@ -0,0 +1,480 @@ +load->is_loaded('Genfunctions')) { + $this->load->library('Genfunctions'); + } + } + + function get_wae_array($dxccArray, $bands, $postdata) { + $this->load->model('logbooks_model'); + $logbooks_locations_array = $this->logbooks_model->list_logbook_relationships($this->session->userdata('active_station_logbook')); + + if (!$logbooks_locations_array) { + return null; + } + + $location_list = "'".implode("','",$logbooks_locations_array)."'"; + + $qsl = $this->genfunctions->gen_qsl_from_postdata($postdata); + + 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] = '-'; + } + + // If worked is checked, we add worked entities to the array + if ($postdata['worked'] != NULL) { + $workedDXCC = $this->getDxccBandWorked($location_list, $band, $postdata); + foreach ($workedDXCC as $wdxcc) { + $dxccMatrix[$wdxcc->dxcc][$band] = '
name).'","'. $band . '","'. $postdata['sat'] . '","' . $postdata['orbit'] . '","'. $postdata['mode'] . '","DXCC", "")\'>W
'; + } + } + + // If confirmed is checked, we add confirmed entities to the array + if ($postdata['confirmed'] != NULL) { + $confirmedDXCC = $this->getDxccBandConfirmed($location_list, $band, $postdata); + foreach ($confirmedDXCC as $cdxcc) { + $dxccMatrix[$cdxcc->dxcc][$band] = '
name).'","'. $band . '","'. $postdata['sat'] . '","'. $postdata['orbit'] . '","' . $postdata['mode'] . '","DXCC","'.$qsl.'")\'>C
'; + } + } + } + + // 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($location_list, $postdata); + foreach ($workedDxcc as $wdxcc) { + if (array_key_exists($wdxcc->dxcc, $dxccMatrix)) { + unset($dxccMatrix[$wdxcc->dxcc]); + } + } + } + + // 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($location_list, $postdata); + foreach ($confirmedDxcc as $cdxcc) { + if (array_key_exists($cdxcc->dxcc, $dxccMatrix)) { + unset($dxccMatrix[$cdxcc->dxcc]); + } + } + } + + if (isset($dxccMatrix)) { + return $dxccMatrix; + } else { + return 0; + } + } + + function getDxccBandConfirmed($location_list, $band, $postdata) { + $bindings=[]; + $sql = "select adif as dxcc, name from dxcc_entities + join ( + select 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 . + ") and col_dxcc in ( ". $this->eucountries . ")"; + + $sql .= $this->genfunctions->addBandToQuery($band,$bindings); + if ($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 + ) x on dxcc_entities.adif = x.col_dxcc"; + + if ($postdata['includedeleted'] == NULL) { + $sql .= " and dxcc_entities.end is null"; + } + + $sql .= ' and col_dxcc in ( '. $this->eucountries . ')'; + + $query = $this->db->query($sql,$bindings); + + return $query->result(); + } + + function getDxccBandWorked($location_list, $band, $postdata) { + $bindings=[]; + $sql = "select adif as dxcc, name from dxcc_entities + join ( + select 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 . + ") and col_dxcc in ( ". $this->eucountries . ")"; + $sql .= $this->genfunctions->addBandToQuery($band,$bindings); + if ($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 .= " group by col_dxcc + ) x on dxcc_entities.adif = x.col_dxcc";; + if ($postdata['includedeleted'] == NULL) { + $sql .= " and dxcc_entities.end is null"; + } + + $query = $this->db->query($sql,$bindings); + return $query->result(); + } + + function fetchDxcc($postdata) { + $bindings=[]; + $this->load->model('logbooks_model'); + $logbooks_locations_array = $this->logbooks_model->list_logbook_relationships($this->session->userdata('active_station_logbook')); + + if (!$logbooks_locations_array) { + return null; + } + + $location_list = "'".implode("','",$logbooks_locations_array)."'"; + + $sql = "select adif, prefix, name, date(end) Enddate, date(start) Startdate, lat, `long` + from dxcc_entities"; + + if ($postdata['notworked'] == NULL) { + $sql .= " join (select 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 . ") and col_dxcc in ( ". $this->eucountries . ")"; + + if ($postdata['band'] != 'All') { + if ($postdata['band'] == 'SAT') { + $sql .= " and col_prop_mode = ?"; + $bindings[]=$postdata['band']; + if ($postdata['sat'] != 'All') { + $sql .= " and col_sat_name = ?"; + $bindings[]=$postdata['sat']; + } + } else { + $sql .= " and col_prop_mode !='SAT'"; + $sql .= " and col_band = ?"; + $bindings[]=$postdata['band']; + } + } + + if ($postdata['mode'] != 'All') { + $sql .= " and (col_mode = ? or col_submode = ?)"; + $bindings[]=$postdata['mode']; + $bindings[]=$postdata['mode']; + } + + $sql .= $this->addOrbitToQuery($postdata, $bindings); + $sql .= " and col_dxcc in ( ". $this->eucountries . ")"; + + $sql .= ' group by col_dxcc) x on dxcc_entities.adif = x.col_dxcc'; + } + + $sql .= " where 1 = 1"; + + if ($postdata['includedeleted'] == NULL) { + $sql .= " and end is null"; + } + + $sql .= " and adif in ( ". $this->eucountries . ")"; + + + $sql .= ' order by prefix'; + $query = $this->db->query($sql,$bindings); + + return $query->result(); + } + + function getDxccWorked($location_list, $postdata) { + $bindings=[]; + $sql = "SELECT adif as dxcc FROM dxcc_entities + join ( + select 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 . + ") and col_dxcc in ( ". $this->eucountries . ")"; + $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 and col_dxcc > 0"; + $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 + ) ll on dxcc_entities.adif = ll.col_dxcc + where 1=1"; + + if ($postdata['includedeleted'] == NULL) { + $sql .= " and dxcc_entities.end is null"; + } + + $query = $this->db->query($sql,$bindings); + return $query->result(); + } + + function getDxccConfirmed($location_list, $postdata) { + $bindings=[]; + $sql = "SELECT adif as dxcc FROM dxcc_entities + join ( + select 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 . + ") and col_dxcc in ( ". $this->eucountries . ")"; + + $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 + ) ll on dxcc_entities.adif = ll.col_dxcc + where 1=1"; + + if ($postdata['includedeleted'] == NULL) { + $sql .= " and dxcc_entities.end is null"; + } + + $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) { + $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 null; + } + + $location_list = "'".implode("','",$logbooks_locations_array)."'"; + + foreach ($bands as $band) { + $worked = $this->getSummaryByBand($band, $postdata, $location_list); + $confirmed = $this->getSummaryByBandConfirmed($band, $postdata, $location_list); + $dxccSummary['worked'][$band] = $worked[0]->count; + $dxccSummary['confirmed'][$band] = $confirmed[0]->count; + } + + $workedTotal = $this->getSummaryByBand($postdata['band'], $postdata, $location_list); + $confirmedTotal = $this->getSummaryByBandConfirmed($postdata['band'], $postdata, $location_list); + + $dxccSummary['worked']['Total'] = $workedTotal[0]->count; + $dxccSummary['confirmed']['Total'] = $confirmedTotal[0]->count; + + return $dxccSummary; + } + + function getSummaryByBand($band, $postdata, $location_list) { + $bindings=[]; + $sql = "SELECT count(distinct thcv.col_dxcc) as count 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 . ") and col_dxcc > 0"; + + 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') { + $this->load->model('bands'); + + $bandslots = $this->bands->get_worked_bands('dxcc'); + + $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"; + } + $sql .= " and col_dxcc 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 getSummaryByBandConfirmed($band, $postdata, $location_list) { + $bindings=[]; + $sql = "SELECT count(distinct thcv.col_dxcc) as count 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 . ") and col_dxcc > 0"; + + 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') { + $this->load->model('bands'); + + $bandslots = $this->bands->get_worked_bands('dxcc'); + + $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"; + } + + $sql .= " and col_dxcc 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 new file mode 100644 index 000000000..082795a02 --- /dev/null +++ b/application/views/awards/wae/index.php @@ -0,0 +1,218 @@ +
+ +
+
+ +

+ +
+ + +
+
+ +
+
+
+
+ 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"'; ?> > + +
+
+
+ +
+
+
+
+ input->post('qsl') || $this->input->method() !== 'post') echo ' checked="checked"'; ?> > + +
+
+ input->post('lotw') || $this->input->method() !== 'post') echo ' checked="checked"'; ?> > + +
+
+ input->post('eqsl')) echo ' checked="checked"'; ?> > + +
+
+ input->post('qrz')) echo ' checked="checked"'; ?> > + +
+
+ input->post('clublog')) echo ' checked="checked"'; ?> > + +
+
+
+ +
+ +
+ +
+
+
input->post('band') != 'SAT' && $this->input->post('band') != 'All') echo "style=\"display: none\""; ?>> + + +
+ +
+ + + +
+
input->post('band') != 'SAT' && $this->input->post('band') != 'All') echo "style=\"display: none\""; ?>> + +
+ +
+
+
+ +
+ +
+
+ +
+ +
+ + +
+
+ +
+
+ + + + + # + ' . __("DXCC Name") . ' + ' . __("Prefix") . ''; + foreach($bands as $band) { + echo '' . $band . ''; + } + echo ' + + '; + foreach ($wae_array as $dxcc => $value) { // Fills the table with the data + echo ' + '. $i++ .''; + foreach ($value as $name => $key) { + if (isset($value['Deleted']) && $value['Deleted'] == 1 && $name == "name") { + echo '' . $key . ' '.__("Deleted DXCC").''; + } else if ($name == "Deleted") { + continue; + } else { + echo '' . $key . ''; + } + } + echo ''; + } + echo ' +

' . __("Summary") . '

+ + + + '; + + foreach($bands as $band) { + echo ''; + } + echo ' + + + + + '; + + foreach ($wae_summary['worked'] as $dxcc) { // Fills the table with the data + echo ''; + } + + echo ' + '; + foreach ($wae_summary['confirmed'] as $dxcc) { // Fills the table with the data + echo ''; + } + + echo ' +
' . $band . '' . __("Total") . '
' . __("Total worked") . '' . $dxcc . '
' . __("Total confirmed") . '' . $dxcc . '
+
'; + + } + else { + echo ''; + } + ?> diff --git a/application/views/interface_assets/footer.php b/application/views/interface_assets/footer.php index 969af12f4..034e39828 100644 --- a/application/views/interface_assets/footer.php +++ b/application/views/interface_assets/footer.php @@ -1680,7 +1680,7 @@ $(document).ready(function(){ -uri->segment(2) == "dxcc") { ?> +uri->segment(2) == "dxcc" || $this->uri->segment(2) == "wae") { ?>