Merge pull request #890 from AndreasK79/wac_award

[Awards] Added Worked All Continents
This commit is contained in:
Andreas Kristiansen
2024-09-06 13:02:48 +02:00
committed by GitHub
6 changed files with 582 additions and 0 deletions

View File

@@ -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');
}
}

View File

@@ -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);

274
application/models/Wac.php Normal file
View File

@@ -0,0 +1,274 @@
<?php
class Wac extends CI_Model{
private $validContinents = ['AF', 'EU', 'AS', 'SA', 'NA', 'OC', 'AN'];
function __construct() {
$this->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] = '<div class="bg-danger awardsBgDanger"><a href=\'javascript:displayContacts("' . str_replace("&", "%26", $line->col_cont) . '","' . $band . '","All", "All","'. $postdata['mode'] . '","WAC","")\'>W</a></div>';
$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] = '<div class="bg-success awardsBgSuccess"><a href=\'javascript:displayContacts("' . str_replace("&", "%26", $line->col_cont) . '","' . $band . '","All", "All","'. $postdata['mode'] . '","WAC","'.$qsl.'")\'>C</a></div>';
$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;
}
}

View File

@@ -0,0 +1,204 @@
<div class="container">
<!-- Award Info Box -->
<br>
<div id="awardInfoButton">
<script>
var lang_awards_info_button = "<?= __("Award Info"); ?>";
var lang_award_info_ln1 = "<?= __("Worked All Continents (WAC)"); ?>";
var lang_award_info_ln2 = "<?= __("Sponsored by the International Amateur Radio Union (IARU), the Worked All Continents award is issued for working and confirming all six continents. These are North America, South America, Oceania, Asia, Europe and Africa."); ?>";
var lang_award_info_ln3 = "";
var lang_award_info_ln4 = "<?= sprintf(__("You can find all information about the DXCC Award on the %s."), "<a href='https://www.arrl.org/wac' target='_blank'>" . __("ARRL website") . "</a>"); ?>";
</script>
<h2><?= __("Awards - Worked All Continents (WAC)"); ?></h2>
<button type="button" class="btn btn-sm btn-primary me-1" id="displayAwardInfo"><?= __("Award Info"); ?></button>
</div>
<!-- End of Award Info Box -->
<form class="form" action="<?php echo site_url('awards/wac'); ?>" method="post" enctype="multipart/form-data">
<fieldset>
<!-- Multiple Checkboxes (inline) -->
<div class="mb-3 row">
<div class="col-md-2" for="checkboxes"><?= __("Worked") . ' / ' . __("Confirmed")?></div>
<div class="col-md-10">
<div class="form-check-inline">
<input class="form-check-input" type="checkbox" name="worked" id="worked" value="1" <?php if ($this->input->post('worked') || $this->input->method() !== 'post') echo ' checked="checked"'; ?> >
<label class="form-check-label" for="worked"><?= __("Show worked"); ?></label>
</div>
<div class="form-check-inline">
<input class="form-check-input" type="checkbox" name="confirmed" id="confirmed" value="1" <?php if ($this->input->post('confirmed') || $this->input->method() !== 'post') echo ' checked="checked"'; ?> >
<label class="form-check-label" for="confirmed"><?= __("Show confirmed"); ?></label>
</div>
<div class="form-check-inline">
<input class="form-check-input" type="checkbox" name="notworked" id="notworked" value="1" <?php if ($this->input->post('notworked') || $this->input->method() !== 'post') echo ' checked="checked"'; ?> >
<label class="form-check-label" for="notworked"><?= __("Show not worked"); ?></label>
</div>
</div>
</div>
<div class="mb-3 row">
<div class="col-md-2"><?= __("Show QSO with QSL Type"); ?></div>
<div class="col-md-10">
<div class="form-check-inline">
<input class="form-check-input" type="checkbox" name="qsl" value="1" id="qsl" <?php if ($this->input->post('qsl') || $this->input->method() !== 'post') echo ' checked="checked"'; ?> >
<label class="form-check-label" for="qsl"><?= __("QSL Card"); ?></label>
</div>
<div class="form-check-inline">
<input class="form-check-input" type="checkbox" name="lotw" value="1" id="lotw" <?php if ($this->input->post('lotw') || $this->input->method() !== 'post') echo ' checked="checked"'; ?> >
<label class="form-check-label" for="lotw"><?= __("LoTW"); ?></label>
</div>
<div class="form-check-inline">
<input class="form-check-input" type="checkbox" name="eqsl" value="1" id="eqsl" <?php if ($this->input->post('eqsl')) echo ' checked="checked"'; ?> >
<label class="form-check-label" for="eqsl"><?= __("eQSL"); ?></label>
</div>
<div class="form-check-inline">
<input class="form-check-input" type="checkbox" name="qrz" value="1" id="qrz" <?php if ($this->input->post('qrz')) echo ' checked="checked"'; ?> >
<label class="form-check-label" for="qrz"><?= __("QRZ.com"); ?></label>
</div>
</div>
</div>
<div class="mb-3 row">
<label class="col-md-2 control-label" for="band"><?= __("Band"); ?></label>
<div class="col-md-2">
<select id="band2" name="band" class="form-select form-select-sm">
<option value="All" <?php if ($this->input->post('band') == "All" || $this->input->method() !== 'post') echo ' selected'; ?> ><?= __("Every band"); ?></option>
<?php foreach($worked_bands as $band) {
echo '<option value="' . $band . '"';
if ($this->input->post('band') == $band) echo ' selected';
echo '>' . $band . '</option>'."\n";
} ?>
</select>
</div>
</div>
<div id="satrow" class="mb-3 row" <?php if ($this->input->post('band') != 'SAT' && $this->input->post('band') != 'All') echo "style=\"display: none\""; ?>>
<?php if (count($sats_available) != 0) { ?>
<label class="col-md-2 control-label" id="satslabel" for="distplot_sats"><?= __("Satellite"); ?></label>
<div class="col-md-2">
<select class="form-select form-select-sm" id="sats" name="sats">
<option value="All" <?php if ($this->input->post('sats') == "All" || $this->input->method() !== 'post') echo ' selected'; ?>><?= __("All")?></option>
<?php foreach($sats_available as $sat) {
echo '<option value="' . $sat . '"';
if ($this->input->post('sats') == $sat) echo ' selected';
echo '>' . $sat . '</option>'."\n";
} ?>
</select>
</div>
<?php } else { ?>
<input id="sats" type="hidden" value="All"></input>
<?php } ?>
</div>
<div id="orbitrow" class="mb-3 row" <?php if ($this->input->post('band') != 'SAT' && $this->input->post('band') != 'All') echo "style=\"display: none\""; ?>>
<label class="col-md-2 control-label" id="orbitslabel" for="orbits"><?= __("Orbit"); ?></label>
<div class="col-md-2">
<select class="form-select form-select-sm" id="orbits" name="orbits">
<option value="All" <?php if ($this->input->post('orbits') == "All" || $this->input->method() !== 'post') echo ' selected'; ?>><?= __("All")?></option>
<?php
foreach($orbits as $orbit){
echo '<option value="' . $orbit . '"';
if ($this->input->post('orbits') == $orbit) echo ' selected';
echo '>' . strtoupper($orbit) . '</option>'."\n";
}
?>
</select>
</div>
</div>
<div class="mb-3 row">
<label class="col-md-2 control-label" for="mode"><?= __("Mode"); ?></label>
<div class="col-md-2">
<select id="mode" name="mode" class="form-select form-select-sm">
<option value="All" <?php if ($this->input->post('mode') == "All" || $this->input->method() !== 'mode') echo ' selected'; ?>><?= __("All"); ?></option>
<?php
foreach($modes->result() as $mode){
if ($mode->submode == null) {
echo '<option value="' . $mode->mode . '"';
if ($this->input->post('mode') == $mode->mode) echo ' selected';
echo '>'. $mode->mode . '</option>'."\n";
} else {
echo '<option value="' . $mode->submode . '"';
if ($this->input->post('mode') == $mode->submode) echo ' selected';
echo '>' . $mode->submode . '</option>'."\n";
}
}
?>
</select>
</div>
</div>
<div class="mb-3 row">
<label class="col-md-2 control-label" for="button1id"></label>
<div class="col-md-10">
<button id="button2id" type="reset" name="button2id" class="btn btn-sm btn-warning"><?= __("Reset"); ?></button>
<button id="button1id" type="submit" name="button1id" class="btn btn-sm btn-primary"><?= __("Show"); ?></button>
</div>
</div>
</fieldset>
</form>
<div>
<?php
$i = 1;
if ($wac_array) {
echo "
<table style='width:100%' class='table tablecq table-sm table-bordered table-hover table-striped table-condensed text-center'>
<thead>
<tr>
<td>#</td>
<td>" . __("Continent") . "</td>";
foreach($bands as $band) {
echo '<td>' . $band . '</td>';
}
echo '</tr>
</thead>
<tbody>';
foreach ($wac_array as $wac => $value) { // Fills the table with the data
echo '<tr>
<td>' . $i++ . '</td>
<td>'. $wac.'</td>';
foreach ($value as $key) {
echo '<td style="text-align: center">' . $key . '</td>';
}
echo '</tr>';
}
echo "</table>
<h2>" . __("Summary") . "</h2>
<table class='table-sm tablesummary table table-bordered table-hover table-striped table-condensed text-center'>
<thead>
<tr><td></td>";
foreach($bands as $band) {
echo '<td>' . $band . '</td>';
}
echo "<td>" . __("Total") . "</td></tr>
</thead>
<tbody>
<tr><td>" . __("Total worked") . "</td>";
foreach ($wac_summary['worked'] as $wac) { // Fills the table with the data
echo '<td style="text-align: center">' . $wac . '</td>';
}
echo "</tr><tr>
<td>" . __("Total confirmed") . "</td>";
foreach ($wac_summary['confirmed'] as $wac) { // Fills the table with the data
echo '<td style="text-align: center">' . $wac . '</td>';
}
echo '</tr>
</table>
</div>';
}
else {
echo '<div class="alert alert-danger" role="alert">' . __("Nothing found!") . '</div>';
}
?>
</div>
</div>

View File

@@ -2757,6 +2757,32 @@ function viewEqsl(picture, callsign) {
$('[class*="buttons"]').css("color", "white");
}
</script>
<?php } else if ($this->uri->segment(2) == "wac") { ?>
<script>
$('#band2').change(function(){
var band = $("#band2 option:selected").text();
if (band != "SAT") {
$("#sats").val('All');
$("#orbits").val('All');
$("#satrow").hide();
$("#orbitrow").hide();
} else {
$("#satrow").show();
$("#orbitrow").show();
}
});
$('#sats').change(function(){
var sat = $("#sats option:selected").text();
$("#band2").val('SAT');
if (sat != "All") {
}
});
// change color of csv-button if dark mode is chosen
if (isDarkModeTheme()) {
$('[class*="buttons"]').css("color", "white");
}
</script>
<?php } ?>
<?php } ?>

View File

@@ -171,6 +171,8 @@
<div class="dropdown-divider"></div>
<li><a class="dropdown-item" href="<?php echo site_url('awards/vucc'); ?>"><i class="fas fa-trophy"></i> <?= __("VUCC"); ?></a></li>
<div class="dropdown-divider"></div>
<li><a class="dropdown-item" href="<?php echo site_url('awards/wac'); ?>"><i class="fas fa-trophy"></i> <?= __("Worked All Continents (WAC)"); ?></a></li>
<div class="dropdown-divider"></div>
<li><a class="dropdown-item" href="<?php echo site_url('awards/wwff'); ?>"><i class="fas fa-trophy"></i> <?= __("WWFF"); ?></a></li>
</ul>
</li>