Fix #114: Beleg-Löschung nicht mehr durch Datei-Permission-Fehler unterbrochen
This commit is contained in:
parent
0fad25907c
commit
2012f228c4
3 changed files with 52 additions and 2 deletions
|
|
@ -2,6 +2,12 @@
|
|||
|
||||
---
|
||||
|
||||
## 2026-07-06 – Fix: Fehlermeldung beim Beleg-Löschen, falls Datei nicht löschbar ist (Issue #114)
|
||||
|
||||
- **`src/Models/Beleg.php`:** `delete()` nutzte ein ungeschütztes `unlink()`; schlug dieses auf dem Server mit „Permission denied" fehl, wurde eine PHP-Warning ausgegeben, die den nachfolgenden Redirect-Header zerstörte („headers already sent"). Der Datensatz wurde dabei trotzdem gelöscht, was zu Verwirrung führte. Fehler beim Datei-Löschen wird jetzt abgefangen und nur noch geloggt (`error_log`), die Löschung des Datensatzes läuft unverändert durch.
|
||||
|
||||
---
|
||||
|
||||
## 2026-07-02 – Feature: Zusätzliche CC-E-Mail-Adressen pro Kunde (Issue #111)
|
||||
|
||||
- **`migrations/084_customer_cc_emails.sql`:** Neue Spalten `email_cc1`, `email_cc2` in `customers`
|
||||
|
|
|
|||
|
|
@ -249,9 +249,11 @@ class Beleg
|
|||
$cnt = Database::fetchOne('SELECT COUNT(*) as cnt FROM bookings WHERE beleg_id=?', [$id]);
|
||||
if ($cnt && $cnt['cnt'] > 0) return false;
|
||||
|
||||
// Delete file
|
||||
// Delete file (Datei-Löschung darf DB-Löschung nicht durch Warnings/Header-Fehler stören)
|
||||
$fullPath = dirname(__DIR__, 2) . '/public/' . $beleg['storage_path'];
|
||||
if (file_exists($fullPath)) unlink($fullPath);
|
||||
if (file_exists($fullPath) && !@unlink($fullPath)) {
|
||||
error_log('Beleg::delete: Datei konnte nicht gelöscht werden: ' . $fullPath);
|
||||
}
|
||||
|
||||
Database::execute('DELETE FROM belege WHERE id=?', [$id]);
|
||||
return true;
|
||||
|
|
|
|||
42
tests/49_BelegDeleteUnlinkFailTest.php
Normal file
42
tests/49_BelegDeleteUnlinkFailTest.php
Normal file
|
|
@ -0,0 +1,42 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
use Steuerkram\Models\Beleg;
|
||||
|
||||
class BelegDeleteUnlinkFailTest extends TestCase
|
||||
{
|
||||
protected string $testName = 'Test 49: Beleg-Löschung trotz Datei-Permission-Fehler';
|
||||
|
||||
public function run(): void
|
||||
{
|
||||
$dir = dirname(__DIR__) . '/public/static/uploads/test_49_unlink_fail';
|
||||
$file = $dir . '/original.pdf';
|
||||
|
||||
mkdir($dir, 0755, true);
|
||||
file_put_contents($file, 'dummy');
|
||||
// Schreibschutz auf das Verzeichnis: unlink() der Datei schlägt fehl (Permission denied),
|
||||
// genau wie im gemeldeten Fehler auf dem Produktiv-Server.
|
||||
chmod($dir, 0500);
|
||||
|
||||
try {
|
||||
$id = Beleg::create([
|
||||
'beleg_nr' => 'BLG-TEST-49',
|
||||
'filename' => 'original.pdf',
|
||||
'storage_path' => 'static/uploads/test_49_unlink_fail/original.pdf',
|
||||
'mime_type' => 'application/pdf',
|
||||
'file_hash' => 'testhash49',
|
||||
'beleg_datum' => '2026-01-01',
|
||||
]);
|
||||
$this->assertGreaterThan(0, $id, 'Beleg angelegt');
|
||||
|
||||
$result = Beleg::delete($id);
|
||||
$this->assert($result === true, 'delete() liefert true, obwohl unlink() fehlschlägt');
|
||||
$this->assert(Beleg::find($id) === false, 'Beleg-Datensatz wurde trotz Datei-Fehler aus der DB gelöscht');
|
||||
} finally {
|
||||
chmod($dir, 0755);
|
||||
if (file_exists($file)) unlink($file);
|
||||
if (is_dir($dir)) rmdir($dir);
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Reference in a new issue