Die Zeitraum-Regel galt nur an einer Stelle -- Filipe fand die andere
"jetzt hab ich eine hochgeladen ber sehe sie nicht."
WAS PASSIERT IST, aus der Datenbank gelesen und nicht vermutet: Seine
Backstage-Ausgabe lief durch den EINZEL-Import ("Aus Datei einlesen")
und schrieb genau eine Zeile -- creator_id 2, Tag 2026-09-01, alle
Werte 0, Quelle "import", erfasst 11:52. Unsichtbar war sie aus zwei
Gruenden: Der 1. September liegt 13 Tage zurueck (die Liste zeigt
sieben), und es stand nichts darin.
DREI FEHLER AUF EINMAL, und alle drei waren meine:
1. DER ZEITRAUM-SCHUTZ STAND NUR IM BACKSTAGE-WEG. Ich hatte ihn heute
frueh gebaut, gemessen, geprueft -- und an genau einer von drei
Stellen eingesetzt. "2026-09-01 ~ 2026-09-11" wurde im Einzel-Import
weiterhin zum 1. September.
Das ist an diesem Tag das DRITTE Mal dieselbe Sache: eine Regel,
zweimal aufgeschrieben, und die zweite Abschrift ist die
unvollstaendige. Jetzt steht sie EINMAL in `tagAusZelle()` und wird
dreimal benutzt. Sie liefert immer genau eines von beidem: Tag oder
Grund -- nie beides, nie keines.
2. DIE DAUER-EINHEIT FEHLTE DORT EBENFALLS. Auch das hatte ich nur im
Backstage-Weg eingesetzt.
3. DIE DATEI GEHOERTE GAR NICHT DORTHIN. Sie enthaelt ALLE
Creator:innen; der Einzel-Import schreibt auf EINE Person. Es gab
keine Fehlermeldung -- es passierte nur nichts Sichtbares, und das
ist die schlechteste aller Antworten.
Jetzt erkennt der Weg eine Namensspalte mit mehreren verschiedenen
Eintraegen und sagt: "In dieser Datei stehen 3 verschiedene Creator
(Spalte ...). Dieser Weg schreibt auf EINE Person. Nimm
'Backstage-Tabelle einfuegen'." Mit Gegenprobe, dass eine Datei mit
EINEM Creator weiterhin durchgeht.
pruef-xlsx 60 -> 67, pruef-backstage-import 82 -> 86.
NEBENBEFUND AUS DER EIGENEN PRUEFUNG: Mein Testfile fuer den
Einzel-Import hatte selbst zwei verschiedene Creator -- die neue Sperre
hat es sofort abgewiesen. Das war ihr erster echter Treffer, und es
zeigt, dass ich den Weg beim Schreiben der Pruefung selbst falsch
verstanden hatte. Jetzt steht dort, wofuer er da ist: eine Person,
mehrere Tage.
Die Zeile vom 1. September steht noch in der Datenbank. Sie zu
entfernen ist Filipes Entscheidung, nicht meine.
Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
@@ -666,6 +666,32 @@ export function zeitraumLesen(roh) {
|
||||
return { von, bis };
|
||||
}
|
||||
|
||||
/** Der Tag aus einer Zelle -- MIT dem Zeitraum-Schutz.
|
||||
*
|
||||
* (14.09.2026, nachgetragen.) Den Schutz gab es seit heute frueh nur
|
||||
* im Backstage-Weg. Filipe hat daraufhin seine echte Datei durch den
|
||||
* EINZEL-Import geschickt, und genau das ist passiert, wovor der
|
||||
* Schutz bewahren sollte: eine Zeile auf den 1. September, aus einem
|
||||
* Zeitraum vom 1. bis 11.
|
||||
*
|
||||
* Dass es an zwei Stellen stand und an einer fehlte, ist derselbe
|
||||
* Fehler wie an diesem Tag schon zweimal: eine Regel, zweimal
|
||||
* aufgeschrieben, und die zweite Abschrift ist die unvollstaendige.
|
||||
* Deshalb steht sie jetzt EINMAL hier und wird dreimal benutzt.
|
||||
*
|
||||
* Rueckgabe: { tag } oder { fehler } -- nie beides, nie keines.
|
||||
*/
|
||||
export function tagAusZelle(roh) {
|
||||
const zeitraum = zeitraumLesen(roh);
|
||||
if (zeitraum && zeitraum.von !== zeitraum.bis) {
|
||||
return { fehler: `Zeitraum ${zeitraum.von} bis ${zeitraum.bis} – das sind mehrere `
|
||||
+ "Tage auf einmal. Stell in Backstage den Zeitraum auf EINEN Tag." };
|
||||
}
|
||||
const tag = zeitraum ? zeitraum.von : datumLesen(roh);
|
||||
if (!tag) return { fehler: `Datum unlesbar: "${String(roh ?? "").slice(0, 40)}"` };
|
||||
return { tag };
|
||||
}
|
||||
|
||||
/** Macht aus einem Textwert ein Datum "JJJJ-MM-TT".
|
||||
* Erkennt 2026-09-06, 06.09.2026 und 09/06/2026. */
|
||||
export function datumLesen(roh) {
|
||||
@@ -860,29 +886,17 @@ function netzwerkLesen(text, person, tagVorgabe) {
|
||||
const rohWer = String(rohHandle).trim() || String(rohName).trim();
|
||||
if (!rohWer) { schlecht.push({ zeile: i + 1, grund: "Keine Person in der Zeile." }); continue; }
|
||||
|
||||
/* EIN ZEITRAUM IST KEIN TAG (14.09.2026).
|
||||
|
||||
Backstage schreibt in "Datenzeitraum" `2026-09-01 ~ 2026-09-11`.
|
||||
`datumLesen` griff sich davon den ersten Tag -- elf Tage
|
||||
Diamanten waeren auf den 1. September geschrieben worden. Die
|
||||
Zahl steht da, sie ist gross, sie sieht richtig aus, und niemand
|
||||
kann spaeter sagen, dass elf Tage darin stecken.
|
||||
|
||||
Gemessen am echten Export vom 12.09.2026, nicht vermutet.
|
||||
|
||||
Ein Zeitraum von EINEM Tag geht durch -- dann ist die Datei
|
||||
genau das, was hier gebraucht wird. */
|
||||
const zeitraum = ausTabelle ? zeitraumLesen(z[zu.tag]) : null;
|
||||
if (zeitraum && zeitraum.von !== zeitraum.bis) {
|
||||
schlecht.push({ zeile: i + 1,
|
||||
grund: `Zeitraum ${zeitraum.von} bis ${zeitraum.bis} – das sind mehrere Tage `
|
||||
+ "auf einmal. Stell in Backstage den Zeitraum auf EINEN Tag." });
|
||||
continue;
|
||||
/* EIN ZEITRAUM IST KEIN TAG -- die Regel steht in tagAusZelle().
|
||||
Sie stand am 14.09. frueh nur hier; Filipe schickte seine Datei
|
||||
daraufhin durch den Einzel-Import, und dort fehlte sie. Jetzt
|
||||
benutzen alle drei Stellen dieselbe. */
|
||||
let tag = tagVorgabe;
|
||||
if (ausTabelle) {
|
||||
const gelesen = tagAusZelle(z[zu.tag]);
|
||||
if (gelesen.fehler) { schlecht.push({ zeile: i + 1, grund: gelesen.fehler }); continue; }
|
||||
tag = gelesen.tag;
|
||||
}
|
||||
const tag = ausTabelle
|
||||
? (zeitraum ? zeitraum.von : datumLesen(z[zu.tag]))
|
||||
: tagVorgabe;
|
||||
if (!tag) { schlecht.push({ zeile: i + 1, grund: `Datum unlesbar: "${z[zu.tag]}"` }); continue; }
|
||||
if (!tag) { schlecht.push({ zeile: i + 1, grund: "Kein Tag angegeben." }); continue; }
|
||||
if (tag > heuteLokal()) { schlecht.push({ zeile: i + 1, grund: `${tag} liegt in der Zukunft` }); continue; }
|
||||
|
||||
/* Vier Versuche, in dieser Reihenfolge: Handle gegen Handle, Handle
|
||||
@@ -1111,13 +1125,43 @@ leistungRouter.post("/workspace/api/leistung/:creatorId/import/vorschau", gleich
|
||||
});
|
||||
}
|
||||
|
||||
/* DIESE DATEI GEHOERT WOANDERS HIN (14.09.2026).
|
||||
|
||||
Filipe hat seine Backstage-Ausgabe hier hochgeladen -- eine
|
||||
Tabelle mit ALLEN Creator:innen. Dieser Weg schreibt aber auf
|
||||
EINEN Creator; herausgekommen ist eine Zeile mit lauter Nullen
|
||||
auf einem Tag, den er nicht mehr sah.
|
||||
|
||||
"Es passiert nichts Sichtbares" ist die schlechteste aller
|
||||
Antworten. Erkannt wird es an einer Namensspalte mit MEHREREN
|
||||
verschiedenen Eintraegen -- das ist keine Tagesliste, das ist
|
||||
eine Personenliste. */
|
||||
const werSpalte = kopf.findIndex((n) =>
|
||||
/creator|nickname|anmeldename|benutzer|username|handle|tiktok/i.test(String(n)));
|
||||
if (werSpalte >= 0) {
|
||||
const leute = new Set();
|
||||
for (let i = 1; i < zeilen.length; i++) {
|
||||
const w = String(zeilen[i][werSpalte] ?? "").trim().toLowerCase();
|
||||
if (w) leute.add(w);
|
||||
}
|
||||
if (leute.size > 1) {
|
||||
return res.status(409).json({
|
||||
fehler: `In dieser Datei stehen ${leute.size} verschiedene Creator `
|
||||
+ `(Spalte „${kopf[werSpalte]}“). Dieser Weg schreibt auf EINE Person. `
|
||||
+ "Nimm „Backstage-Tabelle einfügen“ – der ordnet jede Zeile selbst zu.",
|
||||
kopf, spalten: zu, mehrere: leute.size,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
const neu = [];
|
||||
const ersetzt = [];
|
||||
const fehlerhaft = [];
|
||||
for (let i = 1; i < zeilen.length; i++) {
|
||||
const z = zeilen[i];
|
||||
const tag = datumLesen(z[zu.tag]);
|
||||
if (!tag) { fehlerhaft.push({ zeile: i + 1, grund: `Datum unlesbar: "${z[zu.tag]}"` }); continue; }
|
||||
const gelesen = tagAusZelle(z[zu.tag]);
|
||||
if (gelesen.fehler) { fehlerhaft.push({ zeile: i + 1, grund: gelesen.fehler }); continue; }
|
||||
const tag = gelesen.tag;
|
||||
if (tag > tagVor(0)) { fehlerhaft.push({ zeile: i + 1, grund: `${tag} liegt in der Zukunft` }); continue; }
|
||||
|
||||
const werte = { tag };
|
||||
@@ -1177,10 +1221,16 @@ leistungRouter.post("/workspace/api/leistung/:creatorId/import", gleicheHerkunft
|
||||
try {
|
||||
for (let i = 1; i < zeilen.length; i++) {
|
||||
const z = zeilen[i];
|
||||
const tag = datumLesen(z[zu.tag]);
|
||||
/* Dieselbe Regel wie in der Vorschau -- sonst zeigt die
|
||||
Vorschau etwas anderes an, als geschrieben wird. Genau das
|
||||
ist der Unterschied, den niemand bemerkt. */
|
||||
const gelesen = tagAusZelle(z[zu.tag]);
|
||||
const tag = gelesen.tag;
|
||||
if (!tag || tag > tagVor(0)) { uebersprungen++; continue; }
|
||||
const w = (feld) => (zu[feld] === undefined ? null : zahlLesen(z[zu[feld]]));
|
||||
const dauer = w("dauer_min");
|
||||
/* Die Dauer hat eine EINHEIT ("86Std. 10Min. 52Sek."), die
|
||||
uebrigen Felder nicht. */
|
||||
const dauer = zu.dauer_min === undefined ? null : dauerLesen(z[zu.dauer_min]);
|
||||
schreiben.run(
|
||||
creatorId, tag, w("diamanten"), dauer,
|
||||
/* Ein gültiger Tag ist ein Tag mit LIVE-Zeit. Steht im
|
||||
|
||||
Reference in New Issue
Block a user