public void Delete(Transportplan tp)
        {
            Contract.Requires(tp != null);
            Contract.Requires(tp.TpNr > 0);

            persistenceService.Delete(tp);
        }
        public void UpdateTransportplanstatus(Transportplan gewählterPlan, TransportplanStatusTyp tpStTyp)
        {
            Contract.Requires(gewählterPlan != null);

            gewählterPlan.Status = tpStTyp;
        }
        public void FühreTransportplanAus(Transportplan gewählterPlan, Sendungsanfrage sa)
        {
            Contract.Requires(gewählterPlan != null);
            Contract.Requires(sa != null);

            this.auftragServices.UpdateSendungsanfrageStatus(sa.SaNr, SendungsanfrageStatusTyp.InAusfuehrung);
            gewählterPlan.UpdateStatus(TransportplanStatusTyp.InAusfuehrung);

            if (this.timeServices.Now > gewählterPlan.AbholungAm)
            {
                gewählterPlan.Meldungen.Add(new TransportplanMeldungTyp(this.timeServices.Now, TransportplanMeldungTyp.MeldungTag.AbholzeitUeberschritten, "Ausführung des Plans " + gewählterPlan.TpNr + " unterbrochen, da die Abholzeit " + sa.AbholzeitfensterEnde + " überschritten wurde."));
                this.auftragServices.UpdateSendungsanfrageStatus(sa.SaNr, SendungsanfrageStatusTyp.Unterbrochen);
                return;
            }

            // beauftrage alle (Teil-)Transporte und sichere die Frachtauftragsnummer in der Transportaktivität
            foreach (TransportAktivitaet ta in gewählterPlan.TransportplanSchritte)
            {
                ta.Frachtauftrag = unterbeauftragungServices.BeauftrageTransport(ta.FrachtfuehrerRahmenvertrag, ta.PlanStartzeit, ta.PlanEndezeit, ta.VerwendeteKapazitaetTEU, ta.VerwendeteKapazitaetFEU, sa.SaNr);
            }

            // lösche alle anderen mit derselben Sendungsanfrage assoziierten alternativen Transportpläne (dies gibt die geplanten Ressourcen frei)
            List<Transportplan> ltp = this.tp_REPO.SucheZuSendungsanfrage(gewählterPlan.SaNr);
            ltp.ForEach((plan) =>
                {
                    if (plan.TpNr != gewählterPlan.TpNr)
                    {
                        this.tp_REPO.Delete(plan);
                    }
                });
        }
        private void ErzeugeTransportpläneZuSendungsanfrage(Sendungsanfrage sa, TransportplanungJob job)
        {
            Contract.Requires(sa != null);

            List<Frachteinheit> fe = null;
            fe = ErzeugeFrachteinheitenFür(sa.Sendungspositionen, job);
            if (job.Abort)
            {
                return;
            }

            List<List<Transportbeziehung>> p = transportnetzServices.GeneriereAllePfadeVonBis(sa.StartLokation, sa.ZielLokation);
            if (p.Count == 0)
            {
                job.Meldungen.Add(new TransportplanungMeldung(
                    TransportplanungMeldungTag.KeinWegVorhanden,
                    "Kein Weg von " + sa.StartLokation + " bis " + sa.ZielLokation + " vorhanden."));
                job.Abort = true;

                return;
            }

            List<Transportplan> ltp = new List<Transportplan>();
            foreach (List<Transportbeziehung> pfad in p)
            {
                List<TransportplanSchritt> tps = ErzeugePlanFür(pfad, fe, sa.AbholzeitfensterStart, sa.AbholzeitfensterEnde);

                if (tps != null)
                {
                    Transportplan tp = new Transportplan();
                    tp.TransportplanSchritte = tps;
                    tp.Frachteinheiten = fe.Select(_fe => (Frachteinheit)_fe.Clone()).ToList();
                    tp.SaNr = sa.SaNr;
                    tp.UpdateStatus(TransportplanStatusTyp.Geplant);

                    ltp.Add(tp);
                }
            }

            Contract.Ensures(ltp != null);

            // Füge die erzeugten Transportpläne dem Repository hinzu
            ltp.ForEach((tp) => { this.tp_REPO.Save(tp); });
        }