subtracted method

Cart subtracted(
  1. Cart sold
)

Zieht die verkauften Positionen ab.

Gebraucht, weil der Abschluss dauert (Signatur, DEP) und die Erfassung dabei offen bleibt: der naechste Gast steht schon da. Im Augenblick der Antwort kann der Korb deshalb mehr enthalten, als der Beleg ausweist — ihn dann pauschal zu leeren hiesse, diese Position spurlos zu verlieren: nicht berechnet, auf keinem Beleg, nicht mehr auffindbar.

Abgezogen wird nach Kennung und Menge: wurden zwei von drei Kaffee verkauft, bleibt einer stehen.

Implementation

Cart subtracted(Cart sold) {
  final mengen = <String, int>{};
  for (final p in sold.items) {
    mengen[p.id] = (mengen[p.id] ?? 0) + p.quantity;
  }
  final rest = <Position>[];
  for (final p in items) {
    final bleibt = p.quantity - (mengen[p.id] ?? 0);
    if (bleibt <= 0) continue;
    rest.add(bleibt == p.quantity ? p : p.withQuantity(bleibt));
  }
  return Cart(items: rest);
}