Gutschriften: Dateien beim Loeschen/Bearbeiten mit aufraeumen (R138)
Pentester-Hinweis: generierte Gutschrift-PDFs blieben nach dem Loeschen der Gutschrift als verwaiste Files im Upload-Ordner liegen (harmlos, da ohne DB-Referenz nicht mehr abrufbar - aber unsauber). deleteCreditNote entfernt jetzt PDF (pdfPath) + Ueberweisungsbeleg (receiptPath) von der Platte. updateCreditNote loescht das alte PDF beim Leeren von pdfPath. Kein verwaister Ordner-Muell mehr. Verifiziert: PDF nach Erzeugung vorhanden, nach Loeschen der Gutschrift weg. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -2,11 +2,26 @@
|
||||
// CRUD für Vertrags-Gutschriften (Subventionen: Geld/Sachwert) inkl.
|
||||
// USt-Berechnung (pro Gutschrift wählbar: vatRelevant + Basis Netto/Brutto).
|
||||
|
||||
import fs from 'fs';
|
||||
import path from 'path';
|
||||
import prisma from '../lib/prisma.js';
|
||||
import { ApiError } from '../utils/apiError.js';
|
||||
import { assignNextNumber } from './creditNoteNumberRange.service.js';
|
||||
import { CreditNoteType, CreditNoteCustomerType, CreditNoteAmountBasis } from '@prisma/client';
|
||||
|
||||
// Löscht eine hochgeladene/erzeugte Datei von der Platte (best effort).
|
||||
function deleteFileIfExists(filePath: string | null) {
|
||||
if (!filePath) return;
|
||||
const absolute = path.join(process.cwd(), filePath);
|
||||
if (fs.existsSync(absolute)) {
|
||||
try {
|
||||
fs.unlinkSync(absolute);
|
||||
} catch (error) {
|
||||
console.error('Fehler beim Löschen der Gutschrift-Datei:', absolute, error);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const round2 = (n: number) => Math.round((n + Number.EPSILON) * 100) / 100;
|
||||
|
||||
export interface AmountResult {
|
||||
@@ -230,7 +245,9 @@ export async function updateCreditNote(id: number, input: CreateCreditNoteInput)
|
||||
}
|
||||
// Nummer bleibt unverändert (einmal vergeben = fix). Ein evtl. schon
|
||||
// erzeugtes PDF ist nach inhaltlicher Änderung veraltet → Pfad leeren
|
||||
// (der User erzeugt es bei Bedarf neu).
|
||||
// (der User erzeugt es bei Bedarf neu) und die alte Datei entfernen,
|
||||
// damit sie nicht verwaist liegen bleibt.
|
||||
if (existing.pdfPath) deleteFileIfExists(existing.pdfPath);
|
||||
return prisma.creditNote.update({ where: { id }, data: { ...normalized, pdfPath: null } });
|
||||
}
|
||||
|
||||
@@ -239,6 +256,10 @@ export async function deleteCreditNote(id: number) {
|
||||
if (!existing) {
|
||||
throw new ApiError(404, 'Gutschrift nicht gefunden');
|
||||
}
|
||||
// Verwaiste Dateien vermeiden: generiertes PDF + Überweisungsbeleg von der
|
||||
// Platte entfernen (Pentest R138-Hinweis).
|
||||
deleteFileIfExists(existing.pdfPath);
|
||||
deleteFileIfExists(existing.receiptPath);
|
||||
return prisma.creditNote.delete({ where: { id } });
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user