diff --git a/application/controllers/Awards.php b/application/controllers/Awards.php index 675ff5990..e9bc2085a 100644 --- a/application/controllers/Awards.php +++ b/application/controllers/Awards.php @@ -1838,4 +1838,77 @@ class Awards extends CI_Controller { echo json_encode($zones); } + public function wac() { + $this->load->model('logbooks_model'); + $logbooks_locations_array = $this->logbooks_model->list_logbook_relationships($this->session->userdata('active_station_logbook')); + + $this->load->model('wac'); + $this->load->model('modes'); + $this->load->model('bands'); + + $data['worked_bands'] = $this->bands->get_worked_bands(); + $data['modes'] = $this->modes->active(); // Used in the view for mode select + + $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'); + + 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->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->security->xss_clean($this->input->post('qsl')); + $postdata['lotw'] = $this->security->xss_clean($this->input->post('lotw')); + $postdata['eqsl'] = $this->security->xss_clean($this->input->post('eqsl')); + $postdata['qrz'] = $this->security->xss_clean($this->input->post('qrz')); + $postdata['worked'] = $this->security->xss_clean($this->input->post('worked')); + $postdata['confirmed'] = $this->security->xss_clean($this->input->post('confirmed')); + $postdata['notworked'] = $this->security->xss_clean($this->input->post('notworked')); + $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['band'] = 'All'; + $postdata['mode'] = 'All'; + $postdata['sat'] = 'All'; + $postdata['orbit'] = 'All'; + } + + if ($logbooks_locations_array) { + $location_list = "'".implode("','",$logbooks_locations_array)."'"; + $data['wac_array'] = $this->wac->get_wac_array($bands, $postdata, $location_list); + $data['wac_summary'] = $this->wac->get_wac_summary($bands, $postdata, $location_list); + } else { + $location_list = null; + $data['wac_array'] = null; + $data['wac_summary'] = null; + } + + // Render page + $data['page_title'] = sprintf(__("Awards - %s"), __("Worked All Continents (WAC)")); + $this->load->view('interface_assets/header', $data); + $this->load->view('awards/wac/index'); + $this->load->view('interface_assets/footer'); + } + } diff --git a/application/models/Logbook_model.php b/application/models/Logbook_model.php index 12ccab09b..a62c2689b 100644 --- a/application/models/Logbook_model.php +++ b/application/models/Logbook_model.php @@ -548,6 +548,9 @@ class Logbook_model extends CI_Model { $this->db->where('COL_SIG', 'WAB'); $this->db->where('COL_SIG_INFO', $searchphrase); break; + case 'WAC': + $this->db->where('COL_CONT', $searchphrase); + break; case 'WAJA': $state = str_pad($searchphrase, 2, '0', STR_PAD_LEFT); $this->db->where('COL_STATE', $state); diff --git a/application/models/Wac.php b/application/models/Wac.php new file mode 100644 index 000000000..a9c9f241c --- /dev/null +++ b/application/models/Wac.php @@ -0,0 +1,274 @@ +load->library('Genfunctions'); + } + + function get_wac_array($bands, $postdata, $location_list) { + $wac = array(); + + foreach ($this->validContinents as $cont) { + $wac[$cont]['count'] = 0; // Inits each wac's count + } + + $qsl = $this->genfunctions->gen_qsl_from_postdata($postdata); + + foreach ($bands as $band) { + foreach ($this->validContinents as $cont) { + $bandWac[$cont][$band] = '-'; // Sets all to dash to indicate no result + } + + if ($postdata['worked'] != NULL) { + $wacBand = $this->getWACWorked($location_list, $band, $postdata); + foreach ($wacBand as $line) { + $bandWac[$line->col_cont][$band] = '
'; + $wac[$line->col_cont]['count']++; + } + } + if ($postdata['confirmed'] != NULL) { + $wacBand = $this->getWACConfirmed($location_list, $band, $postdata); + foreach ($wacBand as $line) { + $bandWac[$line->col_cont][$band] = ''; + $wac[$line->col_cont]['count']++; + } + } + } + + // We want to remove the worked continents in the list, since we do not want to display them + if ($postdata['worked'] == NULL) { + $wacBand = $this->getWACWorked($location_list, $postdata['band'], $postdata); + foreach ($wacBand as $line) { + unset($bandWac[$line->col_cont]); + } + } + + // We want to remove the confirmed continents in the list, since we do not want to display them + if ($postdata['confirmed'] == NULL) { + $wacBand = $this->getWACConfirmed($location_list, $postdata['band'], $postdata); + foreach ($wacBand as $line) { + unset($bandWac[$line->col_cont]); + } + } + + if ($postdata['notworked'] == NULL) { + foreach ($this->validContinents as $cont) { + if ($wac[$cont]['count'] == 0) { + unset($bandWac[$cont]); + }; + } + } + + if (isset($bandWac)) { + return $bandWac; + } else { + return 0; + } + } + + /* + * Function returns all worked, but not confirmed continents + * $postdata contains data from the form, in this case Lotw or QSL are used + */ + function getWACWorked($location_list, $band, $postdata) { + $bindings=[]; + $sql = "SELECT distinct col_cont 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_cont in ('AF', 'EU', 'AS', 'SA', 'NA', 'OC', 'AN')"; + + if ($postdata['mode'] != 'All') { + $sql .= " and (col_mode = ? or col_submode = ?)"; + $bindings[]=$postdata['mode']; + $bindings[]=$postdata['mode']; + } + + $sql .= $this->genfunctions->addBandToQuery($band); + if ($band == 'SAT') { + if ($postdata['sat'] != 'All') { + $sql .= " and col_sat_name = ?"; + $bindings[]=$postdata['sat']; + } + } + $sql .= $this->addOrbitToQuery($postdata,$bindings); + + $sql .= " and not exists (select 1 from " . $this->config->item('table_name') . " thcv2 + LEFT JOIN satellite on thcv2.COL_SAT_NAME = satellite.name + where station_id in (" . $location_list . + ") and col_cont = thcv.col_cont and col_cont <> '' "; + + $sql .= $this->genfunctions->addBandToQuery($band); + 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 .= ")"; + + $query = $this->db->query($sql,$bindings); + + return $query->result(); + } + + /* + * Function returns all confirmed continents on given band and on LoTW or QSL + * $postdata contains data from the form, in this case Lotw or QSL are used + */ + function getWACConfirmed($location_list, $band, $postdata) { + $bindings=[]; + $sql = "SELECT distinct col_cont 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_cont in ('AF', 'EU', 'AS', 'SA', 'NA', 'OC', 'AN')"; + + if ($postdata['mode'] != 'All') { + $sql .= " and (col_mode = ? or col_submode = ?)"; + $bindings[]=$postdata['mode']; + $bindings[]=$postdata['mode']; + } + + $sql .= $this->genfunctions->addBandToQuery($band); + if ($band == 'SAT') { + if ($postdata['sat'] != 'All') { + $sql .= " and col_sat_name = ?"; + $bindings[]=$postdata['sat']; + } + } + + $sql .= $this->genfunctions->addQslToQuery($postdata); + + $sql .= $this->addOrbitToQuery($postdata,$bindings); + + $query = $this->db->query($sql,$bindings); + + return $query->result(); + } + + + /* + * Function gets worked and confirmed summary on each band on the active stationprofile + */ + function get_wac_summary($bands, $postdata, $location_list) { + foreach ($bands as $band) { + $worked = $this->getSummaryByBand($band, $postdata, $location_list); + $confirmed = $this->getSummaryByBandConfirmed($band, $postdata, $location_list); + $wacSummary['worked'][$band] = $worked[0]->count; + $wacSummary['confirmed'][$band] = $confirmed[0]->count; + } + + $workedTotal = $this->getSummaryByBand($postdata['band'], $postdata, $location_list); + $confirmedTotal = $this->getSummaryByBandConfirmed($postdata['band'], $postdata, $location_list); + + $wacSummary['worked']['Total'] = $workedTotal[0]->count; + $wacSummary['confirmed']['Total'] = $confirmedTotal[0]->count; + + return $wacSummary; + } + + function getSummaryByBand($band, $postdata, $location_list) { + $bindings=[]; + $sql = "SELECT count(distinct thcv.col_cont) as count FROM " . $this->config->item('table_name') . " thcv"; + $sql .= " LEFT JOIN satellite on thcv.COL_SAT_NAME = satellite.name"; + + $sql .= " where station_id in (" . $location_list . ") and col_cont in ('AF', 'EU', 'AS', 'SA', 'NA', 'OC', 'AN')"; + + if ($band == 'SAT') { + $sql .= " and thcv.col_prop_mode = ?"; + $bindings[]=$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(); + + $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->addOrbitToQuery($postdata,$bindings); + + $query = $this->db->query($sql,$bindings); + return $query->result(); + } + + function getSummaryByBandConfirmed($band, $postdata, $location_list){ + $bindings=[]; + $sql = "SELECT count(distinct thcv.col_cont) as count FROM " . $this->config->item('table_name') . " thcv"; + $sql .= " LEFT JOIN satellite on thcv.COL_SAT_NAME = satellite.name"; + + $sql .= " where station_id in (" . $location_list . ") and col_cont in ('AF', 'EU', 'AS', 'SA', 'NA', 'OC', 'AN')"; + + if ($band == 'SAT') { + $sql .= " and thcv.col_prop_mode ='" . $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(); + + $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); + + $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; + } + +} diff --git a/application/views/awards/wac/index.php b/application/views/awards/wac/index.php new file mode 100644 index 000000000..b244dbe26 --- /dev/null +++ b/application/views/awards/wac/index.php @@ -0,0 +1,204 @@ +| "; + + foreach($bands as $band) { + echo ' | ' . $band . ' | '; + } + echo "" . __("Total") . " |
| " . __("Total worked") . " | "; + + foreach ($wac_summary['worked'] as $wac) { // Fills the table with the data + echo '' . $wac . ' | '; + } + + echo "|
| " . __("Total confirmed") . " | "; + foreach ($wac_summary['confirmed'] as $wac) { // Fills the table with the data + echo '' . $wac . ' | '; + } + + echo '