Пример #1
0
        public List <Zahlung> Buche()
        {
            if (Gebucht)
            {
                throw new InvalidOperationException("Diese Abrechnung ist bereits gebucht.");
            }

            Verifiziere();

            var verlustumlage = BerechneVerlustumlage();

            var getränkekosten = BerechneKostenProBenutzer();

            Zahlungen.Clear();
            // Wir fügen selbst dann eine Zahlung hinzu wenn der Benutzer in dieser Abrechnung nichts bezahlen muss
            // Das erlaubt den Schluss abrechnung.Gebucht => es gibt eine Zahlung für jeden Benutzer in abrechnung.Benutzer
            Zahlungen.AddRange(Benutzer.Select(benutzer => new Zahlung()
            {
                Benutzer          = benutzer, // Untypisch, erleichtert aber die Zuweisung
                Betrag            = -verlustumlage[benutzer] - getränkekosten[benutzer],
                Buchungszeitpunkt = Endzeitpunkt,
                Beschreibung      = "Abrechnung: " + Name,
                Abrechnung        = this,
                Löschbar          = false
            }));

            Zahlungen.ForEach(z => z.Benutzer.Buche(z));

            Gebucht = true;

            return(Zahlungen);
        }
Пример #2
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");
            }
        }
Пример #3
0
        public Dictionary <Benutzer, double> BerechneKostenProBenutzer()
        {
            var getränkekosten = Benutzer.ToDictionary(b => b, b => 0.0);

            Verbrauche.ForEach(v => getränkekosten[v.Benutzer] += v.AnzahlFlaschen * v.Verkaufsprodukt.Verkaufspreis);
            return(getränkekosten);
        }
Пример #4
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()));
        }
Пример #5
0
        public Zahlung Storniere()
        {
            var stornoÜberweisung = Überweisung.Storniere();

            var stornoZahlung = new Zahlung()
            {
                Buchungszeitpunkt = DateTime.Now,
                Betrag            = -Betrag,
                Beschreibung      = String.Format("STORNO ({0:d}) - {1}", Buchungszeitpunkt, Beschreibung),
                Überweisung       = stornoÜberweisung,
                Löschbar          = false
            };

            Beschreibung = "STORNIERT - " + Beschreibung;
            Löschbar     = false;
            Benutzer.Buche(stornoZahlung);

            return(stornoZahlung);
        }