Merge pull request #2552 from AndreasK79/adif_date_fence

[ADIF Import] More fences for INVALID DATA
This commit is contained in:
Andreas Kristiansen
2025-11-23 15:28:58 +01:00
committed by GitHub

View File

@@ -4591,6 +4591,12 @@ class Logbook_model extends CI_Model {
$my_error = "";
if (validateADIFDate($record['qso_date']) != true) {
log_message("Error", "Trying to import QSO with invalid date: " . $record['qso_date']. " for station_id " . $station_id . ". Call: " . ($record['call'] ?? '') . " Mode: " . ($record['mode'] ?? '') . " Band: " . ($record['band'] ?? ''));
$returner['error']=__("QSO on")." ".$record['qso_date'].": ".__("You tried to import a QSO without valid date. This QSO wasn't imported. It's invalid") . "<br>";
return($returner);
}
// Join date+time
$time_on = date('Y-m-d', strtotime($record['qso_date'] ?? '1970-01-01')) . " " . date('H:i:s', strtotime($record['time_on'] ?? '00:00:00'));
@@ -4645,7 +4651,7 @@ class Logbook_model extends CI_Model {
if (($band ?? '') == '') {
log_message("Error", "Trying to import QSO without Band for station_id " . $station_id . ". QSO Date/Time: " . $time_on . " at ".($record['freq'] ?? 'N/A')." Mode: " . ($record['mode'] ?? '') . " Call: " . ($record['call'] ?? ''));
$returner['error']=sprintf(__("QSO on %s: You tried to import a QSO without any given Band. This QSO wasn't imported. It's invalid"),$time_on);
$returner['error']=sprintf(__("QSO on %s: You tried to import a QSO without any given Band. This QSO wasn't imported. It's invalid"), $time_on);
return($returner);
}
@@ -5000,13 +5006,11 @@ class Logbook_model extends CI_Model {
// lotw_qslrdate can obly be valid if lotw_qsl_rcvd is one of the following values
// ref: https://www.adif.org.uk/316/ADIF_316.htm#QSO_Field_LOTW_QSLRDATE
$valid_lotw_rcvd = ['Y', 'I', 'V'];
if (($record['lotw_qslrdate'] ?? '') != '' && in_array(strtoupper($input_lotw_qsl_rcvd), $valid_lotw_rcvd)) {
if (($record['lotw_qslrdate'] ?? '') != '' && in_array(strtoupper($input_lotw_qsl_rcvd ?? ''), $valid_lotw_rcvd)) {
if (validateADIFDate($record['lotw_qslrdate']) == true) {
$input_lotw_qslrdate = $record['lotw_qslrdate'];
} else {
$input_lotw_qslrdate = NULL;
$my_error .= "Error QSO: Date: " . $time_on . " Callsign: " . $record['call'] . " ".__("the lotw_qslrdate is invalid (YYYYMMDD)").": " . $record['lotw_qslrdate'] . "; " . __("LoTW Rcvd status will be reset.") . "<br>";
$input_lotw_qsl_rcvd = NULL;
}
} else {
$input_lotw_qslrdate = NULL;
@@ -5030,13 +5034,56 @@ class Logbook_model extends CI_Model {
$input_lotw_qslsdate = $record['lotw_qslsdate'];
} else {
$input_lotw_qslsdate = NULL;
$my_error .= "Error QSO: Date: " . $time_on . " Callsign: " . $record['call'] . " ".__("the lotw_qslsdate is invalid (YYYYMMDD)").": " . $record['lotw_qslsdate'] . "; " . __("LoTW Sent status will be reset.") . "<br>";
$input_lotw_qsl_sent = NULL;
}
} else {
$input_lotw_qslsdate = NULL;
}
/**
* Validate eQSL Fields
*/
if (isset($record['eqsl_qsl_rcvd'])) {
$input_eqsl_qsl_rcvd = mb_strimwidth($record['eqsl_qsl_rcvd'], 0, 1);
} else {
$input_eqsl_qsl_rcvd = NULL;
}
// eqsl_qslrdate can obly be valid if EQSL_QSL_RCVD is one of the following values
// ref: https://www.adif.org.uk/316/ADIF_316.htm#QSO_Field_EQSL_QSLRDATE
$valid_eqsl_rcvd = ['Y', 'I', 'V'];
if (($record['eqsl_qslrdate'] ?? '') != '' && in_array(strtoupper($input_eqsl_qsl_rcvd ?? ''), $valid_eqsl_rcvd)) {
if (validateADIFDate($record['eqsl_qslrdate']) == true) {
$input_eqsl_qslrdate = $record['eqsl_qslrdate'];
} else {
$input_eqsl_qslrdate = NULL;
}
} else {
$input_eqsl_qslrdate = NULL;
}
if ($markEqsl != NULL) {
$input_eqsl_qsl_sent = 'Y';
} elseif (isset($record['eqsl_qsl_sent'])) {
$input_eqsl_qsl_sent = mb_strimwidth($record['eqsl_qsl_sent'], 0, 1);
} else {
$input_eqsl_qsl_sent = NULL;
}
// eqsl_qslsdate can obly be valid if eqsl_qsl_sent is one of the following values
// ref: https://www.adif.org.uk/316/ADIF_316.htm#QSO_Field_EQSL_QSLSDATE
$valid_eqsl_sent = ['Y', 'Q', 'I'];
if ($markEqsl != NULL) {
$input_eqsl_qslsdate = $date = date("Y-m-d H:i:s", strtotime("now"));
} elseif (($record['eqsl_qslsdate'] ?? '') != '' && in_array(strtoupper($input_eqsl_qsl_sent ?? ''), $valid_eqsl_sent)) {
if (validateADIFDate($record['eqsl_qslsdate']) == true) {
$input_eqsl_qslsdate = $record['eqsl_qslsdate'];
} else {
$input_eqsl_qslsdate = NULL;
}
} else {
$input_eqsl_qslsdate = NULL;
}
// Get active station_id from station profile if one hasn't been provided
if ($station_id == "" || $station_id == "0") {
$this->load->model('stations');
@@ -5067,14 +5114,6 @@ class Logbook_model extends CI_Model {
$input_qrzcom_qso_upload_status = (!empty($record['qrzcom_qso_upload_status'])) ? $record['qrzcom_qso_upload_status'] : '';
}
if ($markEqsl != null) {
$input_eqsl_qso_upload_status = 'Y';
$input_eqsl_qso_upload_date = $date = date("Y-m-d H:i:s", strtotime("now"));
} else {
$input_eqsl_qso_upload_date = (!empty($record['eqsl_qslsdate'])) ? $record['eqsl_qslsdate'] : null;
$input_eqsl_qso_upload_status = (!empty($record['eqsl_qsl_sent'])) ? $record['eqsl_qsl_sent'] : '';
}
if ($markDcl != null) {
$input_dcl_qso_upload_status = 'Y';
$input_dcl_qso_upload_date = $date = date("Y-m-d H:i:s", strtotime("now"));
@@ -5127,10 +5166,10 @@ class Logbook_model extends CI_Model {
'COL_DXCC' => $dxcc[0],
'COL_EMAIL' => (!empty($record['email'])) ? $record['email'] : '',
'COL_EQ_CALL' => (!empty($record['eq_call'])) ? $record['eq_call'] : '',
'COL_EQSL_QSL_RCVD' => (!empty($record['eqsl_qsl_rcvd'])) ? $record['eqsl_qsl_rcvd'] : null,
'COL_EQSL_QSL_SENT' => $input_eqsl_qso_upload_status,
'COL_EQSL_QSLRDATE' => (!empty($record['eqsl_qslrdate'])) ? $record['eqsl_qslrdate'] : null,
'COL_EQSL_QSLSDATE' => $input_eqsl_qso_upload_date,
'COL_EQSL_QSL_RCVD' => $input_eqsl_qsl_rcvd,
'COL_EQSL_QSL_SENT' => $input_eqsl_qsl_sent,
'COL_EQSL_QSLRDATE' => $input_eqsl_qslrdate,
'COL_EQSL_QSLSDATE' => $input_eqsl_qslsdate,
'COL_EQSL_STATUS' => (!empty($record['eqsl_status'])) ? $record['eqsl_status'] : '',
'COL_EQSL_AG' => (!empty($record['eqsl_ag'])) ? $record['eqsl_ag'] : '',
'COL_FISTS' => (!empty($record['fists'])) ? $record['fists'] : null,
@@ -6471,6 +6510,16 @@ class Logbook_model extends CI_Model {
}
function validateADIFDate($date, $format = 'Ymd') {
$d = DateTime::createFromFormat($format, $date);
return $d && $d->format($format) == $date;
try {
$d = DateTime::createFromFormat($format, $date);
// Check if parsing failed or if the formatted date doesn't match input
if (!$d || $d->format($format) !== $date) {
return false;
}
return true; // Valid date
} catch (Exception $e) {
return false; // Catch unexpected errors
}
}