/// <summary>
        /// Saves a new Ausgangsrechnung within the database
        /// </summary>
        /// <param name="projektID">The connected ProjektID</param>
        /// <param name="unpaidBalance">The amount of money which the Ausgangsrechnung shall include</param>
        /// <param name="rechnungstitelString">The title of the Ausgangsrechnung</param>
        public void CreateAusgangsrechnung(int projektID, double unpaidBalance, string rechnungstitelString)
        {
            // create business objects for Ausgangsrechnung, Ausgangsbuchung & Buchungszeilen
            AusgangsrechnungTable rechnung = new AusgangsrechnungTable();
            AusgangsbuchungTable buchung = new AusgangsbuchungTable();
            BuchungszeilenTable zeile = new BuchungszeilenTable();

            // fill with values and validate
            rechnung.ProjektID = projektID;
            rechnung.Rechnungsdatum = DateTime.Now.ToShortDateString();
            rechnung.Bezeichnung = rechnungstitelString;

            zeile.BetragNetto = unpaidBalance;
            zeile.Bezeichnung = rechnungstitelString;
            zeile.Buchungsdatum = rechnung.Rechnungsdatum;

            // initialise Rule objects
            PositiveIntValidator piv = new PositiveIntValidator();
            PositiveDoubleValidator pdv = new PositiveDoubleValidator();
            LettersNumbersHyphenSpaceValidator lnhsv = new LettersNumbersHyphenSpaceValidator();
            StringLength150Validator slv = new StringLength150Validator();

            // evaluate ProjektID
            piv.Eval(rechnung.ProjektID);

            if (piv.HasErrors)
            { throw new InvalidInputException("ProjektID ungültig!"); }

            // evaluate Bezeichnung
            lnhsv.Eval(rechnung.Bezeichnung);
            slv.Eval(rechnung.Bezeichnung);

            if (lnhsv.HasErrors || slv.HasErrors)
            { throw new InvalidInputException("Bezeichnung ungültig!"); }

            // evaluate Betrag
            pdv.Eval(zeile.BetragNetto);

            if (pdv.HasErrors)
            { throw new InvalidInputException("Betrag ungültig"); }

            // SAVE Ausgangsrechnung, Buchungszeile and Ausgangsbuchung
            try
            {
                buchung.AusgangsrechnungsID = DALFactory.GetDAL().SaveAusgangsrechnung(rechnung);
                buchung.BuchungszeilenID = DALFactory.GetDAL().SaveBuchungszeile(zeile);

                // create Ausgangsbuchung with ID values which just returned from database
                DALFactory.GetDAL().SaveAusgangsbuchung(buchung);
            }
            catch (SQLiteException e)
            {
                this.logger.Log(Logger.Level.Info, "A database exception occured while saving a new Ausgangsrechnung, Buchungszeile or Ausgangsbuchung.");
                throw new DataBaseException(e.Message, e);
            }
        }
        // add Buchungszeile
        private void AddBuchungszeileToDataGridView()
        {
            string betrag = this.eingangsrechnungBetragTextBox.Text;
            string bezeichnung = this.buchungszeileBezeichnungTextBox.Text;

            IRule pdv = new PositiveDoubleValidator();
            IRule lnhsv = new LettersNumbersHyphenSpaceValidator();
            IRule slv = new StringLength150Validator();

            // Create Buchungszeilen business object
            BuchungszeilenTable buchungszeile = new BuchungszeilenTable();
            buchungszeile.Bezeichnung = DataBindingFramework.BindFromString(bezeichnung, "Bezeichnung", this.eingangsrechnungMsgLabel, false, lnhsv, slv);
            buchungszeile.BetragNetto = DataBindingFramework.BindFromDouble(betrag, "Betrag", this.eingangsrechnungMsgLabel, false, pdv);
            buchungszeile.KategorieID = this.kategorieComboBox.SelectedIndex+1;
            buchungszeile.Buchungsdatum = DateTime.Now.ToShortDateString();

            // in case of errors, do not continue with saving new Eingangsrechnung
            if (this.eingangsrechnungMsgLabel.Visible)
            { return; }

            // add to DataGridView
            this.buchungszeilenBindingSource.Add(buchungszeile);
            GlobalActions.ShowSuccessLabel(this.eingangsrechnungMsgLabel);
        }
        /// <summary>
        /// Save new Buchungszeile to the SQLite database
        /// </summary>
        /// <param name="table">The business object</param>
        /// <returns>The ID of the just inserted Buchungszeile</returns>
        public int SaveBuchungszeile(BuchungszeilenTable table)
        {
            string sql = "INSERT INTO Buchungszeilen (KategorieID, BankkontoID, BetragNetto, BetragUST, Buchungsdatum, Bezeichnung) VALUES (?, ?, ?, ?, ?, ?)";
            int insertedID;

            try
            {
                insertedID = this.InsertAndReturnID(sql, "Buchungszeilen", table.KategorieID, table.BankkontoID, table.BetragNetto, table.BetragUST, table.Buchungsdatum, table.Bezeichnung);
            }
            catch (SQLiteException)
            {
                throw;
            }

            // return ID of inserted item
            return insertedID;
        }
        /// <summary>
        /// Saves a new Buchungszeile to the Database
        /// </summary>
        /// <param name="table">The Buchungszeilentable</param>
        /// <param name="eingangsrechnungsID">The ID of the Eingangsrechnung</param>
        public void SaveBuchungszeile(BuchungszeilenTable table, int eingangsrechnungsID)
        {
            table.BetragUST = table.BetragNetto; // we don't use UST

            // check EingangsrechnungsID
            IRule piv = new PositiveIntValidator();
            piv.Eval(eingangsrechnungsID);

            // check description
            IRule lnhsv = new LettersNumbersHyphenSpaceValidator();
            IRule slv = new StringLength150Validator();
            lnhsv.Eval(table.Bezeichnung);
            slv.Eval(table.Bezeichnung);

            // check Betrag
            IRule pdv = new PositiveDoubleValidator();
            pdv.Eval(table.BetragNetto);

            // check date
            IRule dateval = new DateValidator();
            dateval.Eval(table.Buchungsdatum);

            // check KategorieID for positive int
            IRule piv2 = new PositiveIntValidator();
            piv2.Eval(table.KategorieID);

            if (piv.HasErrors || lnhsv.HasErrors || slv.HasErrors || pdv.HasErrors || dateval.HasErrors || piv2.HasErrors)
            {
                throw new InvalidInputException("Daten ungültig");
            }

            // save Buchungszeile
            int bzID = -1;
            try
            {
                bzID = DALFactory.GetDAL().SaveBuchungszeile(table);
            }
            catch (SQLiteException)
            {
                throw;
            }

            // save Eingangsbuchung
            EingangsbuchungTable eingangsbuchung = new EingangsbuchungTable();
            eingangsbuchung.BuchungszeilenID = bzID;
            eingangsbuchung.EingangsrechungsID = eingangsrechnungsID;

            try
            {
                DALFactory.GetDAL().SaveEingangsbuchung(eingangsbuchung);
            }
            catch (SQLiteException)
            {
                throw;
            }
        }
 /// <summary>
 /// Saves a new Buchungszeile to the mock db
 /// </summary>
 /// <param name="table">The business object</param>
 /// <returns>The ID of the inserted Buchungszeile</returns>
 public int SaveBuchungszeile(BuchungszeilenTable table)
 {
     table.ID = MockDataBaseManager.BuchungszeilenID;
     MockDataBaseManager.savedBuchungszeilen.Add(table);
     return table.ID;
 }
        /// <summary>
        /// Loads all Eingangsrechnungen as Views
        /// </summary>
        /// <returns>The saved Eingangsrechnungen</returns>
        public List<EingangsrechnungsView> LoadEingangsrechnungsView()
        {
            List<EingangsrechnungsView> view = new List<EingangsrechnungsView>();
            int buchungsID = -1;
            BuchungszeilenTable zeile = new BuchungszeilenTable();

            foreach (EingangsrechnungTable table in savedEingangsrechnungen)
            {
                EingangsrechnungsView viewelement = new EingangsrechnungsView();
                viewelement.ID = table.ID;
                viewelement.Bezeichnung = table.Bezeichnung;
                viewelement.Rechnungsdatum = table.Rechnungsdatum;

                // get connected EingangsbuchungsID
                foreach (EingangsbuchungTable b in savedEingangsbuchungen)
                {
                    if (b.EingangsrechungsID == viewelement.ID)
                    {
                        buchungsID = b.BuchungszeilenID;
                        break;
                    }
                }

                // get connected Buchungszeile and Betrag
                foreach (BuchungszeilenTable b in savedBuchungszeilen)
                {
                    if (b.ID == buchungsID)
                    {
                        viewelement.Betrag = b.BetragUST;
                        break;
                    }
                }

                view.Add(viewelement);
            }

            return view;
        }