This commit is contained in:
seb
2026-10-21 03:22:35 +02:00
parent b09100b13e
commit fbf107843f
9 changed files with 448 additions and 172 deletions

View File

@@ -106,6 +106,7 @@ class ManifestForm extends PureComponent {
paidTotal: initialEdit?.paidTotal ?? null,
paid: Boolean(initialEdit?.paid),
shipped: Boolean(initialEdit?.shipped),
isShipped: Boolean(initialEdit?.isShipped ?? initialEdit?.shipped),
delivered: Boolean(initialEdit?.delivered),
isDirty: Boolean(initialEdit?.isDirty),
dirtyFields: initialEdit?.dirtyFields || null,
@@ -249,6 +250,7 @@ class ManifestForm extends PureComponent {
paidTotal: state.paidTotal ?? null,
paid: Boolean(state.paid),
shipped: Boolean(state.shipped),
isShipped: Boolean(state.isShipped ?? state.shipped),
delivered: Boolean(state.delivered),
isDirty: Boolean(state.isDirty),
dirtyFields: state.dirtyFields,
@@ -477,6 +479,7 @@ class ManifestForm extends PureComponent {
paidTotal: doc.paidTotal ?? null,
paid: Boolean(doc.paid),
shipped: Boolean(doc.shipped),
isShipped: Boolean(doc.isShipped ?? doc.shipped),
delivered: Boolean(doc.delivered),
};
@@ -812,24 +815,52 @@ class ManifestForm extends PureComponent {
}
isFullyDelivered() {
if (this.state.delivered) return true;
if (this.state.delivered || this.state.isShipped || this.state.shipped) return true;
const lines = this.state.lines || [];
const validLines = lines.filter((l) => l.sku && Number(l.amount) > 0);
if (validLines.length === 0) return false;
const shippableLines = lines.filter((l) => l.shippable !== false && Number(l.amount) > 0);
if (shippableLines.length === 0) return lines.length > 0;
const shippedBySku = {};
const shippedByOrderLineId = {};
const shippedByName = {};
for (const sh of this.state.shipments || []) {
for (const sl of sh.lines || []) {
const amt = Number(sl.amount) || 0;
if (sl.sku) {
const k = String(sl.sku).trim().toLowerCase();
shippedBySku[k] = (shippedBySku[k] || 0) + (Number(sl.amount) || 0);
shippedBySku[k] = (shippedBySku[k] || 0) + amt;
}
if (sl.orderLineId != null) {
shippedByOrderLineId[sl.orderLineId] = (shippedByOrderLineId[sl.orderLineId] || 0) + amt;
}
if (sl.name) {
const n = String(sl.name).trim().toLowerCase();
shippedByName[n] = (shippedByName[n] || 0) + amt;
}
}
}
return validLines.every((l) => {
const k = String(l.sku).trim().toLowerCase();
return (shippedBySku[k] || 0) >= Number(l.amount);
const remainingShippedByName = { ...shippedByName };
return shippableLines.every((l) => {
const amt = Number(l.amount) || 0;
if (l.sku) {
const k = String(l.sku).trim().toLowerCase();
return (shippedBySku[k] || 0) >= amt;
}
if (l.id != null && shippedByOrderLineId[l.id] != null) {
return shippedByOrderLineId[l.id] >= amt;
}
if (l.name) {
const n = String(l.name).trim().toLowerCase();
const pool = remainingShippedByName[n] || 0;
if (pool >= amt) {
remainingShippedByName[n] = pool - amt;
return true;
}
return false;
}
return false;
});
}
@@ -838,10 +869,15 @@ class ManifestForm extends PureComponent {
const lineToRemove = prev.lines.find((line) => line.key === key);
if (lineToRemove && this.props.kind === 'order') {
const rawSku = lineToRemove.sku != null ? String(lineToRemove.sku).trim().toLowerCase() : '';
const orderLineId = lineToRemove.id;
const lineName = lineToRemove.name != null ? String(lineToRemove.name).trim().toLowerCase() : '';
const isShipped = Boolean(
rawSku &&
(prev.shipments || []).some((sh) =>
(sh.lines || []).some((sl) => sl.sku && String(sl.sku).trim().toLowerCase() === rawSku)
(sh.lines || []).some((sl) =>
(rawSku && sl.sku && String(sl.sku).trim().toLowerCase() === rawSku) ||
(orderLineId != null && sl.orderLineId != null && sl.orderLineId === orderLineId) ||
(!rawSku && !sl.sku && lineName && sl.name && String(sl.name).trim().toLowerCase() === lineName)
)
)
);
if (isShipped) {