/// <summary>
        /// Führt eine Seminarbuchung durch bzw. aktualisiert diese
        /// </summary>
        /// <param name="seminarbuchung"></param>
        /// <returns></returns>
        public Seminarbuchung UpdateBuchung(Seminarbuchung seminarbuchung)
        {
            try
            {
                Seminarbuchung buchungUpdated;

                // Validierung des Objektes
                validateSeminarbuchung(seminarbuchung);
                buchungUpdated = SeminarData.UpdateOrInsertSeminarbuchung(Mandant, seminarbuchung);

                /// Aktualisierung erst, wenn Buchung erfolgreich committed
                SeminarData.UpdateSeminarterminTeilnehmer(Mandant, seminarbuchung.SeminarterminID);

                return(buchungUpdated);
            }
            catch (RecordUpdateException)
            {
                throw;
            }
            catch (Exception ex)
            {
                TraceLog.LogException(ex);
                throw ex;
            }
        }
        /// <summary>
        /// Prüft eine Seminarbuchung und sorgt für die notwendigen Plausibilitäten (z.B. Anlage Ansprechpartner etc.)
        /// </summary>
        /// <param name="seminarbuchung">Seminarbuchung</param>
        private void validateSeminarbuchung(Seminarbuchung seminarbuchung)
        {
            if (SeminarData.KontokorrentExists(Mandant, seminarbuchung.Konto, true))
            {
                var konto = SeminarData.GetKunde(Mandant, seminarbuchung.Konto);
                if (seminarbuchung.Adresse == 0)
                {
                    seminarbuchung.Adresse = konto.Adresse;
                }
                if (string.IsNullOrWhiteSpace(seminarbuchung.KontoMatchcode))
                {
                    seminarbuchung.KontoMatchcode = konto.Matchcode;
                }

                var ansprechpartner = this.CreateOrGetAnsprechpartner(seminarbuchung.Adresse, seminarbuchung.AnsprechpartnerNachname, seminarbuchung.AnsprechpartnerVorname, seminarbuchung.AnsprechpartnerEmail);
                seminarbuchung.Ansprechpartnernummer = ansprechpartner.Nummer;
                var seminartermin = this._seminarManager.GetSeminartermin(seminarbuchung.SeminarterminID);
                if (seminartermin.AnzahlTeilnehmer.GetValueOrDefault() >= seminartermin.AnzahlTeilnehmerMax)
                {
                    throw new BuchungValidationException(Properties.Resources.BuchungValidationSeminarterminSoldOut);
                }
            }
            else
            {
                throw new BuchungValidationException(Properties.Resources.BuchungValidationException);
            }
        }
        public void Test_SeminarData_CreateSeminarbuchung_Load_Delete()
        {
            var buchung = new Seminarbuchung()
            {
                Adresse = 10,
                AnsprechpartnerEmail    = "*****@*****.**",
                AnsprechpartnerNachname = "Test",
                Ansprechpartnernummer   = 1,
                AnsprechpartnerVorname  = "Vorname",
                BelID     = 0,
                BelPosID  = 0,
                BuchungID = 0,
                EmailBestaetigungGesendet = false,
                Konto           = "D100000",
                KontoMatchcode  = "Testkunde",
                Mandant         = _mandant.Id,
                SeminarterminID = "S100001",
                VorPosID        = 0
            };

            var saveBuchung = SeminarData.UpdateOrInsertSeminarbuchung(_mandant, buchung);

            Assert.IsTrue(saveBuchung.BuchungID != 0);

            var loadedBuchung = SeminarData.GetSeminarbuchung(_mandant, saveBuchung.BuchungID);

            Assert.IsTrue(saveBuchung.SeminarterminID == loadedBuchung.SeminarterminID);
            //Assert.AreEqual(loadedBuchung, saveBuchung);
            //Assert.areEquals(saveBuchung, loadedBuchung);

            SeminarData.DeleteSeminarbuchung(_mandant, saveBuchung.BuchungID);
            loadedBuchung = SeminarData.GetSeminarbuchung(_mandant, saveBuchung.BuchungID);
        }
        public void SeminarbuchungManager_Create_Buchungsbeleg()
        {
            var buchung = new Seminarbuchung()
            {
                AnsprechpartnerEmail    = "*****@*****.**",
                AnsprechpartnerNachname = "Fritz",
                AnsprechpartnerVorname  = "Thomas",
                Konto           = "D100000",
                SeminarterminID = "S100001"
            };

            var manager = new SeminarbuchungManager(_mandant);

            buchung = manager.CreateOrUpdateBuchungsbeleg(buchung);
            Assert.IsTrue(buchung.BuchungID != 0);
            Assert.IsTrue(buchung.BelID != 0);
            Assert.IsTrue(buchung.VorPosID != 0);
        }
        /// <summary>
        /// Führt eine Seminarbuchung durch und legt den Warenwirtschaftsbeleg
        /// in der Office Line an.
        /// </summary>
        /// <param name="seminarbuchung"></param>
        /// <returns></returns>
        public Seminarbuchung CreateOrUpdateBuchungsbeleg(Seminarbuchung seminarbuchung)
        {
            try
            {
                if (seminarbuchung == null)
                {
                    throw new ArgumentNullException("Seminarbuchung");
                }
                var seminartermin = SeminarData.GetSeminartermin(Mandant, seminarbuchung.SeminarterminID);

                Mandant.MainDevice.GenericConnection.BeginTransaction();

                using (var beleg = new Sagede.OfficeLine.Wawi.BelegEngine.Beleg(Mandant, Erfassungsart.Verkauf))
                {
                    if (seminarbuchung.BuchungID == 0)
                    {
                        #region Neuanlage eines Beleges

                        if (!beleg.Initialize("VVA", DateTime.Today,
                                              (short)Mandant.PeriodenManager.Perioden.Date2Periode(DateTime.Now).Jahr))
                        {
                            throw new BuchungValidationException("Fehler bei Beleganlage. " + beleg.Errors.GetDescriptionSummary());
                        }

                        beleg.Bearbeiter = Mandant.Benutzer.Name;
                        if (seminartermin.Startdatum.HasValue)
                        {
                            beleg.Liefertermin = seminartermin.Startdatum.GetValueOrDefault();
                        }
                        else
                        {
                            beleg.Liefertermin = beleg.Belegdatum;
                        }

                        beleg.Matchcode = $"Seminarbuchung für Termin {seminartermin.SeminarterminID}";

                        if (!beleg.SetKonto(seminarbuchung.Konto, false))
                        {
                            throw new BuchungValidationException("Fehler bei Beleganlage [SetKonto]. " + beleg.Errors.GetDescriptionSummary());
                        }

                        var position = new BelegPosition(beleg);
                        if (!position.Initialize(Positionstyp.Artikel))
                        {
                            throw new BuchungValidationException("Fehler bei Beleganlage [InitializePosition]. " + beleg.Errors.GetDescriptionSummary());
                        }

                        if (!position.SetArtikel(seminartermin.Artikelnummer, 0))
                        {
                            throw new BuchungValidationException("Fehler bei Artikelanlage [SetArtikel]. " + beleg.Errors.GetDescriptionSummary());
                        }

                        position.Menge = 1;
                        position.RefreshBasismenge(true, 2);

                        //bei manuellen Preisen => IstEinzelpreisManuell
                        //position.Einzelpreis = 1000;
                        //position.IstEinzelpreisManuell = true;

                        position.Calculate();
                        beleg.Positionen.Add(position);
                        beleg.Renumber();
                        beleg.ReadStandardTexte(true);

                        if (!beleg.Validate(true))
                        {
                            throw new BuchungValidationException("Fehler bei Beleganlage [Validate]. " + beleg.Errors.GetDescriptionSummary());
                        }

                        // TODO: Transaktionsklammer
                        if (!beleg.Save(false))
                        {
                            throw new BuchungValidationException("Fehler bei Beleganlage [Save]. " + beleg.Errors.GetDescriptionSummary());
                        }

                        seminarbuchung.BelID          = beleg.Handle;
                        seminarbuchung.BelPosID       = position.Handle;
                        seminarbuchung.VorPosID       = position.VorgangspositionsHandle;
                        seminarbuchung.KontoMatchcode = beleg.A0Matchcode;
                        seminarbuchung.Adresse        = beleg.VKA0AdressNummer;
                        seminarbuchung = this.UpdateBuchung(seminarbuchung);

                        #endregion
                    }
                    else
                    {
                        throw new NotImplementedException("Aktualiserung Buchungsbeleg");
                    }
                }
                if (!Mandant.MainDevice.GenericConnection.PendingRollback)
                {
                    Mandant.MainDevice.GenericConnection.CommitTransaction();
                }
                else
                {
                    Mandant.MainDevice.GenericConnection.RollbackTransaction();
                }
                return(seminarbuchung);
            }
            catch (Exception ex)
            {
                Mandant.MainDevice.GenericConnection.RollbackTransaction();
                TraceLog.LogException(ex);
                throw;
            }
        }
 /// <summary>
 /// Führt eine Seminarbuchung durch und legt den Warenwirtschaftsbeleg
 /// in der Office Line an.
 /// </summary>
 /// <param name="seminarbuchung"></param>
 /// <returns></returns>
 public Seminarbuchung CreateOrUpdateBuchungsbeleg(Seminarbuchung seminarbuchung)
 {
     // TODO: Implementierung
     throw new NotImplementedException("CreateOrUpdatebuchungsbeleg");
 }