bookTile function

TileBooking bookTile(
  1. Cart cart,
  2. CartItemDraft draft, {
  3. required bool bundle,
})

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);
}