This commit is contained in:
seb
2026-10-04 21:04:40 +02:00
parent 669954b496
commit f765b87336
59 changed files with 1491 additions and 2045 deletions

View File

@@ -37,8 +37,9 @@ import {
BookDeliveryDialog,
} from '../../components/manifest';
import ManifestPdfDialog from '../../components/manifest/ManifestPdfDialog';
import { loadParties } from '../../components/manifest/manifestConfig';
import { StorageManagerContext } from '../../api/storageManagerContext';
import { loadParties, apiFor } from '../../components/manifest/manifestConfig';
import { article as articleApi, delivery as deliveryApi } from '../../api';
import { getCategoryState } from '../../automats/categoryAutomat';
import { requireArray, requireDefined, requireObject } from '../../utils/apiShape';
import { backendErrorFrom } from '../../utils/backendError';
import { notifyError } from '../../utils/notify';
@@ -47,12 +48,10 @@ import { generateTextThumbnail } from '../../utils/textThumbnail';
import { extractPdfText } from '../../utils/pdfText';
import { getDeliveryEditorAutomat } from '../../automats/deliveryEditorAutomat';
import { setLastDeliveryPath, userSettingsAutomat, setViewerPosition } from '../../automats';
import { delivery as deliveryApi, ledger as defaultLedgerApi } from '../../api';
import { fetchDeliveryLedgerSummary } from '../../utils/deliveryLedger';
class LieferungNeuPage extends PureComponent {
static contextType = StorageManagerContext;
constructor(props) {
super(props);
this.cfg = manifestConfig('delivery');
@@ -168,7 +167,7 @@ class LieferungNeuPage extends PureComponent {
async loadPartiesOnly() {
this.setState({ status: 'loadingParties', error: null, partiesLoading: true });
try {
const parties = await loadParties('delivery', this.context);
const parties = await loadParties('delivery');
if (this._cancelled) return;
this.automat.actions.setDeliveryEntities(parties);
this.setState({
@@ -200,8 +199,8 @@ class LieferungNeuPage extends PureComponent {
this.setState({ status: 'loading', error: null, partiesLoading: true });
try {
const [docRes, parties] = await Promise.all([
this.context[cfg.api].get(docId),
loadParties('delivery', this.context),
apiFor(cfg.kind).get(docId),
loadParties('delivery'),
]);
if (this._cancelled) return;
@@ -228,12 +227,7 @@ class LieferungNeuPage extends PureComponent {
let ledgerSummary = null;
try {
const ledgerClient = this.context?.ledger || defaultLedgerApi;
const deliveryClient = this.context?.[cfg.api] || deliveryApi;
ledgerSummary = await fetchDeliveryLedgerSummary(docId, {
ledgerApi: ledgerClient,
deliveryApi: deliveryClient,
});
ledgerSummary = await fetchDeliveryLedgerSummary(docId);
} catch (lErr) {
console.error('[neu] Failed to load ledger summary:', lErr);
}
@@ -272,12 +266,7 @@ class LieferungNeuPage extends PureComponent {
const { docId } = this.props;
if (docId == null) return;
try {
const ledgerClient = this.context?.ledger || defaultLedgerApi;
const deliveryClient = this.context?.[this.cfg.api] || deliveryApi;
const ledgerSummary = await fetchDeliveryLedgerSummary(docId, {
ledgerApi: ledgerClient,
deliveryApi: deliveryClient,
});
const ledgerSummary = await fetchDeliveryLedgerSummary(docId);
if (this._cancelled) return;
this.setState({ ledgerSummary });
} catch (err) {
@@ -381,7 +370,7 @@ class LieferungNeuPage extends PureComponent {
try {
// Get root category ID
const categoryState = this.context.getCategoryState();
const categoryState = getCategoryState();
if (!categoryState) {
enqueueSnackbar('Kategorie-Daten nicht verfügbar.', { variant: 'error' });
return;
@@ -394,7 +383,7 @@ class LieferungNeuPage extends PureComponent {
}
// Create article in root category
const articleRes = await this.context.article.create({
const articleRes = await articleApi.create({
parentId: rootCategoryId,
name: categoryName,
});
@@ -407,7 +396,7 @@ class LieferungNeuPage extends PureComponent {
const supplierSku = line.sku;
// Add supplier relationship with the supplier's SKU
await this.context.article.addSupplier(internalSku, {
await articleApi.addSupplier(internalSku, {
entityId: partyId,
sku: supplierSku || undefined,
pu: line.pu ? Number(line.pu) : undefined,
@@ -457,7 +446,7 @@ class LieferungNeuPage extends PureComponent {
const supplierSku = line?.sku;
try {
await this.context.article.addSupplier(internalSku, {
await articleApi.addSupplier(internalSku, {
entityId: partyId,
sku: supplierSku || undefined,
pu: line?.pu ? Number(line.pu) : undefined,
@@ -699,10 +688,7 @@ class LieferungNeuPage extends PureComponent {
};
try {
const parser = this.context?.delivery?.parseSse;
if (!parser) throw new Error('parseSse nicht verfügbar.');
for await (const { event, data } of parser(file, { signal: abortController.signal })) {
for await (const { event, data } of deliveryApi.parseSse(file, { signal: abortController.signal })) {
if (this._cancelled || abortController.signal.aborted) return;
switch (event) {
case 'status':
@@ -914,10 +900,7 @@ class LieferungNeuPage extends PureComponent {
}
try {
const getFile =
this.context?.delivery?.getFile?.bind(this.context.delivery) ||
deliveryApi.getFile;
const blob = await getFile(docId, fileId);
const blob = await deliveryApi.getFile(docId, fileId);
const filename = attachment.name || 'Dokument';
const mimetype = attachment.type || blob.type || 'application/octet-stream';
const file = new File([blob], filename, { type: mimetype });
@@ -1164,23 +1147,24 @@ class LieferungNeuPage extends PureComponent {
}
this.setState({ saving: true });
const api = apiFor(cfg.kind);
try {
if (isCreate) {
const data = await this.context[cfg.api].create(body);
const data = await api.create(body);
requireObject(data, cfg.postPathLabel);
requireObject(data[cfg.docField], cfg.docField);
requireDefined(data[cfg.docField].id, `${cfg.docField}.id`);
await this.context[cfg.updateCache]();
await cfg.listAutomat.actions.reload();
if (this._cancelled) return;
enqueueSnackbar(cfg.createdMsg, { variant: 'success' });
this.automat.actions.resetDelivery();
this.props.navigate(cfg.editPath(data[cfg.docField].id));
} else {
const data = await this.context[cfg.api].update(docId, body);
const data = await api.update(docId, body);
requireObject(data, cfg.patchPathLabel);
requireObject(data[cfg.docField], cfg.docField);
requireDefined(data[cfg.docField].id, `${cfg.docField}.id`);
await this.context[cfg.updateCache]();
await cfg.listAutomat.actions.reload();
if (this._cancelled) return;
const doc = data[cfg.docField];
const apiLines = requireArray(doc.lines, `${cfg.docField}.lines`);