diff --git a/application/controllers/Adif.php b/application/controllers/Adif.php
index a9c0efc4c..30684c4a6 100644
--- a/application/controllers/Adif.php
+++ b/application/controllers/Adif.php
@@ -224,8 +224,7 @@ class adif extends CI_Controller {
$this->adif_parser->initialize();
$custom_errors = "";
$alladif=[];
- while($record = $this->adif_parser->get_record())
- {
+ while($record = $this->adif_parser->get_record()) {
if ($contest != '') {
$record['contest_id']=$contest;
}
diff --git a/application/controllers/Api.php b/application/controllers/Api.php
index 191fdafaa..b3a03ef45 100644
--- a/application/controllers/Api.php
+++ b/application/controllers/Api.php
@@ -160,7 +160,10 @@ class API extends CI_Controller {
*/
function qso($dryrun = false) {
header('Content-type: application/json');
+ set_time_limit(0);
+ ini_set('memory_limit', '-1');
+ session_write_close();
$this->load->model('api_model');
$this->load->model('stations');
@@ -169,7 +172,9 @@ class API extends CI_Controller {
$return_count = 0;
// Decode JSON and store
- $obj = json_decode(file_get_contents("php://input"), true);
+ $raw = file_get_contents("php://input");
+ $obj = json_decode($raw,true);
+ $raw='';
if ($obj === NULL) {
echo json_encode(['status' => 'failed', 'reason' => "wrong JSON"]);
die();
@@ -182,6 +187,7 @@ class API extends CI_Controller {
}
$userid = $this->api_model->key_userid($obj['key']);
+ $this->api_model->update_last_used(($obj['key']));
if(!isset($obj['station_profile_id']) || $this->stations->check_station_against_user($obj['station_profile_id'], $userid) == false) {
http_response_code(401);
@@ -198,49 +204,32 @@ class API extends CI_Controller {
// Feed in the ADIF string
$this->adif_parser->feed($obj['string']);
-
- // Create QSO Record
- while($record = $this->adif_parser->get_record())
- {
- if(count($record) == 0)
- {
- break;
- };
-
-
- if( !($dryrun) && (isset($obj['station_profile_id']))) {
- if(isset($record['station_callsign']) && $this->stations->check_station_against_callsign($obj['station_profile_id'], $record['station_callsign']) == false) {
- http_response_code(401);
- echo json_encode(['status' => 'failed', 'reason' => "station callsign does not match station callsign in station profile."]);
- die();
- }
-
+ $obj['string']='';
+ $return_msg=[];
+ $return_count=0;
+ if( !($dryrun) && (isset($obj['station_profile_id']))) {
+ $custom_errors = "";
+ $alladif=[];
+ gc_collect_cycles();
+ while($record = $this->adif_parser->get_record()) {
if(!(isset($record['call'])) || (trim($record['call']) == '')) {
- http_response_code(401);
- echo json_encode(['status' => 'failed', 'reason' => "QSO Call is empty."]);
- die();
+ continue;
}
+ if(count($record) == 0) {
+ break;
+ };
+ array_push($alladif,$record);
+ $return_count++;
+ };
+ $record=''; // free memory
+ gc_collect_cycles();
+ $custom_errors = $this->logbook_model->import_bulk($alladif, $obj['station_profile_id'], false, false, false, false, false, false, true, false, true, false);
+ $alladif=[];
+ $return_msg[]='';
+ } else {
+ $return_msg[]='Dryrun works';
+ }
- if ( ((!(isset($record['distance']))) || ($record['distance'] == '')) && ((isset($record['gridsquare'])) && ($record['gridsquare'] != '')) ) {
- $mygrid=$this->stations->gridsquare_from_station($obj['station_profile_id']);
- $this->load->library('Qra');
- $record['distance'] = $this->qra->distance($mygrid, $record['gridsquare'], 'K');
- }
-
- $this->api_model->update_last_used(($obj['key']));
-
- $msg = $this->logbook_model->import($record, $obj['station_profile_id'], NULL, NULL, NULL, NULL, NULL, NULL, false, false, true);
-
- if ( $msg == "" ) {
- $return_count++;
- } else {
- $return_msg[] = $msg;
- }
- } else {
- $return_msg[]='Dryrun works';
- }
-
- };
http_response_code(201);
echo json_encode(['status' => 'created', 'type' => $obj['type'], 'string' => $obj['string'], 'imported_count' => $return_count, 'messages' => $return_msg ]);
diff --git a/application/controllers/Awards.php b/application/controllers/Awards.php
index ac3a0d618..251c85763 100644
--- a/application/controllers/Awards.php
+++ b/application/controllers/Awards.php
@@ -329,6 +329,31 @@ class Awards extends CI_Controller {
$this->load->view('interface_assets/footer', $footerData);
}
+ public function jcc_export() {
+ $this->load->model('Jcc_model');
+ $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'));
+
+ $qsos = $this->Jcc_model->exportJcc($postdata);
+
+ $fp = fopen( 'php://output', 'w' );
+ $i=1;
+ fputcsv($fp, array('No', 'Callsign', 'Date', 'Band', 'Mode', 'Remarks'), ';');
+ foreach ($qsos as $qso) {
+ fputcsv($fp, array($i, $qso['call'], $qso['date'], ($qso['prop_mode'] != null ? $qso['band'].' / '.$qso['prop_mode'] : $qso['band']), $qso['mode'], $qso['cnty'].' - '.$qso['jcc']), ';');
+ $i++;
+ }
+ fclose($fp);
+ return;
+ }
+
public function vucc() {
$this->load->model('vucc');
$this->load->model('bands');
diff --git a/application/models/Jcc_model.php b/application/models/Jcc_model.php
index f972eee40..93e887647 100644
--- a/application/models/Jcc_model.php
+++ b/application/models/Jcc_model.php
@@ -825,9 +825,8 @@ class Jcc_model extends CI_Model {
);
function get_jcc_array($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'));
+ $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;
@@ -1020,9 +1019,8 @@ class Jcc_model extends CI_Model {
*/
function get_jcc_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'));
+ $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;
@@ -1131,5 +1129,59 @@ class Jcc_model extends CI_Model {
$sql .= " and COL_CNTY in (".implode(',', array_keys($this->jaCities)).")";
return $sql;
}
+
+ function exportJcc($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)."'";
+
+ $jccArray = array_keys($this->jaCities);
+
+ $sql = "SELECT distinct col_cnty FROM " . $this->config->item('table_name') . " thcv
+ where station_id in (" . $location_list . ")";
+
+ if ($postdata['mode'] != 'All') {
+ $sql .= " and (col_mode = '" . $postdata['mode'] . "' or col_submode = '" . $postdata['mode'] . "')";
+ }
+
+ $sql .= $this->addStateToQuery();
+ $sql .= $this->genfunctions->addBandToQuery($postdata['band']);
+ $sql .= $this->genfunctions->addQslToQuery($postdata);
+ $sql .= ' ORDER BY COL_CNTY ASC';
+
+ $query = $this->db->query($sql);
+
+ $jccs = array();
+ foreach($query->result() as $line) {
+ $jccs[] = $line->col_cnty;
+ }
+ $qsos = array();
+ foreach($jccs as $jcc) {
+ $qso = $this->getFirstQso($location_list, $jcc, $postdata);
+ $qsos[] = array('call' => $qso[0]->COL_CALL, 'date' => $qso[0]->COL_TIME_ON, 'band' => $qso[0]->COL_BAND, 'mode' => $qso[0]->COL_MODE, 'prop_mode' => $qso[0]->COL_PROP_MODE, 'cnty' => $qso[0]->COL_CNTY, 'jcc' => $this->jaCities[$qso[0]->COL_CNTY]);
+ }
+
+ return $qsos;
+ }
+
+ function getFirstQso($location_list, $jcc, $postdata) {
+ $sql = 'SELECT COL_CNTY, COL_CALL, COL_TIME_ON, COL_BAND, COL_MODE, COL_PROP_MODE FROM '.$this->config->item('table_name').' t1
+ WHERE station_id in ('.$location_list.')';
+ if ($postdata['mode'] != 'All') {
+ $sql .= " and (col_mode = '" . $postdata['mode'] . "' or col_submode = '" . $postdata['mode'] . "')";
+ }
+ $sql .= $this->addStateToQuery();
+ $sql .= $this->genfunctions->addBandToQuery($postdata['band']);
+ $sql .= $this->genfunctions->addQslToQuery($postdata);
+ $sql .= ' AND COL_CNTY = \''.$jcc.'\'';
+ $sql .= ' ORDER BY COL_TIME_ON ASC LIMIT 1';
+ $query = $this->db->query($sql);
+ return $query->result();
+ }
}
?>
diff --git a/application/models/Logbook_model.php b/application/models/Logbook_model.php
index 48db848d5..afbfea070 100755
--- a/application/models/Logbook_model.php
+++ b/application/models/Logbook_model.php
@@ -3344,22 +3344,24 @@ function lotw_last_qsl_date($user_id) {
return '1900-01-01 00:00:00.000';
}
- function import_bulk($records, $station_id = "0", $skipDuplicate = false, $markClublog = false, $markLotw = false, $dxccAdif = false, $markQrz = false, $markHrd = false,$skipexport = false, $operatorName = false, $apicall = false, $skipStationCheck = false) {
- $custom_errors='';
- $a_qsos=[];
- foreach ($records as $record) {
- $one_error = $this->logbook_model->import($record, $station_id, $skipDuplicate, $markClublog, $markLotw,$dxccAdif, $markQrz, $markHrd, $skipexport, $operatorName, $apicall, $skipStationCheck, true);
- if ($one_error['error'] ?? '' != '') {
- $custom_errors.=$one_error['error']."
";
- } else {
- array_push($a_qsos,$one_error['raw_qso'] ?? '');
- }
- }
- if (count($a_qsos)>0) {
- $this->db->insert_batch($this->config->item('table_name'), $a_qsos);
- }
- return $custom_errors;
- }
+ function import_bulk($records, $station_id = "0", $skipDuplicate = false, $markClublog = false, $markLotw = false, $dxccAdif = false, $markQrz = false, $markHrd = false,$skipexport = false, $operatorName = false, $apicall = false, $skipStationCheck = false) {
+ $custom_errors='';
+ $a_qsos=[];
+ foreach ($records as $record) {
+ $one_error = $this->logbook_model->import($record, $station_id, $skipDuplicate, $markClublog, $markLotw,$dxccAdif, $markQrz, $markHrd, $skipexport, $operatorName, $apicall, $skipStationCheck, true);
+ if ($one_error['error'] ?? '' != '') {
+ $custom_errors.=$one_error['error']."
";
+ } else {
+ array_push($a_qsos,$one_error['raw_qso'] ?? '');
+ }
+ }
+ $records='';
+ gc_collect_cycles();
+ if (count($a_qsos)>0) {
+ $this->db->insert_batch($this->config->item('table_name'), $a_qsos);
+ }
+ return $custom_errors;
+ }
/*
* $skipDuplicate - used in ADIF import to skip duplicate checking when importing QSOs
* $markLoTW - used in ADIF import to mark QSOs as exported to LoTW when importing QSOs
@@ -4004,6 +4006,8 @@ function lotw_last_qsl_date($user_id) {
if ($batchmode) {
$raw_qso=$this->add_qso($data, $skipexport, $batchmode);
$returner['raw_qso']=$raw_qso;
+ $data='';
+ $raw_qso='';
} else {
$this->add_qso($data, $skipexport);
}
@@ -4016,6 +4020,7 @@ function lotw_last_qsl_date($user_id) {
} else {
$returner=$my_error;
}
+ $record=[];
return $returner;
}
diff --git a/application/views/awards/jcc/index.php b/application/views/awards/jcc/index.php
index 776b5199f..0e4c464f4 100644
--- a/application/views/awards/jcc/index.php
+++ b/application/views/awards/jcc/index.php
@@ -98,6 +98,7 @@