Update taskExecuter.php
This commit is contained in:
parent
7a143dc18a
commit
67c7b5ccff
330
taskExecuter.php
330
taskExecuter.php
|
|
@ -3,312 +3,114 @@ include "zefixAPI.php";
|
||||||
include "emailSender.php";
|
include "emailSender.php";
|
||||||
|
|
||||||
$maxExecutionTime = 120;
|
$maxExecutionTime = 120;
|
||||||
$taskDir = __DIR__ . '/tasks';
|
$taskDir = 'tasks';
|
||||||
$downloadDir = __DIR__ . '/download';
|
$downloadDir = 'download';
|
||||||
$downloadUrlBase = 'download';
|
|
||||||
|
|
||||||
$minTaskOldness = 10;
|
$minTaskOldness = 10;
|
||||||
$latesEndTime = time() + $maxExecutionTime;
|
$latesEndTime = time() + $maxExecutionTime;
|
||||||
$smtppassword = getenv("smtppassword");
|
$smtppassword = getenv("smtppassword");
|
||||||
|
|
||||||
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)){
|
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 (!is_array($responseObject)) {
|
|
||||||
logMsg("ERROR: API response is not valid JSON");
|
|
||||||
logMsg("Raw response: " . htmlspecialchars($response));
|
|
||||||
return ['status' => 'error', 'writtenRows' => 0];
|
|
||||||
}
|
|
||||||
|
|
||||||
if(array_key_exists("error", $responseObject)) {
|
if(array_key_exists("error", $responseObject)) {
|
||||||
$errorCode = $responseObject['error']['code'] ?? '';
|
return false;
|
||||||
|
|
||||||
if ($errorCode === 'API.ZFR.SEARCH.NORESULT') {
|
|
||||||
logMsg("API returned no results. Treating as empty search result.");
|
|
||||||
return ['status' => 'empty', 'writtenRows' => 0];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
logMsg("ERROR: API returned error");
|
$companyArray = $responseObject['list'];
|
||||||
logMsg("API error response: " . htmlspecialchars(json_encode($responseObject)));
|
$companyData = array();
|
||||||
return ['status' => 'error', 'writtenRows' => 0];
|
|
||||||
|
foreach ($companyArray as $company) {
|
||||||
|
$companyFullData = json_decode(sendAPICompanyInfoRequest($username, $password, $company['uid']), true)[0];
|
||||||
|
$companyData[] = [
|
||||||
|
$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']
|
||||||
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!isset($responseObject['list']) || !is_array($responseObject['list'])) {
|
if (!file_exists($filename)) {
|
||||||
logMsg("ERROR: API response has no valid list");
|
$file = fopen($filename, 'w');
|
||||||
logMsg("API response: " . htmlspecialchars(json_encode($responseObject)));
|
if($file) {
|
||||||
return ['status' => 'error', 'writtenRows' => 0];
|
fputcsv($file, ['name', 'careOf', 'street', 'houseNumber', 'swissZipCode', 'city', 'uid', 'legalSeat', 'legalForm', 'status', 'sogcDate', 'deletionDate'], ',', '"', "\\");
|
||||||
}
|
}
|
||||||
|
|
||||||
$companies = $responseObject['list'];
|
|
||||||
logMsg("Companies found in this request: " . count($companies));
|
|
||||||
|
|
||||||
if (count($companies) === 0) {
|
|
||||||
logMsg("No companies found in this request.");
|
|
||||||
return ['status' => 'empty', 'writtenRows' => 0];
|
|
||||||
}
|
|
||||||
|
|
||||||
$isNewFile = !file_exists($filename);
|
|
||||||
$file = fopen($filename, $isNewFile ? 'w' : 'a');
|
|
||||||
|
|
||||||
if (!$file) {
|
|
||||||
logMsg("ERROR: Could not open CSV file for writing");
|
|
||||||
return ['status' => 'error', 'writtenRows' => 0];
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($isNewFile) {
|
|
||||||
logMsg("Creating new CSV file with header");
|
|
||||||
|
|
||||||
fputcsv($file, [
|
|
||||||
'name',
|
|
||||||
'careOf',
|
|
||||||
'street',
|
|
||||||
'houseNumber',
|
|
||||||
'swissZipCode',
|
|
||||||
'city',
|
|
||||||
'uid',
|
|
||||||
'legalSeat',
|
|
||||||
'legalForm',
|
|
||||||
'status',
|
|
||||||
'sogcDate',
|
|
||||||
'deletionDate'
|
|
||||||
], ',', '"', "\\");
|
|
||||||
} else {
|
} else {
|
||||||
logMsg("Appending to existing CSV file");
|
$file = fopen($filename, 'a');
|
||||||
}
|
}
|
||||||
|
|
||||||
$writtenRows = 0;
|
if ($file) {
|
||||||
|
foreach ($companyData as $row){
|
||||||
foreach ($companies as $company) {
|
fputcsv($file, $row, ',', '"', "\\");
|
||||||
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);
|
fclose($file);
|
||||||
|
|
||||||
logMsg("Rows written to CSV in this request: " . $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("ERROR: Search returned companies, but no rows could be written.");
|
|
||||||
return ['status' => 'error', 'writtenRows' => 0];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!empty($responseObject['hasMoreResults'])) {
|
if($responseObject['hasMoreResults']) {
|
||||||
$nextOffset = ($responseObject['maxOffset'] ?? 0) + 50;
|
return $responseObject['maxOffset'];
|
||||||
logMsg("More results available. Next offset: " . $nextOffset);
|
} else {
|
||||||
|
return false;
|
||||||
return [
|
|
||||||
'status' => 'more',
|
|
||||||
'nextOffset' => $nextOffset,
|
|
||||||
'writtenRows' => $writtenRows
|
|
||||||
];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
logMsg("No more results. Request completed.");
|
|
||||||
|
|
||||||
return [
|
|
||||||
'status' => 'done',
|
|
||||||
'writtenRows' => $writtenRows
|
|
||||||
];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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, ['.', '..']);
|
$taskfiles = array_diff($taskfiles, array('.', '..'));
|
||||||
|
|
||||||
$taskfiles = array_filter($taskfiles, function ($taskfile) use ($taskDir) {
|
|
||||||
return is_file($taskDir . '/' . $taskfile)
|
|
||||||
&& pathinfo($taskfile, PATHINFO_EXTENSION) === 'json';
|
|
||||||
});
|
|
||||||
|
|
||||||
sort($taskfiles);
|
sort($taskfiles);
|
||||||
|
|
||||||
logMsg("Task files found: " . count($taskfiles));
|
if(count($taskfiles) > 0 && intval(explode("-", $taskfiles[0])[0]) + $minTaskOldness < time()) {
|
||||||
|
$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 (!is_array($task)) {
|
|
||||||
logMsg("ERROR: Task file is not valid JSON. Deleting task.");
|
|
||||||
unlink($taskFilePath);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!isset($task['email']) || empty($task['email'])) {
|
|
||||||
logMsg("ERROR: Task has no email. Deleting task.");
|
|
||||||
unlink($taskFilePath);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!isset($task['requests']) || !is_array($task['requests'])) {
|
|
||||||
logMsg("ERROR: Task has no valid requests array. Deleting task.");
|
|
||||||
unlink($taskFilePath);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!isset($task['stats']) || !is_array($task['stats'])) {
|
|
||||||
$task['stats'] = [
|
|
||||||
'totalWrittenRows' => 0,
|
|
||||||
'emptyRequests' => 0,
|
|
||||||
'completedRequests' => 0,
|
|
||||||
'failedRequests' => 0
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
$csvFile = str_replace(".json", ".csv", $downloadDir . '/' . $taskFileName);
|
|
||||||
$csvUrl = $downloadUrlBase . '/' . basename($csvFile);
|
|
||||||
|
|
||||||
if(count($task['requests']) > 0) {
|
if(count($task['requests']) > 0) {
|
||||||
$result = doRequest($task['requests'][0], $csvFile, $username, $password);
|
$csvFile = str_replace(".json", ".csv", $downloadDir.'/'.$taskfiles[0]);
|
||||||
|
|
||||||
if (isset($result['writtenRows'])) {
|
$nextOffset = doRequest($task['requests'][0], $csvFile, $username, $password);
|
||||||
$task['stats']['totalWrittenRows'] += $result['writtenRows'];
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($result['status'] === 'more') {
|
if($nextOffset){
|
||||||
$task['requests'][0]['offset'] = $result['nextOffset'];
|
$task['requests'][0]['offset'] = $nextOffset;
|
||||||
logMsg("Request updated with next offset");
|
|
||||||
} elseif ($result['status'] === 'done') {
|
|
||||||
$task['stats']['completedRequests']++;
|
|
||||||
array_shift($task['requests']);
|
|
||||||
logMsg("Request completed and removed from task");
|
|
||||||
} elseif ($result['status'] === 'empty') {
|
|
||||||
$task['stats']['emptyRequests']++;
|
|
||||||
$task['stats']['completedRequests']++;
|
|
||||||
array_shift($task['requests']);
|
|
||||||
logMsg("Request had no results and was removed from task");
|
|
||||||
} else {
|
} else {
|
||||||
$task['stats']['failedRequests']++;
|
array_shift($task['requests']);
|
||||||
file_put_contents($taskFilePath, json_encode($task));
|
|
||||||
logMsg("ERROR: Request failed. Task will NOT be deleted and email will NOT be sent.");
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
file_put_contents($taskFilePath, json_encode($task));
|
$taskString = json_encode($task);
|
||||||
logMsg("Task file updated.");
|
$taskfile = fopen($taskDir.'/'.$taskfiles[0], 'w');
|
||||||
logMsg("Total written rows so far: " . $task['stats']['totalWrittenRows']);
|
|
||||||
logMsg("Empty requests so far: " . $task['stats']['emptyRequests']);
|
|
||||||
logMsg("Completed requests so far: " . $task['stats']['completedRequests']);
|
|
||||||
|
|
||||||
continue;
|
if($taskfile){
|
||||||
|
fwrite($taskfile, $taskString);
|
||||||
|
fclose($taskfile);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$csvFile = str_replace(".json", ".csv", $downloadDir.'/'.$taskfiles[0]);
|
||||||
|
|
||||||
|
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));
|
||||||
|
echo "sleeping 10 seconds";
|
||||||
|
echo "<br>";
|
||||||
|
sleep(10);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
logMsg("All requests completed. Preparing email.");
|
|
||||||
logMsg("Total written rows: " . ($task['stats']['totalWrittenRows'] ?? 0));
|
|
||||||
logMsg("Empty requests: " . ($task['stats']['emptyRequests'] ?? 0));
|
|
||||||
logMsg("Completed requests: " . ($task['stats']['completedRequests'] ?? 0));
|
|
||||||
logMsg("Failed requests: " . ($task['stats']['failedRequests'] ?? 0));
|
|
||||||
|
|
||||||
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");
|
|
||||||
|
|
||||||
$totalWrittenRows = $task['stats']['totalWrittenRows'] ?? 0;
|
|
||||||
|
|
||||||
if ($totalWrittenRows === 0) {
|
|
||||||
logMsg("All requests completed but no rows were exported. 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, although rows were counted. Email will NOT be sent.");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
logMsg("CSV exists and contains exported rows. Sending email with download link.");
|
|
||||||
|
|
||||||
sendEmail(
|
|
||||||
$task['email'],
|
|
||||||
$csvUrl,
|
|
||||||
$smtppassword
|
|
||||||
);
|
|
||||||
|
|
||||||
unlink($taskFilePath);
|
|
||||||
logMsg("Task file deleted after successful email.");
|
|
||||||
}
|
|
||||||
|
|
||||||
logMsg("CRON SCRIPT END");
|
|
||||||
?>
|
?>
|
||||||
Loading…
Reference in New Issue