feat(receipt-import): add multipack count extraction from raw name and update package fields inference
This commit is contained in:
@@ -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,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user