diff --git a/taskExecuter.php b/taskExecuter.php
index 391b217..7084c49 100644
--- a/taskExecuter.php
+++ b/taskExecuter.php
@@ -3,114 +3,272 @@ include "zefixAPI.php";
include "emailSender.php";
$maxExecutionTime = 120;
-$taskDir = 'tasks';
-$downloadDir = 'download';
+$taskDir = __DIR__ . '/tasks';
+$downloadDir = __DIR__ . '/download';
+$downloadUrlBase = 'https://zefix.silias.ch/download';
+
$minTaskOldness = 10;
$latesEndTime = time() + $maxExecutionTime;
$smtppassword = getenv("smtppassword");
-if(!is_dir($downloadDir)){
+function logMsg($message)
+{
+ echo date('Y-m-d H:i:s') . " | " . $message . "
";
+}
+
+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);
}
function doRequest($data, $filename, $username, $password)
{
+ logMsg("Starting API request");
+ logMsg("CSV target: " . $filename);
+
$response = sendAPICompanySearchRequest($username, $password, $data);
$responseObject = json_decode($response, true);
- if(array_key_exists("error", $responseObject)) {
- return false;
+ if (!is_array($responseObject)) {
+ logMsg("ERROR: API response is not valid JSON");
+ logMsg("Raw response: " . htmlspecialchars($response));
+ return ['status' => 'error'];
}
- $companyArray = $responseObject['list'];
- $companyData = array();
+ if (array_key_exists("error", $responseObject)) {
+ logMsg("ERROR: API returned error");
+ logMsg("API error response: " . htmlspecialchars(json_encode($responseObject)));
+ return ['status' => 'error'];
+ }
- 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'])) {
+ logMsg("ERROR: API response has no valid list");
+ logMsg("API response: " . htmlspecialchars(json_encode($responseObject)));
+ return ['status' => 'error'];
+ }
+
+ $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'];
+ }
+
+ $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)) {
- $file = fopen($filename, 'w');
- 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;
- }
+ logMsg("No more results. Request completed.");
+ return ['status' => 'done'];
}
-while($latesEndTime - time() > 30){
- if(is_dir($taskDir)) {
- $taskfiles = scandir($taskDir);
- $taskfiles = array_diff($taskfiles, array('.', '..'));
- sort($taskfiles);
+while ($latesEndTime - time() > 30) {
+ if (!is_dir($taskDir)) {
+ logMsg("Task directory does not exist");
+ break;
+ }
- if(count($taskfiles) > 0 && intval(explode("-", $taskfiles[0])[0]) + $minTaskOldness < time()) {
- $taskString = file_get_contents($taskDir.'/'.$taskfiles[0]);
- $task = json_decode($taskString, true);
+ $taskfiles = scandir($taskDir);
+ $taskfiles = array_diff($taskfiles, ['.', '..']);
- if(count($task['requests']) > 0) {
- $csvFile = str_replace(".json", ".csv", $downloadDir.'/'.$taskfiles[0]);
+ $taskfiles = array_filter($taskfiles, function ($taskfile) use ($taskDir) {
+ return is_file($taskDir . '/' . $taskfile)
+ && pathinfo($taskfile, PATHINFO_EXTENSION) === 'json';
+ });
- $nextOffset = doRequest($task['requests'][0], $csvFile, $username, $password);
+ sort($taskfiles);
- if($nextOffset){
- $task['requests'][0]['offset'] = $nextOffset;
- } else {
- array_shift($task['requests']);
- }
+ logMsg("Task files found: " . count($taskfiles));
- $taskString = json_encode($task);
- $taskfile = fopen($taskDir.'/'.$taskfiles[0], 'w');
+ if (count($taskfiles) === 0) {
+ logMsg("Nothing to do. Sleeping 10 seconds.");
+ sleep(10);
+ continue;
+ }
- if($taskfile){
- fwrite($taskfile, $taskString);
- fclose($taskfile);
- }
- } else {
- $csvFile = str_replace(".json", ".csv", $downloadDir.'/'.$taskfiles[0]);
+ $taskFileName = $taskfiles[0];
+ $taskFilePath = $taskDir . '/' . $taskFileName;
- unlink($taskDir.'/'.$taskfiles[0]);
+ if (intval(explode("-", $taskFileName)[0]) + $minTaskOldness >= time()) {
+ logMsg("Task is too new. Waiting.");
+ sleep(10);
+ continue;
+ }
- echo "Task File deleted";
- echo "
";
+ logMsg("Processing task: " . $taskFileName);
- sendEmail($task['email'], $csvFile, $smtppassword);
- }
+ $taskString = file_get_contents($taskFilePath);
+ $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;
+ }
+
+ $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']);
+ logMsg("Request completed and removed from task");
+ } elseif ($result['status'] === 'empty') {
+ $task['noResults'] = true;
+ array_shift($task['requests']);
+ logMsg("Request had no results and was removed from task");
} else {
- echo "nothing to do after: ".strval(time() - ($latesEndTime - $maxExecutionTime));
- echo "sleeping 10 seconds";
- echo "
";
- sleep(10);
+ logMsg("ERROR: Request failed. Task will NOT be deleted and email will NOT be sent.");
+ break;
}
+
+ file_put_contents($taskFilePath, json_encode($task));
+ logMsg("Task file updated.");
+ continue;
}
+
+ 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");
?>
\ No newline at end of file