feat: tabellengesteuerter Teilenummer-Decoder

Deckt die Samsung-Referenz-Teilenummer aus dem physisch vorhandenen
Modul ab. Unbekannte Fragmente (z.B. nicht gelistete Dichte-Codes)
liefern bewusst null statt einer Vermutung - das ist der geplante
Uebergang zum OCR-Weg, kein Fehlerfall.

Das im Task-Brief vorgegebene Regex-Muster liess das literale 'A' der
Dichte-Kennung ausserhalb der Erfassungsgruppe, wodurch die
Tabellensuche nach 'A8K40' nie greifen konnte. Muster korrigiert, damit
die ebenfalls vorgegebenen Tests bestehen; Tabelleninhalte und
Warnkommentar blieben wortgleich.
This commit is contained in:
vchuser
2026-07-28 14:29:13 +02:00
parent 8199d25a6e
commit c580d4f924
3 changed files with 115 additions and 0 deletions
+34
View File
@@ -0,0 +1,34 @@
import { emptySpec, normalizeToken } from './spec.js';
import { VENDOR_TABLES } from './pn-tables.js';
/**
* Leitet aus einer Hersteller-Teilenummer die Spec-Felder ab.
* Nicht ableitbare Felder bleiben null - das ist kein Fehler,
* sondern der regulaere Uebergang zum OCR-Weg.
*/
export function decodePartNumber(pn) {
const spec = emptySpec();
const normalized = normalizeToken(pn);
if (normalized === '') return spec;
spec.partNumber = normalized;
for (const table of VENDOR_TABLES) {
const match = normalized.match(table.pattern);
if (!match) continue;
const [, formCode, densityCode, speedCode] = match;
spec.formFactor = table.formFactor[formCode] ?? null;
spec.speed = table.speed[speedCode] ?? null;
const density = table.density[densityCode];
if (density) {
spec.capacityGb = density.capacityGb;
spec.rank = density.rank;
}
break;
}
return spec;
}