public void Entferne(Abrechnung abrechnung, Einkauf einkauf)
 {
     abrechnung.Einkäufe.Remove(einkauf);
     einkauf.Abrechnung = null;
     BearbeiteAbrechnung(abrechnung);
     Einkaufsteuerung.BearbeiteEinkauf(einkauf);
 }
        public void LöscheEinkauf(Einkauf einkauf)
        {
            if (!IstLöschbar(einkauf))
            {
                throw new InvalidOperationException("Dieser Einkauf ist nicht löschbar, er ist Teil einer schon abgerechneten Abrechnung.");
            }

            using (var transaktion = Kontext.Database.BeginOrReuseTransaction())
            {
                if (einkauf.Abrechnung != null)
                {
                    Abrechnungssteuerung.Entferne(einkauf.Abrechnung, einkauf);
                }

                Einkaufspositionssteuerung.LöschePositionen(einkauf.Positionen.ToList(), erzwinge: true);

                var überweisung = einkauf.Überweisung;
                Überweisungssteuerung.StorniereÜberweisung(überweisung, erzwinge: true);
                einkauf.Überweisung = null;

                Kontext.Einkäufe.Remove(einkauf);
                Kontext.SaveChanges();
                transaktion?.Commit();
            }
            EinkaufGelöscht?.Invoke(einkauf);
        }
        public void NeuerEinkauf(Einkauf einkauf, Konto konto)
        {
            var überweisung = einkauf.RechneAb(konto);

            Überweisungssteuerung.NeueÜberweisung(überweisung);
            NeuerEinkauf(einkauf);
        }
 public void FügeHinzu(Abrechnung abrechnung, Einkauf einkauf)
 {
     using (var transaktion = Kontext.Database.BeginOrReuseTransaction())
     {
         abrechnung.Einkäufe.Add(einkauf);
         einkauf.Abrechnung = abrechnung;
         FügeHinzu(abrechnung, einkauf.Positionen.Select(p => p.Kastengröße.Produkt).Distinct().ToList());
         BearbeiteAbrechnung(abrechnung);
         Einkaufsteuerung.BearbeiteEinkauf(einkauf);
         transaktion?.Commit();
     }
 }
 private void FülleEinkäufe(Einkauf einkauf = null)
 {
     if (einkauf == null)
     {
         Einkäufeliste.SetObjects(einkaufsteuerung.Einkäufe.ToList());
         Einkäufeliste.Sort(DatumSpalte, SortOrder.Descending);
     }
     else
     {
         Einkäufeliste.RefreshObject(einkauf);
     }
 }
示例#6
0
        public void NeuePosition(Einkaufsposition position, Einkauf einkauf)
        {
            if (!Einkaufsteuerung.IstLöschbar(einkauf))
            {
                throw new InvalidOperationException("Zu diesem Einkauf kann keine Position mehr hinzugefügt werden.");
            }

            position.Einkauf = einkauf;
            einkauf.Positionen.Add(position);
            if (einkauf.Abrechnung != null && !einkauf.Abrechnung.Produkte.Contains(position.Kastengröße.Produkt))
            {
                Abrechnungssteuerung.FügeHinzu(einkauf.Abrechnung, position.Kastengröße.Produkt);
            }

            Kontext.SaveChanges();
            EinkaufspositionHinzugefügt?.Invoke(position);
        }
        private void NeuerEinkaufKnopf_Click(object sender, EventArgs e)
        {
            var betrag = BetragBox.Betrag;

            if (betrag == null)
            {
                return;
            }

            var einkauf = new Einkauf()
            {
                Zeitpunkt       = DatumBox.Value,
                Rechnungsnummer = RechnungsnummberBox.Text,
                Betrag          = betrag.Value
            };

            einkaufsteuerung.NeuerEinkauf(einkauf, KontoBox.Konto);
        }
 private void EinkaufGelöscht(Einkauf einkauf)
 {
     Einkäufeliste.RemoveObject(einkauf);
 }
 private void NeuerEinkauf(Einkauf einkauf)
 {
     Einkäufeliste.AddObject(einkauf);
     Einkäufeliste.EnsureModelVisible(einkauf);
 }
 public void NeuerEinkauf(Einkauf einkauf)
 {
     Kontext.Einkäufe.Add(einkauf);
     Kontext.SaveChanges();
     EinkaufHinzugefügt?.Invoke(einkauf);
 }
 public void BearbeiteEinkauf(Einkauf einkauf)
 {
     Kontext.SaveChanges();
     EinkaufVerändert?.Invoke(einkauf);
 }
 public bool IstLöschbar(Einkauf einkauf) => einkauf.Abrechnung == null || !einkauf.Abrechnung.Gebucht;
示例#13
0
文件: Program.cs 项目: ae2021/csharp1
        static void Main(string[] args)
        {
            Console.OutputEncoding = System.Text.Encoding.UTF8; // z.B. für das Sonderzeichen €

            // Einführung aller Objekte (noch OHNE Assoziations-Information)
            Auto a1 = new Auto();

            a1.Id    = 1;
            a1.Marke = "VW";

            Auto a2 = new Auto();

            a2.Id    = 2;
            a2.Marke = "Opel";


            Fahrer f1 = new Fahrer();

            f1.Id       = 1;
            f1.Nachname = "Müller";

            Fahrer f2 = new Fahrer();

            f2.Id       = 2;
            f2.Nachname = "Mayer";

            // Darstellung der vorliegenden Assoziationen:
            f1.AutoListe.Add(a1);   // Fahrer 1 darf Auto 1 verwenden
            f1.AutoListe.Add(a2);   // Fahrer 1 darf Auto 2 verwenden
            f2.AutoListe.Add(a1);   // Fahrer 2 darf Auto 1 verwenden
            // (redundante) weitere Informationen (um auch die Navigierbarkeit von Auto zu Fahrer herstellen zu können)
            a1.FahrerListe.Add(f1); // Auto 1 darf von Fahrer 1 genutzt werden
            a1.FahrerListe.Add(f2); // Auto 1 darf von Fahrer 2 genutzt werden
            a2.FahrerListe.Add(f1); // Auto 2 darf von Fahrer 1 genutzt werden

            // 2 Beispielsausgaben (als Beispiele für die unterschiedlichen Navigationsrichtungen Fahrer->Auto / Auto->Fahrer)
            Console.WriteLine("Alle Autos von Fahrer 1:");
            foreach (Auto a in f1.AutoListe)
            {
                Console.WriteLine("ID: " + a.Id + " / Marke: " + a.Marke);
            }

            Console.WriteLine("\nAlle Fahrer des Autos 1:");
            foreach (Fahrer f in a1.FahrerListe)
            {
                Console.WriteLine("ID: " + f.Id + " / Nachname: " + f.Nachname);
            }


            // ***********************************************************************************************************************
            // Beispiel für eine Assoziationsklasse (Produkt - Kunde)
            // m:n-Beziehung, denn: Ein Produkt kann von mehreren Kunden gekauft werden, und ein Kunde kann mehrere Produkte kaufen
            // (In diesem Beispiel: Kunde 1 kauft die Produkte 1 und 2  /  Kunde 2 kauft Produkt 1)

            // Instanziierung aller Objekte:
            Kunde k1 = new Kunde();

            k1.Id       = 1;
            k1.Nachname = "Schmidt";

            Kunde k2 = new Kunde();

            k2.Id       = 2;
            k2.Nachname = "Hansen";


            Produkt p1 = new Produkt();

            p1.Id    = 1;
            p1.Preis = 3.50;

            Produkt p2 = new Produkt();

            p2.Id    = 2;
            p2.Preis = 4.70;

            // Instanziierung der Objekte vom Typ Einkauf (jedes Objekt steht dann für eine Assoziation zwischen einem Kunden und einem Produkt)

            // Einkauf 1: Kunde 1 kaufte Produkt 1
            Einkauf e1 = new Einkauf();

            e1.Käufer = k1;
            e1.Ware   = p1;

            // Einkauf 2: Kunde 1 kaufte Produkt 2
            Einkauf e2 = new Einkauf();

            e2.Käufer = k1;
            e2.Ware   = p2;

            // Einkauf 3: Kunde 2 kaufte Produkt 1
            Einkauf e3 = new Einkauf();

            e3.Käufer = k2;
            e3.Ware   = p1;

            // Damit wären wir bereits am Ziel FALLS wir uns ausschließlich mit einer Navigation Einkauf->Produkt, bzw. Einkauf->Kunde
            // begnügen würden. Beispiel:
            Console.WriteLine("\nKunde und Produkt von Einkauf 1:  Kundenname: " + e1.Käufer.Nachname + "   Produkt-ID: " + e1.Ware.Id);

            // Falls wir hingegen die Navigation Kunde->Produkt und Produkt->Kunde betrachten wollen, dann benötigen wir noch eine
            // Einkaufsliste (die als statische Liste auch in der Klasse Einkauf eingetragen werden könnte), die wir aber hier im Main einführen:

            // Liste aller Einkäufe:
            List <Einkauf> einkaufListe = new List <Einkauf>();

            // Befüllen der Liste mit allen drei Einkäufen:
            einkaufListe.Add(e1);
            einkaufListe.Add(e2);
            einkaufListe.Add(e3);

            //Alle Schritte in Einem!
            einkaufListe.Add(new Einkauf()
            {
                Käufer = new Kunde
                {
                    Id       = 4,
                    Nachname = "Müller"
                },
                Ware = new Produkt
                {
                    Id    = 4,
                    Preis = 1.99
                }
            });



            // Navigation Kunde->Produkt
            Console.WriteLine("\nListe aller Produkte, die von Kunden 1 gekauft wurden:");
            foreach (Einkauf e in einkaufListe)
            {
                if (e.Käufer.Id == 1)
                {
                    Console.WriteLine("Produkt-ID: " + e.Ware.Id + "   Preis: " + e.Ware.Preis + "€");
                }
            }

            // Navigation Produkt->Kunde
            Console.WriteLine("\nAlle Kunden der Ware 1:");
            foreach (Einkauf e in einkaufListe)
            {
                if (e.Ware.Id == 1)
                {
                    Console.WriteLine("Kunden-ID: " + e.Käufer.Id + "   Nachname: " + e.Käufer.Nachname);
                }
            }



            // Ergänzende Bemerkung:
            // Beim Design eines Programmes und der Erkenntnis, eine Assoziationsklasse einführen zu müssen (wollen) kann es natürlich
            // dabei bleiben, diese Assoziationsklasse als reine technische Notwendigkeit einzuführen und ansonsten inhaltlich nicht zu
            // nutzen ... nicht untypisch ist aber, dass man mit der Erkenntnis, eine Assoziationsklasse verwenden zu sollen, diese auch noch
            // als "eigenständige" Klasse begreift, entsprechend ergänzt und daher effektiver nutzt:

            // Beispiel:
            // Die Assoziationsklasse "Einkauf" muss nicht nur über die Assoziation Kunde-Ware sprechen, sondern kann durch weitere Informationen
            // aufgewertet werden (z.B. Einkaufsdatum) [wenn dies geschieht, dann lohnt es sich in der Regel auch, eine ID zu vergeben]

            Console.ReadKey();
        }