From 3a415a558729a38794aceccbc84f99215cbf1d7f Mon Sep 17 00:00:00 2001
From: Andreas <6977712+AndreasK79@users.noreply.github.com>
Date: Wed, 12 Apr 2023 11:58:47 +0200
Subject: [PATCH 01/13] [Cabrillo export] Added contest export for cabrillo
---
 application/controllers/Cabrillo.php          |  82 ++++++++++++++
 application/libraries/Cabrilloformat.php      |  63 +++++++++++
 application/models/Contesting_model.php       | 103 ++++++++++++++++++
 application/views/cabrillo/export.php         |  12 ++
 application/views/cabrillo/index.php          |  41 +++++++
 application/views/interface_assets/header.php |   2 +
 assets/js/sections/cabrillo.js                |  44 ++++++++
 7 files changed, 347 insertions(+)
 create mode 100644 application/controllers/Cabrillo.php
 create mode 100644 application/libraries/Cabrilloformat.php
 create mode 100644 application/views/cabrillo/export.php
 create mode 100644 application/views/cabrillo/index.php
 create mode 100644 assets/js/sections/cabrillo.js
diff --git a/application/controllers/Cabrillo.php b/application/controllers/Cabrillo.php
new file mode 100644
index 00000000..5cf61dde
--- /dev/null
+++ b/application/controllers/Cabrillo.php
@@ -0,0 +1,82 @@
+load->model('user_model');
+		if(!$this->user_model->authorize(2)) { $this->session->set_flashdata('notice', 'You\'re not allowed to do that!'); redirect('dashboard'); }
+	}
+
+    public function index()
+    {
+        $data['page_title'] = "Export Cabrillo";
+
+        $this->load->model('Contesting_model');
+
+        $data['contestyears'] = $this->Contesting_model->get_logged_years();
+
+		$footerData = [];
+		$footerData['scripts'] = [
+			'assets/js/sections/cabrillo.js'
+		];
+        
+        $this->load->view('interface_assets/header', $data);
+		$this->load->view('cabrillo/index');
+		$this->load->view('interface_assets/footer', $footerData);
+    }
+
+    public function getContests() {
+		$this->load->model('Contesting_model');
+		$result = $this->Contesting_model->get_logged_contests($this->input->post('year'));
+
+		header('Content-Type: application/json');
+		echo json_encode($result);
+    }
+
+    public function getContestDates() {
+        $this->load->model('Contesting_model');
+		$result = $this->Contesting_model->get_contest_dates($this->input->post('year'), $this->input->post('contestid'));
+
+		header('Content-Type: application/json');
+		echo json_encode($result);
+    }
+
+    public function export() {
+        // Set memory limit to unlimited to allow heavy usage
+		ini_set('memory_limit', '-1');
+        $this->load->model('Contesting_model');
+
+        $contest_id = $this->security->xss_clean($this->input->post('contestid'));
+        $fromto = $this->security->xss_clean($this->input->post('contestdates'));
+
+        $fromto = explode(',', $fromto);
+
+        $from = $fromto[0];
+        $to = $fromto[1];
+
+		$data['qsos'] = $this->Contesting_model->export_custom($from, $to, $contest_id);
+
+        $data['contest_id'] = $contest_id;
+        $data['callsign'] = '';
+        $data['claimed_score'] = '';
+        $data['operators'] = '';
+        $data['club'] = '';
+        $data['name'] = '';
+        $data['address1'] = '';
+        $data['address2'] = '';
+        $data['address3'] = '';
+        $data['soapbox'] = '';
+
+		$this->load->view('cabrillo/export', $data);
+    }
+}
\ No newline at end of file
diff --git a/application/libraries/Cabrilloformat.php b/application/libraries/Cabrilloformat.php
new file mode 100644
index 00000000..4f849c74
--- /dev/null
+++ b/application/libraries/Cabrilloformat.php
@@ -0,0 +1,63 @@
+COL_FREQ, 0, -3);
+
+        if($qso->COL_MODE == "SSB") {
+            $mode = "PH";
+        } elseif($qso->COL_MODE == "RTTY") {
+            $mode = "RY";
+        } else {
+            $mode = $qso->COL_MODE;
+        }
+
+        $time = substr($qso->COL_TIME_ON, 0, -3);
+
+        $time = str_replace(":","",$time);
+
+        if ($qso->COL_STX_STRING != "") {
+
+            if($qso->COL_SRX_STRING != "") {
+                $rx_string = $qso->COL_SRX_STRING;
+            } else {
+                $rx_string = "--";
+            }
+
+            return "QSO:  ".$freq." ".$mode." ".$time." ".$qso->station_callsign."\t".$qso->COL_RST_SENT." ".$qso->COL_STX." ".$qso->COL_STX_STRING."\t".$qso->COL_CALL."\t".$qso->COL_RST_RCVD." ".$qso->COL_STX." ".$rx_string."\n";
+        } else {
+            return "QSO:  ".$freq." ".$mode." ".$time." ".$qso->station_callsign."\t".$qso->COL_RST_SENT." ".$qso->COL_STX."\t".$qso->COL_CALL."\t".$qso->COL_RST_RCVD." ".$qso->COL_STX."\n";   
+        }
+    }
+}
\ No newline at end of file
diff --git a/application/models/Contesting_model.php b/application/models/Contesting_model.php
index 79918db1..6d5c2784 100644
--- a/application/models/Contesting_model.php
+++ b/application/models/Contesting_model.php
@@ -160,4 +160,107 @@ class Contesting_model extends CI_Model {
 
 	    return $query;
 	}
+
+	function export_custom($from, $to, $contest_id) {
+		$CI =& get_instance();
+        $CI->load->model('Stations');
+        $station_id = $CI->Stations->find_active();
+
+        $this->db->select(''.$this->config->item('table_name').'.*, station_profile.*');
+        $this->db->from($this->config->item('table_name'));
+        $this->db->where($this->config->item('table_name').'.station_id', $station_id);
+
+        // If date is set, we format the date and add it to the where-statement
+        if ($from != 0) {
+            $from = DateTime::createFromFormat('Y-m-d', $from);
+            $from = $from->format('Y-m-d');
+            $this->db->where("date(".$this->config->item('table_name').".COL_TIME_ON) >= '".$from."'");
+        }
+        if ($to != 0) {
+            $to = DateTime::createFromFormat('Y-m-d', $to);
+            $to = $to->format('Y-m-d');
+            $this->db->where("date(".$this->config->item('table_name').".COL_TIME_ON) <= '".$to."'");
+        }
+
+		$this->db->where($this->config->item('table_name').'.COL_CONTEST_ID', $contest_id);
+
+        $this->db->order_by($this->config->item('table_name').".COL_TIME_ON", "ASC");
+
+        $this->db->join('station_profile', 'station_profile.station_id = '.$this->config->item('table_name').'.station_id');
+
+        return $this->db->get();
+    }
+
+	function get_logged_contests2() {
+		$CI =& get_instance();
+        $CI->load->model('Stations');
+        $station_id = $CI->Stations->find_active();
+
+		$sql = "select col_contest_id, min(date(col_time_on)) mindate, max(date(col_time_on)) maxdate, year(col_time_on) year, month(col_time_on) month
+		from logbook l 
+		where coalesce(COL_CONTEST_ID, '') <> '' 
+		and station_id =" . $station_id;
+
+		$sql .= " group by COL_CONTEST_ID , year(col_time_on), month(col_time_on) order by year(col_time_on) desc";
+
+		$data = $this->db->query($sql);
+
+		return ($data->result());
+	}
+
+	function get_logged_years() {
+		$CI =& get_instance();
+        $CI->load->model('Stations');
+        $station_id = $CI->Stations->find_active();
+
+		$sql = "select distinct year(col_time_on) year
+		from logbook l 
+		where coalesce(COL_CONTEST_ID, '') <> '' 
+		and station_id =" . $station_id;
+
+		$sql .= " order by year(col_time_on) desc";
+
+		$data = $this->db->query($sql);
+
+		return ($data->result());
+	}
+
+	function get_logged_contests($year) {
+        $year = $this->security->xss_clean($year);
+
+		$CI =& get_instance();
+        $CI->load->model('Stations');
+        $station_id = $CI->Stations->find_active();
+
+		$sql = "select distinct col_contest_id
+		from logbook l 
+		where coalesce(COL_CONTEST_ID, '') <> '' 
+		and station_id =" . $station_id .
+		" and year(col_time_on) ='" . $year . "'";
+
+		$sql .= " order by COL_CONTEST_ID asc";
+
+		$data = $this->db->query($sql);
+
+        return $data->result();
+    }
+
+	function get_contest_dates($year, $contestid) {
+		$year = $this->security->xss_clean($year);
+		$contestid = $this->security->xss_clean($contestid);
+
+		$CI =& get_instance();
+        $CI->load->model('Stations');
+        $station_id = $CI->Stations->find_active();
+
+		$sql = "select min(date(col_time_on)) mindate, max(date(col_time_on)) maxdate
+		from logbook l 
+		where coalesce(COL_CONTEST_ID, '') <> '' 
+		and station_id =" . $station_id .
+		" and year(col_time_on) ='" . $year . "' and col_contest_id ='" . $contestid . "'";
+
+		$data = $this->db->query($sql);
+
+        return $data->result();
+	}
 }
diff --git a/application/views/cabrillo/export.php b/application/views/cabrillo/export.php
new file mode 100644
index 00000000..3b6226d0
--- /dev/null
+++ b/application/views/cabrillo/export.php
@@ -0,0 +1,12 @@
+session->userdata('user_callsign').'-'.date('dmY-Hi').'.log"');
+
+$CI =& get_instance();
+$CI->load->library('Cabrilloformat');
+
+echo $CI->cabrilloformat->header($contest_id, $callsign, $claimed_score, $operators, $club, $name, $address1, $address2, $address3, $soapbox);
+foreach ($qsos->result() as $row) {
+	echo $CI->cabrilloformat->qso($row);
+}
+echo $CI->cabrilloformat->footer();
\ No newline at end of file
diff --git a/application/views/cabrillo/index.php b/application/views/cabrillo/index.php
new file mode 100644
index 00000000..2c4b4a1f
--- /dev/null
+++ b/application/views/cabrillo/index.php
@@ -0,0 +1,41 @@
+
+
+    
+
+    
+
+    
+        
+        
+
+		';
+		  if ($contestyears) { ?>
+
+			
+
+			
+
+        
+    
+
Select daterange: 
' +
+                '' +
+                '  '); 
+
+                $.each(data, function(key, value) {
+                    $('#contestdates')
+                        .append($("")
+                        .attr("value", value.mindate + ',' + value.maxdate)
+                        .text(value.mindate + ' - ' + value.maxdate));
+                });
+        }
+    });
+}
\ No newline at end of file
From bcdf01ef2a2c22ee7ab7c406737b3a95f124d176 Mon Sep 17 00:00:00 2001
From: Andreas <6977712+AndreasK79@users.noreply.github.com>
Date: Wed, 12 Apr 2023 12:12:14 +0200
Subject: [PATCH 02/13] [Cabrillo export] Adjusted javascript to remove correct
 tags
---
 assets/js/sections/cabrillo.js | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/assets/js/sections/cabrillo.js b/assets/js/sections/cabrillo.js
index 031b5c81..c5a55c18 100644
--- a/assets/js/sections/cabrillo.js
+++ b/assets/js/sections/cabrillo.js
@@ -1,6 +1,6 @@
 function loadContests() {
-    $(".stationinfo").empty();
-    $(".searchinfo").empty();
+    $(".contestname").empty();
+    $(".contestdates").empty();
     $.ajax({
         url: base_url+'index.php/cabrillo/getContests',
         type: 'post',
@@ -22,6 +22,7 @@ function loadContests() {
 }
 
 function loadContestDates() {
+    $(".contestdates").empty();
     $.ajax({
         url: base_url+'index.php/cabrillo/getContestDates',
         type: 'post',
From 1249076d6dba5a6b7e5256249490ca819d1bdd87 Mon Sep 17 00:00:00 2001
From: Andreas <6977712+AndreasK79@users.noreply.github.com>
Date: Wed, 12 Apr 2023 13:25:15 +0200
Subject: [PATCH 03/13] [Cabrillo export] Fixed tablename
---
 application/models/Contesting_model.php | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/application/models/Contesting_model.php b/application/models/Contesting_model.php
index 6d5c2784..7e6dc3f2 100644
--- a/application/models/Contesting_model.php
+++ b/application/models/Contesting_model.php
@@ -197,7 +197,7 @@ class Contesting_model extends CI_Model {
         $station_id = $CI->Stations->find_active();
 
 		$sql = "select col_contest_id, min(date(col_time_on)) mindate, max(date(col_time_on)) maxdate, year(col_time_on) year, month(col_time_on) month
-		from logbook l 
+		from " . $this->config->item('table_name') . " 
 		where coalesce(COL_CONTEST_ID, '') <> '' 
 		and station_id =" . $station_id;
 
@@ -214,7 +214,7 @@ class Contesting_model extends CI_Model {
         $station_id = $CI->Stations->find_active();
 
 		$sql = "select distinct year(col_time_on) year
-		from logbook l 
+		from " . $this->config->item('table_name') . " 
 		where coalesce(COL_CONTEST_ID, '') <> '' 
 		and station_id =" . $station_id;
 
@@ -233,7 +233,7 @@ class Contesting_model extends CI_Model {
         $station_id = $CI->Stations->find_active();
 
 		$sql = "select distinct col_contest_id
-		from logbook l 
+		from " . $this->config->item('table_name') . " 
 		where coalesce(COL_CONTEST_ID, '') <> '' 
 		and station_id =" . $station_id .
 		" and year(col_time_on) ='" . $year . "'";
@@ -254,7 +254,7 @@ class Contesting_model extends CI_Model {
         $station_id = $CI->Stations->find_active();
 
 		$sql = "select min(date(col_time_on)) mindate, max(date(col_time_on)) maxdate
-		from logbook l 
+		from " . $this->config->item('table_name') . " 
 		where coalesce(COL_CONTEST_ID, '') <> '' 
 		and station_id =" . $station_id .
 		" and year(col_time_on) ='" . $year . "' and col_contest_id ='" . $contestid . "'";
From 7423c9eae6a15d54156fdba01088a8e39d4a8a7d Mon Sep 17 00:00:00 2001
From: Andreas <6977712+AndreasK79@users.noreply.github.com>
Date: Wed, 12 Apr 2023 13:31:30 +0200
Subject: [PATCH 04/13] [Cabrillo export] Changed filename
---
 application/views/cabrillo/export.php | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/application/views/cabrillo/export.php b/application/views/cabrillo/export.php
index 3b6226d0..f793d43d 100644
--- a/application/views/cabrillo/export.php
+++ b/application/views/cabrillo/export.php
@@ -1,6 +1,6 @@
 session->userdata('user_callsign').'-'.date('dmY-Hi').'.log"');
+header('Content-Disposition: attachment; filename="'.$callsign.'-'.$contest_id.'-'.date('dmY-Hi').'.cbr"');
 
 $CI =& get_instance();
 $CI->load->library('Cabrilloformat');
From ef3c92d9cf46e27dcce70993887c28a4ae92dda2 Mon Sep 17 00:00:00 2001
From: Andreas <6977712+AndreasK79@users.noreply.github.com>
Date: Wed, 12 Apr 2023 14:24:03 +0200
Subject: [PATCH 05/13] [Cabrillo export] Added station location
---
 application/controllers/Cabrillo.php     | 48 +++++++++++++++++++-----
 application/libraries/Cabrilloformat.php |  6 ++-
 application/models/Contesting_model.php  | 30 +++------------
 application/views/cabrillo/export.php    |  2 +-
 application/views/cabrillo/index.php     | 21 +++++++----
 assets/js/sections/cabrillo.js           | 31 ++++++++++++++-
 6 files changed, 92 insertions(+), 46 deletions(-)
diff --git a/application/controllers/Cabrillo.php b/application/controllers/Cabrillo.php
index 5cf61dde..eb921baf 100644
--- a/application/controllers/Cabrillo.php
+++ b/application/controllers/Cabrillo.php
@@ -9,21 +9,24 @@ if ( ! defined('BASEPATH')) exit('No direct script access allowed');
 
 class Cabrillo extends CI_Controller {
 
-	function __construct()
-	{
+	function __construct() {
 		parent::__construct();
 
 		$this->load->model('user_model');
 		if(!$this->user_model->authorize(2)) { $this->session->set_flashdata('notice', 'You\'re not allowed to do that!'); redirect('dashboard'); }
 	}
 
-    public function index()
-    {
+    public function index() {
         $data['page_title'] = "Export Cabrillo";
 
         $this->load->model('Contesting_model');
+        $this->load->model('stations');
 
-        $data['contestyears'] = $this->Contesting_model->get_logged_years();
+        $data['station_profile'] = $this->stations->all_of_user();
+        $active_station_id = $this->stations->find_active();
+        $station_profile = $this->stations->profile($active_station_id);
+
+		$data['active_station_info'] = $station_profile->row();
 
 		$footerData = [];
 		$footerData['scripts'] = [
@@ -37,7 +40,20 @@ class Cabrillo extends CI_Controller {
 
     public function getContests() {
 		$this->load->model('Contesting_model');
-		$result = $this->Contesting_model->get_logged_contests($this->input->post('year'));
+
+        $station_id = $this->security->xss_clean($this->input->post('station_id'));
+        $year = $this->security->xss_clean($this->input->post('year'));
+		$result = $this->Contesting_model->get_logged_contests($station_id, $year);
+
+		header('Content-Type: application/json');
+		echo json_encode($result);
+    }
+
+    public function getYears() {
+		$this->load->model('Contesting_model');
+        $station_id = $this->security->xss_clean($this->input->post('station_id'));
+
+		$result = $this->Contesting_model->get_logged_years($station_id);
 
 		header('Content-Type: application/json');
 		echo json_encode($result);
@@ -45,7 +61,11 @@ class Cabrillo extends CI_Controller {
 
     public function getContestDates() {
         $this->load->model('Contesting_model');
-		$result = $this->Contesting_model->get_contest_dates($this->input->post('year'), $this->input->post('contestid'));
+        $station_id = $this->security->xss_clean($this->input->post('station_id'));
+        $year = $this->security->xss_clean($this->input->post('year'));
+        $contestid = $this->security->xss_clean($this->input->post('contestid'));
+
+		$result = $this->Contesting_model->get_contest_dates($station_id, $year, $contestid);
 
 		header('Content-Type: application/json');
 		echo json_encode($result);
@@ -56,6 +76,11 @@ class Cabrillo extends CI_Controller {
 		ini_set('memory_limit', '-1');
         $this->load->model('Contesting_model');
 
+        $this->load->model('stations');
+
+        
+
+        $station_id = $this->security->xss_clean($this->input->post('station_id'));
         $contest_id = $this->security->xss_clean($this->input->post('contestid'));
         $fromto = $this->security->xss_clean($this->input->post('contestdates'));
 
@@ -64,10 +89,14 @@ class Cabrillo extends CI_Controller {
         $from = $fromto[0];
         $to = $fromto[1];
 
-		$data['qsos'] = $this->Contesting_model->export_custom($from, $to, $contest_id);
+        $station = $this->stations->profile($station_id);
+
+        $station = $station->row();
+
+		$data['qsos'] = $this->Contesting_model->export_custom($from, $to, $contest_id, $station_id);
 
         $data['contest_id'] = $contest_id;
-        $data['callsign'] = '';
+        $data['callsign'] = $station->station_callsign;
         $data['claimed_score'] = '';
         $data['operators'] = '';
         $data['club'] = '';
@@ -76,6 +105,7 @@ class Cabrillo extends CI_Controller {
         $data['address2'] = '';
         $data['address3'] = '';
         $data['soapbox'] = '';
+        $data['gridlocator'] = $station->station_gridsquare;
 
 		$this->load->view('cabrillo/export', $data);
     }
diff --git a/application/libraries/Cabrilloformat.php b/application/libraries/Cabrilloformat.php
index 4f849c74..b3a060bc 100644
--- a/application/libraries/Cabrilloformat.php
+++ b/application/libraries/Cabrilloformat.php
@@ -2,7 +2,7 @@
 
 class Cabrilloformat {
 
-    public function header($contest_id, $callsign, $claimed_score, $operators, $club, $name, $address1, $address2, $address3, $soapbox) {
+    public function header($contest_id, $callsign, $claimed_score, $operators, $club, $name, $address1, $address2, $address3, $soapbox, $gridlocator) {
         $cab_header = "";
         $cab_header .= "START-OF-LOG: 3.0"."\r\n";
         $cab_header .= "CONTEST: ".$contest_id."\r\n";
@@ -24,6 +24,10 @@ class Cabrilloformat {
         $cab_header .= "ADDRESS: ".$address3."\r\n";
         $cab_header .= "SOAPBOX: ".$soapbox."\r\n";
 
+        if($gridlocator != null) {
+            $cab_header .= "GRID-LOCATOR: ".$gridlocator."\r\n";
+        }
+
         return $cab_header;
 
     }
diff --git a/application/models/Contesting_model.php b/application/models/Contesting_model.php
index 7e6dc3f2..e139d919 100644
--- a/application/models/Contesting_model.php
+++ b/application/models/Contesting_model.php
@@ -161,11 +161,7 @@ class Contesting_model extends CI_Model {
 	    return $query;
 	}
 
-	function export_custom($from, $to, $contest_id) {
-		$CI =& get_instance();
-        $CI->load->model('Stations');
-        $station_id = $CI->Stations->find_active();
-
+	function export_custom($from, $to, $contest_id, $station_id) {
         $this->db->select(''.$this->config->item('table_name').'.*, station_profile.*');
         $this->db->from($this->config->item('table_name'));
         $this->db->where($this->config->item('table_name').'.station_id', $station_id);
@@ -208,10 +204,7 @@ class Contesting_model extends CI_Model {
 		return ($data->result());
 	}
 
-	function get_logged_years() {
-		$CI =& get_instance();
-        $CI->load->model('Stations');
-        $station_id = $CI->Stations->find_active();
+	function get_logged_years($station_id) {
 
 		$sql = "select distinct year(col_time_on) year
 		from " . $this->config->item('table_name') . " 
@@ -222,16 +215,10 @@ class Contesting_model extends CI_Model {
 
 		$data = $this->db->query($sql);
 
-		return ($data->result());
+		return $data->result();
 	}
 
-	function get_logged_contests($year) {
-        $year = $this->security->xss_clean($year);
-
-		$CI =& get_instance();
-        $CI->load->model('Stations');
-        $station_id = $CI->Stations->find_active();
-
+	function get_logged_contests($station_id, $year) {
 		$sql = "select distinct col_contest_id
 		from " . $this->config->item('table_name') . " 
 		where coalesce(COL_CONTEST_ID, '') <> '' 
@@ -245,14 +232,7 @@ class Contesting_model extends CI_Model {
         return $data->result();
     }
 
-	function get_contest_dates($year, $contestid) {
-		$year = $this->security->xss_clean($year);
-		$contestid = $this->security->xss_clean($contestid);
-
-		$CI =& get_instance();
-        $CI->load->model('Stations');
-        $station_id = $CI->Stations->find_active();
-
+	function get_contest_dates($station_id, $year, $contestid) {
 		$sql = "select min(date(col_time_on)) mindate, max(date(col_time_on)) maxdate
 		from " . $this->config->item('table_name') . " 
 		where coalesce(COL_CONTEST_ID, '') <> '' 
diff --git a/application/views/cabrillo/export.php b/application/views/cabrillo/export.php
index f793d43d..d4e5e6f0 100644
--- a/application/views/cabrillo/export.php
+++ b/application/views/cabrillo/export.php
@@ -5,7 +5,7 @@ header('Content-Disposition: attachment; filename="'.$callsign.'-'.$contest_id.'
 $CI =& get_instance();
 $CI->load->library('Cabrilloformat');
 
-echo $CI->cabrilloformat->header($contest_id, $callsign, $claimed_score, $operators, $club, $name, $address1, $address2, $address3, $soapbox);
+echo $CI->cabrilloformat->header($contest_id, $callsign, $claimed_score, $operators, $club, $name, $address1, $address2, $address3, $soapbox, $gridlocator);
 foreach ($qsos->result() as $row) {
 	echo $CI->cabrilloformat->qso($row);
 }
diff --git a/application/views/cabrillo/index.php b/application/views/cabrillo/index.php
index 2c4b4a1f..a002cce3 100644
--- a/application/views/cabrillo/index.php
+++ b/application/views/cabrillo/index.php
@@ -12,17 +12,22 @@
 
 		';
-		  if ($contestyears) { ?>
+
+
+		  if ($station_profile) { ?>