Bestellschein aus Materialschein: Titel = Kundenname, Baustelle in der Notiz
Build and Deploy / version (push) Successful in 2s
Build and Deploy / build (push) Failing after 3s
Build and Deploy / deploy (push) Skipped

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
Fidelis Huber
2026-10-09 20:17:55 +02:00
co-authored by Claude Sonnet 5.5
parent 64e7239dc7
commit 98df3ec80a
2 changed files with 13 additions and 7 deletions
+12 -6
View File
@@ -19,9 +19,10 @@ export function scheinInfo(typ: ScheinTyp): ScheinInfo {
: { name: 'Materialschein', plural: 'Materialscheine', liste: 'Materialliste', druckTitel: 'Materialschein', betreff: 'Materialverbrauch', listBase: '/', detailBase: '/projekte' }; : { name: 'Materialschein', plural: 'Materialscheine', liste: 'Materialliste', druckTitel: 'Materialschein', betreff: 'Materialverbrauch', listBase: '/', detailBase: '/projekte' };
} }
// Legt zu einem Materialschein einen leeren Bestellschein mit denselben Kopfdaten an // Legt zu einem Materialschein einen leeren Bestellschein an. Titel des Bestellscheins ist der
// (Projekt/Baustelle, Kunde, Auftrags-Nr., Datum, Monteur, Notiz). Beide Scheine sind danach // Kundenname (Auftraggeber; fehlt er, die Baustelle). Die Baustelle selbst steht in der Notiz,
// unabhängig voneinander – Löschen geht nur im jeweiligen Reiter. // damit nichts verloren geht. Beide Scheine sind danach unabhängig voneinander – Löschen geht
// nur im jeweiligen Reiter.
export interface ScheinKopf { export interface ScheinKopf {
titel: string; titel: string;
auftraggeber: string; auftraggeber: string;
@@ -33,12 +34,17 @@ export interface ScheinKopf {
export const normName = (s: string) => s.trim().toLowerCase().replace(/\s+/g, ' '); export const normName = (s: string) => s.trim().toLowerCase().replace(/\s+/g, ' ');
const bestellTitel = (kopf: Pick<ScheinKopf, 'titel' | 'auftraggeber'>) => kopf.auftraggeber.trim() || kopf.titel.trim();
export async function bestellscheinFuerKopf(kopf: ScheinKopf): Promise<Projekt> { export async function bestellscheinFuerKopf(kopf: ScheinKopf): Promise<Projekt> {
return api.projekte.create({ ...kopf, typ: 'Bestell' }); const baustelle = kopf.auftraggeber.trim() && kopf.titel.trim() ? `Baustelle: ${kopf.titel.trim()}` : '';
const notiz = [baustelle, kopf.notiz.trim()].filter(Boolean).join('
');
return api.projekte.create({ ...kopf, titel: bestellTitel(kopf), notiz, typ: 'Bestell' });
} }
// Gibt es zu Projekt + Kunde schon einen Bestellschein? (Schutz vor versehentlichen Doppelten) // Gibt es zu diesem Kunden schon einen Bestellschein? (Schutz vor versehentlichen Doppelten)
export async function findeBestellschein(kopf: Pick<ScheinKopf, 'titel' | 'auftraggeber'>): Promise<Projekt | undefined> { export async function findeBestellschein(kopf: Pick<ScheinKopf, 'titel' | 'auftraggeber'>): Promise<Projekt | undefined> {
const alle = await api.projekte.list('Bestell'); const alle = await api.projekte.list('Bestell');
return alle.find(p => normName(p.titel) === normName(kopf.titel) && normName(p.auftraggeber ?? '') === normName(kopf.auftraggeber)); return alle.find(p => normName(p.titel) === normName(bestellTitel(kopf)));
} }
+1 -1
View File
@@ -92,7 +92,7 @@ export default function ProjektDetail({ typ }: { typ: ScheinTyp }) {
setBestellBusy(true); setBestellBusy(true);
try { try {
const vorhanden = await findeBestellschein(kopf); const vorhanden = await findeBestellschein(kopf);
if (vorhanden && !confirm(`Es gibt bereits einen Bestellschein "${vorhanden.titel}"${vorhanden.auftraggeber ? ' (' + vorhanden.auftraggeber + ')' : ''}. Trotzdem einen weiteren anlegen?`)) { if (vorhanden && !confirm(`Es gibt bereits einen Bestellschein "${vorhanden.titel}" für diesen Kunden. Trotzdem einen weiteren anlegen?`)) {
navigate(`/bestellungen/${vorhanden.id}`); navigate(`/bestellungen/${vorhanden.id}`);
return; return;
} }