Stapel merken sich gelesene Barcode-Inhalte, entscheiden die Zuordnung

Jeder Stapel fuehrt jetzt die Menge der Barcode-Zeichenketten, die bei
seinen Modulen gelesen wurden (stack.codes). Traegt ein gescanntes Modul
einen Code, den ein Stapel bereits kennt, hat das Vorrang vor dem Vergleich
der technischen Angaben - ein Barcode ist exakt gelesen, abgeleitete Angaben
koennen fehlerbehaftet sein. Genau ein Stapel ueber einen bekannten Code
-> Zuweisung, auch bei unvollstaendigen Angaben; mehrere -> weiterhin
mehrdeutig, der Nutzer entscheidet; kein passender Code -> unveraendert die
bisherige Regel. Eine Seriennummer, die bei jedem Modul anders ist, laeuft
dabei einfach ins Leere, ohne die Zuordnung ueber die Teilenummer zu
verhindern.

proposeAssignment und commitAssignment bekommen dafuer einen neuen, optional
en codes-Parameter (Vorgabe []); bestehende Aufrufe ohne diesen Parameter
verhalten sich unveraendert.

storage.js sichert und prueft stack.codes jetzt mit: fehlt das Feld (Stand
aus einer aelteren Fassung), gilt der Stapel als ohne bekannte Codes statt
den ganzen Stand zu verwerfen; ist es vorhanden, muss es eine Liste von
Zeichenketten sein wie jedes andere Feld auch.
This commit is contained in:
vchuser
2026-07-29 09:05:23 +02:00
parent 661bd07a26
commit 61dde3eb08
4 changed files with 221 additions and 10 deletions
+55
View File
@@ -244,6 +244,61 @@ test('nextEntryId als Null liefert null', () => {
assert.equal(loadSession(store), null);
});
// --- Erweiterung: Barcode-Inhalte je Stapel ueberleben Sichern und Laden ---
test('Codes eines Stapels ueberleben Sichern und Laden', () => {
const store = fakeStore();
const session = createSession();
commitAssignment(
session,
{ ...emptySpec(), partNumber: 'HMA84GL7AFR4N-UH' },
'barcode',
'A',
['HMA84GL7AFR4N-UH', 'SN-000'],
);
saveSession(session, store);
const reloaded = loadSession(store);
assert.notEqual(reloaded, null);
assert.deepEqual([...reloaded.stacks[0].codes].sort(), ['HMA84GL7AFR4N-UH', 'SN-000'].sort());
const plan = proposeAssignment(reloaded, emptySpec(), ['HMA84GL7AFR4N-UH']);
assert.equal(plan.kind, 'match');
assert.equal(plan.stackId, 'A');
});
test('ein Stand ohne codes-Feld (aeltere Fassung) wird nicht verworfen, der Stapel gilt als ohne bekannte Codes', () => {
const store = fakeStore();
store.setItem('ram-sortierhilfe:session', JSON.stringify({
stacks: [{ id: 'A', count: 1, spec: { ...emptySpec(), capacityGb: 64 } }],
entries: [{ entryId: 1, stackId: 'A', spec: { ...emptySpec(), capacityGb: 64 }, source: 'barcode' }],
nextEntryId: 2,
}));
const reloaded = loadSession(store);
assert.notEqual(reloaded, null, 'ein Stand ohne codes-Feld darf nicht verworfen werden');
assert.deepEqual(reloaded.stacks[0].codes, []);
});
test('Stapel mit codes als Nicht-Array liefert null', () => {
const store = fakeStore();
store.setItem('ram-sortierhilfe:session', JSON.stringify({
stacks: [{ id: 'A', count: 0, spec: emptySpec(), codes: 'nicht-array' }],
entries: [],
nextEntryId: 1,
}));
assert.equal(loadSession(store), null);
});
test('Stapel mit codes-Array, das Nicht-Zeichenketten enthaelt, liefert null', () => {
const store = fakeStore();
store.setItem('ram-sortierhilfe:session', JSON.stringify({
stacks: [{ id: 'A', count: 0, spec: emptySpec(), codes: [123] }],
entries: [],
nextEntryId: 1,
}));
assert.equal(loadSession(store), null);
});
test('Eintrag mit gebrochener entryId liefert null', () => {
const store = fakeStore();
store.setItem('ram-sortierhilfe:session', JSON.stringify({