wavelog/application/models/Adif_data.php

369 lines
15 KiB
PHP
Raw Permalink Normal View History

<?php
class adif_data extends CI_Model {
function export_all_chunked($api_key = null, $from = null, $to = null, $exportLotw = false, $onlyop = null, $offset = 0, $limit = 5000, $backup = false) {
2025-12-05 06:02:17 +00:00
$this->load->model('logbooks_model');
if ($api_key != null) {
$this->load->model('api_model');
if (strpos($this->api_model->access($api_key), 'r') !== false) {
$this->api_model->update_last_used($api_key);
$user_id = $this->api_model->key_userid($api_key);
$logbooks_locations_array = $this->list_station_locations($user_id, $backup);
2026-07-11 16:59:07 +02:00
} else {
return;
2025-12-05 06:02:17 +00:00
}
} else {
$this->load->model('stations');
$logbooks_locations_array = $this->list_station_locations($this->session->userdata('user_id'), $backup);
2025-12-05 06:02:17 +00:00
}
$this->db->select($this->config->item('table_name').'.*, station_profile.*, dxcc_entities.name as station_country');
$this->db->order_by("COL_TIME_ON", "ASC");
$this->db->join('station_profile', 'station_profile.station_id = '.$this->config->item('table_name').'.station_id');
if ($from) {
2026-02-03 11:51:07 +00:00
$this->db->where($this->config->item('table_name').".COL_TIME_ON >= ", $from . ' 00:00:00');
2025-12-05 06:02:17 +00:00
}
if ($to) {
2026-02-03 11:51:07 +00:00
$this->db->where($this->config->item('table_name').".COL_TIME_ON <= ", $to . ' 23:59:59');
2025-12-05 06:02:17 +00:00
}
if ($onlyop) {
$this->db->where("upper(".$this->config->item('table_name').".col_operator)",$onlyop);
}
if ($exportLotw) {
$this->db->group_start();
$this->db->where($this->config->item('table_name').".COL_LOTW_QSL_SENT != 'Y'");
$this->db->or_where($this->config->item('table_name').".COL_LOTW_QSL_SENT", NULL);
$this->db->group_end();
}
$this->db->where_in('station_profile.station_id', $logbooks_locations_array);
$this->db->join('dxcc_entities', 'station_profile.station_dxcc = dxcc_entities.adif');
// Add chunking
$this->db->limit($limit, $offset);
$query = $this->db->get($this->config->item('table_name'));
return $query;
}
2025-12-05 06:02:17 +00:00
function export_all($api_key = null,$from = null, $to = null, $exportLotw = false, $onlyop = null) {
$this->load->model('logbooks_model');
if ($api_key != null) {
$this->load->model('api_model');
if (strpos($this->api_model->access($api_key), 'r') !== false) {
$this->api_model->update_last_used($api_key);
$user_id = $this->api_model->key_userid($api_key);
$logbooks_locations_array = $this->list_station_locations($user_id);
2026-07-11 16:59:07 +02:00
} else {
return;
}
} else {
$this->load->model('stations');
$logbooks_locations_array = $this->list_station_locations($this->session->userdata('user_id'));
}
$this->db->select($this->config->item('table_name').'.*, station_profile.*, dxcc_entities.name as station_country');
$this->db->order_by("COL_TIME_ON", "ASC");
$this->db->join('station_profile', 'station_profile.station_id = '.$this->config->item('table_name').'.station_id');
if ($from) {
2026-02-03 11:51:07 +00:00
$this->db->where($this->config->item('table_name').".COL_TIME_ON >= ", $from . ' 00:00:00');
}
if ($to) {
2026-02-03 11:51:07 +00:00
$this->db->where($this->config->item('table_name').".COL_TIME_ON <= ", $to . ' 23:59:59');
}
if ($onlyop) {
$this->db->where("upper(".$this->config->item('table_name').".col_operator)",$onlyop);
}
if ($exportLotw) {
$this->db->group_start();
$this->db->where($this->config->item('table_name').".COL_LOTW_QSL_SENT != 'Y'");
$this->db->or_where($this->config->item('table_name').".COL_LOTW_QSL_SENT", NULL);
$this->db->group_end();
}
$this->db->where_in('station_profile.station_id', $logbooks_locations_array);
$this->db->join('dxcc_entities', 'station_profile.station_dxcc = dxcc_entities.adif');
$query = $this->db->get($this->config->item('table_name'));
return $query;
}
function list_station_locations($user_id, $backup = false) {
$dkey_opt=$this->user_options_model->get_options('stations',array('option_name'=>'active_log_only','option_key'=>'boolean'), $user_id)->result();
$user_stations_active_log_only = (count($dkey_opt)>0) ? $dkey_opt[0]->option_value : false;
if (!empty($user_stations_active_log_only) && !$backup) {
$locations_array = $this->logbooks_model->list_logbook_relationships($this->logbooks_model->find_active_station_logbook_from_userid($user_id));
} else {
$this->db->where('user_id', $user_id);
$query = $this->db->get('station_profile');
if ($query->num_rows() == 0) {
return array();
}
$locations_array = array();
foreach ($query->result() as $row) {
array_push($locations_array, $row->station_id);
}
}
return $locations_array;
}
function export_printrequested($station_id = NULL) {
$this->load->model('stations');
$active_station_id = $this->stations->find_active();
$this->db->select($this->config->item('table_name').'.*, station_profile.*, dxcc_entities.name as station_country');
Remove redundant country colum in station_profile Squashed commit of the following: commit 29e5f5118a1c3f8deb623e5948c3b7602241792d Merge: 566b390d e0a04cbe Author: phl0 <github@florian-wolters.de> Date: Mon Apr 24 23:28:31 2023 +0200 Merge remote-tracking branch 'upstream/dev' into removeRedundantDxccNames commit 566b390d8b0322b32f4438994354ce902010c0d4 Author: phl0 <github@florian-wolters.de> Date: Mon Apr 24 23:18:28 2023 +0200 Refactor reassign function to use DXCC name from dxcc_entities commit 2e50b34c1bdb9bb087e0e0d16f13c340c15588fb Author: phl0 <github@florian-wolters.de> Date: Mon Apr 24 22:05:12 2023 +0200 Use DXCC name from DXCC entities upon import commit d2b1d895818777747db593848b855819f53ffe6d Author: phl0 <github@florian-wolters.de> Date: Mon Apr 24 21:18:53 2023 +0200 Add DB migration script commit 0ecf4b8d9cf0253c1f818a252f7ae83722254544 Author: phl0 <github@florian-wolters.de> Date: Mon Apr 24 18:16:55 2023 +0200 Fix export function for requests QSLs commit 51d2c5c6175a8e8c69b9edd57d6f1e95c4a03600 Author: phl0 <github@florian-wolters.de> Date: Mon Apr 24 17:53:50 2023 +0200 Fix webadif/qrz upload commit 45039a6b1284d1a23f610fc70a39ef25ce720cab Author: phl0 <github@florian-wolters.de> Date: Mon Apr 24 17:32:40 2023 +0200 Fix lotw_export function commit 1306225d027cacbe70e510fd0fc5d3ca5040c35e Author: phl0 <github@florian-wolters.de> Date: Mon Apr 24 17:21:37 2023 +0200 Fix SIG export function commit 082798a80d8bb446500dcbadfa4912c510e4a458 Author: phl0 <github@florian-wolters.de> Date: Mon Apr 24 17:01:42 2023 +0200 Fix SAT export functions commit 2f035afaa3d3c74ca811c96c66f7bf9726b31a78 Merge: 87555f20 d6139439 Author: phl0 <github@florian-wolters.de> Date: Mon Apr 24 16:52:43 2023 +0200 Merge remote-tracking branch 'upstream/dev' into removeRedundantDxccNames commit 87555f201817fb963be117ab193d42bc03889972 Author: phl0 <github@florian-wolters.de> Date: Thu Apr 20 23:54:14 2023 +0200 Use DXCC entity name from dxcc_entities in ADIF export commit e2fd1c5eb9b7e3257ed016814719bc7f9b913587 Author: phl0 <github@florian-wolters.de> Date: Thu Apr 20 23:36:16 2023 +0200 Make logbooks use DXCC name from entities table commit 463057523dacbc34a545f0d9f720f2c29c9883a7 Author: phl0 <github@florian-wolters.de> Date: Thu Apr 20 23:01:58 2023 +0200 Use DXCC name from separate table in QSO view commit 62b8f7aed8c1dca426b055eb7af6360106fc022b Author: phl0 <github@florian-wolters.de> Date: Thu Apr 20 18:21:57 2023 +0200 Add table join to station profile lookup commit 0afe155f46f1fcd227446166b215a98729494dc8 Author: phl0 <github@florian-wolters.de> Date: Thu Apr 20 18:13:35 2023 +0200 Remove country name from edit functions commit ecb3689a0a73f0cc9c5ca7eba5dec7df5f9fbcd1 Author: phl0 <github@florian-wolters.de> Date: Thu Apr 20 18:07:58 2023 +0200 Remove station_country parameter commit 22c350a585a3ff95d1d0b1f49dbe8ca310bdaf85 Author: phl0 <github@florian-wolters.de> Date: Thu Apr 20 17:59:24 2023 +0200 Use DXCC name from dxcc_entitites table
2023-04-25 00:13:49 +02:00
if ($station_id == NULL) {
$this->db->where($this->config->item('table_name').'.station_id', $active_station_id);
} else if ($station_id != 'All') {
$this->db->where($this->config->item('table_name').'.station_id', $station_id);
}
$this->db->join('station_profile', 'station_profile.station_id = '.$this->config->item('table_name').'.station_id');
$this->db->join('dxcc_entities', 'station_profile.station_dxcc = dxcc_entities.adif');
// always filter user. this ensures that even if the station_id is from another user no inaccesible QSOs will be returned
$this->db->where('station_profile.user_id', $this->session->userdata('user_id'));
$this->db->where_in('COL_QSL_SENT', array('R', 'Q'));
$this->db->order_by("COL_TIME_ON", "ASC");
$query = $this->db->get($this->config->item('table_name'));
return $query;
}
function sat_all($onlyop = null) {
$this->load->model('stations');
$active_station_id = $this->stations->find_active();
2020-04-08 14:53:20 +01:00
$this->db->select(''.$this->config->item('table_name').'.*, station_profile.*, dxcc_entities.name as station_country');
$this->db->from($this->config->item('table_name'));
$this->db->where($this->config->item('table_name').'.station_id', $active_station_id);
$this->db->where($this->config->item('table_name').'.COL_PROP_MODE', 'SAT');
2020-04-08 14:53:20 +01:00
if ($onlyop) {
$this->db->where("upper(".$this->config->item('table_name').".col_operator)",$onlyop);
}
$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');
$this->db->join('dxcc_entities', 'station_profile.station_dxcc = dxcc_entities.adif', 'left outer');
return $this->db->get();
}
function satellte_lotw($onlyop = null) {
$this->load->model('stations');
$active_station_id = $this->stations->find_active();
$this->db->select(''.$this->config->item('table_name').'.*, station_profile.*, dxcc_entities.name as station_country');
$this->db->from($this->config->item('table_name'));
$this->db->where($this->config->item('table_name').'.station_id', $active_station_id);
$this->db->where($this->config->item('table_name').'.COL_PROP_MODE', 'SAT');
if ($onlyop) {
$this->db->where("upper(".$this->config->item('table_name').".col_operator)",$onlyop);
}
$where = $this->config->item('table_name').".COL_LOTW_QSLRDATE IS NOT NULL";
$this->db->where($where);
$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');
$this->db->join('dxcc_entities', 'station_profile.station_dxcc = dxcc_entities.adif', 'left outer');
return $this->db->get();
}
2025-12-05 06:57:14 +00:00
function export_custom_chunked($from, $to, $station_id, $exportLotw = false, $onlyop = null, $offset = 0, $limit = 5000) {
// Copy export_custom logic but add chunking for station_id > 0
$this->load->model('Stations');
if ($station_id == 0) {
// Use existing chunked export_all for all stations
return $this->export_all_chunked(null, $from, $to, $exportLotw, $onlyop, $offset, $limit);
}
// Check station access
if (!$this->Stations->check_station_is_accessible($station_id)) {
return;
}
// Build query identical to export_custom but add LIMIT/OFFSET
$this->db->select(''.$this->config->item('table_name').'.*, station_profile.*, dxcc_entities.name as station_country');
$this->db->from($this->config->item('table_name'));
$this->db->where($this->config->item('table_name').'.station_id', $station_id);
// Apply same filters as export_custom
if ($from) {
2026-02-03 11:51:07 +00:00
$this->db->where($this->config->item('table_name').".COL_TIME_ON >= ", $from . ' 00:00:00');
2025-12-05 06:57:14 +00:00
}
if ($to) {
2026-02-03 11:51:07 +00:00
$this->db->where($this->config->item('table_name').".COL_TIME_ON <= ", $to . ' 23:59:59');
2025-12-05 06:57:14 +00:00
}
if ($onlyop) {
$this->db->where("upper(".$this->config->item('table_name').".col_operator)",$onlyop);
}
if ($exportLotw) {
$this->db->group_start();
$this->db->where($this->config->item('table_name').".COL_LOTW_QSL_SENT != 'Y'");
$this->db->or_where($this->config->item('table_name').".COL_LOTW_QSL_SENT", NULL);
$this->db->group_end();
}
$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');
$this->db->join('dxcc_entities', 'station_profile.station_dxcc = dxcc_entities.adif', 'left outer');
// Add chunking
$this->db->limit($limit, $offset);
return $this->db->get();
}
function export_custom($from, $to, $station_id, $exportLotw = false, $onlyop = null) {
// be sure that station belongs to user
$this->load->model('Stations');
if ($station_id == 0) {
return $this->export_all($api_key = null,$from, $to, $exportLotw);
} else {
if (!$this->Stations->check_station_is_accessible($station_id)) {
return;
}
$this->db->select(''.$this->config->item('table_name').'.*, station_profile.*, dxcc_entities.name as station_country');
$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) {
2026-02-03 11:51:07 +00:00
$this->db->where($this->config->item('table_name').".COL_TIME_ON >= ", $from . ' 00:00:00');
}
if ($to) {
2026-02-03 11:51:07 +00:00
$this->db->where($this->config->item('table_name').".COL_TIME_ON <= ", $to . ' 23:59:59');
}
if ($onlyop) {
$this->db->where("upper(".$this->config->item('table_name').".col_operator)",$onlyop);
}
if ($exportLotw) {
$this->db->group_start();
$this->db->where($this->config->item('table_name').".COL_LOTW_QSL_SENT != 'Y'");
$this->db->or_where($this->config->item('table_name').".COL_LOTW_QSL_SENT", NULL);
$this->db->group_end();
}
$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');
$this->db->join('dxcc_entities', 'station_profile.station_dxcc = dxcc_entities.adif', 'left outer');
return $this->db->get();
}
}
function export_past_id_chunked($station_ids, $fetchfromid, $limit, $onlyop = null, $offset = 0, $chunk_size = 5000, $qsl_filter = null, $band = null) {
2026-04-01 07:55:00 +00:00
$tbl = $this->config->item('table_name');
//normalize to array of ints (accepts legacy scalar as well)
if (!is_array($station_ids)) {
$station_ids = [$station_ids];
}
$station_ids = array_map('intval', $station_ids);
if (empty($station_ids)) {
return $this->db->query("SELECT * FROM {$tbl} WHERE 1=0");
}
$placeholders = implode(', ', array_fill(0, count($station_ids), '?'));
2026-04-01 07:55:00 +00:00
$sql = "SELECT {$tbl}.*, station_profile.*, dxcc_entities.name AS station_country
FROM {$tbl}
JOIN station_profile ON station_profile.station_id = {$tbl}.station_id
LEFT OUTER JOIN dxcc_entities ON station_profile.station_dxcc = dxcc_entities.adif
WHERE {$tbl}.station_id IN ({$placeholders})
2026-04-01 07:55:00 +00:00
AND {$tbl}.COL_PRIMARY_KEY > ?";
$bindings = array_merge($station_ids, [$fetchfromid]);
2025-12-05 06:57:14 +00:00
if ($onlyop) {
2026-04-01 07:55:00 +00:00
$sql .= " AND UPPER({$tbl}.col_operator) = ?";
$bindings[] = $onlyop;
}
2026-04-01 07:55:00 +00:00
if (!empty($qsl_filter)) {
$col_map = [
'lotw' => 'COL_LOTW_QSL_RCVD',
'qsl' => 'COL_QSL_RCVD',
'eqsl' => 'COL_EQSL_QSL_RCVD',
'clublog' => 'COL_CLUBLOG_QSO_DOWNLOAD_STATUS',
];
$clauses = [];
foreach ($qsl_filter as $method) {
if (!isset($col_map[$method])) continue;
$clauses[] = "{$tbl}.{$col_map[$method]} = 'Y'";
}
$sql .= " AND (" . implode(" OR ", $clauses) . ")";
}
2025-12-05 06:57:14 +00:00
2026-04-01 09:04:04 +00:00
if ($band !== null) {
if ($band === 'SAT') {
$sql .= " AND {$tbl}.COL_PROP_MODE = ?";
} else {
$sql .= " AND {$tbl}.COL_BAND = ? AND ({$tbl}.COL_PROP_MODE = '' OR {$tbl}.COL_PROP_MODE is null)";
}
$bindings[] = $band;
}
2026-04-01 07:55:00 +00:00
$sql .= " ORDER BY {$tbl}.COL_PRIMARY_KEY ASC LIMIT ? OFFSET ?";
$bindings[] = (int)$chunk_size;
$bindings[] = (int)$offset;
2026-04-01 07:55:00 +00:00
return $this->db->query($sql, $bindings);
}
function export_lotw($onlyop = null) {
$this->load->model('stations');
$active_station_id = $this->stations->find_active();
$this->db->select(''.$this->config->item('table_name').'.*, station_profile.*, dxcc_entities.name as station_country');
$this->db->from($this->config->item('table_name'));
$this->db->where($this->config->item('table_name').'.station_id', $active_station_id);
if ($onlyop) {
$this->db->where("upper(".$this->config->item('table_name').".col_operator)",$onlyop);
}
$this->db->group_start();
$this->db->where($this->config->item('table_name').".COL_LOTW_QSL_SENT != 'Y'");
$this->db->or_where($this->config->item('table_name').".COL_LOTW_QSL_SENT", NULL);
$this->db->group_end();
$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');
$this->db->join('dxcc_entities', 'station_profile.station_dxcc = dxcc_entities.adif', 'left outer');
return $this->db->get();
}
function sig_all($type) {
$CI =& get_instance();
$CI->load->model('logbooks_model');
$logbooks_locations_array = $CI->logbooks_model->list_logbook_relationships($this->session->userdata('active_station_logbook'));
Remove redundant country colum in station_profile Squashed commit of the following: commit 29e5f5118a1c3f8deb623e5948c3b7602241792d Merge: 566b390d e0a04cbe Author: phl0 <github@florian-wolters.de> Date: Mon Apr 24 23:28:31 2023 +0200 Merge remote-tracking branch 'upstream/dev' into removeRedundantDxccNames commit 566b390d8b0322b32f4438994354ce902010c0d4 Author: phl0 <github@florian-wolters.de> Date: Mon Apr 24 23:18:28 2023 +0200 Refactor reassign function to use DXCC name from dxcc_entities commit 2e50b34c1bdb9bb087e0e0d16f13c340c15588fb Author: phl0 <github@florian-wolters.de> Date: Mon Apr 24 22:05:12 2023 +0200 Use DXCC name from DXCC entities upon import commit d2b1d895818777747db593848b855819f53ffe6d Author: phl0 <github@florian-wolters.de> Date: Mon Apr 24 21:18:53 2023 +0200 Add DB migration script commit 0ecf4b8d9cf0253c1f818a252f7ae83722254544 Author: phl0 <github@florian-wolters.de> Date: Mon Apr 24 18:16:55 2023 +0200 Fix export function for requests QSLs commit 51d2c5c6175a8e8c69b9edd57d6f1e95c4a03600 Author: phl0 <github@florian-wolters.de> Date: Mon Apr 24 17:53:50 2023 +0200 Fix webadif/qrz upload commit 45039a6b1284d1a23f610fc70a39ef25ce720cab Author: phl0 <github@florian-wolters.de> Date: Mon Apr 24 17:32:40 2023 +0200 Fix lotw_export function commit 1306225d027cacbe70e510fd0fc5d3ca5040c35e Author: phl0 <github@florian-wolters.de> Date: Mon Apr 24 17:21:37 2023 +0200 Fix SIG export function commit 082798a80d8bb446500dcbadfa4912c510e4a458 Author: phl0 <github@florian-wolters.de> Date: Mon Apr 24 17:01:42 2023 +0200 Fix SAT export functions commit 2f035afaa3d3c74ca811c96c66f7bf9726b31a78 Merge: 87555f20 d6139439 Author: phl0 <github@florian-wolters.de> Date: Mon Apr 24 16:52:43 2023 +0200 Merge remote-tracking branch 'upstream/dev' into removeRedundantDxccNames commit 87555f201817fb963be117ab193d42bc03889972 Author: phl0 <github@florian-wolters.de> Date: Thu Apr 20 23:54:14 2023 +0200 Use DXCC entity name from dxcc_entities in ADIF export commit e2fd1c5eb9b7e3257ed016814719bc7f9b913587 Author: phl0 <github@florian-wolters.de> Date: Thu Apr 20 23:36:16 2023 +0200 Make logbooks use DXCC name from entities table commit 463057523dacbc34a545f0d9f720f2c29c9883a7 Author: phl0 <github@florian-wolters.de> Date: Thu Apr 20 23:01:58 2023 +0200 Use DXCC name from separate table in QSO view commit 62b8f7aed8c1dca426b055eb7af6360106fc022b Author: phl0 <github@florian-wolters.de> Date: Thu Apr 20 18:21:57 2023 +0200 Add table join to station profile lookup commit 0afe155f46f1fcd227446166b215a98729494dc8 Author: phl0 <github@florian-wolters.de> Date: Thu Apr 20 18:13:35 2023 +0200 Remove country name from edit functions commit ecb3689a0a73f0cc9c5ca7eba5dec7df5f9fbcd1 Author: phl0 <github@florian-wolters.de> Date: Thu Apr 20 18:07:58 2023 +0200 Remove station_country parameter commit 22c350a585a3ff95d1d0b1f49dbe8ca310bdaf85 Author: phl0 <github@florian-wolters.de> Date: Thu Apr 20 17:59:24 2023 +0200 Use DXCC name from dxcc_entitites table
2023-04-25 00:13:49 +02:00
$this->db->select(''.$this->config->item('table_name').'.*, station_profile.*, dxcc_entities.name as station_country');
$this->db->from($this->config->item('table_name'));
$this->db->where_in($this->config->item('table_name').'.station_id', $logbooks_locations_array);
$this->db->where($this->config->item('table_name').'.COL_SIG', $type);
$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');
$this->db->join('dxcc_entities', 'station_profile.station_dxcc = dxcc_entities.adif', 'left outer');
return $this->db->get();
}
}
?>