This commit is contained in:
seb
2026-10-17 00:53:01 +02:00
parent b3a81efe46
commit 0b0ffb2203
3 changed files with 113 additions and 38 deletions

View File

@@ -297,6 +297,7 @@ class DeliveryRow extends PureComponent {
textTransform: 'none',
fontSize: '0.75rem',
fontWeight: 600,
color: '#ffffff',
}}
>
Buchen

View File

@@ -184,21 +184,38 @@ class ManifestFormLine extends PureComponent {
renderLedgerChip() {
const { ledgerLine, onBookLine } = this.props;
if (!ledgerLine || !ledgerLine.trackStock) return null;
if (!ledgerLine) return null;
const isBooked = ledgerLine.isBooked;
const isPartial = !isBooked && ledgerLine.bookedAmount > 0;
const isClickable = Boolean(onBookLine);
const isTracked = Boolean(ledgerLine.trackStock);
return (
<Tooltip
title={
isBooked
const tooltipTitle = isTracked
? isBooked
? `Vollständig im Lager gebucht: ${ledgerLine.bookedAmount} Stück (Klicken für Details)`
: isPartial
? `Teilweise im Lager gebucht: ${ledgerLine.bookedAmount} von ${ledgerLine.targetAmount} Stück (Klicken zum Einbuchen dieser Position)`
: `Noch nicht im Lager gebucht (${ledgerLine.targetAmount} Stück – Klicken zum Einbuchen dieser Position)`
}
>
: isBooked
? `Vollständig im Ledger verbucht: ${ledgerLine.bookedAmount} Stück (Klicken für Details)`
: isPartial
? `Teilweise im Ledger verbucht: ${ledgerLine.bookedAmount} von ${ledgerLine.targetAmount} Stück (Klicken zum Verbuchen dieser Position)`
: `Noch nicht im Ledger verbucht (${ledgerLine.targetAmount} Stück – Klicken zum Verbuchen dieser Position)`;
const label = isTracked
? isBooked
? `Lager: ${ledgerLine.bookedAmount} Stk. gebucht`
: isPartial
? `Lager: ${ledgerLine.bookedAmount}/${ledgerLine.targetAmount} Stk.`
: 'Lager: offen'
: isBooked
? `Gebucht: ${ledgerLine.bookedAmount} Stk.`
: isPartial
? `Gebucht: ${ledgerLine.bookedAmount}/${ledgerLine.targetAmount} Stk.`
: 'Verbuchen: offen';
return (
<Tooltip title={tooltipTitle}>
<Chip
size="small"
clickable={isClickable}
@@ -212,35 +229,47 @@ class ManifestFormLine extends PureComponent {
}
icon={
isBooked ? (
<CheckCircleOutlineOutlinedIcon sx={{ '&&': { fontSize: 13 } }} />
<CheckCircleOutlineOutlinedIcon sx={{ '&&': { fontSize: 13, color: 'inherit' } }} />
) : (
<Inventory2OutlinedIcon sx={{ '&&': { fontSize: 13 } }} />
<Inventory2OutlinedIcon sx={{ '&&': { fontSize: 13, color: 'inherit' } }} />
)
}
label={
isBooked
? `Lager: ${ledgerLine.bookedAmount} Stk. gebucht`
: isPartial
? `Lager: ${ledgerLine.bookedAmount}/${ledgerLine.targetAmount} Stk.`
: 'Lager: offen'
}
color={isBooked ? 'success' : isPartial ? 'warning' : 'default'}
variant="outlined"
label={label}
variant={isBooked ? 'outlined' : 'filled'}
sx={{
height: 20,
fontSize: '0.68rem',
fontWeight: 600,
height: 22,
fontSize: '0.7rem',
fontWeight: 700,
cursor: isClickable ? 'pointer' : 'default',
bgcolor: isBooked ? 'success.50' : undefined,
'&:hover': isClickable
...(isBooked
? {
bgcolor: isBooked
? 'success.100'
: isPartial
? 'warning.100'
: 'action.hover',
bgcolor: 'rgba(21, 128, 61, 0.08)',
color: '#15803d',
borderColor: '#15803d',
borderWidth: 1,
borderStyle: 'solid',
'&:hover': isClickable ? { bgcolor: 'rgba(21, 128, 61, 0.16)' } : undefined,
}
: undefined,
: isPartial
? {
bgcolor: '#d97706',
color: '#ffffff',
border: 'none',
'&:hover': isClickable ? { bgcolor: '#b45309' } : undefined,
}
: {
bgcolor: 'primary.main',
color: '#ffffff',
border: 'none',
'&:hover': isClickable ? { bgcolor: 'primary.dark' } : undefined,
}),
'& .MuiChip-label': {
color: 'inherit',
px: 0.75,
},
'& .MuiChip-icon': {
color: 'inherit',
},
}}
/>
</Tooltip>
@@ -1122,7 +1151,7 @@ class ManifestFormLine extends PureComponent {
}
render() {
const { columns = LINE_COLUMNS, saving } = this.props;
const { columns = LINE_COLUMNS, saving, ledgerLine } = this.props;
const secondLine = this.renderSecondLine();
return (
@@ -1153,11 +1182,52 @@ class ManifestFormLine extends PureComponent {
pl: 0.5,
pr: 0.5,
verticalAlign: 'middle',
width: this.props.onMove ? 92 : 40,
width: (this.props.onMove ? 80 : 36) + (this.props.kind === 'delivery' && Boolean(this.props.onBookLine) ? 36 : 0),
whiteSpace: 'nowrap',
}}
>
<Box sx={{ display: 'flex', alignItems: 'center', gap: 0.25 }}>
{this.props.kind === 'delivery' && Boolean(this.props.onBookLine) && (
<Tooltip
title={
!ledgerLine
? 'Lieferung zuerst speichern, um diese Position zu verbuchen'
: ledgerLine.isBooked
? 'Position bereits verbucht (Klicken zum Einsehen)'
: `Position verbuchen (${ledgerLine.remainingAmount > 0 ? `${ledgerLine.remainingAmount} Stk.` : ''})`
}
>
<span>
<IconButton
size="small"
aria-label="Position verbuchen"
disabled={saving || !ledgerLine}
onClick={(e) => {
e.stopPropagation();
if (ledgerLine) {
this.props.onBookLine(ledgerLine);
}
}}
color={
!ledgerLine
? 'default'
: ledgerLine.isBooked
? 'success'
: ledgerLine.bookedAmount > 0
? 'warning'
: 'primary'
}
sx={{ p: 0.35 }}
>
{ledgerLine?.isBooked ? (
<CheckCircleOutlineOutlinedIcon sx={{ fontSize: 18 }} />
) : (
<Inventory2OutlinedIcon sx={{ fontSize: 18 }} />
)}
</IconButton>
</span>
</Tooltip>
)}
{this.props.onMove && (
<>
<span>

View File

@@ -511,7 +511,7 @@ class ManifestHeader extends PureComponent {
Wiederherstellen
</Button>
)}
{docId != null && kind === 'delivery' && onOpenBookDialog && ledgerSummary?.hasTrackStock && (
{docId != null && kind === 'delivery' && onOpenBookDialog && Boolean(ledgerSummary && (ledgerSummary.totalPositions > 0 || ledgerSummary.lines?.length > 0 || ledgerSummary.hasTrackStock)) && (
<Button
variant={ledgerSummary?.status === 'booked' ? 'outlined' : 'contained'}
color={
@@ -535,13 +535,17 @@ class ManifestHeader extends PureComponent {
fontWeight: 700,
fontSize: '0.8125rem',
whiteSpace: 'nowrap',
...(ledgerSummary?.status !== 'booked' && {
color: '#ffffff',
'& .MuiButton-startIcon': { color: '#ffffff' },
}),
}}
>
{ledgerSummary?.status === 'booked'
? 'Lager gebucht'
? 'Vollständig gebucht'
: ledgerSummary?.status === 'partial'
? 'Rest einbuchen'
: 'Ins Lager buchen'}
? 'Rest verbuchen'
: 'Lieferung verbuchen'}
</Button>
)}
{kind === 'quote' && docId != null && onCreateOrder && (