public void Verifiziere() { var produkte = Verkaufsprodukte.ToDictionary(vk => vk.Produkt); if (produkte.Count != Verkaufsprodukte.Count) { throw new InvalidOperationException("In dieser Abrechung kommen doppelte Produkte vor."); } if (!Einkäufe.SelectMany(e => e.Positionen).Select(p => p.Kastengröße.Produkt).Distinct().All(p => produkte.ContainsKey(p))) { throw new InvalidOperationException("In den Einkäufen dieser Abrechnung kommt ein Produkt vor, das nicht Teil der Abrechnung ist."); } var paare = Verbrauche.Select(v => new { v.Benutzer, v.Verkaufsprodukt }).ToHashSet(); if (!Benutzer.SelectMany(b => Verkaufsprodukte.Select(p => new { Benutzer = b, Verkaufsprodukt = p })).All(p => paare.Contains(p))) { throw new InvalidOperationException("Diese Abrechnung hat keinen Verbrauch für jeden Benutzer und jedes Produkt"); } if (!Zahlungen.Select(z => z.Benutzer).ToHashSet().SetEquals(Benutzer)) { throw new InvalidOperationException("Diese Abrechnung enthält nicht eine Zahlung für jeden Benutzer"); } }
public Dictionary <Produkt, int> BerechneEinkäufe() { var einkäufe = Verkaufsprodukte.ToDictionary(p => p.Produkt, p => 0); foreach (var position in Einkäufe.SelectMany(e => e.Positionen)) { einkäufe[position.Kastengröße.Produkt] += position.Kastengröße.Größe * position.AnzahlKästen; } return(einkäufe); }
public Dictionary <Produkt, int> BerechneVerluste() { var beständeSoll = Verkaufsprodukte.ToDictionary(p => p.Produkt, p => 0); if (AusgangsBestandAbrechnung != null) { AusgangsBestandAbrechnung.Verkaufsprodukte.Where(p => beständeSoll.ContainsKey(p.Produkt)).ToList().ForEach(b => beständeSoll[b.Produkt] += b.Bestand); } foreach (var position in Einkäufe.SelectMany(e => e.Positionen)) { beständeSoll[position.Kastengröße.Produkt] += position.AnzahlKästen * position.Kastengröße.Größe; } foreach (var verbrauch in Verbrauche) { beständeSoll[verbrauch.Verkaufsprodukt.Produkt] -= verbrauch.AnzahlFlaschen; } var beständeIst = Verkaufsprodukte.ToDictionary(p => p.Produkt, p => p.Bestand); return(Verkaufsprodukte.ToDictionary(p => p.Produkt, p => beständeSoll[p.Produkt] - beständeIst[p.Produkt])); }