Konfigurator: Sammelbestellung ohne Empfängerliste > 25 wieder bestellbar
All checks were successful
Build & Deploy / deploy (push) Successful in 22s

Die neue Mengen-Sperre (entries.length === quantity) hätte identische
Sammelkarten ohne Empfängerliste oberhalb der Tabellengrenze blockiert:
dort wuchs entries nie auf die Menge, weil der Sync-Effekt pauschal bei
> 25 pausierte. Der Sync pausiert jetzt nur noch, wenn pro Zeile wirklich
Daten nötig sind (Empfänger-/Individualtext-Schritt oder eigene
Platzhalter im Brieftext). Ohne solche Daten erzeugt die Menge N
Blanko-Zeilen – auch > 25. Extern-Modus unverändert.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
s4luorth
2026-09-21 11:57:59 +02:00
parent 9a467b9fb5
commit dd9ab3736b

View File

@@ -584,23 +584,6 @@ export default function Configurator({ vorwahlProdukt }: { vorwahlProdukt?: stri
useEffect(() => { setPreviewSession(null); },
[textTemplate, font, format, realistisch, labeling, needsEnvelope, umschlagText, entries]);
// Empfängerzeilen an die Menge angleichen (nur im Tabellenmodus). Gilt auch im
// Extern-Modus: die (vom Betreiber vorgegebene) Menge erzeugt die passende
// Anzahl Zeilen – egal ob mit oder ohne Kuvert/Empfänger.
useEffect(() => {
// Bei vielen Empfängern (Tabelle unpraktisch) wird auf Excel verwiesen und
// nicht synchronisiert – AUSSER im Extern-Modus ohne Empfänger-Schritt, wo die
// Menge einfach N Blanko-Dokumente erzeugen muss (auch über der Tabellengrenze).
if (nurUpload && (!externModus || empfaengerSchritt)) return;
setEntries((prev) => {
if (prev.length === quantity) return prev;
if (prev.length < quantity) {
return [...prev, ...Array.from({ length: quantity - prev.length }, leereEntry)];
}
return prev.slice(0, quantity);
});
}, [quantity, nurUpload, externModus, empfaengerSchritt]);
// Extern-Preset (vom Betreiber im Direktlink gesetzt) – der Kunde wählt nichts:
// ?extern=1&versand=sammel|einzeln&kuvert=0|1&beschriftung=empfaenger|freitext|keine&menge=N
// Die Menge ist maßgeblich (greift immer); nur ein Excel-Import passt sie an die
@@ -806,6 +789,27 @@ export default function Configurator({ vorwahlProdukt }: { vorwahlProdukt?: stri
const eigeneImText = genutztePlatzhalter.filter((p) => !standardSet.has(p.toLowerCase()));
/** Platzhalter im individuellen Umschlagtext – analog zur Text-Tabelle. */
const genutztePlatzhalterUmschlag = useMemo(() => textPlatzhalter(umschlagText), [umschlagText]);
// Müssen pro Dokument eigene Daten erfasst werden? Das ist der Fall bei einem
// Empfänger-/Individualtext-Schritt oder bei eigenen Platzhaltern im Brieftext
// (jede Zeile trägt andere Werte → oberhalb der Tabellengrenze via Excel).
const zeilenDatenNoetig = !!empfaengerSchritt || eigeneImText.length > 0;
// Empfängerzeilen an die Menge angleichen. Unterhalb der Tabellengrenze immer;
// darüber nur, wenn KEINE Pflicht-Zeilendaten nötig sind (z. B. identische
// Sammelkarten ohne Empfängerliste) – dann erzeugt die Menge N Blanko-Zeilen.
// Werden pro Zeile Daten gebraucht, bleibt es beim Excel-Upload (nicht syncen).
// Im Extern-Modus wie bisher: syncen außer bei Empfänger-/Individualtext-Schritt.
useEffect(() => {
if (nurUpload && (externModus ? empfaengerSchritt : zeilenDatenNoetig)) return;
setEntries((prev) => {
if (prev.length === quantity) return prev;
if (prev.length < quantity) {
return [...prev, ...Array.from({ length: quantity - prev.length }, leereEntry)];
}
return prev.slice(0, quantity);
});
}, [quantity, nurUpload, externModus, empfaengerSchritt, zeilenDatenNoetig]);
/**
* Entry für den Versand ans Backend: löst ALLE im Text/Umschlag genutzten
* Platzhalter explizit auf (Standard-Platzhalter aus der Adresse via standardWert,