feat(receipt-import): add multipack count extraction from raw name and update package fields inference

This commit is contained in:
Nils-Johan Gynther
2026-05-03 16:16:02 +02:00
parent 87eff6a37f
commit a1c4a2f24d
@@ -74,6 +74,15 @@ bool isPackageLikeUnit(String? unit) {
return (packQuantity: value, packUnit: sizeUnit); return (packQuantity: value, packUnit: sizeUnit);
} }
double? extractMultipackCountFromRawName(String rawName) {
final match = RegExp(
r'(\d+)\s*[x×]\s*\d+(?:[\.,]\d+)?\s*(ml|cl|dl|l|g|kg)\b',
caseSensitive: false,
).firstMatch(rawName);
if (match == null) return null;
return double.tryParse(match.group(1)!);
}
// ── Paketfältsinferens ──────────────────────────────────────────────────────── // ── Paketfältsinferens ────────────────────────────────────────────────────────
typedef PackageFields = ({ typedef PackageFields = ({
@@ -92,6 +101,7 @@ PackageFields inferPackageFields({
final normalizedUnit = unit?.trim().toLowerCase(); final normalizedUnit = unit?.trim().toLowerCase();
final safeCount = (quantity != null && quantity > 0) ? quantity : 1.0; final safeCount = (quantity != null && quantity > 0) ? quantity : 1.0;
final extracted = extractPackageSizeFromRawName(rawName); final extracted = extractPackageSizeFromRawName(rawName);
final multipackCount = extractMultipackCountFromRawName(rawName);
// Om rånamnet innehåller storlek (t.ex. "5dl") och enhet saknas eller är // Om rånamnet innehåller storlek (t.ex. "5dl") och enhet saknas eller är
// paketliknande — använd extraherad storlek. // paketliknande — använd extraherad storlek.
@@ -99,11 +109,14 @@ PackageFields inferPackageFields({
(normalizedUnit == null || (normalizedUnit == null ||
normalizedUnit.isEmpty || normalizedUnit.isEmpty ||
isPackageLikeUnit(normalizedUnit))) { isPackageLikeUnit(normalizedUnit))) {
final packageCount = multipackCount != null && multipackCount > 0
? multipackCount
: safeCount;
return ( return (
packQuantity: extracted.packQuantity, packQuantity: extracted.packQuantity,
packUnit: extracted.packUnit, packUnit: extracted.packUnit,
packageCount: safeCount, packageCount: packageCount,
totalQuantity: extracted.packQuantity * safeCount, totalQuantity: extracted.packQuantity * packageCount,
totalUnit: extracted.packUnit, totalUnit: extracted.packUnit,
); );
} }