Пример #1
0
        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");
            }
        }
Пример #2
0
        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);
        }
Пример #3
0
        public Dictionary <Benutzer, double> BerechneVerlustumlage()
        {
            var verluste = BerechneVerluste();

            var verbrauchProProdukt = BerechneVerbrauche();

            var verbrauche = Verbrauche.ToDictionary(v => new { v.Benutzer, v.Verkaufsprodukt }, v => v.AnzahlFlaschen);

            // Jeder Benutzer beteiligt sich an den Verlusten anteilig entsprechend seinem Anteil am gesamten Verbrauch dieses Produkts
            return(Benutzer.ToDictionary(b => b,
                                         b => Verkaufsprodukte.Select(p => verbrauchProProdukt[p.Produkt] != 0 ? verluste[p.Produkt] * p.Verkaufspreis * verbrauche[new { Benutzer = b, Verkaufsprodukt = p }] / verbrauchProProdukt[p.Produkt] : 0.0).Sum()));
        }
Пример #4
0
 public Dictionary <Produkt, int> BerechneAltbestände()
 {
     if (AusgangsBestandAbrechnung == null)
     {
         return(Verkaufsprodukte.ToDictionary(vk => vk.Produkt, vk => 0));
     }
     else
     {
         var ausgang = AusgangsBestandAbrechnung.Verkaufsprodukte.ToDictionary(vk => vk.Produkt, vk => vk.Bestand);
         return(Produkte.ToDictionary(p => p, p => ausgang.ContainsKey(p) ? ausgang[p] : 0));
     }
 }
Пример #5
0
        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]));
        }