bookTile function
Kachel in den Korb.
Mit bundle wird eine gleiche Zeile (Name, Preis, Satz und
Artikel-ID) hochgezählt, ohne entsteht je Griff eine Zeile. Zwei Artikel
gleichen Aussehens bleiben zwei Zeilen (jeder bucht sein eigenes Lager),
ebenso ein Artikel und eine freie Position; freie Positionen ohne ID
bündeln wie bisher. Eine leere Artikel-ID gilt auf beiden Seiten als
keine (auch an einer von Hand gebauten Position). Die Höchstmenge des
Artikels hält auch hier – Cart.withQuantity deckelt, egal woher der
Griff kommt.
Implementation
TileBooking bookTile(Cart cart, CartItemDraft draft, {required bool bundle}) {
if (bundle) {
final artikel = artikelIdOderNull(draft.articleId);
for (final p in cart.items) {
if (p.name != draft.name.trim()) continue;
if (p.priceCents != draft.unitPriceCents) continue;
if (p.vat != draft.vatRate) continue;
if (artikelIdOderNull(p.articleId) != artikel) continue;
final neu = cart.withQuantity(p.id, p.quantity + 1);
final zeile = neu.items.firstWhere((z) => z.id == p.id);
return TileBooking(cart: neu, lineId: p.id, quantity: zeile.quantity);
}
}
final neu = cart.added(draft);
// Ohne Bezeichnung bleibt der Korb unverändert; dann gibt es keine Zeile.
if (identical(neu, cart) || neu.items.isEmpty) {
return TileBooking(cart: cart, lineId: '', quantity: 0);
}
return TileBooking(cart: neu, lineId: neu.items.last.id, quantity: 1);
}