Löschfunktion für abgeschlossene Projekte + VenDoc-CSV-Export
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:
@@ -0,0 +1,2 @@
|
||||
-- AlterTable
|
||||
ALTER TABLE "projekte" ADD COLUMN "auftragsNr" TEXT;
|
||||
@@ -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?
|
||||
|
||||
@@ -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();
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user