Bestellschein aus Materialschein: Titel = Kundenname, Baustelle in der Notiz
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 5.5
parent
64e7239dc7
commit
98df3ec80a
@@ -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)));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user