Hallo zusammen,
ich habe erst vor kurzem meine erste Paperless-Instanz aufgesetzt. Schnell war der Wunsch geboren meine archivierten Eingangsrechnungen automatisiert zu Sevdesk zu pushen. Hier mein kleines PHP-Script…
// Konfiguration
$paperlessApiUrl = ‚http://paperless.url/api/‘;
$paperlessApiToken = ‚hier_den_paperless_token‘;
$sevdeskApiUrl = ‚https://my.sevdesk.de/api/v1/‘;
$sevdeskApiToken = ‚hier_den_sevdesk_token‘;
$tempDir = ‚/pfad/zu/temp‘; // Pfad für temporäre Dateien
// Sicherstellen, dass das Verzeichnis existiert
if (!is_dir($tempDir)) {
mkdir($tempDir, 0777, true);
}
// Funktion: HTTP-Request
function httpRequest($url, $method, $headers = , $data = null) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method);
if (!empty($headers)) {
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
}
if (!empty($data)) {
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
}
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
return [‚response‘ => $response, ‚httpCode‘ => $httpCode];
}
// Schritt 1: Dokumente von Paperless NGX abrufen
$tagId = ‚62‘; // Ursprünglicher Tag
$newTagId = ‚63‘; // Neuer Tag nach erfolgreichem Upload
$documentTypeId = ‚3‘; // ID der gewünschten Dokumentenart
$headers = [
„Authorization: Token $paperlessApiToken“,
‚Content-Type: application/json‘
];
// Dokumente filtern nach Tag und Dokumententyp
$response = httpRequest(
$paperlessApiUrl . „documents/?tag=$tagId&document_type__id=$documentTypeId“,
‚GET‘,
$headers
);
echo "API-Antwort HTTP-Code: " . $response[‚httpCode‘] . „\n“;
if ($response[‚httpCode‘] !== 200) {
echo "Fehler bei der API-Abfrage: " . $response[‚response‘] . „\n“;
exit;
}
$documents = json_decode($response[‚response‘], true);
if (empty($documents[‚results‘])) {
echo „Keine Dokumente gefunden.\n“;
exit;
}
echo "Gefundene Dokumente: " . count($documents[‚results‘]) . „\n“;
foreach ($documents[‚results‘] as $document) {
echo „Prüfe Dokument: ID = {$document[‚id‘]}, Titel = {$document[‚title‘]}\n“;
if (!isset($document[‚tags‘]) || !in_array((int)$tagId, $document[‚tags‘], true)) {
echo „Dokument ID {$document[‚id‘]} hat nicht das Tag $tagId, wird übersprungen.\n“;
continue;
}
if (in_array((int)$newTagId, $document[‚tags‘], true)) {
echo „Dokument ID {$document[‚id‘]} enthält bereits das Tag $newTagId, wird übersprungen.\n“;
continue;
}
echo „Dokument ID {$document[‚id‘]} erfüllt alle Kriterien.\n“;
$fileUrl = $paperlessApiUrl . „documents/{$document[‚id‘]}/download/“;
$tempFilePath = $tempDir . basename($document[‚archived_file_name‘]);
$fileContent = file_get_contents($fileUrl, false, stream_context_create([
‚http‘ => [
‚header‘ => „Authorization: Token $paperlessApiToken“
]
]));
if ($fileContent === false) {
echo "Fehler beim Herunterladen der Datei: $fileUrl\n";
continue;
}
file_put_contents($tempFilePath, $fileContent);
echo "Dokument heruntergeladen und gespeichert: $tempFilePath\n";
// Schritt 2: Dokument zu SevDesk hochladen
$sevdeskHeaders = [
"Authorization: $sevdeskApiToken", // Header für SevDesk angepasst
'Accept: application/json'
];
$readFile = fopen($tempFilePath, 'rb');
$sevdeskData = [
'creditDebit' => 'C',
'voucher' => new CURLFile($tempFilePath, 'application/pdf', basename($tempFilePath))
];
$sevdeskResponse = httpRequest(
$sevdeskApiUrl . "Voucher/Factory/createVoucherFromFile",
'POST',
$sevdeskHeaders,
$sevdeskData
);
echo "SevDesk Response: HTTP Code {$sevdeskResponse['httpCode']}, Body: {$sevdeskResponse['response']}\n";
if ($sevdeskResponse['httpCode'] === 201) {
echo "Dokument erfolgreich an SevDesk übermittelt.\n";
// Ersetzen des alten Tags mit dem neuen Tag
$updatedTags = array_map(function($tag) use ($tagId, $newTagId) {
return $tag === (int)$tagId ? (int)$newTagId : $tag;
}, $document['tags']);
$updateData = ['tags' => $updatedTags];
$updateResponse = httpRequest(
$paperlessApiUrl . "documents/{$document['id']}/",
'PATCH',
$headers,
json_encode($updateData)
);
if ($updateResponse['httpCode'] === 200) {
echo "Tag von Dokument ID {$document['id']} erfolgreich aktualisiert.\n";
} else {
echo "Fehler beim Aktualisieren der Tags von Dokument ID {$document['id']}: " . $updateResponse['response'] . "\n";
}
} else {
echo "Fehler beim Übertragen an SevDesk: HTTP Code {$sevdeskResponse['httpCode']}, Body: {$sevdeskResponse['response']}\n";
}
unlink($tempFilePath);
}
?>