public void Schließe()
 {
     if (kontext != null)
     {
         kontext.Dispose();
     }
     kontext = null;
 }
        public void Öffne(string dateiname)
        {
            var kontext = new GetränkeabrechnungKontext(dateiname);

            if (kontext.Database.Exists())
            {
                this.kontext = kontext;
            }
        }
 public Datenbanksteuerung() : base(null)
 {
     kontext = null;
     abrechnungssteuerung       = new Abrechnungssteuerung(this);
     benutzersteuerung          = new Benutzersteuerung(this);
     einkaufsteuerung           = new Einkaufsteuerung(this);
     einkaufspositionssteuerung = new Einkaufspositionssteuerung(this);
     kastengrößensteuerung      = new Kastengrößensteuerung(this);
     kontosteuerung             = new Kontosteuerung(this);
     produktsteuerung           = new Produktsteuerung(this);
     überweisungssteuerung      = new Überweisungssteuerung(this);
     verbrauchsteuerung         = new Verbrauchsteuerung(this);
     verkaufsproduktsteuerung   = new Verkaufsproduktsteuerung(this);
     zahlungssteuerung          = new Zahlungssteuerung(this);
 }
Пример #4
0
        public static void Main(string[] args)
        {
            CultureInfo.DefaultThreadCurrentCulture   = new CultureInfo("de-DE");
            CultureInfo.DefaultThreadCurrentUICulture = new CultureInfo("de-DE");
            Console.Out.WriteLine("Reading Database...");
            var connection = new SQLiteConnection(@"Data Source=D:\Project\Getränkeabrechnung\Getränkeabrechnung\drinkaccounting.sqlite");

            connection.Open();
            Console.Out.WriteLine("Read Database...");

            var command = connection.CreateCommand();

            command.CommandText = "select * from cgross_drinkaccounting_domain_model_statement";
            var result     = command.ExecuteReader();
            var statements = result.Cast <IDataRecord>()
                             .Select(r => new
            {
                id                    = r["persistence_object_identifier"] as string,
                title                 = r["title"] as string,
                datestart             = (DateTime)r["datestart"],
                datestop              = (DateTime)r["datestop"],
                billed                = ((byte)r["billed"]) > 0,
                step                  = (int)r["step"],
                initialstockstatement = r["initialstockstatement"] as string
            })
                             .ToDictionary(r => r.id);

            command             = connection.CreateCommand();
            command.CommandText = "select * from cgross_drinkaccounting_domain_model_product";
            result = command.ExecuteReader();
            var products = result.Cast <IDataRecord>()
                           .Select(r => new
            {
                id            = r["persistence_object_identifier"] as string,
                parent        = r["parent"] as string,
                name          = r["name"] as string,
                price         = (double)r["price"],
                cratesize     = (int)r["cratesize"],
                purchaseprice = (double)r["purchaseprice"],
                deposit       = (double)r["deposit"],
                active        = ((byte)r["active"]) > 0,
                position      = (int)r["position"],
                hidden        = ((byte)r["hidden"]) > 0,
                ancestor      = r["ancestor"] as string
            })
                           .ToDictionary(r => r.id);

            command             = connection.CreateCommand();
            command.CommandText = "select * from cgross_drinkaccounting_domain_model_account";
            result = command.ExecuteReader();
            var accounts = result.Cast <IDataRecord>()
                           .Select(r => new
            {
                id      = r["persistence_object_identifier"] as string,
                name    = r["name"] as string,
                balance = (double)r["balance"]
            })
                           .ToDictionary(r => r.id);

            command             = connection.CreateCommand();
            command.CommandText = "select * from cgross_drinkaccounting_domain_model_transaction";
            result = command.ExecuteReader();
            var transactions = result.Cast <IDataRecord>()
                               .Select(r => new
            {
                id              = r["persistence_object_identifier"] as string,
                account_id      = r["account"] as string,
                transactiondate = (DateTime)r["transactiondate"],
                creationdate    = (DateTime)r["creationdate"],
                sum             = (double)r["sum"],
                balanceold      = (double)r["balanceold"],
                balancenew      = (double)r["balancenew"],
                transactiondesc = r["transactiondesc"] as string,
                deletable       = ((byte)r["deletable"]) > 0
            }).ToDictionary(r => r.id);

            command             = connection.CreateCommand();
            command.CommandText = "select * from cgross_drinkaccounting_domain_model_user";
            result = command.ExecuteReader();
            var users = result.Cast <IDataRecord>()
                        .Select(r => new
            {
                id         = r["persistence_object_identifier"] as string,
                name       = r["name"] as string,
                surname    = r["surname"] as string,
                roomnumber = (int)r["roomnumber"],
                nickname   = r["nickname"] as string,
                balance    = (double)r["balance"],
                active     = ((byte)r["active"]) > 0,
                deposit    = (double)r["deposit"]
            }).ToDictionary(r => r.id);

            command             = connection.CreateCommand();
            command.CommandText = "select * from cgross_drinkaccounting_domain_model_payment";
            result = command.ExecuteReader();
            var payments = result.Cast <IDataRecord>()
                           .Select(r => new
            {
                id             = r["persistence_object_identifier"] as string,
                user_id        = r["user"] as string,
                statement_id   = r["statement"] as string,
                transaction_id = r["transaction"] as string,
                paymentdate    = (DateTime)r["paymentdate"],
                creationdate   = (DateTime)r["creationdate"],
                sum            = (double)r["sum"],
                balanceold     = (double)r["balanceold"],
                balancenew     = (double)r["balancenew"],
                paymentdesc    = r["paymentdesc"] as string,
                deletable      = ((byte)r["deletable"]) > 0
            }).ToDictionary(r => r.id);

            command             = connection.CreateCommand();
            command.CommandText = "select * from cgross_drinkaccounting_domain_model_consumption";
            result = command.ExecuteReader();
            var consumptions = result.Cast <IDataRecord>()
                               .Select(r => new
            {
                id              = r["persistence_object_identifier"] as string,
                statement_id    = r["statement"] as string,
                consumptiondate = (DateTime)r["consumptiondate"],
                user_id         = r["user"] as string,
                product_id      = r["product"] as string,
                bottleamount    = (int)r["bottleamount"]
            }).ToList();

            command             = connection.CreateCommand();
            command.CommandText = "select * from cgross_drinkaccounting_domain_model_stock";
            result = command.ExecuteReader();
            var stocks = result.Cast <IDataRecord>()
                         .Select(r => new
            {
                id           = r["persistence_object_identifier"] as string,
                statement_id = r["statement"] as string,
                product_id   = r["product"] as string,
                bottleamount = (int)r["bottleamount"]
            }).ToList();

            command             = connection.CreateCommand();
            command.CommandText = "select * from cgross_drinkaccounting_domain_model_purchase";
            result = command.ExecuteReader();
            var purchases = result.Cast <IDataRecord>()
                            .Select(r => new
            {
                id             = r["persistence_object_identifier"] as string,
                purchasedate   = (DateTime)r["purchasedate"],
                invoicetext    = r["invoictext"] as string,  // ja stimmt so
                sum            = (double)r["sum"],
                transaction_id = r["transaction"] as string,
                statement_id   = r["statement"] as string
            }).ToDictionary(r => r.id);

            command             = connection.CreateCommand();
            command.CommandText = "select * from cgross_drinkaccounting_domain_model_purchaseposition";
            result = command.ExecuteReader();
            var purchasepositions = result.Cast <IDataRecord>()
                                    .Select(r => new
            {
                id          = r["persistence_object_identifier"] as string,
                product_id  = r["product"] as string,
                purchase_id = r["purchase"] as string,
                crateamount = (int)r["crateamount"]
            }).ToDictionary(r => r.id);

            command             = connection.CreateCommand();
            command.CommandText = "select * from cgross_drinkaccounting_domain_model_statement_products_join";
            result = command.ExecuteReader();
            var statement_products_join = result.Cast <IDataRecord>()
                                          .Select(r => new
            {
                statement_id = r["drinkaccounting_statement"] as string,
                product_id   = r["drinkaccounting_product"] as string,
            }).ToList();

            command             = connection.CreateCommand();
            command.CommandText = "select * from cgross_drinkaccounting_domain_model_statement_users_join";
            result = command.ExecuteReader();
            var statement_users_join = result.Cast <IDataRecord>()
                                       .Select(r => new
            {
                statement_id = r["drinkaccounting_statement"] as string,
                user_id      = r["drinkaccounting_user"] as string,
            }).ToList();

            connection.Close();

            var abrechnungen = statements.Select(kv => new KeyValuePair <string, Abrechnung>(kv.Key,
                                                                                             new Abrechnung
            {
                Name           = kv.Value.title,
                Startzeitpunkt = kv.Value.datestart,
                Endzeitpunkt   = kv.Value.datestop,
                Gebucht        = kv.Value.billed,
                Schritt        = kv.Value.step,
            })).ToDictionary(kv => kv.Key, kv => kv.Value);

            foreach (var statement in statements.Values.Where(s => s.initialstockstatement != null))
            {
                abrechnungen[statement.id].AusgangsBestandAbrechnung = abrechnungen[statement.initialstockstatement];
            }


            var konten = accounts.Select(kv => new KeyValuePair <string, Konto>(kv.Key,
                                                                                new Konto
            {
                Name       = kv.Value.name,
                Kontostand = kv.Value.balance
            })).ToDictionary();

            var überweisungen = transactions.Select(kv => new KeyValuePair <string, Überweisung>(kv.Key,
                                                                                                 new Überweisung
            {
                Konto                = konten[kv.Value.account_id],
                AlterKontostand      = kv.Value.balanceold,
                NeuerKontostand      = kv.Value.balancenew,
                Betrag               = kv.Value.sum,
                Beschreibung         = ÜbersetzeBeschreibung(kv.Value.transactiondesc),
                Buchungszeitpunkt    = kv.Value.transactiondate,
                Erstellungszeitpunkt = kv.Value.creationdate,
                Löschbar             = kv.Value.deletable,
            })).ToDictionary();

            foreach (var überweisung in überweisungen.Values)
            {
                überweisung.Konto.Überweisungen.Add(überweisung);
            }

            var benutzer = users.Select(kv => new KeyValuePair <string, Benutzer>(kv.Key,
                                                                                  new Benutzer()
            {
                Vorname      = kv.Value.surname, // stimmt so
                Nachname     = kv.Value.name,
                Rufname      = kv.Value.nickname,
                Zimmernummer = kv.Value.roomnumber,
                Guthaben     = kv.Value.balance,
                Kaution      = kv.Value.deposit,
                Aktiv        = kv.Value.active,
            }
                                                                                  )).ToDictionary();

            foreach (var v in statement_users_join)
            {
                abrechnungen[v.statement_id].Benutzer.Add(benutzer[v.user_id]);
            }

            var zahlungen = payments.Select(kv => new KeyValuePair <string, Zahlung>(kv.Key,
                                                                                     new Zahlung
            {
                Abrechnung           = kv.Value.statement_id != null ? abrechnungen[kv.Value.statement_id] : null,
                AltesGuthaben        = kv.Value.balanceold,
                NeuesGuthaben        = kv.Value.balancenew,
                Benutzer             = benutzer[kv.Value.user_id],
                Beschreibung         = ÜbersetzeBeschreibung(kv.Value.paymentdesc),
                Erstellungszeitpunkt = kv.Value.creationdate,
                Buchungszeitpunkt    = kv.Value.paymentdate,
                Betrag      = kv.Value.sum,
                Löschbar    = kv.Value.deletable,
                Überweisung = kv.Value.transaction_id != null ? überweisungen[kv.Value.transaction_id] : null
            })).ToDictionary();

            foreach (Zahlung zahlung in zahlungen.Values)
            {
                if (zahlung.Abrechnung != null)
                {
                    zahlung.Abrechnung.Zahlungen.Add(zahlung);
                }
            }

            var productChildren = products.Values.Where(p => p.ancestor != null).ToDictionary(p => p.ancestor, p => p.id); // Es gibt keine Produkte mit mehreren Kindern

            string LetztesProdukt(string id)
            {
                string key = id;

                while (productChildren.ContainsKey(key))
                {
                    key = productChildren[key];
                }
                return(products[key].id);
            }

            var produkte = products
                           .Where(kv => !productChildren.ContainsKey(kv.Value.id) && kv.Value.parent == null)
                           .Select(kv => new KeyValuePair <string, Produkt>(kv.Key,
                                                                            new Produkt
            {
                Name                   = kv.Value.name,
                Listenposition         = kv.Value.position,
                AktuellerVerkaufspreis = kv.Value.price,
                Versteckt              = kv.Value.hidden || !kv.Value.active
            })).ToDictionary();

            foreach (var prod in products.Values)
            {
                if (produkte.ContainsKey(prod.id))
                {
                    continue;
                }

                string id = LetztesProdukt(prod.parent ?? prod.id);
                produkte[prod.id] = produkte[id];
            }

            var kastengrößen = products
                               .Select(kv => kv.Value)
                               .Select(p => new Kastengröße
            {
                Produkt       = produkte[p.id],
                Größe         = p.cratesize,
                Einkaufspreis = p.purchaseprice,
                Pfand         = p.deposit,
                Versteckt     = p.hidden || !p.active
            }).GroupBy(p => new { p.Produkt, p.Größe })
                               .Peek(group => group.First().Versteckt = group.All(kg => kg.Versteckt))
                               .Select(group => group.First())
                               .ToDictionary(p => new { p.Produkt, p.Größe }); // Filtert auch produktvarianten, die sich nicht in Größe unterscheiden

            foreach (var kastengröße in kastengrößen.Values)
            {
                kastengröße.Produkt.Kastengrößen.Add(kastengröße);
            }

            var einkäufe = purchases
                           .Select(kv => new KeyValuePair <string, Einkauf>(kv.Key,
                                                                            new Einkauf
            {
                Rechnungsnummer = kv.Value.invoicetext,
                Betrag          = kv.Value.sum,
                Abrechnung      = kv.Value.statement_id != null ? abrechnungen[kv.Value.statement_id] : null,
                Überweisung     = überweisungen[kv.Value.transaction_id],
                Zeitpunkt       = kv.Value.purchasedate
            })).ToDictionary();

            foreach (var einkauf in einkäufe.Values.Where(e => e.Abrechnung != null))
            {
                einkauf.Abrechnung.Einkäufe.Add(einkauf);
            }

            var einkaufspositionen = purchasepositions.Select(kv => kv.Value)
                                     .Select(pp => new Einkaufsposition
            {
                Einkauf      = einkäufe[pp.purchase_id],
                Kastengröße  = kastengrößen[new { Produkt = produkte[pp.product_id], Größe = products[pp.product_id].cratesize }],
                AnzahlKästen = pp.crateamount,
            }).ToList();

            foreach (var einkaufsposition in einkaufspositionen)
            {
                einkaufsposition.Einkauf.Positionen.Add(einkaufsposition);
            }

            var verkaufsprodukte = stocks.Select(s =>
                                                 new Verkaufsprodukt
            {
                Produkt       = produkte[s.product_id],
                Bestand       = s.bottleamount,
                Abrechnung    = abrechnungen[s.statement_id],
                Verkaufspreis = products[s.product_id].price
            }).ToList();

            foreach (var v in verkaufsprodukte)
            {
                v.Abrechnung.Verkaufsprodukte.Add(v);
            }

            var verbrauche = consumptions.Select(c =>
                                                 new Verbrauch
            {
                Abrechnung      = abrechnungen[c.statement_id],
                Verkaufsprodukt = abrechnungen[c.statement_id].Verkaufsprodukte.Single(vk => vk.Produkt == produkte[c.product_id]),
                Benutzer        = benutzer[c.user_id],
                AnzahlFlaschen  = c.bottleamount
            }).ToList();

            foreach (var v in verbrauche)
            {
                v.Abrechnung.Verbrauche.Add(v);
            }

            foreach (var abrechnung in abrechnungen.Values)
            {
                if (abrechnung.Name.StartsWith("Initial Stock"))
                {
                    continue;
                }
                var benutzerSet   = abrechnung.Zahlungen.Select(z => z.Benutzer).ToHashSet();
                var neueZahlungen = abrechnung.Benutzer.Where(b => !benutzerSet.Contains(b)).Select(b => new { Benutzer = b, Guthaben =
                                                                                                                   b.Zahlungen.Where(z => z.Buchungszeitpunkt > abrechnung.Endzeitpunkt).MinBy(z => z.Buchungszeitpunkt)?.AltesGuthaben ?? b.Guthaben }
                                                                                                    ).Select(p =>
                                                                                                             new Zahlung
                {
                    Benutzer          = p.Benutzer,
                    Betrag            = 0.0,
                    Buchungszeitpunkt = abrechnung.Endzeitpunkt,
                    Beschreibung      = "Abrechnung: " + abrechnung.Name,
                    AltesGuthaben     = p.Guthaben,
                    NeuesGuthaben     = p.Guthaben,
                    Abrechnung        = abrechnung,
                    Löschbar          = false
                }
                                                                                                             );
                abrechnung.Zahlungen.AddRange(neueZahlungen);

                abrechnung.Verifiziere();
            }

            using (var kontext = new GetränkeabrechnungKontext(@"D:\Project\Getränkeabrechnung\Getränkeabrechnung\RSH4.sqlite")
            {
                Erstellen = true
            })
            {
                kontext.SaveChanges();
                kontext.Abrechnungen.AddRange(abrechnungen.Values);
                kontext.Konten.AddRange(konten.Values);
                kontext.Überweisungen.AddRange(überweisungen.Values);
                kontext.Benutzer.AddRange(benutzer.Values);
                kontext.Zahlungen.AddRange(zahlungen.Values);
                kontext.Produkte.AddRange(produkte.Values.Distinct());
                kontext.Kastengrößen.AddRange(kastengrößen.Values);
                kontext.Einkäufe.AddRange(einkäufe.Values);
                kontext.Einkaufspositionen.AddRange(einkaufspositionen);
                kontext.Verkaufsprodukte.AddRange(verkaufsprodukte);
                kontext.Verbrauche.AddRange(verbrauche);
                kontext.SaveChanges();
            }
        }