feat(bestellungen): add optional "Für Mitglied" field, auto-populated from internal request submitter
This commit is contained in:
@@ -480,6 +480,7 @@ export default function BestellungDetail() {
|
||||
bezeichnung: string;
|
||||
lieferant_id?: number;
|
||||
besteller_id?: string;
|
||||
mitglied_id?: string;
|
||||
notizen: string;
|
||||
steuersatz: number;
|
||||
}>({ bezeichnung: '', notizen: '', steuersatz: 20 });
|
||||
@@ -661,6 +662,7 @@ export default function BestellungDetail() {
|
||||
bezeichnung: bestellung.bezeichnung,
|
||||
lieferant_id: bestellung.lieferant_id,
|
||||
besteller_id: bestellung.besteller_id || '',
|
||||
mitglied_id: bestellung.mitglied_id || '',
|
||||
notizen: bestellung.notizen || '',
|
||||
steuersatz: parseFloat(String(bestellung.steuersatz ?? 20)),
|
||||
});
|
||||
@@ -690,6 +692,7 @@ export default function BestellungDetail() {
|
||||
bezeichnung: editOrderData.bezeichnung,
|
||||
lieferant_id: editOrderData.lieferant_id,
|
||||
besteller_id: editOrderData.besteller_id || undefined,
|
||||
mitglied_id: editOrderData.mitglied_id || undefined,
|
||||
notizen: editOrderData.notizen,
|
||||
steuersatz: editOrderData.steuersatz,
|
||||
});
|
||||
@@ -822,6 +825,19 @@ export default function BestellungDetail() {
|
||||
curY += 3;
|
||||
}
|
||||
|
||||
// ── Für Mitglied block ──
|
||||
if (bestellung.mitglied_name) {
|
||||
doc.setFontSize(10);
|
||||
doc.setFont('helvetica', 'bold');
|
||||
doc.text('Für Mitglied', 10, curY);
|
||||
curY += 5;
|
||||
const mitgliedNameWithRank = bestellung.mitglied_dienstgrad
|
||||
? `${kurzDienstgrad(bestellung.mitglied_dienstgrad)} ${bestellung.mitglied_name}`
|
||||
: bestellung.mitglied_name;
|
||||
row('Name', mitgliedNameWithRank);
|
||||
curY += 3;
|
||||
}
|
||||
|
||||
// ── Order info block ──
|
||||
doc.setFontSize(10);
|
||||
doc.setFont('helvetica', 'bold');
|
||||
@@ -1115,6 +1131,15 @@ export default function BestellungDetail() {
|
||||
renderInput={(params) => <TextField {...params} label="Besteller" size="small" />}
|
||||
/>
|
||||
</Grid>
|
||||
<Grid item xs={12} sm={6}>
|
||||
<Autocomplete
|
||||
options={orderUsers}
|
||||
getOptionLabel={(o) => o.name}
|
||||
value={orderUsers.find(u => u.id === editOrderData.mitglied_id) ?? null}
|
||||
onChange={(_, v) => setEditOrderData(d => ({ ...d, mitglied_id: v?.id || '' }))}
|
||||
renderInput={(params) => <TextField {...params} label="Für Mitglied" size="small" />}
|
||||
/>
|
||||
</Grid>
|
||||
<Grid item xs={12}>
|
||||
<TextField label="Notizen" fullWidth multiline rows={3} size="small"
|
||||
value={editOrderData.notizen}
|
||||
@@ -1136,6 +1161,18 @@ export default function BestellungDetail() {
|
||||
<Typography>{bestellung.besteller_name || '–'}</Typography>
|
||||
</CardContent></Card>
|
||||
</Grid>
|
||||
{bestellung.mitglied_name && (
|
||||
<Grid item xs={12} sm={6} md={4}>
|
||||
<Card variant="outlined"><CardContent>
|
||||
<Typography variant="caption" color="text.secondary">Für Mitglied</Typography>
|
||||
<Typography>
|
||||
{bestellung.mitglied_dienstgrad
|
||||
? `${kurzDienstgrad(bestellung.mitglied_dienstgrad)} ${bestellung.mitglied_name}`
|
||||
: bestellung.mitglied_name}
|
||||
</Typography>
|
||||
</CardContent></Card>
|
||||
</Grid>
|
||||
)}
|
||||
<Grid item xs={12} sm={6} md={4}>
|
||||
<Card variant="outlined"><CardContent>
|
||||
<Typography variant="caption" color="text.secondary">Erstellt am</Typography>
|
||||
|
||||
@@ -23,7 +23,7 @@ import { ausruestungsanfrageApi } from '../services/ausruestungsanfrage';
|
||||
import type { BestellungFormData, BestellpositionFormData, LieferantFormData, Lieferant } from '../types/bestellung.types';
|
||||
import type { AusruestungArtikel } from '../types/ausruestungsanfrage.types';
|
||||
|
||||
const emptyOrderForm: BestellungFormData = { bezeichnung: '', lieferant_id: undefined, besteller_id: '', notizen: '', positionen: [] };
|
||||
const emptyOrderForm: BestellungFormData = { bezeichnung: '', lieferant_id: undefined, besteller_id: '', mitglied_id: undefined, notizen: '', positionen: [] };
|
||||
const emptyVendorForm: LieferantFormData = { name: '', kontakt_name: '', email: '', telefon: '', adresse: '', website: '', notizen: '' };
|
||||
const emptyPosition: BestellpositionFormData = { bezeichnung: '', menge: 1, einheit: 'Stk' };
|
||||
|
||||
@@ -150,6 +150,14 @@ export default function BestellungNeu() {
|
||||
renderInput={(params) => <TextField {...params} label="Besteller" />}
|
||||
/>
|
||||
|
||||
<Autocomplete
|
||||
options={orderUsers}
|
||||
getOptionLabel={(o) => o.name}
|
||||
value={orderUsers.find((u) => u.id === orderForm.mitglied_id) || null}
|
||||
onChange={(_e, v) => setOrderForm((f) => ({ ...f, mitglied_id: v?.id || '' }))}
|
||||
renderInput={(params) => <TextField {...params} label="Für Mitglied" />}
|
||||
/>
|
||||
|
||||
<TextField
|
||||
label="Notizen"
|
||||
multiline
|
||||
|
||||
@@ -334,6 +334,7 @@ export default function Bestellungen() {
|
||||
{ key: 'bezeichnung', label: 'Bezeichnung' },
|
||||
{ key: 'lieferant_name', label: 'Lieferant', render: (o) => o.lieferant_name || '–' },
|
||||
{ key: 'besteller_name', label: 'Besteller', render: (o) => o.besteller_name || '–' },
|
||||
{ key: 'mitglied_name', label: 'Für Mitglied', render: (o) => o.mitglied_name || '–' },
|
||||
{ key: 'status', label: 'Status', render: (o) => (
|
||||
<StatusChip status={o.status} labelMap={BESTELLUNG_STATUS_LABELS} colorMap={BESTELLUNG_STATUS_COLORS} />
|
||||
)},
|
||||
|
||||
@@ -64,6 +64,9 @@ export interface Bestellung {
|
||||
besteller_email?: string;
|
||||
besteller_telefon?: string;
|
||||
besteller_dienstgrad?: string;
|
||||
mitglied_id?: string;
|
||||
mitglied_name?: string;
|
||||
mitglied_dienstgrad?: string;
|
||||
status: BestellungStatus;
|
||||
budget?: number;
|
||||
steuersatz?: number;
|
||||
@@ -88,6 +91,7 @@ export interface BestellungFormData {
|
||||
bezeichnung: string;
|
||||
lieferant_id?: number;
|
||||
besteller_id?: string;
|
||||
mitglied_id?: string;
|
||||
status?: BestellungStatus;
|
||||
steuersatz?: number;
|
||||
notizen?: string;
|
||||
|
||||
Reference in New Issue
Block a user