Commit graph

698 commits

Author SHA1 Message Date
Peter Goodhall
52eec73ecc Improve satellite mode label mapping
Enhances satellite mode detection in `Logbook_model` by adding explicit CSS FM cross-band handling based on TX/RX bands and expanding per-satellite mode maps. FM transponder aliases (`V/U`, `U/V`) are now recognized for SO-50/SO-124/SO-125/PO-101, and ISS/ARISS mappings now cover repeater aliases plus `V` as Packet to improve mode label consistency.
2026-08-04 12:52:07 +01:00
Peter Goodhall
9e1b10169e Add OscarWatch status upload controls
Adds full user-setting support for OscarWatch SAT status uploads: new per-user `status_upload` option initialization, save/load wiring, and session hydration. The user edit page now includes an enable/disable selector plus a “Test Token” action that calls a new `validate_oscarwatch_token` controller endpoint to verify tokens against OscarWatch and return clear JSON status messages. Logbook SAT upload logic is updated so AMSAT and OscarWatch uploads are handled independently based on their respective user toggles.
2026-08-03 14:51:19 +01:00
Peter Goodhall
8e0e28cd84 Add OscarWatch SAT status upload support
This adds optional OscarWatch integration for SAT QSOs: users can store an OscarWatch API token in account settings, and Cloudlog now reports SAT status uploads to OscarWatch alongside AMSAT uploads when enabled. It includes payload building, mode remapping for common satellites/modes, timestamp/grid handling, and error logging for failed submissions. The edit flow was also updated to load/save these options for the correct edited user, and the account label was generalized from “AMSAT Status Upload” to “Satellite Status Upload.”
2026-08-03 14:45:59 +01:00
Peter Goodhall
0c9c48779f Notify user on Clublog credential reset
When Clublog returns HTTP 403 (access denied), automatically clear the stored credentials and optionally send the user an email notification with context about the failure. Also sets a session flash warning when the affected user is logged in. Adds an email view template for the notification.
2026-08-02 22:32:50 +01:00
Peter Goodhall
35369a0996 Merge activator call variants
Canonicalize activator callsigns and combine results for variant forms such as portable suffixes and MM/MW prefixes. This updates activator listings, max-grid counts, and contact details to aggregate grids across matching calls while keeping the table output consistently sorted.
2026-07-17 13:49:42 +01:00
Peter Goodhall
2476c65beb Treat empty numeric inputs as NULL
In Logbook_model, only sanitize 'a_index' and 'age' when the input is not an empty string; if filter_var returns an empty string or false, set the variable to NULL. This prevents empty/invalid sanitized values from being treated as valid numeric inputs.
2026-06-09 11:22:01 +01:00
Peter Goodhall
35354db2c5 Check correct flag before clearing cache
Fixes a conditional in Logbook_model.php where the cache-clear check used the wrong variable. The condition now uses $skipexport instead of $skipCacheClear so dashboard cache is skipped appropriately during export operations and cleared otherwise.
2026-05-09 23:52:24 +01:00
Peter Goodhall
77cd61408c Add skipCacheClear option to import
Add a $skipCacheClear parameter to Logbook_model::import() to skip clearing the dashboard cache for each imported record. Bulk import loop now calls import(..., true) and clears the cache once after all records are processed, reducing repeated cache invalidations and improving import performance. Default behavior remains unchanged (parameter defaults to false).
2026-05-09 22:22:40 +01:00
Peter Goodhall
4cfab6fe4e Add plugin system and Plugin Manager
Introduce a plugin framework and management UI: adds Plugin Manager controller, Plugin_awards controller, Plugin_manager and Cloudlog_hooks libraries, Plugins_model, migration (268) to create the plugins table, and views for plugin manager and award pages. Integrates hooks into Logbook_model (qso.filter.before_save, qso.action.after_save, qso.action.after_edit), updates header to show award plugin entries and a Plugin Manager menu link, and bumps migration_version to 268. Also adds .gitignore rules, plugin index placeholder, docs and example plugin packages. The Plugin Manager supports uploading/installing ZIP packages, safe extraction, manifest validation, enable/disable/delete actions, and CSRF protection.
2026-04-29 22:33:22 +01:00
Peter Goodhall
b6a0e0bb91 Fixes SimpleFLE bugs relating to satellite ops
Support multiple comma-separated grids (VUCC) across SimpleFLE. Updated Logbook_model to accept vucc_grids and prefer it over single locator when present. Frontend changes: parse and detect single vs multiple grids, add Grid column to preview table, send both `locator` and `vucc_grids` to the save endpoint, tighten time regex, add qsotime variable, include X band in satellite mode handling, and clear satellite state when switching to a regular band. Documentation and help updated: improved syntax help and added full docs/SimpleFLE.md explaining grids, VUCC usage, satellite handling and other SimpleFLE features.
2026-04-27 22:41:40 +01:00
Peter Goodhall
9913eb08a2 Improve callsign lookup, caching & recent details
Add a cached DXCC lookup and a jsondxcc endpoint to speed up country resolution and reduce DB load (file-cache with 1h TTL). Introduce cached_dxcc_lookup(), build_confirmation_where(), and callsign_status() in the Logbook controller; refactor confirmed_grid_before() and worked_grid_before() to accept logbook relationships and confirmation prefs to avoid redundant queries. Use a new Logbook_model::get_recent_callsign_details() to populate recent name/gridsquare/qth/iota/qsl/state/county values in a single query. Update JS to better manage lookup state, invalidate in-flight requests, and perform a debounced quick DXCC lookup to improve UX. Tweak previous-contacts pagination to a compact sliding window and remove a redundant UI note.
2026-04-13 13:57:03 +01:00
Peter Goodhall
9bbc58d805 Use COL_VUCC_GRIDS as fallback for grids
Prefer COL_GRIDSQUARE when present and fall back to COL_VUCC_GRIDS when building grid information. Added COL_VUCC_GRIDS to select lists in Note model queries and updated Logbook_model to set plot HTML to VUCC grids if gridsquare is missing. Also updated the public station diary view to display VUCC grids in the table when COL_GRIDSQUARE is empty. Files changed: Logbook_model.php, Note.php, public_index.php.
2026-03-29 14:12:25 +01:00
Peter Goodhall
cee6cd2def Refactor DXCC checks; add CW RBN lock UI
Replace inline DB queries in Dxcluster with a new Logbook_model::check_if_dxcc_worked_in_logbook method to centralize DXCC existence checks (per-band and overall). Remove several debug log statements from Dxcluster. Add client-side logic in dxcluster and qso views to enforce a CW↔RBN rule: when mode is 'cw' the "hide RBN" option is forced off and the checkbox is disabled (and restored when leaving CW), and apply that lock on load and mode changes. Also disable track-band when the user manually changes band in the QSO cluster UI.
2026-03-29 13:37:16 +01:00
Peter Goodhall
d847e4819e Add pagination and DXCC tab to previous QSOs
Implement server-side pagination for previous contacts and add a DXCC Summary tab. Controller Qso now uses last_custom_paginated and exposes total_rows/total_pages/current_page/limit. Logbook_model gained last_custom_paginated and last_custom_count to support paged queries. The previous_contacts view was updated with HTMX pagination controls and wrapping for a scrollable table; qso/index was refactored to a tabbed UI (Previous Contacts / DXCC Summary). Lookup result display was improved: responsive table, sticky header, consolidation of LSB/USB into SSB and filtering out empty modes. JS and CSS updates load DXCC HTML into the new tab, hide legacy dxccsummary elements, and add form reset / Escape handling to return focus to the previous contacts tab.
2026-03-26 22:26:47 +00:00
Peter Goodhall
c3a5410805 Normalize county/state fields and use in queries
Normalize COL_CNTY/COL_STATE handling and use normalized expressions in queries to ensure consistent grouping/filtering and avoid mismatches.

- application/models/Counties.php: add normalized SQL expressions (trim/case/substring) and apply them to counting, grouping and ordering queries; filter out empty normalized states and adjust joins to compare normalized values.
- application/models/Logbook_model.php: normalize incoming $county/$state, add dxcc_entities join and selects, and use normalized WHERE clauses (case/trim and substring for 'ST, County' formats); also standardize band filter to COL_BAND != 'SAT'.
- application/views/view_log/partial/log_ajax.php: avoid undefined property notices by checking for name/end on the row object and use those values for Country and Flag display.

These changes address inconsistent imported county/state formats (e.g. "ST, County"), whitespace/case variations, and prevent PHP notices while keeping query semantics intact.
2026-03-24 16:04:23 +00:00
Peter Goodhall
14af3fda19 Support multiple POTA refs, DB + UI
Add support for comma-separated POTA references across the app: bump migration version to 259 and add migration 260 to expand COL_MY_POTA_REF and station_pota to VARCHAR(255). Introduce Pota::split_refs and collect_refs_from_rows to normalize and aggregate multiple refs; refactor Pota counts to compute unique refs per band/mode. Normalize station_pota when saving in Stations and Logbook_model (uses normalize_pota_refs), and adjust POTA search to match refs inside comma-separated values. Update views to render multiple POTA links and hashtags, and add Selectize-based autocomplete for station POTA input on create/edit forms. Also minor change to user_owns_station query (removed user_id where clause).
2026-03-24 14:32:17 +00:00
Peter Goodhall
2537f66d8f Support multi POTA refs in QSO entry and ADIF export 2026-03-24 14:20:17 +00:00
Peter Goodhall
66900a9f86 Add MY_NAME to ADIF exports from user profile (#3391) 2026-03-23 22:43:44 +00:00
Peter Goodhall
5747413a46 AMSAT-Status - Sat name changes
AMSAT has decided to change value names so this fixes it
2026-03-11 11:37:41 +00:00
Peter Goodhall
7ba915e29c Add public QSO map to station diary
Add interactive QSO map support for public station diary entries. Controller: add stationdiary::get_qso_map_data() to return JSON map data for a given entry/date range/logbook with station location. Models: Note::get_public_entry_user_id() to resolve the entry owner; Logbook_model: get_qsos_for_public_map() to query QSOs for the map, set a default stn_loc fallback, and skip markers with invalid 0,0 coordinates. View: public_index.php includes Leaflet CSS/JS, a Show/Hide QSO Map toggle, map container per entry, client-side map initialization and marker/popups loaded via POST to the new endpoint. These changes ensure public diary entries can display QSO locations and the station marker while avoiding bogus markers and limiting results to the correct user/logbook context.
2026-03-09 13:50:34 +00:00
Peter Goodhall
ad81bd81de Support batch updates by primary key
Allow LoTW batch updates to reference QSOs by COL_PRIMARY_KEY for reliable matching. Controller: include 'primary_key' in batch update payloads. Model: collect numeric primary keys, expand WHERE to include COL_PRIMARY_KEY IN (...) alongside the existing datetime/call/band/station match, add early exit/log when no usable keys provided, and build an id-based lookup (qso_map_by_id) to prefer primary-key matches while remaining backward-compatible with the composite key lookup. This reduces ambiguous matches and improves update accuracy.
2026-02-17 15:28:53 +00:00
Peter Goodhall
392a1389d6 Map additional satellite names in Logbook_model
Add mappings for QMR-KWT-2 -> QMR-KWT-2_(RS95S) and Lobachevsky -> Lobachevsky_(RS83S), and introduce conditional APRS name mapping for BOTAN (when COL_MODE == 'PKT') and SONATE-2 (when COL_MODE == 'PKT'). These changes extend satellite name normalization in application/models/Logbook_model.php to handle these satellites and modes.
2026-02-17 14:21:24 +00:00
Peter Goodhall
c57c250b45 Use distinct() and fix station field
In Logbook_model.php, replace select('DISTINCT user_id') with $this->db->distinct(); $this->db->select('user_id') to use CI's distinct API and produce correct SQL. Also correct the where clause to use station_logbooks_relationship.station_location_id instead of station_id so shared-access users are filtered by the proper station location.
2026-02-11 14:16:51 +00:00
Peter Goodhall
41a8849d7e Cache dashboard stats and add DB indexes
Add per-user/logbook file caching for dashboard statistics (15min TTL) and update Dashboard controller to use cached qso, countries, VUCC and QSL queries. Introduce clear_dashboard_cache() in Logbook_model and call it on QSO create/update/delete to invalidate affected users' cache entries. Add migration (249) to create composite indexes (idx_dxcc_stats, idx_vucc_gridsquare, idx_vucc_grids) to improve dashboard query performance, and bump migration_version to 249. Also include generated cache files under application/cache for current stats.
2026-02-11 13:18:52 +00:00
Peter Goodhall
cfa24d9f1a Add LoTW batch updates and performance indexes
Bump migration version to 247 and add a migration that creates performance indexes for LoTW workflows (idx_lotw_qslrdate, idx_lotw_qsos_to_upload, idx_lotw_confirmation_match) to speed common queries. Refactor Lotw controller to collect records in memory, build rows for rendering, and perform a single batch confirmation update via a new Logbook_model::lotw_update_batch() method instead of many individual updates. Implement lotw_update_batch() to look up matching QSOs, perform update_batch() calls, and separately update gridsquares/distances using the Qra library. Simplify LotwCert::toggle_archive_certificate() to toggle archived state with a single UPDATE and return the resulting status.
2026-02-11 11:14:59 +00:00
Peter Goodhall
f01599e6a5 Add indexes and batch processing for uploads
Improve query performance and memory usage by adding a migration to create several indexes and converting various upload/reporting flows to batched processing. Changes include:

- Add migration 245 to create indexes: idx_mode, idx_sat_name, idx_continent, idx_qsl_stats (composite), idx_hrdlog_upload, idx_qrz_upload to speed common queries.
- Bump migration version to 245 in config.
- Hrdlog and Qrz controllers: switch to fetching QSOs in LIMIT/OFFSET batches, process updates in chunks, add logging for batch progress, and use break 2 to stop outer loops on invalid API keys to avoid continuing work.
- Logbook_model:
  - get_hrdlog_qsos and get_qrz_qsos now accept limit/offset and use ORDER BY/LIMIT/OFFSET for batching.
  - Replaced a subquery with a JOIN for grid-based filtering to improve performance.
  - get_modes rewritten to use query builder (distinct/select/order_by).
  - Bulk DXCC updates use update_batch instead of per-row queries.
  - calls_without_station_id limited to 500 results to avoid UI hangs.

Overall goal: prevent memory exhaustion with large datasets and improve database query performance.
2026-02-11 10:59:24 +00:00
Peter Goodhall
1d51b608ae Use direct lotw_users joins instead of subqueries
Replace repeated LEFT OUTER JOIN (SELECT callsign, MAX(lastupload) ...) derived-table joins with simpler LEFT JOIN lotw_users lotw across Distances_model, Logbook_model, Logbookadvanced_model, and Worked_all_britain_model. Also remove an unnecessary DISTINCT/inner station_profile join from an optimized Logbook_model subquery. These changes simplify SQL emitted by the CI query builder, improve compatibility and readability, and may improve performance; note that using direct joins can change which lastupload row is returned if multiple lotw_users rows exist for a callsign.
2026-02-11 10:50:22 +00:00
Peter Goodhall
e6aeee53a1 Add reusable User-Agent helper for QRZ API requests
Introduced a useragent_helper with a function to generate a compliant User-Agent string for Cloudlog, and updated QRZ API calls in Qrz controller and Logbook_model to use this helper. This ensures consistent and QRZ-compliant User-Agent headers for all outgoing requests.
2026-01-09 10:52:37 +00:00
Peter Goodhall
cc1b92cb13 Fix DXCC ID assignment in logbook model
Corrects the logic for assigning DXCC ID when the country is set and dxcc_id is 0 by fetching the DXCC ID from the callsign lookup. This ensures the correct DXCC ID is used in these cases.
2026-01-08 14:29:59 +00:00
Peter Goodhall
e572821b96 Add Personal Propagation Advisor feature
Introduces the Personal Propagation Advisor, allowing users to analyze their own QSO data to determine the best times, bands, and modes for working specific DXCC entities. Adds a new controller, model methods, view, JavaScript, and language strings in multiple languages. Updates navigation and footer to support the new feature.
2026-01-05 22:14:00 +00:00
Peter Goodhall
44fbfd4aab Pass second parameter to getAdifLine in Logbook_model
Updated the call to getAdifLine in Logbook_model to include a second parameter set to true. This may enable additional functionality or formatting in the ADIF line generation for Clublog integration.
2026-01-03 21:34:27 +00:00
Peter Goodhall
b368cba876 Enforce write permissions for QSO modifications
Replaced checks for QSO accessibility with stricter write permission checks across controllers and models. Added a new check_qso_is_writable method to Logbook_model to ensure only authorized users can modify or delete QSOs, including shared logbook scenarios. Updated QSO, Qsl_model, and Sstv_model to use the new permission logic for all write operations.
2025-12-23 11:06:19 +00:00
Peter Goodhall
d9e0fe0900 Improve QSO access checks and error handling
Enhanced the QSO access logic to allow access if the QSO belongs to the user or is part of a user's active logbook, including shared permissions. Added a guard in the controller to prevent accessing missing or inaccessible QSOs, redirecting with a notice if access is denied.
2025-12-20 22:03:12 +00:00
Peter Goodhall
7bdd3386b7 Use latest LoTW upload per callsign in joins
Replaces direct joins to lotw_users with subqueries that select the latest (MAX) lastupload per callsign in Distances_model, Logbook_model, and Logbookadvanced_model. This ensures only the most recent LoTW upload per callsign is joined, improving data accuracy and preventing duplicate join results.
2025-12-02 22:47:19 +00:00
Peter Goodhall
307c87ea48 Optimize LOTW user join in logbook query
Replaces direct join with lotw_users table by joining a subquery that selects the latest lastupload per callsign. This improves performance and ensures only the most recent LOTW upload date is included for each callsign.
2025-12-02 22:43:19 +00:00
Peter Goodhall
e6e1ac4fd8 Add 'B' to csadditions regex for DXCC lookup
Updated the csadditions regular expression in Logbook_model.php and Dxcc.php to include 'B' as a valid suffix for DXCC lookup and call sign parsing. This change ensures callsigns with '/B' are properly recognized in DXCC-related functions.
2025-11-21 17:50:32 +00:00
Peter Goodhall
e51aae79eb Change QSO_LOOKUP table collation to utf8mb4_general_ci
Updated the SQL statement in Logbook_model to use utf8mb4_general_ci collation instead of utf8mb4_unicode_ci for the MEMORY table QSO_LOOKUP. This may improve performance for certain lookup operations.
2025-10-20 17:32:04 +01:00
Peter Goodhall
210953fc7d Reset QSL sent status on QSO edit and update DXCC info
In Logbook_model.php, LoTW and eQSL sent status are reset to 'N' when editing a QSO that was previously sent, ensuring re-upload to these services. In common.js, a handler updates DXCC, location, and state fields when the callsign is changed in the QSO edit modal.
2025-10-19 13:18:24 +01:00
Peter Goodhall
c19868b5ff Refactor VUCC search to use query builder methods
Replaced raw SQL LIKE conditions with CodeIgniter's query builder 'like' and 'or_like' methods for VUCC search cases. This improves code readability and helps prevent SQL injection.
2025-10-18 14:41:02 +01:00
Peter Goodhall
7d64275095 Add input validation and secure queries for VUCC details
Enhanced input validation for gridsquare and band parameters in Awards controller to prevent invalid data and potential abuse. Updated Logbook_model to use parameterized queries and early return for empty logbook relationships, improving security and reliability of VUCC QSO details retrieval.
2025-10-18 11:31:48 +01:00
Peter Goodhall
44a729f335 Optimize QRZ QSO upload/download with batch processing
Improves performance of QRZ QSO upload by batching database updates in the controller and model, reducing the number of individual update queries. Adds a new migration to create indexes supporting QRZ upload/download operations. Refactors QRZ download batch processing to use temporary tables and efficient JOINs for large batch updates, further enhancing speed and scalability.
2025-10-13 15:01:25 +01:00
Peter Goodhall
e6ecfa4f1b Require Clublog username to be a valid email address
Enforces that Clublog usernames are valid email addresses throughout the application, reflecting Clublog's policy change to no longer accept callsigns as usernames. Updates validation in controllers, models, and views, adds a migration to clear non-email usernames, and updates language files in multiple languages to clarify the requirement.
2025-10-13 13:40:56 +01:00
Peter Goodhall
97fc54df91 Improve Clublog realtime upload error handling
Refactored variable names for clarity and added detailed logging for Clublog realtime upload results. Now resets user credentials if a 403 error is returned by the Clublog API, and includes HTTP status code in the response for better error handling.
2025-10-12 21:44:27 +01:00
Peter Goodhall
ad80e94bd3 Optimize LoTW upload with batch QSO updates
Replaces individual QSO update queries with a new mark_lotw_sent_batch() method in Logbook_model for improved performance during LoTW uploads. Updates Lotw controller to use batch updates within a transaction, reducing database load and increasing efficiency for large QSO uploads.
2025-10-11 15:17:51 +01:00
Peter Goodhall
76f002b214 Revert "Add debug output and refactor queries for LoTW and logbook"
This reverts commit 4cad75be43.
2025-10-11 00:11:46 +01:00
Peter Goodhall
4cad75be43 Add debug output and refactor queries for LoTW and logbook
Added extensive debug output and error handling to LoTW upload and download processes for easier troubleshooting. Refactored SQL queries in Logbook_model and Logbookadvanced_model to simplify and optimize data retrieval, replacing subqueries with more direct joins and query builder usage. Removed migration 217_add_performance_indexes.php.
2025-10-11 00:08:03 +01:00
Peter Goodhall
5667437160 Include COL_TIME_ON in subquery for logbook query
Added COL_TIME_ON to the DISTINCT subquery in the logbook model's SQL for improved query accuracy and potential performance benefits.
2025-10-10 23:13:10 +01:00
Peter Goodhall
2a835fea1f Optimize QSO queries with subqueries and improved joins
Refactored SQL queries in Logbook_model and Logbookadvanced_model to use subqueries for filtering and pagination, improving performance and accuracy. Updated joins and selected fields for consistency and to avoid duplicate results, especially when limiting and ordering large datasets.
2025-10-10 23:04:21 +01:00
Peter Goodhall
952007467d Add latitude and longitude to DXCC lookup results
Enhanced the DXCC lookup in Logbook_model to include latitude and longitude in the returned array. Updated API controller to utilize these new fields when returning recent QSOs and callsign lookups, providing more detailed location data in API responses.
2025-09-12 13:14:31 +01:00
Peter Goodhall
b7c065dbdd Add input validation for recent_qsos limit parameter
The recent_qsos API endpoint now validates and sanitizes the $limit parameter, enforcing a default of 10, a minimum of 1, and a maximum of 50. Additionally, get_last_qsos in Logbook_model ensures $num is always an integer to prevent SQL injection.
2025-09-09 14:25:40 +01:00