Send error Message as E-Mail if no results

This commit is contained in:
Roman Schenk 2026-05-17 16:22:13 +02:00
parent 8ac18050a0
commit 5011f714e1
1 changed files with 234 additions and 76 deletions

View File

@ -3,114 +3,272 @@ include "zefixAPI.php";
include "emailSender.php"; include "emailSender.php";
$maxExecutionTime = 120; $maxExecutionTime = 120;
$taskDir = 'tasks'; $taskDir = __DIR__ . '/tasks';
$downloadDir = 'download'; $downloadDir = __DIR__ . '/download';
$downloadUrlBase = 'https://zefix.silias.ch/download';
$minTaskOldness = 10; $minTaskOldness = 10;
$latesEndTime = time() + $maxExecutionTime; $latesEndTime = time() + $maxExecutionTime;
$smtppassword = getenv("smtppassword"); $smtppassword = getenv("smtppassword");
if(!is_dir($downloadDir)){ function logMsg($message)
{
echo date('Y-m-d H:i:s') . " | " . $message . "<br>";
}
logMsg("CRON SCRIPT START");
logMsg("BASE_DIR: " . __DIR__);
logMsg("TASK DIR: " . $taskDir);
logMsg("DOWNLOAD DIR: " . $downloadDir);
if (!is_dir($downloadDir)) {
logMsg("Download directory does not exist. Creating...");
mkdir($downloadDir, 0755, true); mkdir($downloadDir, 0755, true);
} }
function doRequest($data, $filename, $username, $password) function doRequest($data, $filename, $username, $password)
{ {
logMsg("Starting API request");
logMsg("CSV target: " . $filename);
$response = sendAPICompanySearchRequest($username, $password, $data); $response = sendAPICompanySearchRequest($username, $password, $data);
$responseObject = json_decode($response, true); $responseObject = json_decode($response, true);
if(array_key_exists("error", $responseObject)) { if (!is_array($responseObject)) {
return false; logMsg("ERROR: API response is not valid JSON");
logMsg("Raw response: " . htmlspecialchars($response));
return ['status' => 'error'];
} }
$companyArray = $responseObject['list']; if (array_key_exists("error", $responseObject)) {
$companyData = array(); logMsg("ERROR: API returned error");
logMsg("API error response: " . htmlspecialchars(json_encode($responseObject)));
return ['status' => 'error'];
}
foreach ($companyArray as $company) { if (!isset($responseObject['list']) || !is_array($responseObject['list'])) {
$companyFullData = json_decode(sendAPICompanyInfoRequest($username, $password, $company['uid']), true)[0]; logMsg("ERROR: API response has no valid list");
$companyData[] = [ logMsg("API response: " . htmlspecialchars(json_encode($responseObject)));
$companyFullData['name'], return ['status' => 'error'];
$companyFullData['address']['careOf'], }
$companyFullData['address']['street'],
$companyFullData['address']['houseNumber'], $companies = $responseObject['list'];
$companyFullData['address']['swissZipCode'], logMsg("Companies found in this request: " . count($companies));
$companyFullData['address']['city'],
$companyFullData['uid'], if (count($companies) === 0) {
$companyFullData['legalSeat'], logMsg("No companies found in this request.");
$companyFullData['legalForm']['name']['de'], return ['status' => 'empty'];
$companyFullData['status'], }
$companyFullData['sogcDate'],
$companyFullData['deletionDate'] $isNewFile = !file_exists($filename);
$file = fopen($filename, $isNewFile ? 'w' : 'a');
if (!$file) {
logMsg("ERROR: Could not open CSV file for writing");
return ['status' => 'error'];
}
if ($isNewFile) {
logMsg("Creating new CSV file with header");
fputcsv($file, [
'name',
'careOf',
'street',
'houseNumber',
'swissZipCode',
'city',
'uid',
'legalSeat',
'legalForm',
'status',
'sogcDate',
'deletionDate'
], ',', '"', "\\");
} else {
logMsg("Appending to existing CSV file");
}
$writtenRows = 0;
foreach ($companies as $company) {
if (!isset($company['uid'])) {
logMsg("WARNING: Company entry without UID skipped");
continue;
}
$companyInfoResponse = sendAPICompanyInfoRequest($username, $password, $company['uid']);
$companyInfo = json_decode($companyInfoResponse, true);
if (!isset($companyInfo[0]) || !is_array($companyInfo[0])) {
logMsg("WARNING: Could not load company info for UID: " . $company['uid']);
logMsg("Company info response: " . htmlspecialchars($companyInfoResponse));
continue;
}
$companyFullData = $companyInfo[0];
fputcsv($file, [
$companyFullData['name'] ?? '',
$companyFullData['address']['careOf'] ?? '',
$companyFullData['address']['street'] ?? '',
$companyFullData['address']['houseNumber'] ?? '',
$companyFullData['address']['swissZipCode'] ?? '',
$companyFullData['address']['city'] ?? '',
$companyFullData['uid'] ?? '',
$companyFullData['legalSeat'] ?? '',
$companyFullData['legalForm']['name']['de'] ?? '',
$companyFullData['status'] ?? '',
$companyFullData['sogcDate'] ?? '',
$companyFullData['deletionDate'] ?? ''
], ',', '"', "\\");
$writtenRows++;
}
fclose($file);
logMsg("Rows written to CSV: " . $writtenRows);
logMsg("CSV exists after writing: " . (file_exists($filename) ? "YES" : "NO"));
logMsg("CSV size after writing: " . (file_exists($filename) ? filesize($filename) : 0) . " bytes");
if ($writtenRows === 0) {
logMsg("No rows could be written although search returned companies.");
return ['status' => 'error'];
}
if (!empty($responseObject['hasMoreResults'])) {
$nextOffset = ($responseObject['maxOffset'] ?? 0) + 50;
logMsg("More results available. Next offset: " . $nextOffset);
return [
'status' => 'more',
'nextOffset' => $nextOffset
]; ];
} }
if (!file_exists($filename)) { logMsg("No more results. Request completed.");
$file = fopen($filename, 'w'); return ['status' => 'done'];
if($file) {
fputcsv($file, ['name', 'careOf', 'street', 'houseNumber', 'swissZipCode', 'city', 'uid', 'legalSeat', 'legalForm', 'status', 'sogcDate', 'deletionDate'], ',', '"', "\\");
}
} else {
$file = fopen($filename, 'a');
}
if ($file) {
foreach ($companyData as $row){
fputcsv($file, $row, ',', '"', "\\");
}
fclose($file);
}
if($responseObject['hasMoreResults']) {
return $responseObject['maxOffset'] + 50;
} else {
return false;
}
} }
while($latesEndTime - time() > 30){ while ($latesEndTime - time() > 30) {
if(is_dir($taskDir)) { if (!is_dir($taskDir)) {
logMsg("Task directory does not exist");
break;
}
$taskfiles = scandir($taskDir); $taskfiles = scandir($taskDir);
$taskfiles = array_diff($taskfiles, array('.', '..')); $taskfiles = array_diff($taskfiles, ['.', '..']);
$taskfiles = array_filter($taskfiles, function ($taskfile) use ($taskDir) {
return is_file($taskDir . '/' . $taskfile)
&& pathinfo($taskfile, PATHINFO_EXTENSION) === 'json';
});
sort($taskfiles); sort($taskfiles);
if(count($taskfiles) > 0 && intval(explode("-", $taskfiles[0])[0]) + $minTaskOldness < time()) { logMsg("Task files found: " . count($taskfiles));
$taskString = file_get_contents($taskDir.'/'.$taskfiles[0]);
if (count($taskfiles) === 0) {
logMsg("Nothing to do. Sleeping 10 seconds.");
sleep(10);
continue;
}
$taskFileName = $taskfiles[0];
$taskFilePath = $taskDir . '/' . $taskFileName;
if (intval(explode("-", $taskFileName)[0]) + $minTaskOldness >= time()) {
logMsg("Task is too new. Waiting.");
sleep(10);
continue;
}
logMsg("Processing task: " . $taskFileName);
$taskString = file_get_contents($taskFilePath);
$task = json_decode($taskString, true); $task = json_decode($taskString, true);
if(count($task['requests']) > 0) { if (!is_array($task)) {
$csvFile = str_replace(".json", ".csv", $downloadDir.'/'.$taskfiles[0]); logMsg("ERROR: Task file is not valid JSON. Deleting task.");
unlink($taskFilePath);
continue;
}
$nextOffset = doRequest($task['requests'][0], $csvFile, $username, $password); if (!isset($task['email']) || empty($task['email'])) {
logMsg("ERROR: Task has no email. Deleting task.");
unlink($taskFilePath);
continue;
}
if($nextOffset){ if (!isset($task['requests']) || !is_array($task['requests'])) {
$task['requests'][0]['offset'] = $nextOffset; logMsg("ERROR: Task has no valid requests array. Deleting task.");
} else { unlink($taskFilePath);
continue;
}
$csvFile = str_replace(".json", ".csv", $downloadDir . '/' . $taskFileName);
$csvUrl = $downloadUrlBase . '/' . basename($csvFile);
if (count($task['requests']) > 0) {
$result = doRequest($task['requests'][0], $csvFile, $username, $password);
if ($result['status'] === 'more') {
$task['requests'][0]['offset'] = $result['nextOffset'];
logMsg("Request updated with next offset");
} elseif ($result['status'] === 'done') {
array_shift($task['requests']); array_shift($task['requests']);
} logMsg("Request completed and removed from task");
} elseif ($result['status'] === 'empty') {
$taskString = json_encode($task); $task['noResults'] = true;
$taskfile = fopen($taskDir.'/'.$taskfiles[0], 'w'); array_shift($task['requests']);
logMsg("Request had no results and was removed from task");
if($taskfile){
fwrite($taskfile, $taskString);
fclose($taskfile);
}
} else { } else {
$csvFile = str_replace(".json", ".csv", $downloadDir.'/'.$taskfiles[0]); logMsg("ERROR: Request failed. Task will NOT be deleted and email will NOT be sent.");
break;
unlink($taskDir.'/'.$taskfiles[0]);
echo "Task File deleted";
echo "<br>";
sendEmail($task['email'], $csvFile, $smtppassword);
} }
} else {
echo "nothing to do after: ".strval(time() - ($latesEndTime - $maxExecutionTime)); file_put_contents($taskFilePath, json_encode($task));
echo "sleeping 10 seconds"; logMsg("Task file updated.");
echo "<br>"; continue;
sleep(10);
} }
logMsg("All requests completed. Preparing email.");
logMsg("Final CSV path: " . $csvFile);
logMsg("Final CSV URL: " . $csvUrl);
logMsg("CSV exists before email: " . (file_exists($csvFile) ? "YES" : "NO"));
logMsg("CSV size before email: " . (file_exists($csvFile) ? filesize($csvFile) : 0) . " bytes");
if (!empty($task['noResults']) && (!file_exists($csvFile) || filesize($csvFile) === 0)) {
logMsg("No results found. Sending no-results email.");
sendEmail(
$task['email'],
"Ihre Suche hat leider keine Ergebnisse geliefert, die exportiert werden konnten.",
$smtppassword
);
unlink($taskFilePath);
logMsg("Task file deleted after no-results email.");
continue;
} }
if (!file_exists($csvFile) || filesize($csvFile) === 0) {
logMsg("ERROR: CSV file missing or empty. Email will NOT be sent.");
break;
}
logMsg("CSV exists. Sending email with download link.");
sendEmail(
$task['email'],
$csvUrl,
$smtppassword
);
unlink($taskFilePath);
logMsg("Task file deleted after successful email.");
} }
logMsg("CRON SCRIPT END");
?> ?>