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); } }
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;
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(); }