Löschfunktion für abgeschlossene Projekte + VenDoc-CSV-Export
Build and Deploy / version (push) Successful in 1s
Build and Deploy / build (push) Successful in 14s
Build and Deploy / deploy (push) Successful in 2s

Abgeschlossene Materialscheine können jetzt gelöscht werden (serverseitig
auf Status=Abgeschlossen beschränkt, mit Bestätigungsdialog). Neues Feld
Auftrags-Nr. am Projekt für die Zuordnung zum VenDoc-Auftrag. Neuer CSV-Export
(Semikolon, Komma-Dezimal, UTF-8 BOM) als Positionstabelle für den Import ins
ERP.
This commit is contained in:
Fidelis Huber
2026-09-11 08:08:19 +02:00
parent a61722bb4f
commit 36d5246187
7 changed files with 94 additions and 8 deletions
@@ -0,0 +1,2 @@
-- AlterTable
ALTER TABLE "projekte" ADD COLUMN "auftragsNr" TEXT;
+1
View File
@@ -17,6 +17,7 @@ model Projekt {
id String @id @default(cuid())
titel String
auftraggeber String?
auftragsNr String?
datum DateTime? @db.Date
monteur String?
notiz String?
+21 -2
View File
@@ -10,7 +10,7 @@ projekteRouter.get('/', async (_req, res) => {
});
projekteRouter.post('/', async (req: AuthedRequest, res) => {
const { titel, auftraggeber, datum, monteur, notiz } = req.body ?? {};
const { titel, auftraggeber, auftragsNr, datum, monteur, notiz } = req.body ?? {};
if (!titel || typeof titel !== 'string' || !titel.trim()) {
res.status(400).json({ error: 'Titel (Projekt/Baustelle) ist erforderlich.' });
return;
@@ -19,6 +19,7 @@ projekteRouter.post('/', async (req: AuthedRequest, res) => {
data: {
titel: titel.trim(),
auftraggeber: auftraggeber || null,
auftragsNr: auftragsNr || null,
datum: datum ? new Date(datum) : null,
monteur: monteur || null,
notiz: notiz || null
@@ -29,10 +30,11 @@ projekteRouter.post('/', async (req: AuthedRequest, res) => {
projekteRouter.patch('/:id', async (req, res) => {
const { id } = req.params;
const { titel, auftraggeber, datum, monteur, notiz, status } = req.body ?? {};
const { titel, auftraggeber, auftragsNr, datum, monteur, notiz, status } = req.body ?? {};
const data: Record<string, unknown> = {};
if (titel !== undefined) data.titel = titel;
if (auftraggeber !== undefined) data.auftraggeber = auftraggeber || null;
if (auftragsNr !== undefined) data.auftragsNr = auftragsNr || null;
if (datum !== undefined) data.datum = datum ? new Date(datum) : null;
if (monteur !== undefined) data.monteur = monteur || null;
if (notiz !== undefined) data.notiz = notiz || null;
@@ -44,3 +46,20 @@ projekteRouter.patch('/:id', async (req, res) => {
res.status(404).json({ error: 'Projekt nicht gefunden.' });
}
});
// Löschen ist nur für abgeschlossene Projekte erlaubt (Schutz vor versehentlichem
// Löschen laufender Baustellen) - Material-Positionen werden per Cascade mitgelöscht.
projekteRouter.delete('/:id', async (req, res) => {
const { id } = req.params;
const projekt = await prisma.projekt.findUnique({ where: { id } });
if (!projekt) {
res.status(404).json({ error: 'Projekt nicht gefunden.' });
return;
}
if (projekt.status !== 'Abgeschlossen') {
res.status(400).json({ error: 'Nur abgeschlossene Projekte können gelöscht werden.' });
return;
}
await prisma.projekt.delete({ where: { id } });
res.status(204).end();
});