diff --git a/src/components/manifest/ManifestForm.jsx b/src/components/manifest/ManifestForm.jsx
index 8cce2fe..60890a0 100644
--- a/src/components/manifest/ManifestForm.jsx
+++ b/src/components/manifest/ManifestForm.jsx
@@ -220,6 +220,7 @@ class ManifestForm extends PureComponent {
void this.loadEdit();
} else {
void this.loadPartiesOnly();
+ void ensureDocumentNumber(this.props.kind).catch(() => {});
}
if (this.draftAutomat) {
diff --git a/src/components/manifest/ManifestHeader.jsx b/src/components/manifest/ManifestHeader.jsx
index 6347547..ef28419 100644
--- a/src/components/manifest/ManifestHeader.jsx
+++ b/src/components/manifest/ManifestHeader.jsx
@@ -26,6 +26,8 @@ import { notifyError, notifyErrorMessage } from '../../utils/notify';
import entityAutomat from '../../automats/entityAutomat';
import customergroupAutomat from '../../automats/customergroupAutomat';
import supplierAutomat from '../../automats/supplierAutomat';
+import numberAutomat from '../../automats/numberAutomat';
+import { getNextDocumentNumber, ensureDocumentNumber } from '../../utils/documentNumber';
import {
SURFACE_RAISED,
} from '../../colors';
@@ -231,6 +233,40 @@ class ManifestHeader extends PureComponent {
this.props.onPdfUpload?.(file);
}
+ componentDidMount() {
+ this._cancelled = false;
+ this.unsubNumber = numberAutomat.subscribe(this, () => {
+ this.forceUpdate();
+ });
+ void numberAutomat.actions.ensureLoaded().catch(() => {});
+ if (!this.props.number && this.props.docId == null) {
+ void ensureDocumentNumber(this.props.kind)
+ .then(() => {
+ if (!this._cancelled) this.forceUpdate();
+ })
+ .catch(() => {});
+ }
+ }
+
+ componentDidUpdate(prevProps) {
+ if (
+ !this.props.number &&
+ this.props.docId == null &&
+ (prevProps.kind !== this.props.kind || prevProps.docId !== this.props.docId)
+ ) {
+ void ensureDocumentNumber(this.props.kind)
+ .then(() => {
+ if (!this._cancelled) this.forceUpdate();
+ })
+ .catch(() => {});
+ }
+ }
+
+ componentWillUnmount() {
+ this._cancelled = true;
+ this.unsubNumber?.();
+ }
+
render() {
const {
kind,
@@ -273,6 +309,9 @@ class ManifestHeader extends PureComponent {
const hasArticles = this.hasArticles();
const isEdit = docId != null;
+ const previewNumber =
+ this.props.previewNumber ??
+ (!number && !isEdit ? getNextDocumentNumber(kind) : null);
const hasAttachments = Array.isArray(attachments) && attachments.length > 0;
const hasParty = partyId != null && partyId !== '';
const partyValid = kind !== 'order' || hasParty;
@@ -400,12 +439,25 @@ class ManifestHeader extends PureComponent {
{useExternalNumber ? (
diff --git a/src/utils/documentNumber.js b/src/utils/documentNumber.js
index 3d99d72..346b85d 100644
--- a/src/utils/documentNumber.js
+++ b/src/utils/documentNumber.js
@@ -1,6 +1,7 @@
import numberAutomat from '../automats/numberAutomat';
import quoteAutomat from '../automats/quoteAutomat';
import orderAutomat from '../automats/orderAutomat';
+import deliveryAutomat from '../automats/deliveryAutomat';
/**
* Formats a number pattern given prefix, padding width, and counter.
@@ -18,9 +19,9 @@ export function formatNumberPattern(prefix, padding, next) {
}
/**
- * Returns the next document number for quote or order based on company sequences.
+ * Returns the next document number for quote, order, or delivery based on company sequences.
*
- * @param {'quote'|'order'|string} kind
+ * @param {'quote'|'order'|'delivery'|string} kind
* @returns {string}
*/
export function getNextDocumentNumber(kind) {
@@ -42,7 +43,9 @@ export function getNextDocumentNumber(kind) {
let prefix = '';
let startNum = 1;
- if (
+ if (kind === 'delivery') {
+ prefix = prefixStyle.startsWith('DEL-') ? 'DEL-' : (prefixStyle.startsWith('L-') ? 'L-' : 'LS-');
+ } else if (
prefixStyle.startsWith('ART-') ||
prefixStyle.startsWith('LS-') ||
prefixStyle.startsWith('KD-') ||
@@ -69,8 +72,8 @@ export function getNextDocumentNumber(kind) {
prefix = kind === 'quote' ? 'ANG-' : (kind === 'order' ? 'AUF-' : '');
}
- // Check existing docs from quoteAutomat / orderAutomat to avoid collisions
- const listAutomat = kind === 'quote' ? quoteAutomat : (kind === 'order' ? orderAutomat : null);
+ // Check existing docs from quoteAutomat / orderAutomat / deliveryAutomat to avoid collisions
+ const listAutomat = kind === 'quote' ? quoteAutomat : (kind === 'order' ? orderAutomat : (kind === 'delivery' ? deliveryAutomat : null));
const existingDocs = Array.isArray(listAutomat?.state?.items) ? listAutomat.state.items : [];
let maxFound = startNum - 1;
@@ -99,11 +102,11 @@ export function getNextDocumentNumber(kind) {
/**
* Asynchronously ensures required stores are loaded, then returns the next document number.
*
- * @param {'quote'|'order'|string} kind
+ * @param {'quote'|'order'|'delivery'|string} kind
* @returns {Promise}
*/
export async function ensureDocumentNumber(kind) {
- const listAutomat = kind === 'quote' ? quoteAutomat : (kind === 'order' ? orderAutomat : null);
+ const listAutomat = kind === 'quote' ? quoteAutomat : (kind === 'order' ? orderAutomat : (kind === 'delivery' ? deliveryAutomat : null));
await Promise.all([
numberAutomat.actions.ensureLoaded().catch(() => {}),
listAutomat?.actions?.ensureLoaded ? listAutomat.actions.ensureLoaded().catch(() => {}) : Promise.resolve(),