Commit graph

1701 commits

Author SHA1 Message Date
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
d4a7e4cfac Batch eQSL updates and add indexes
Add batch processing for eQSL imports/exports and introduce performance indexes. Bump migration_version to 248 and add Migration_add_eqsl_performance_indexes to create idx_eqsl_qslrdate and idx_eqsl_confirmation_match indexes to speed up eQSL queries and batch matching. Modify Eqsl controller to collect successful uploads and perform a single batch mark-as-sent update. Update EqslImporter to queue confirmations and run a single batch update at the end. Implement eqsl_update_batch() and eqsl_mark_sent_batch() in Eqslmethods_model to perform efficient batch DB operations and logging, reducing per-record queries for large eQSL operations.
2026-02-11 11:32:25 +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
2cb8d62860 Add gridsquare prefix index and optimizations
Bump migration version and add a new migration (246) to create/drop a 4-char prefix index on COL_GRIDSQUARE to speed LIKE queries; migration 245 now also drops the prefix index if present. Add Stations::user_owns_station and use it in Logbookadvanced_model to avoid N+1 station lookups. Add caching to Logbooks_model::list_logbook_relationships to prevent redundant queries. Optimize Oqrs_model queries to select only needed columns for several methods. Add Stats::getUniqueCallsignsConsolidated to combine multiple unique-callsign groupings into a single set of queries for better performance. Database debug toggles added where appropriate.
2026-02-11 11:09:39 +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
c556a42892 Add advanced filtering and stats to WWFF awards page
Enhanced the WWFF awards page with band, mode, and QSL type filters, quick preset buttons, and a summary section showing worked/confirmed parks and milestone progress. Updated the controller to handle filter input and summary data, and extended the model with methods for filtered queries and statistics.
2026-01-21 17:36:18 +00:00
Peter Goodhall
e85e18018e Enhance WAJA award page with filters and stats
Added collapsible filter panel with quick preset buttons, improved form layout, and a new statistics summary section showing WAJA progress and milestones. Prefecture names in the table are now clickable to view QSOs. Updated SQL queries in the Waja model to use the correct band key and improved SAT handling.
2026-01-21 17:31:32 +00:00
Peter Goodhall
2d9c4182d2 Add SIG award filters and translations
Introduces filtering by band, mode, and confirmation status to the SIG awards section in Awards.php, including a filter summary helper. Updates all supported language files to add translations for the new SIG award filters, table headers, and related UI elements.
2026-01-21 17:15:01 +00:00
Peter Goodhall
2a2f62ccbc Add filtering and localization to WAB award view
Introduces band, mode, and confirmed-only filters to the Worked All Britain (WAB) award view and details AJAX endpoint. Updates the controller, model, and view logic to support filtering, and adds new localized strings for WAB award UI elements in multiple languages. Also ensures the correct script is loaded for the WAB section and improves the Bands model to check for field existence before filtering by award.
2026-01-21 16:54:24 +00:00
Peter Goodhall
8b819d2177 Refactor and enhance SOTA awards support
Replaces the old SOTA model with a new Sota_model, adds CSV-based summit metadata caching, and introduces new controller endpoints and view components for SOTA table, stats, and map fragments. The SOTA award page now supports filtering, improved statistics, and interactive mapping using summit coordinates. Updates .gitignore to include the new SOTA CSV, and refactors SOTA data refresh logic for reliability and maintainability.
2026-01-13 13:35:11 +00:00
Peter Goodhall
a59bf0ce35 Fix SQL query to use 'in' for station_id comparison
Updated the SQL query to use 'station_id in (...)' instead of 'station_id = ...' in the subquery, ensuring correct filtering when multiple station IDs are provided.
2026-01-13 10:45:52 +00:00
Peter Goodhall
2f917c8bcf Add advanced POTA awards dashboard with filtering and map
Introduces a new POTA awards dashboard with HTMX-powered filtering, statistics, progress bars, and a Leaflet map of worked parks. Adds new controller endpoints, model methods for filtered queries and park metadata, and modular view components for table, stats, progress, and map. Updates language files for new stats labels and enhances the update process to cache the full POTA parks CSV for richer features.
2026-01-10 15:08:22 +00:00
Peter Goodhall
eb03e364d5 Add editable created date to note editing
Introduces a 'Created Date' field to the note edit form, allowing users to set or update the creation date of a note. The model is updated to handle and save the optional 'created_at' value when provided.
2026-01-09 16:37:11 +00:00
Peter Goodhall
ae97ef5152 Add created_at to notes and enable date filtering
Introduces a migration to add a created_at timestamp to the notes table. Updates the Note model and Notes controller to support filtering notes by creation date, and enhances the notes view to include date filter fields and display the created date for each note. Migration version is incremented to 242.
2026-01-09 16:13:57 +00:00
Peter Goodhall
5c5bdf2f2f Add categories and management to notes feature
Introduces note categories with support for filtering, assigning, and managing categories. Adds category selection and creation to add/edit forms, category filtering to the notes list, and modals for deleting/merging categories and confirming note deletion. Updates controller and model logic to handle categories, and improves UI for notes management.
2026-01-09 13:17:56 +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
6080db9e23 Improve distances UI and add caching for statistics
Refactored the distances filter form for better layout and usability, added a reset button, and enhanced the display of statistics with metric cards. Implemented session-based caching in Distances_model to reduce repeated calculations and speed up responses. Updated JavaScript to auto-load charts, show loading spinners, and improve error handling and dynamic UI updates.
2026-01-06 22:48:26 +00:00
Peter Goodhall
d597e2e83b Add DXCC statistics and continent breakdown
Introduces DXCC statistics and continent breakdown features to the awards page, including new controller endpoints for DXCC QSOs, QSOs by status, and continent QSOs. Updates the DXCC model to provide continent and milestone statistics, and enhances the awards view with summary cards, continent progress, table search, sorting, and modal dialogs for QSO details.
2026-01-06 22:34:05 +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
1583590ecf Improve logbook ownership checks and permissions
Updated Logbooks controller to use profile_clean for station lookup and added a notice for missing stations. Enhanced Setup_model to count logbooks a user owns or has permissions for, ensuring accurate logbook statistics for users with shared access.

Fixes #3389
2025-12-20 21:50:21 +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
0848a9b4c0 Add open registration and public signup feature
Introduces open registration settings in the options area, allowing administrators to enable or disable public user signup. Adds a registration options page, updates sidebar navigation, and implements a public signup form and controller logic. Also refines user model to ensure correct data types for user fields and updates language strings for registration. The login page now links to signup when open registration is enabled.
2025-12-02 18:10:37 +00:00
Peter Goodhall
88f328581b Added Awards Settings 2025-12-02 13:32:11 +00:00
Peter Goodhall
2236d4360b Ensure user callsign is stored in uppercase
Updated User_model to store user_callsign in uppercase using strtoupper when creating or updating users. Also added a style to the edit form input to visually enforce uppercase entry for callsign.
2025-11-24 14:22:34 +00:00
Peter Goodhall
a5dc268b72 Handle unauthenticated user in Logbooks_model queries
Added checks to return empty results when no user is logged in, preventing SQL errors and ensuring consistent behavior for unauthenticated access in logbook-related queries.
2025-11-23 10:57:27 +00:00
Peter Goodhall
fb4f3877de Implement natural callsign sorting in label queries
Replaces standard callsign ordering with natural sorting by splitting callsigns into prefix, number (padded), and suffix. This improves the order of QSO label results for better readability and organization.
2025-11-22 17:21:00 +00:00
Peter Goodhall
476b59abc4 Add logbook sharing email notification
Introduces email notifications when a logbook is shared with a new user, including a new email template and improved error logging for email sending. Also enhances the test email UI with a loading spinner and updates error messages for better clarity.
2025-11-22 15:09:44 +00:00
Peter Goodhall
f2b8a3eeaa Redirect to edit page after logbook creation
After creating a new logbook, users are now redirected to the edit page for the newly created logbook instead of the logbooks list. The add method in Logbooks_model now returns the new logbook ID to support this change.
2025-11-22 14:38:53 +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
b287af642b Add multi-user logbook sharing and permissions
Introduces logbook sharing with read, write, and admin permission levels via a new station_logbooks_permissions table and related migration. Updates controllers, models, and views to support managing collaborators, restricts sensitive actions to owners/admins, and adds UI for sharing management. Also adds user lookup by callsign and improves logbook/station location access logic.
2025-11-19 15:37:34 +00:00
Peter Goodhall
d9e0504e7a Improve error handling for DXpedition data fetch
Added error checks when fetching DXpedition data in Workabledxcc_model and updated Dashboard controller to only sort valid records. The upcoming_dxccs view now displays a warning message if an error occurs, improving user feedback and robustness.
2025-11-18 13:14:41 +00:00
Peter Goodhall
45528ee293 Add new gridsquares by band to monthly report
Introduces per-band breakdown of new gridsquares in the monthly report, including model, controller, and view changes. The report now displays new gridsquares grouped by band, as well as improved details for new DXCCs and satellite activity breakdowns.
2025-11-14 17:49:25 +00:00
Peter Goodhall
4e657094f8 Separate SAT/EME DXCC reporting from band-based stats
Updated Monthlyreport_model to distinguish Satellite and EME DXCC entities from terrestrial bands, grouping them separately and including callsign/mode details. Modified report view to filter and display terrestrial, satellite, and EME DXCCs in distinct sections with improved formatting and additional QSO info.
2025-11-14 17:40:27 +00:00
Peter Goodhall
1ee55d3739 Add mode and satellite info to monthly report
Enhances the monthly report to display QSO mode and satellite name for new DXCCs and grids. Adds a satellite breakdown table showing QSOs per satellite and their percentage of total satellite QSOs. Improves data structure in the model to support these features and updates the view for clearer presentation.
2025-11-14 17:33:08 +00:00
Peter Goodhall
f7e03cc52b Optimize grid 'new' checks with historical data caching
Replaced repeated database queries for grid 'new' checks with pre-built in-memory caches, significantly improving performance by reducing hundreds of queries to a few. Added build_historical_caches() to load all relevant historical grid data at once and refactored is_grid_new, is_grid_new_for_prop, and is_grid_new_for_hf to use these caches for instant lookups.
2025-11-14 17:13:11 +00:00
Peter Goodhall
36ae819a22 Show callsign for new DXCC and grid entries in report
Adds callsign information to new DXCC and grid entries in the monthly report, both in the backend data and frontend display. Also updates JSON export to include a filename for downloads. This provides more detailed context for each new entity or grid worked during the month.
2025-11-14 17:11:18 +00:00
Peter Goodhall
4449a91634 Improve grid newness checks for VUCC and gridsquare
Refactored is_grid_new, is_grid_new_for_prop, and is_grid_new_for_hf to more accurately check for new grids by matching the first 4 characters of COL_GRIDSQUARE and parsing COL_VUCC_GRIDS. This ensures grids are not considered new if present in either field, improving report accuracy.
2025-11-14 16:54:00 +00:00
Peter Goodhall
ad6dd809bb Normalize gridsquare processing to 4 characters
Updated gridsquare and VUCC grid handling to consistently use only the first 4 characters in all relevant methods. Also modified country selection to use MAX(COL_COUNTRY) and group by COL_DXCC for improved aggregation.
2025-11-14 16:46:58 +00:00
Peter Goodhall
03390ed2e8 Optimize DXCC entity queries in monthly report model
Replaced use of distinct() with MAX(COL_COUNTRY) in select statements to group DXCC entities more efficiently. This change improves query performance and ensures correct aggregation of country names in monthly report generation.
2025-11-14 16:41:55 +00:00
Peter Goodhall
66e2376ac4 Add monthly report feature for amateur radio activity
Introduces a new Monthlyreport controller, model, and views to generate comprehensive monthly activity reports for amateur radio logbooks. The feature includes summary statistics, new DXCC entities and gridsquares, breakdowns by mode, band, and propagation, and export options in JSON and text formats for AI/blog post generation. Also adds a navigation link to the header for easy access.
2025-11-14 16:39:56 +00:00
Peter Goodhall
63ec8ff1c4 Add bulk satellite assignment to logbook entries
Introduces functionality to assign satellite information to multiple QSOs in Logbook Advanced. Adds controller and model methods for updating satellite data, a new view for satellite selection, and corresponding frontend logic to handle user interaction and update selected entries.
2025-11-07 15:28:18 +00:00