This commit is contained in:
seb
2026-10-24 01:24:11 +02:00
parent 35144c7187
commit 2f946442c8
6 changed files with 74 additions and 17 deletions

View File

@@ -423,6 +423,7 @@ export function createManifestEditAutomat({ kind, name }) {
const actions = {
loadDoc(id, doc) {
const date = dateInputValue(doc.date);
const createdAt = doc.createdAt ?? doc.created_at ?? null;
const partyId = doc.partyId ?? null;
const number = doc.number ?? '';
const externalNumber = doc.externalNumber != null ? String(doc.externalNumber) : '';
@@ -431,6 +432,7 @@ export function createManifestEditAutomat({ kind, name }) {
const baseline = {
date,
createdAt,
partyId,
number,
externalNumber,
@@ -443,6 +445,7 @@ export function createManifestEditAutomat({ kind, name }) {
mode: 'edit',
id,
date,
createdAt,
partyId,
number,
externalNumber,
@@ -508,6 +511,7 @@ export function createManifestEditAutomat({ kind, name }) {
commitSaved(savedDoc) {
const date = dateInputValue(savedDoc.date);
const createdAt = savedDoc.createdAt ?? savedDoc.created_at ?? automat.state.createdAt ?? null;
const partyId = savedDoc.partyId ?? null;
const number = savedDoc.number ?? automat.state.number;
const externalNumber = savedDoc.externalNumber != null ? String(savedDoc.externalNumber) : '';
@@ -516,6 +520,7 @@ export function createManifestEditAutomat({ kind, name }) {
const baseline = {
date,
createdAt,
partyId,
number,
externalNumber,
@@ -525,6 +530,7 @@ export function createManifestEditAutomat({ kind, name }) {
automat.setState({
date,
createdAt,
partyId,
number,
externalNumber,
@@ -545,6 +551,7 @@ export function createManifestEditAutomat({ kind, name }) {
mode: 'edit',
id: null,
date: '',
createdAt: null,
partyId: null,
number: '',
externalNumber: '',
@@ -566,6 +573,7 @@ export function createManifestEditAutomat({ kind, name }) {
mode: 'edit',
id: null,
date: '',
createdAt: null,
partyId: null,
number: '',
externalNumber: '',

View File

@@ -94,6 +94,7 @@ class ManifestForm extends PureComponent {
parties: initialParties,
partiesLoading: !partiesReady,
date: initialDate,
createdAt: initialDoc?.createdAt || initialEdit?.createdAt || null,
partyId: initialDoc?.partyId ?? null,
number: initialDoc?.number || '',
externalNumber: initialDoc?.externalNumber || '',
@@ -256,6 +257,7 @@ class ManifestForm extends PureComponent {
if (String(state.id) === String(this.props.docId)) {
return {
date: state.date || '',
createdAt: state.createdAt ?? null,
partyId: state.partyId,
externalNumber: state.externalNumber || '',
lines: state.lines || [],
@@ -449,6 +451,7 @@ class ManifestForm extends PureComponent {
dirtyLineFields: this.editAutomat.state.dirtyLineFields,
dirtySummary: this.editAutomat.state.dirtySummary,
date: this.editAutomat.state.date,
createdAt: this.editAutomat.state.createdAt ?? null,
partyId: this.editAutomat.state.partyId,
number: this.editAutomat.state.number,
externalNumber: this.editAutomat.state.externalNumber,
@@ -511,6 +514,7 @@ class ManifestForm extends PureComponent {
const loadedDoc = {
date: dateInputValue(doc.date),
createdAt: doc.createdAt ?? doc.created_at ?? null,
partyId: doc[cfg.partyField],
number: doc.number ?? '',
externalNumber:
@@ -1302,6 +1306,7 @@ class ManifestForm extends PureComponent {
const apiLines = requireArray(doc.lines, `${cfg.docField}.lines`);
const savedDoc = {
date: dateInputValue(doc.date),
createdAt: doc.createdAt ?? doc.created_at ?? this.state.createdAt ?? null,
partyId: doc[cfg.partyField],
number: doc.number ?? '',
externalNumber:
@@ -1407,6 +1412,7 @@ class ManifestForm extends PureComponent {
partyId={partyId}
partyError={this.state.partyError}
date={date}
createdAt={this.state.createdAt}
number={number}
externalNumber={externalNumber}
saving={saving}

View File

@@ -21,6 +21,7 @@ import {
manifestConfig,
partyDisplayName,
getLowestSortNonSupplierCustomerGroup,
formatDateTime,
} from './manifestConfig';
import { notifyError, notifyErrorMessage } from '../../utils/notify';
import entityAutomat from '../../automats/entityAutomat';
@@ -303,6 +304,7 @@ class ManifestHeader extends PureComponent {
partiesLoading,
partyId,
date,
createdAt,
number,
externalNumber,
saving,
@@ -512,6 +514,24 @@ class ManifestHeader extends PureComponent {
}}
/>
) : null}
{isEdit && createdAt ? (
<SingleLineTextEdit
size="small"
label="Erstellt am"
value={formatDateTime(createdAt)}
disabled
slotProps={{
inputLabel: { shrink: true },
}}
sx={{
flex: { xs: '1 1 100%', sm: '1 1 150px' },
minWidth: { sm: 130 },
'& .MuiInputBase-input': {
fontVariantNumeric: 'tabular-nums',
},
}}
/>
) : null}
</Box>
<AttachmentList
kind={kind}

View File

@@ -12,7 +12,7 @@ import PaymentsOutlinedIcon from '@mui/icons-material/PaymentsOutlined';
import AddIcon from '@mui/icons-material/Add';
import OpenInNewIcon from '@mui/icons-material/OpenInNew';
import { PanelTile } from 'dashgui/panels';
import { formatDate } from './manifestConfig';
import { formatDate, formatDateTime } from './manifestConfig';
import { formatPrice } from '../../utils/price';
import { typeLabel, typeIcon } from './OrderPaymentList';
import ShipmentDetailDialog from './ShipmentDetailDialog';
@@ -91,6 +91,7 @@ export class OrderDocumentsTiles extends PureComponent {
const carrier = sh.shippings?.[0]?.carrier;
const tracking = sh.shippings?.[0]?.trackingCode;
const posCount = sh.lineCount ?? sh.lines?.length ?? 0;
const shDate = sh.date || sh.createdAt || sh.created_at;
return (
<Card
@@ -114,7 +115,7 @@ export class OrderDocumentsTiles extends PureComponent {
</Typography>
<Stack direction="row" spacing={0.5} sx={{ alignItems: 'center' }}>
<Typography variant="caption" color="text.secondary">
{sh.date ? formatDate(sh.date) : '–'}
{shDate ? formatDateTime(shDate) : '–'}
</Typography>
{navigate && (
<IconButton
@@ -231,6 +232,7 @@ export class OrderDocumentsTiles extends PureComponent {
<Stack spacing={1}>
{payments.map((pay) => {
const pType = pay.type || pay.paymentType || pay.payment_type;
const payDate = pay.date || pay.createdAt || pay.created_at || pay.timestamp;
return (
<Card
key={pay.id}
@@ -257,20 +259,26 @@ export class OrderDocumentsTiles extends PureComponent {
</Typography>
</Stack>
<Stack direction="row" spacing={1} sx={{ alignItems: 'center', flexShrink: 0, ml: 1 }}>
{pay.date ? (
<Typography variant="caption" color="text.secondary">
{formatDate(pay.date)}
</Typography>
) : null}
<Typography
variant="subtitle2"
sx={{ fontWeight: 700, color: 'success.dark', fontVariantNumeric: 'tabular-nums' }}
>
+{formatPrice(pay.amount)}
</Typography>
</Stack>
<Typography
variant="subtitle2"
sx={{ fontWeight: 700, color: 'success.dark', fontVariantNumeric: 'tabular-nums', flexShrink: 0, ml: 1 }}
>
+{formatPrice(pay.amount)}
</Typography>
</Box>
{payDate ? (
<Box sx={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', mt: 0.5 }}>
{pay.id != null ? (
<Typography variant="caption" color="text.secondary" sx={{ fontFamily: 'monospace' }}>
#{pay.id}
</Typography>
) : <span />}
<Typography variant="caption" color="text.secondary">
{formatDateTime(payDate)}
</Typography>
</Box>
) : null}
</Card>
);
})}

View File

@@ -29,7 +29,7 @@ import { enqueueSnackbar } from 'notistack';
import AppDialog from '../AppDialog';
import { shipment as shipmentApi, shipping as shippingApi, stock as stockApi } from '../../api';
import { notifyError } from '../../utils/notify';
import { formatDate } from './manifestConfig';
import { formatDate, formatDateTime } from './manifestConfig';
import orderAutomat from '../../automats/orderAutomat';
import shipmentAutomat from '../../automats/shipmentAutomat';
import carrierAutomat from '../../automats/carrierAutomat';
@@ -433,7 +433,9 @@ export default class ShipmentDetailDialog extends PureComponent {
{shipment.number || 'Lieferschein'}
</Typography>
<Typography variant="caption" color="text.secondary">
{shipment.date ? `Datum: ${formatDate(shipment.date)}` : ''}
{(shipment.date || shipment.createdAt || shipment.created_at)
? `Datum: ${formatDateTime(shipment.date || shipment.createdAt || shipment.created_at)}`
: ''}
{shipment.externalNumber ? (
<>
{' • Ref: '}

View File

@@ -96,6 +96,19 @@ export function formatDate(iso) {
return d.toLocaleDateString('de-DE');
}
export function formatDateTime(iso) {
if (!iso) return '–';
const d = new Date(iso);
if (Number.isNaN(d.getTime())) return String(iso);
return d.toLocaleString('de-DE', {
day: '2-digit',
month: '2-digit',
year: 'numeric',
hour: '2-digit',
minute: '2-digit',
});
}
/**
* Delivery documents have a server-allocated, read-only `number` plus an
* optional user-entered `externalNumber`. Returns the display value for a