public void TestPlanungZweiWegeWähleTransportplanSuccess()
        {
            SendungsanfrageDTO saDTO = new SendungsanfrageDTO();
            SendungspositionDTO sp1 = new SendungspositionDTO();
            saDTO.Sendungspositionen.Add(sp1);
            saDTO.AbholzeitfensterStart = DateTime.Parse("01.09.2013");
            saDTO.AbholzeitfensterEnde = DateTime.Parse("10.09.2013");
            saDTO.AngebotGültigBis = DateTime.Now.AddHours(1);
            saDTO.StartLokation = hamburgLokation.LokNr;
            saDTO.ZielLokation = shanghaiLokation.LokNr;

            frachtfuehrerServicesMock.Setup(ffs => ffs.SendeFrachtauftragAnFrachtfuehrer(
                It.Is<FrachtauftragDTO>((fraDTO) => fraDTO.FrachtfuehrerRahmenvertrag.FrvNr == frv_hh_bhv.FrvNr)))
                .Callback<FrachtauftragDTO>((fraDTO)
                =>
                {
                    bool ok = true;
                    ok &= fraDTO.PlanStartzeit == DateTime.Parse("03.09.2013 8:00");
                    ok &= fraDTO.PlanEndezeit == DateTime.Parse("05.09.2013 8:00");
                    ok &= fraDTO.VerwendeteKapazitaetTEU == 1;
                    ok &= fraDTO.VerwendeteKapazitaetFEU == 0;
                    if (!ok)
                    {
                        throw new ArgumentException();
                    }
                })
                .Verifiable();
            frachtfuehrerServicesMock.Setup(ffs => ffs.SendeFrachtauftragAnFrachtfuehrer(
                It.Is<FrachtauftragDTO>((fraDTO) => fraDTO.FrachtfuehrerRahmenvertrag.FrvNr == frv_bhv_sh.FrvNr)))
                 .Callback<FrachtauftragDTO>((fraDTO)
                =>
                 {
                     bool ok = true;
                     ok &= fraDTO.PlanStartzeit == DateTime.Parse("05.09.2013 10:00");
                     ok &= fraDTO.PlanEndezeit == DateTime.Parse("10.09.2013 10:00");
                     ok &= fraDTO.VerwendeteKapazitaetTEU == 1;
                     ok &= fraDTO.VerwendeteKapazitaetFEU == 0;
                     if (!ok)
                     {
                         throw new ArgumentException();
                     }
                 })
                 .Verifiable();  

            auftragsServices.CreateSendungsanfrage(ref saDTO);
            auftragsServices.PlaneSendungsanfrage(saDTO.SaNr);
            List<TransportplanDTO> pläne = transportplanungsServices.FindTransportplaeneZuSendungsanfrage(saDTO.SaNr);
            Assert.IsTrue(pläne.Count == 2);
            //// Inhalte geprüft durch TestPlanungZweiWegeSuccess()

            TransportplanDTO planÜberBhv = pläne.Find((plan) =>
            {
                return plan.TransportplanSchritte.ToList().Find((tps) =>
                {
                    TransportAktivitaetDTO ta = tps as TransportAktivitaetDTO;
                    if (ta != null)
                    {
                        return ta.FuerTransportAufTransportbeziehung == hh_bhv.TbNr;
                    }
                    else
                    {
                        return false;
                    }
                }) != null;
            });
            Assert.IsTrue(planÜberBhv != null);

            Assert.IsTrue(planÜberBhv.TransportplanSchritte.Count == 2);
            auftragsServices.NimmAngebotAn(saDTO.SaNr);
            transportplanungServicesFuerSendung.FühreTransportplanAus(planÜberBhv.TpNr);
            pläne = transportplanungsServices.FindTransportplaeneZuSendungsanfrage(saDTO.SaNr);
            Assert.IsTrue(pläne.Count == 1);
            Assert.IsTrue(pläne[0].TpNr == planÜberBhv.TpNr);
            frachtfuehrerServicesMock.Verify();
        }
        public void TestErstelleSendungsanfrageUndOrdneRechungenZuSuccess()
        {
            Adresse kundenadresse = new Adresse() { Strasse = "ABC-Strasse", Hausnummer = "123", Land = "Nimmerland", PLZ = "4567", Wohnort = "hinterm Baum" };
            IList<AdresseDTO> adressen = new List<AdresseDTO>();
            adressen.Add(kundenadresse.ToDTO());
            GeschaeftspartnerDTO gpDTO = new GeschaeftspartnerDTO()
            {
                Adressen = adressen,
                Email = new EMailType("*****@*****.**"),
                Vorname = "Hans",
                Nachname = "Peter",
            };
            geschaeftspartnerServices.CreateGeschaeftspartner(ref gpDTO);
            SendungsanfrageDTO saDTO = new SendungsanfrageDTO();
            SendungspositionDTO sp1 = new SendungspositionDTO();
            saDTO.Sendungspositionen.Add(sp1);
            saDTO.AbholzeitfensterStart = DateTime.Parse("01.09.2013");
            saDTO.AbholzeitfensterEnde = DateTime.Parse("10.09.2013");
            saDTO.AngebotGültigBis = DateTime.Now.AddHours(1);
            saDTO.StartLokation = hamburgLokation.LokNr;
            saDTO.ZielLokation = shanghaiLokation.LokNr;
            saDTO.Auftraggeber = 1;

            auftragsServices.CreateSendungsanfrage(ref saDTO);
            auftragsServices.PlaneSendungsanfrage(saDTO.SaNr);
            List<TransportplanDTO> pläne = transportplanungsServices.FindTransportplaeneZuSendungsanfrage(saDTO.SaNr);
            Assert.IsTrue(pläne.Count >= 1);

            TransportplanDTO planÜberBhv = pläne.Find((plan) =>
            {
                return plan.TransportplanSchritte.ToList().Find((tps) =>
                {
                    TransportAktivitaetDTO ta = tps as TransportAktivitaetDTO;
                    if (ta != null)
                    {
                        return ta.FuerTransportAufTransportbeziehung == hh_bhv.TbNr;
                    }
                    else
                    {
                        return false;
                    }
                }) != null; 
            });
            Assert.IsTrue(planÜberBhv != null);

            Assert.IsTrue(planÜberBhv.TransportplanSchritte.Count == 2);
            pläne = transportplanungsServices.FindTransportplaeneZuSendungsanfrage(saDTO.SaNr);
            Assert.IsTrue(pläne.Count == 1);
            Assert.IsTrue(pläne[0].TpNr == planÜberBhv.TpNr);

            foreach (TransportplanDTO tpDTO in pläne)
            {
                Sendungsanfrage sa = auftragsServices.FindSendungsanfrage(tpDTO.SaNr).ToEntity();
                auftragsServices.NimmAngebotAn(sa.SaNr);
                sendungServices.ErstelleSendung(tpDTO.TpNr, saDTO.SaNr);
            }

            FrachtabrechnungDTO fab1DTO = new FrachtabrechnungDTO { Frachtauftrag = 1, IstBestaetigt = true };
            buchhaltungServices.PayFrachtabrechnung(ref fab1DTO);
            FrachtabrechnungDTO fab2DTO = new FrachtabrechnungDTO { Frachtauftrag = 2, IstBestaetigt = true };
            buchhaltungServices.PayFrachtabrechnung(ref fab2DTO);

            buchhaltungServiceFuerSendung.ErstelleKundenrechnung(1, 1);

            var tokenSource = new CancellationTokenSource();
            var token = tokenSource.Token;

            var t = Task.Factory.StartNew(
                () =>
                {
                    bankAdapter.EmpfangeZahlungseingaengenAusQueue();
                    token.ThrowIfCancellationRequested();
                },
                token);

            Thread.Sleep(10000);
            bankAdapter.EmpfangeZahlungseingaenge(false);
            Thread.Sleep(5000);

            tokenSource.Cancel();
        }
        public void TestPlanungZweiSegmenteSuccess()
        {
            SendungsanfrageDTO saDTO = new SendungsanfrageDTO();
            SendungspositionDTO sp1 = new SendungspositionDTO();
            saDTO.Sendungspositionen.Add(sp1);
            saDTO.AbholzeitfensterStart = DateTime.Parse("29.07.2013");
            saDTO.AbholzeitfensterEnde = DateTime.Parse("04.08.2013");
            saDTO.StartLokation = hamburgLokation.LokNr;
            saDTO.ZielLokation = shanghaiLokation.LokNr;

            auftragsServices.CreateSendungsanfrage(ref saDTO);
            auftragsServices.PlaneSendungsanfrage(saDTO.SaNr);
            List<TransportplanDTO> pläne = transportplanungsServices.FindTransportplaeneZuSendungsanfrage(saDTO.SaNr);
            Assert.IsTrue(pläne.Count == 1);
            TransportplanDTO plan = pläne.First();
            Assert.IsTrue(plan.TransportplanSchritte.Count == 2);
            Assert.IsTrue(plan.AbholungAm == DateTime.Parse("30.07.2013 08:00:00"));
            Assert.IsTrue(plan.LieferungAm == DateTime.Parse("06.08.2013 10:00:00"));
            Assert.IsTrue(plan.Dauer == TimeSpan.Parse("7.02:00"));

            // HH: 32 Stunden * 10
            // HH->BHV: 1000 + 100
            // BHV: 2 Stunden * 15
            // BHV->SH: 2000 + 200
            Assert.IsTrue(plan.Kosten == 3650);
        }
        public void TestPlanungZweiWegeSuccess()
        {
            SendungsanfrageDTO saDTO = new SendungsanfrageDTO();
            SendungspositionDTO sp1 = new SendungspositionDTO();
            saDTO.Sendungspositionen.Add(sp1);
            saDTO.AbholzeitfensterStart = DateTime.Parse("01.09.2013");
            saDTO.AbholzeitfensterEnde = DateTime.Parse("10.09.2013");
            saDTO.StartLokation = hamburgLokation.LokNr;
            saDTO.ZielLokation = shanghaiLokation.LokNr;

            auftragsServices.CreateSendungsanfrage(ref saDTO);
            auftragsServices.PlaneSendungsanfrage(saDTO.SaNr);
            List<TransportplanDTO> pläne = transportplanungsServices.FindTransportplaeneZuSendungsanfrage(saDTO.SaNr);
            Assert.IsTrue(pläne.Count == 2);
            TransportplanDTO plan1 = pläne.Find((plan) =>
            {
                return plan.TransportplanSchritte.ToList().Find((tps) =>
                {
                    TransportAktivitaetDTO ta = tps as TransportAktivitaetDTO;
                    if (ta != null)
                    {
                        return ta.FuerTransportAufTransportbeziehung == hh_bhv.TbNr;
                    }
                    else
                    {
                        return false;
                    }
                }) != null;
            });
            Assert.IsTrue(plan1 != null);
            Assert.IsTrue(plan1.TransportplanSchritte.Count == 2);
            Assert.IsTrue(plan1.AbholungAm == DateTime.Parse("03.09.2013 08:00:00"));
            Assert.IsTrue(plan1.LieferungAm == DateTime.Parse("10.09.2013 10:00:00"));
            Assert.IsTrue(plan1.Dauer == TimeSpan.Parse("7.02:00"));
            Assert.IsTrue(plan1.Frachteinheiten.Count == 1);

            // HH: 56 Stunden * 10
            // HH->BHV: 1000 + 100
            // BHV: 2 Stunden * 15
            // BHV->SH: 2000 + 200
            Assert.IsTrue(plan1.Kosten == 3890);

            TransportplanDTO plan2 = pläne.Find((plan) =>
            {
                return plan.TransportplanSchritte.ToList().Find((tps) =>
                {
                    TransportAktivitaetDTO ta = tps as TransportAktivitaetDTO;
                    if (ta != null)
                    {
                        return ta.FuerTransportAufTransportbeziehung == hh_rtd.TbNr;
                    }
                    else
                    {
                        return false;
                    }
                }) != null;
            });
            Assert.IsTrue(plan2 != null);
            Assert.IsTrue(plan2.TransportplanSchritte.Count == 2);
            Assert.IsTrue(plan2.AbholungAm == DateTime.Parse("02.09.2013 08:00:00"));
            Assert.IsTrue(plan2.LieferungAm == DateTime.Parse("12.09.2013 10:00:00"));
            Assert.IsTrue(plan2.Dauer == TimeSpan.Parse("10.02:00"));
            Assert.IsTrue(plan2.Frachteinheiten.Count == 1);

            // HH: 32 Stunden * 10
            // HH->RTD: 2000 + 200
            // RTD: 2 Stunden * 20
            // RTD->SH: 3000 + 300
            Assert.IsTrue(plan2.Kosten == 5860);
        }
        public void TestPlanungEinSegmentZweiTEUSuccess()
        {
            SendungsanfrageDTO saDTO = new SendungsanfrageDTO();
            SendungspositionDTO sp1 = new SendungspositionDTO();
            sp1.Bruttogewicht = TEU.MAXZULADUNG_TONS;
            saDTO.Sendungspositionen.Add(sp1);
            SendungspositionDTO sp2 = new SendungspositionDTO();
            sp2.Bruttogewicht = TEU.MAXZULADUNG_TONS;
            saDTO.Sendungspositionen.Add(sp2);
            saDTO.AbholzeitfensterStart = DateTime.Parse("29.07.2013");
            saDTO.AbholzeitfensterEnde = DateTime.Parse("04.08.2013");
            saDTO.StartLokation = hamburgLokation.LokNr;
            saDTO.ZielLokation = bremerhavenLokation.LokNr;

            auftragsServices.CreateSendungsanfrage(ref saDTO);
            auftragsServices.PlaneSendungsanfrage(saDTO.SaNr);
            List<TransportplanDTO> pläne = transportplanungsServices.FindTransportplaeneZuSendungsanfrage(saDTO.SaNr);
            Assert.IsTrue(pläne.Count == 1);
            TransportplanDTO plan = pläne.First();
            Assert.IsTrue(plan.TransportplanSchritte.Count == 1);
            Assert.IsTrue(plan.AbholungAm == DateTime.Parse("30.07.2013 08:00:00"));
            Assert.IsTrue(plan.LieferungAm == DateTime.Parse("01.08.2013 08:00:00"));
            Assert.IsTrue(plan.Dauer == TimeSpan.Parse("2"));

            // Fixkosten 1000
            // Wartezeit 32 Stunden * 10 = 320
            // Transport 2 TEU = 200
            Assert.IsTrue(plan.Kosten == 1520);
        }
        public void TestPlanungEinSegmentDreiTEUFailWegenZuGeringerKapazität()
        {
            SendungsanfrageDTO saDTO = new SendungsanfrageDTO();
            SendungspositionDTO sp1 = new SendungspositionDTO();
            sp1.Bruttogewicht = TEU.MAXZULADUNG_TONS;
            saDTO.Sendungspositionen.Add(sp1);
            SendungspositionDTO sp2 = new SendungspositionDTO();
            sp2.Bruttogewicht = TEU.MAXZULADUNG_TONS;
            saDTO.Sendungspositionen.Add(sp2);
            SendungspositionDTO sp3 = new SendungspositionDTO();
            sp3.Bruttogewicht = TEU.MAXZULADUNG_TONS;
            saDTO.Sendungspositionen.Add(sp3);
            saDTO.AbholzeitfensterStart = DateTime.Parse("29.07.2013");
            saDTO.AbholzeitfensterEnde = DateTime.Parse("04.08.2013");
            saDTO.StartLokation = hamburgLokation.LokNr;
            saDTO.ZielLokation = bremerhavenLokation.LokNr;

            auftragsServices.CreateSendungsanfrage(ref saDTO);
            auftragsServices.PlaneSendungsanfrage(saDTO.SaNr);
            List<TransportplanDTO> pläne2 = transportplanungsServices.FindTransportplaeneZuSendungsanfrage(saDTO.SaNr);
            Assert.IsTrue(pläne2.Count == 0); // Kapazität des FRV nur zwei TEU
        }
        public void TestPlanungEinSegmentMitFEUundTEUSuccess()
        {
            SendungsanfrageDTO saDTO = new SendungsanfrageDTO();
            //// Erzeugt werden sollen 1 FEU und 1 TEU
            SendungspositionDTO spDTO = new SendungspositionDTO();
            spDTO.Bruttogewicht = TEU.MAXZULADUNG_TONS;
            saDTO.Sendungspositionen.Add(spDTO);
            spDTO = new SendungspositionDTO();
            spDTO.Bruttogewicht = TEU.MAXZULADUNG_TONS + 1; // zu groß für TEU -> FEU soll erzeugt werden
            saDTO.Sendungspositionen.Add(spDTO);
            saDTO.AbholzeitfensterStart = DateTime.Parse("29.07.2013");
            saDTO.AbholzeitfensterEnde = DateTime.Parse("04.08.2013");
            saDTO.StartLokation = bremerhavenLokation.LokNr;
            saDTO.ZielLokation = shanghaiLokation.LokNr;

            auftragsServices.CreateSendungsanfrage(ref saDTO);
            auftragsServices.PlaneSendungsanfrage(saDTO.SaNr);
            List<TransportplanDTO> pläne = transportplanungsServices.FindTransportplaeneZuSendungsanfrage(saDTO.SaNr);
            Assert.IsTrue(pläne.Count == 1);
            TransportplanDTO plan = pläne.First();
            Assert.IsTrue(plan.TransportplanSchritte.Count == 1);
            Assert.IsTrue(plan.AbholungAm == DateTime.Parse("29.07.2013 08:00:00"));
            Assert.IsTrue(plan.LieferungAm == DateTime.Parse("03.08.2013 08:00:00"));
            Assert.IsTrue(plan.Dauer == TimeSpan.Parse("5"));
            Assert.IsTrue(plan.Frachteinheiten.Count == 2);
            Assert.IsTrue(plan.Frachteinheiten.Any((fe) => { return fe.FraeTyp == FrachteinheitTyp.TEU; }));
            Assert.IsTrue(plan.Frachteinheiten.Any((fe) => { return fe.FraeTyp == FrachteinheitTyp.FEU; }));

            // Fixkosten 2000
            // Wartezeit 8 Stunden * 15 = 120
            // Transport 1 FEU = 400, 1 TEU 200
            Assert.IsTrue(plan.Kosten == 2720);
        }
        public void TestPlanungEinSegmentFailWegenZuSchwererSendungsposition()
        {
            SendungsanfrageDTO saDTO = new SendungsanfrageDTO();
            SendungspositionDTO spDTO = new SendungspositionDTO();
            spDTO.Bruttogewicht = FEU.MAXZULADUNG_TONS + 1; // Es können auf Grund des Gewichtes keine Frachteinheiten erzeugt werden
            saDTO.Sendungspositionen.Add(spDTO);
            saDTO.AbholzeitfensterStart = DateTime.Parse("29.07.2013");
            saDTO.AbholzeitfensterEnde = DateTime.Parse("04.08.2013");
            saDTO.StartLokation = hamburgLokation.LokNr;
            saDTO.ZielLokation = bremerhavenLokation.LokNr;

            auftragsServices.CreateSendungsanfrage(ref saDTO);
            List<TransportplanungMeldung> meldungen = auftragsServices.PlaneSendungsanfrage(saDTO.SaNr);
            Assert.IsTrue(meldungen.Count == 1);
            Assert.IsTrue(meldungen[0].Tag == TransportplanungMeldungTag.FrachteinheitenBildungNichtMöglich);
        }
        public void TestPlanungZweiWegeWähleTransportplanSuccess()
        {
            SendungsanfrageDTO saDTO = new SendungsanfrageDTO();
            saDTO.SaNr = 7;
            SendungspositionDTO sp1 = new SendungspositionDTO();
            saDTO.Sendungspositionen.Add(sp1);
            saDTO.AbholzeitfensterStart = DateTime.Parse("01.09.2013");
            saDTO.AbholzeitfensterEnde = DateTime.Parse("10.09.2013");
            saDTO.AngebotGültigBis = DateTime.Now.AddHours(1);
            saDTO.StartLokation = hamburgLokation.LokNr;
            saDTO.ZielLokation = shanghaiLokation.LokNr;
            saDTO.Status = SendungsanfrageStatusTyp.Angenommen;

            auftragsServicesFürTransportplanungMock.Setup(aus => aus.FindSendungsanfrageEntity(saDTO.SaNr))
                .Returns(saDTO.ToEntity());

            ITransportplanungJob job = transportplanungsServicesFürAuftrag.StarteTransportplanungAsync(saDTO.SaNr);
            job.Wait();
            
            List<TransportplanDTO> pläne = transportplanungsServices.FindTransportplaeneZuSendungsanfrage(saDTO.SaNr);
            Assert.IsTrue(pläne.Count == 2);
            //// Inhalte geprüft durch TestPlanungZweiWegeSuccess()

            TransportplanDTO planÜberBhv = pläne.Find((plan) =>
            {
                return plan.TransportplanSchritte.ToList().Find((tps) =>
                {
                    TransportAktivitaetDTO ta = tps as TransportAktivitaetDTO;
                    if (ta != null)
                    {
                        return ta.FuerTransportAufTransportbeziehung == hh_bhv.TbNr;
                    }
                    else
                    {
                        return false;
                    }
                }) != null;
            });
            Assert.IsTrue(planÜberBhv != null);
            TransportplanDTO planÜberRtd = pläne.Find((plan) =>
            {
                return plan.TransportplanSchritte.ToList().Find((tps) =>
                {
                    TransportAktivitaetDTO ta = tps as TransportAktivitaetDTO;
                    if (ta != null)
                    {
                        return ta.FuerTransportAufTransportbeziehung == hh_rtd.TbNr;
                    }
                    else
                    {
                        return false;
                    }
                }) != null;
            });
            Assert.IsTrue(planÜberRtd != null);

            auftragsServicesFürTransportplanungMock.Setup(aus => aus.UpdateSendungsanfrageStatus(saDTO.SaNr, SendungsanfrageStatusTyp.InAusfuehrung))
                .Verifiable();

            Assert.IsTrue(planÜberBhv.TransportplanSchritte.Count == 2);
            pläne = transportplanungsServices.FindTransportplaeneZuSendungsanfrage(saDTO.SaNr);
            Assert.IsTrue(pläne.Count == 2); // es sollten noch beide Pläne vor Wahl eines Plans gespeichert sein
            transportplanungsServicesFuerSendung.FühreTransportplanAus(planÜberBhv.TpNr);
            auftragsServicesFürTransportplanungMock.Verify();
            pläne = transportplanungsServices.FindTransportplaeneZuSendungsanfrage(saDTO.SaNr);
            Assert.IsTrue(pläne.Count == 1, "Plan über Rtd sollte gelöscht sein.");
            Assert.IsTrue(pläne[0].TpNr == planÜberBhv.TpNr, "Plan über Bhv sollte vorhanden sein.");
        }
Пример #10
0
        private static void BefuelleDatenbank()
        {
            IPersistenceServices persistenceService = null;
            ITransactionServices transactionService = null;

            ITransportplanungServices transportplanungsServices = null;
            IAuftragServices auftragsServices = null;
            IUnterbeauftragungServices unterbeauftragungsServices = null;
            ITransportnetzServices transportnetzServices = null;
            IFrachtfuehrerServicesFürUnterbeauftragung frachtfuehrerServices = null;

            LokationDTO hamburgLokation;
            LokationDTO bremerhavenLokation;
            LokationDTO shanghaiLokation;
            TransportbeziehungDTO hh_bhv;
            TransportbeziehungDTO bhv_sh;

            log4net.Config.XmlConfigurator.Configure();

            PersistenceServicesFactory.CreateSimpleMySQLPersistenceService(out persistenceService, out transactionService);

            var timeServicesMock = new Mock<ITimeServices>();
            //// Wir müssen einen fixen Zeitpunkt simulieren, ansonsten sind bei der Ausführung/Planung evtl. die Verträge oder Angebote abgelaufen
            timeServicesMock.Setup(ts => ts.Now)
               .Returns(DateTime.Parse("31.08.2013 12:00"));

            transportnetzServices = new TransportnetzKomponenteFacade();
            auftragsServices = new AuftragKomponenteFacade(persistenceService, transactionService, timeServicesMock.Object);
            IAuftragServicesFürTransportplanung auftragsServicesFürTransportplanung = auftragsServices as IAuftragServicesFürTransportplanung;
            ////frachtfuehrerServices = new FrachtfuehrerAdapterFacade();
            unterbeauftragungsServices = new UnterbeauftragungKomponenteFacade(persistenceService, transactionService, frachtfuehrerServices);
            transportplanungsServices = new TransportplanungKomponenteFacade(persistenceService, transactionService, auftragsServicesFürTransportplanung, unterbeauftragungsServices as IUnterbeauftragungServicesFürTransportplanung, transportnetzServices as ITransportnetzServicesFürTransportplanung, timeServicesMock.Object);
            auftragsServicesFürTransportplanung.RegisterTransportplanungServiceFürAuftrag(transportplanungsServices as ITransportplanungServicesFürAuftrag);

            hamburgLokation = new LokationDTO("Hamburg", TimeSpan.Parse("10"), 10);
            bremerhavenLokation = new LokationDTO("Bremerhaven", TimeSpan.Parse("15"), 15);
            shanghaiLokation = new LokationDTO("Shanghai", TimeSpan.Parse("10"), 10);

            transportnetzServices.CreateLokation(ref hamburgLokation);
            transportnetzServices.CreateLokation(ref bremerhavenLokation);
            transportnetzServices.CreateLokation(ref shanghaiLokation);

            hh_bhv = new TransportbeziehungDTO(hamburgLokation, bremerhavenLokation);
            bhv_sh = new TransportbeziehungDTO(bremerhavenLokation, shanghaiLokation);

            transportnetzServices.CreateTransportbeziehung(ref hh_bhv);
            transportnetzServices.CreateTransportbeziehung(ref bhv_sh);

            FrachtfuehrerDTO frfHH_BHV = new FrachtfuehrerDTO();
            unterbeauftragungsServices.CreateFrachtfuehrer(ref frfHH_BHV);
            FrachtfuehrerRahmenvertragDTO frv_hh_bhv = new FrachtfuehrerRahmenvertragDTO();
            frv_hh_bhv.GueltigkeitAb = DateTime.Parse("01.01.2013");
            frv_hh_bhv.GueltigkeitBis = DateTime.Parse("31.12.2013");
            frv_hh_bhv.Abfahrtszeiten = new System.Collections.Generic.List<StartzeitDTO>() 
            { 
                new StartzeitDTO() { Wochentag = DayOfWeek.Tuesday, Uhrzeit = 8 },
                new StartzeitDTO() { Wochentag = DayOfWeek.Wednesday, Uhrzeit = 8 },
                new StartzeitDTO() { Wochentag = DayOfWeek.Friday, Uhrzeit = 8 }
            };
            frv_hh_bhv.KapazitaetTEU = 2;
            frv_hh_bhv.KostenFix = 1000;
            frv_hh_bhv.KostenProTEU = 100;
            frv_hh_bhv.KostenProFEU = 200;
            frv_hh_bhv.FuerTransportAufTransportbeziehung = hh_bhv.TbNr;
            frv_hh_bhv.Frachtfuehrer = frfHH_BHV;
            frv_hh_bhv.Zeitvorgabe = TimeSpan.Parse("2"); // 2 Tage
            unterbeauftragungsServices.CreateFrachtfuehrerRahmenvertrag(ref frv_hh_bhv);

            FrachtfuehrerDTO frfBHV = new FrachtfuehrerDTO();
            unterbeauftragungsServices.CreateFrachtfuehrer(ref frfBHV);
            FrachtfuehrerRahmenvertragDTO frv_bhv_sh = new FrachtfuehrerRahmenvertragDTO();
            frv_bhv_sh.GueltigkeitAb = DateTime.Parse("01.01.2013");
            frv_bhv_sh.GueltigkeitBis = DateTime.Parse("31.12.2013");
            frv_bhv_sh.Abfahrtszeiten = new System.Collections.Generic.List<StartzeitDTO>() 
            { 
                new StartzeitDTO() { Wochentag = DayOfWeek.Monday, Uhrzeit = 8 },
                new StartzeitDTO() { Wochentag = DayOfWeek.Thursday, Uhrzeit = 10 },
                new StartzeitDTO() { Wochentag = DayOfWeek.Saturday, Uhrzeit = 8 }
            };
            frv_bhv_sh.KapazitaetTEU = 4;
            frv_bhv_sh.KostenFix = 2000;
            frv_bhv_sh.KostenProTEU = 200;
            frv_bhv_sh.KostenProFEU = 400;
            frv_bhv_sh.FuerTransportAufTransportbeziehung = bhv_sh.TbNr;
            frv_bhv_sh.Frachtfuehrer = frfBHV;
            frv_bhv_sh.Zeitvorgabe = TimeSpan.Parse("5"); // 5 Tage
            unterbeauftragungsServices.CreateFrachtfuehrerRahmenvertrag(ref frv_bhv_sh);

            SendungsanfrageDTO saDTO = new SendungsanfrageDTO();
            SendungspositionDTO sp1 = new SendungspositionDTO();
            saDTO.Sendungspositionen.Add(sp1);
            saDTO.AbholzeitfensterStart = DateTime.Parse("01.09.2013");
            saDTO.AbholzeitfensterEnde = DateTime.Parse("10.09.2013");
            saDTO.AngebotGültigBis = DateTime.Now.AddHours(1);
            saDTO.StartLokation = hamburgLokation.LokNr;
            saDTO.ZielLokation = shanghaiLokation.LokNr;

            auftragsServices.CreateSendungsanfrage(ref saDTO);
            auftragsServices.PlaneSendungsanfrage(saDTO.SaNr);
            List<TransportplanDTO> pläne = transportplanungsServices.FindTransportplaeneZuSendungsanfrage(saDTO.SaNr);

            TransportplanDTO planÜberBhv = pläne.Find((plan) =>
            {
                return plan.TransportplanSchritte.ToList().Find((tps) =>
                {
                    TransportAktivitaetDTO ta = tps as TransportAktivitaetDTO;
                    if (ta != null)
                    {
                        return ta.FuerTransportAufTransportbeziehung == hh_bhv.TbNr;
                    }
                    else
                    {
                        return false;
                    }
                }) != null;
            });
            for (int i = 0; i < 5; i++)
            {
                FrachtauftragDTO faDTO = new FrachtauftragDTO() { FrachtfuehrerRahmenvertrag = frv_bhv_sh, PlanEndezeit = new DateTime(), PlanStartzeit = new DateTime(), VerwendeteKapazitaetFEU = 5, VerwendeteKapazitaetTEU = 5 };
                unterbeauftragungServices.SpeichereFrachtauftrag(ref faDTO);
            }
        }
        public void TestPlanungEinSegmentZweiTEUSuccessDreiTEUFailWegenZuGeringerKapazität()
        {
            SendungsanfrageDTO saDTO = new SendungsanfrageDTO();
            saDTO.SaNr = 1;
            SendungspositionDTO sp1 = new SendungspositionDTO();
            sp1.Bruttogewicht = TEU.MAXZULADUNG_TONS;
            saDTO.Sendungspositionen.Add(sp1);
            SendungspositionDTO sp2 = new SendungspositionDTO();
            sp2.Bruttogewicht = TEU.MAXZULADUNG_TONS;
            saDTO.Sendungspositionen.Add(sp2);
            saDTO.AbholzeitfensterStart = DateTime.Parse("29.07.2013");
            saDTO.AbholzeitfensterEnde = DateTime.Parse("04.08.2013");
            saDTO.StartLokation = hamburgLokation.LokNr;
            saDTO.ZielLokation = bremerhavenLokation.LokNr;

            auftragsServicesFürTransportplanungMock.Setup(aus => aus.FindSendungsanfrageEntity(saDTO.SaNr))
                .Returns(saDTO.ToEntity());

            ITransportplanungJob job = transportplanungsServicesFürAuftrag.StarteTransportplanungAsync(saDTO.SaNr);
            job.Wait();
            List<TransportplanDTO> pläne = transportplanungsServices.FindTransportplaeneZuSendungsanfrage(saDTO.SaNr);
            Assert.IsTrue(pläne.Count == 1);
            TransportplanDTO plan = pläne.First();
            Assert.IsTrue(plan.TransportplanSchritte.Count == 1);
            Assert.IsTrue(plan.AbholungAm == DateTime.Parse("30.07.2013 08:00:00"));
            Assert.IsTrue(plan.LieferungAm == DateTime.Parse("01.08.2013 08:00:00"));
            Assert.IsTrue(plan.Dauer == TimeSpan.Parse("2"));

            // Fixkosten 1000
            // Wartezeit 32 Stunden * 10 = 320
            // Transport 2 TEU = 200
            Assert.IsTrue(plan.Kosten == 1520);

            SendungspositionDTO sp3 = new SendungspositionDTO();
            sp3.Bruttogewicht = TEU.MAXZULADUNG_TONS;
            saDTO.Sendungspositionen.Add(sp3);
            auftragsServicesFürTransportplanungMock.Setup(aus => aus.FindSendungsanfrageEntity(saDTO.SaNr))
               .Returns(saDTO.ToEntity());
            job = transportplanungsServicesFürAuftrag.StarteTransportplanungAsync(saDTO.SaNr);
            job.Wait();
            List<TransportplanDTO> pläne2 = transportplanungsServices.FindTransportplaeneZuSendungsanfrage(saDTO.SaNr);
            Assert.IsTrue(pläne2.Count == 0); // Kapazität des FRV nur zwei TEU
        }
        public void TestPlanungEinSegmentFailWegenZuSchwererSendungsposition()
        {
            SendungsanfrageDTO saDTO = new SendungsanfrageDTO();
            saDTO.SaNr = 1;
            SendungspositionDTO sp = new SendungspositionDTO();
            sp.Bruttogewicht = FEU.MAXZULADUNG_TONS + 1; // Es können auf Grund des Gewichtes keine Frachteinheiten erzeugt werden
            saDTO.Sendungspositionen.Add(sp);
            saDTO.AbholzeitfensterStart = DateTime.Parse("29.07.2013");
            saDTO.AbholzeitfensterEnde = DateTime.Parse("04.08.2013");
            saDTO.StartLokation = hamburgLokation.LokNr;
            saDTO.ZielLokation = bremerhavenLokation.LokNr;

            auftragsServicesFürTransportplanungMock.Setup(aus => aus.FindSendungsanfrageEntity(saDTO.SaNr))
                .Returns(saDTO.ToEntity());

            ITransportplanungJob job = transportplanungsServicesFürAuftrag.StarteTransportplanungAsync(saDTO.SaNr);
            job.Wait();
            Assert.IsTrue(job.Status == TransportplanungJobStatusTyp.BeendetNok);
            Assert.IsTrue(job.Meldungen.Count == 1);
            Assert.IsTrue(job.Meldungen[0].Tag == TransportplanungMeldungTag.FrachteinheitenBildungNichtMöglich);
        }
        public void TestPlanungEinSegmentMitFEUSuccess()
        {
            SendungsanfrageDTO saDTO = new SendungsanfrageDTO();
            saDTO.SaNr = 1;
            //// Erzeugt werden soll 1 FEU
            SendungspositionDTO sp = new SendungspositionDTO();
            sp.Bruttogewicht = TEU.MAXZULADUNG_TONS + 1; // zu groß für TEU -> FEU soll erzeugt werden
            saDTO.Sendungspositionen.Add(sp);
            saDTO.AbholzeitfensterStart = DateTime.Parse("29.07.2013");
            saDTO.AbholzeitfensterEnde = DateTime.Parse("04.08.2013");
            saDTO.StartLokation = hamburgLokation.LokNr;
            saDTO.ZielLokation = bremerhavenLokation.LokNr;

            auftragsServicesFürTransportplanungMock.Setup(aus => aus.FindSendungsanfrageEntity(saDTO.SaNr))
                .Returns(saDTO.ToEntity());

            ITransportplanungJob job = transportplanungsServicesFürAuftrag.StarteTransportplanungAsync(saDTO.SaNr);
            job.Wait();
            List<TransportplanDTO> pläne = transportplanungsServices.FindTransportplaeneZuSendungsanfrage(saDTO.SaNr);
            Assert.IsTrue(pläne.Count == 1);
            TransportplanDTO plan = pläne.First();
            Assert.IsTrue(plan.TransportplanSchritte.Count == 1);
            Assert.IsTrue(plan.AbholungAm == DateTime.Parse("30.07.2013 08:00:00"));
            Assert.IsTrue(plan.LieferungAm == DateTime.Parse("01.08.2013 08:00:00"));
            Assert.IsTrue(plan.Dauer == TimeSpan.Parse("2"));
            Assert.IsTrue(plan.Frachteinheiten.Count == 1);
            Assert.IsTrue(plan.Frachteinheiten.Any((fe) => { return fe.FraeTyp == FrachteinheitTyp.FEU; }));

            // Fixkosten 1000
            // Wartezeit 32 Stunden * 10 = 320
            // Transport 1 FEU = 200
            Assert.IsTrue(plan.Kosten == 1520);
        }
        public void TestPlanungWähleUndBeauftrageTransportplanSuccess()
        {
            SendungsanfrageDTO saDTO = new SendungsanfrageDTO();
            SendungspositionDTO sp1 = new SendungspositionDTO();
            saDTO.Sendungspositionen.Add(sp1);
            saDTO.AbholzeitfensterStart = DateTime.Parse("01.09.2013");
            saDTO.AbholzeitfensterEnde = DateTime.Parse("10.09.2013");
            saDTO.AngebotGültigBis = DateTime.Now.AddHours(1);
            saDTO.StartLokation = hamburgLokation.LokNr;
            saDTO.ZielLokation = shanghaiLokation.LokNr;

            auftragsServices.CreateSendungsanfrage(ref saDTO);
            auftragsServices.PlaneSendungsanfrage(saDTO.SaNr);
            List<TransportplanDTO> pläne = transportplanungsServices.FindTransportplaeneZuSendungsanfrage(saDTO.SaNr);
            Assert.IsTrue(pläne.Count == 1);

            TransportplanDTO planÜberBhv = pläne.Find((plan) =>
            {
                return plan.TransportplanSchritte.ToList().Find((tps) =>
                {
                    TransportAktivitaetDTO ta = tps as TransportAktivitaetDTO;
                    if (ta != null)
                    {
                        return ta.FuerTransportAufTransportbeziehung == hh_bhv.TbNr;
                    }
                    else
                    {
                        return false;
                    }
                }) != null;
            });
            Assert.IsTrue(planÜberBhv != null);

            Assert.IsTrue(planÜberBhv.TransportplanSchritte.Count == 2);
            auftragsServices.NimmAngebotAn(saDTO.SaNr);
            transportplanungsServicesFuerSendung.FühreTransportplanAus(planÜberBhv.TpNr);
            pläne = transportplanungsServices.FindTransportplaeneZuSendungsanfrage(saDTO.SaNr);
            Assert.IsTrue(pläne.Count == 1);
            Assert.IsTrue(pläne[0].TpNr == planÜberBhv.TpNr);

            // Manuell prüfen, ob folgende Daten an Frachtführer-Nachbarsystem gesendet wurden:
            // FraNr: 1, FrfNr: 1, FrvNr: 1, Plan Abholzeit: 03.09.2013 8:00, Plan Ende: 05.09.2013 8:00, TEU: 1, FEU: 0
            // FraNr: 2, FrfNr: 2, FrvNr: 2, Plan Abholzeit: 05.09.2013 10:00, Plan Ende: 10.09.2013 10:00, TEU: 1, FEU: 0
        }
        private void Btn_SendungspositionHinzufuegen_Click(object sender, RoutedEventArgs e)
        {
            decimal positionGewicht = GetBruttogewichtFromTextbox();

            ////BL
            SendungspositionDTO sp = new SendungspositionDTO() { Bruttogewicht = positionGewicht };
            saDTO.Sendungspositionen.Add(sp);

            ////Design
            string position = positionenCount++ + ": " + positionGewicht;
            lb_hinzugefuegtePositionen.Items.Add(new TextBlock() { Text = position });

            this.Height += 20;
        }