public void Save(Lokation lokation)
        {
            Contract.Requires(lokation != null);

            IEnumerable<IndexEntry> indexEntries = new[]
                {
                    new IndexEntry("LokationIdx")
                    {
                        { "Name", lokation.Name }
                    }
                };
            NodeReference<Lokation> nodeRef = gc.Create(
                lokation,
                new IRelationshipAllowingParticipantNode<Lokation>[0],
                indexEntries);
            lokation.LokNr = nodeRef.Id;
        }
        public static void InitializeTests(TestContext testContext)
        {
            log4net.Config.XmlConfigurator.Configure();

            PersistenceServicesFactory.CreateSimpleMySQLPersistenceService(out persistenceService, out transactionService);

            auftragsServicesFürTransportplanungMock = new Mock<IAuftragServicesFürTransportplanung>();

            var transportnetzServicesFürTransportplanungMock = new Mock<ITransportnetzServicesFürTransportplanung>();

            hamburgLokation = new Lokation("Hamburg", TimeSpan.Parse("10"), 10);
            hamburgLokation.LokNr = 1;
            bremerhavenLokation = new Lokation("Bremerhaven", TimeSpan.Parse("15"), 15);
            bremerhavenLokation.LokNr = 2;
            rotterdamLokation = new Lokation("Rotterdam", TimeSpan.Parse("20"), 20);
            rotterdamLokation.LokNr = 3;
            shanghaiLokation = new Lokation("Shanghai", TimeSpan.Parse("10"), 10);
            shanghaiLokation.LokNr = 4;

            hh_bhv = new Transportbeziehung(hamburgLokation, bremerhavenLokation);
            hh_bhv.TbNr = 1;
            bhv_sh = new Transportbeziehung(bremerhavenLokation, shanghaiLokation);
            bhv_sh.TbNr = 2;
            hh_rtd = new Transportbeziehung(hamburgLokation, rotterdamLokation);
            hh_rtd.TbNr = 3;
            rtd_sh = new Transportbeziehung(rotterdamLokation, shanghaiLokation);
            rtd_sh.TbNr = 4;

            List<List<Transportbeziehung>> path_hh_bhv = new List<List<Transportbeziehung>>();
            path_hh_bhv.Add(new List<Transportbeziehung>() { hh_bhv });
            transportnetzServicesFürTransportplanungMock.Setup(tns => tns.GeneriereAllePfadeVonBis(hamburgLokation.LokNr, bremerhavenLokation.LokNr))
                .Returns(path_hh_bhv);
            List<List<Transportbeziehung>> path_hh_sh = new List<List<Transportbeziehung>>();
            path_hh_sh.Add(new List<Transportbeziehung>() { hh_bhv, bhv_sh });
            path_hh_sh.Add(new List<Transportbeziehung>() { hh_rtd, rtd_sh });
            transportnetzServicesFürTransportplanungMock.Setup(tns => tns.GeneriereAllePfadeVonBis(hamburgLokation.LokNr, shanghaiLokation.LokNr))
                .Returns(path_hh_sh);

            var unterbeauftragungsServicesMock = new Mock<IUnterbeauftragungServicesFürTransportplanung>();

            // Transportbeauftragung ist im Komponententest unwesentlich
            unterbeauftragungsServicesMock.Setup(ubs => ubs.BeauftrageTransport(It.IsAny<int>(), It.IsAny<DateTime>(), It.IsAny<DateTime>(), It.IsAny<int>(), It.IsAny<int>(), It.IsAny<int>()))
               .Returns(1);

            FrachtfuehrerRahmenvertrag frv_hh_bhv = new FrachtfuehrerRahmenvertrag();
            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<Startzeit>() 
            { 
                new Startzeit() { Wochentag = DayOfWeek.Tuesday, Uhrzeit = 8 },
                new Startzeit() { Wochentag = DayOfWeek.Wednesday, Uhrzeit = 8 },
                new Startzeit() { 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.Zeitvorgabe = TimeSpan.Parse("2"); // 2 Tage
            frv_hh_bhv.FrvNr = 1;

            FrachtfuehrerRahmenvertrag frv_bhv_sh = new FrachtfuehrerRahmenvertrag();
            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<Startzeit>() 
            { 
                new Startzeit() { Wochentag = DayOfWeek.Monday, Uhrzeit = 8 },
                new Startzeit() { Wochentag = DayOfWeek.Thursday, Uhrzeit = 10 },
                new Startzeit() { Wochentag = DayOfWeek.Saturday, Uhrzeit = 8 }
            };
            frv_bhv_sh.KapazitaetTEU = 20;
            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.Zeitvorgabe = TimeSpan.Parse("5"); // 5 Tage
            frv_bhv_sh.FrvNr = 2;

            FrachtfuehrerRahmenvertrag frv_hh_rtd = new FrachtfuehrerRahmenvertrag();
            frv_hh_rtd.GueltigkeitAb = DateTime.Parse("01.09.2013");
            frv_hh_rtd.GueltigkeitBis = DateTime.Parse("31.12.2013");
            frv_hh_rtd.Abfahrtszeiten = new System.Collections.Generic.List<Startzeit>() 
            { 
                new Startzeit() { Wochentag = DayOfWeek.Monday, Uhrzeit = 8 },
                new Startzeit() { Wochentag = DayOfWeek.Thursday, Uhrzeit = 10 },
                new Startzeit() { Wochentag = DayOfWeek.Saturday, Uhrzeit = 8 }
            };
            frv_hh_rtd.KapazitaetTEU = 20;
            frv_hh_rtd.KostenFix = 2000;
            frv_hh_rtd.KostenProTEU = 200;
            frv_hh_rtd.KostenProFEU = 400;
            frv_hh_rtd.FuerTransportAufTransportbeziehung = hh_rtd.TbNr;
            frv_hh_rtd.Zeitvorgabe = TimeSpan.Parse("3"); // 3 Tage
            frv_hh_rtd.FrvNr = 3;

            FrachtfuehrerRahmenvertrag frv_rtd_sh = new FrachtfuehrerRahmenvertrag();
            frv_rtd_sh.GueltigkeitAb = DateTime.Parse("01.09.2013");
            frv_rtd_sh.GueltigkeitBis = DateTime.Parse("31.12.2013");
            frv_rtd_sh.Abfahrtszeiten = new System.Collections.Generic.List<Startzeit>() 
            { 
                new Startzeit() { Wochentag = DayOfWeek.Monday, Uhrzeit = 8 },
                new Startzeit() { Wochentag = DayOfWeek.Thursday, Uhrzeit = 10 },
                new Startzeit() { Wochentag = DayOfWeek.Saturday, Uhrzeit = 8 }
            };
            frv_rtd_sh.KapazitaetTEU = 20;
            frv_rtd_sh.KostenFix = 3000;
            frv_rtd_sh.KostenProTEU = 300;
            frv_rtd_sh.KostenProFEU = 400;
            frv_rtd_sh.FuerTransportAufTransportbeziehung = rtd_sh.TbNr;
            frv_rtd_sh.Zeitvorgabe = TimeSpan.Parse("7"); // 7 Tage
            frv_rtd_sh.FrvNr = 4;

            unterbeauftragungsServicesMock.Setup(ubs => ubs.FindGültigFür(hh_bhv.TbNr, It.IsAny<DateTime>(), It.IsAny<DateTime>()))
                .Returns((long _, DateTime zeitspanneVon, DateTime zeitspanneBis)
                 =>
                 {
                     if ((zeitspanneVon >= frv_hh_bhv.GueltigkeitAb && zeitspanneVon <= frv_hh_bhv.GueltigkeitBis) ||
                         (zeitspanneBis >= frv_hh_bhv.GueltigkeitAb && zeitspanneBis <= frv_hh_bhv.GueltigkeitBis) ||
                         (zeitspanneVon <= frv_hh_bhv.GueltigkeitAb && zeitspanneBis >= frv_hh_bhv.GueltigkeitBis))
                     {
                         List<FrachtfuehrerRahmenvertrag> lfrv = new List<FrachtfuehrerRahmenvertrag>();
                         lfrv.Add(frv_hh_bhv);
                         return lfrv;
                     }
                     else
                     {
                         return new List<FrachtfuehrerRahmenvertrag>();
                     }
                 });

            unterbeauftragungsServicesMock.Setup(ubs => ubs.FindGültigFür(bhv_sh.TbNr, It.IsAny<DateTime>(), It.IsAny<DateTime>()))
                .Returns((long _, DateTime zeitspanneVon, DateTime zeitspanneBis)
                 =>
                {
                    if ((zeitspanneVon >= frv_bhv_sh.GueltigkeitAb && zeitspanneVon <= frv_bhv_sh.GueltigkeitBis) ||
                        (zeitspanneBis >= frv_bhv_sh.GueltigkeitAb && zeitspanneBis <= frv_bhv_sh.GueltigkeitBis) ||
                        (zeitspanneVon <= frv_bhv_sh.GueltigkeitAb && zeitspanneBis >= frv_bhv_sh.GueltigkeitBis))
                    {
                        List<FrachtfuehrerRahmenvertrag> lfrv = new List<FrachtfuehrerRahmenvertrag>();
                        lfrv.Add(frv_bhv_sh);
                        return lfrv;
                    }
                    else
                    {
                        return new List<FrachtfuehrerRahmenvertrag>();
                    }
                });

            unterbeauftragungsServicesMock.Setup(ubs => ubs.FindGültigFür(hh_rtd.TbNr, It.IsAny<DateTime>(), It.IsAny<DateTime>()))
                .Returns((long _, DateTime zeitspanneVon, DateTime zeitspanneBis)
                 =>
                {
                    if ((zeitspanneVon >= frv_hh_rtd.GueltigkeitAb && zeitspanneVon <= frv_hh_rtd.GueltigkeitBis) ||
                        (zeitspanneBis >= frv_hh_rtd.GueltigkeitAb && zeitspanneBis <= frv_hh_rtd.GueltigkeitBis) ||
                        (zeitspanneVon <= frv_hh_rtd.GueltigkeitAb && zeitspanneBis >= frv_hh_rtd.GueltigkeitBis))
                    {
                        List<FrachtfuehrerRahmenvertrag> lfrv = new List<FrachtfuehrerRahmenvertrag>();
                        lfrv.Add(frv_hh_rtd);
                        return lfrv;
                    }
                    else
                    {
                        return new List<FrachtfuehrerRahmenvertrag>();
                    }
                });

            unterbeauftragungsServicesMock.Setup(ubs => ubs.FindGültigFür(rtd_sh.TbNr, It.IsAny<DateTime>(), It.IsAny<DateTime>()))
                .Returns((long _, DateTime zeitspanneVon, DateTime zeitspanneBis)
                 =>
                {
                    if ((zeitspanneVon >= frv_rtd_sh.GueltigkeitAb && zeitspanneVon <= frv_rtd_sh.GueltigkeitBis) ||
                        (zeitspanneBis >= frv_rtd_sh.GueltigkeitAb && zeitspanneBis <= frv_rtd_sh.GueltigkeitBis) ||
                        (zeitspanneVon <= frv_rtd_sh.GueltigkeitAb && zeitspanneBis >= frv_rtd_sh.GueltigkeitBis))
                    {
                        List<FrachtfuehrerRahmenvertrag> lfrv = new List<FrachtfuehrerRahmenvertrag>();
                        lfrv.Add(frv_rtd_sh);
                        return lfrv;
                    }
                    else
                    {
                        return new List<FrachtfuehrerRahmenvertrag>();
                    }
                });

            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"));

            transportplanungsServices = new TransportplanungKomponenteFacade(persistenceService, transactionService, auftragsServicesFürTransportplanungMock.Object, unterbeauftragungsServicesMock.Object as IUnterbeauftragungServicesFürTransportplanung, transportnetzServicesFürTransportplanungMock.Object as ITransportnetzServicesFürTransportplanung, timeServicesMock.Object);
            transportplanungsServicesFuerSendung = transportplanungsServices as ITransportplanungServicesFuerSendung;
            transportplanungsServicesFürAuftrag = transportplanungsServices as ITransportplanungServicesFürAuftrag;
            Assert.IsTrue(transportplanungsServicesFürAuftrag != null);
        }
        protected override void Execute(CodeActivityContext context)
        {
            try
            {
                // Get the context service.
                IWorkflowContext            Icontext       = context.GetExtension <IWorkflowContext>();
                IOrganizationServiceFactory serviceFactory = context.GetExtension <IOrganizationServiceFactory>();

                // Use the context service to create an instance of IOrganizationService.
                IOrganizationService service = serviceFactory.CreateOrganizationService(Icontext.InitiatingUserId);

                //get input fields
                var birthDate = Birthdate.Get(context) == new DateTime(0001, 01, 01) ? new DateTime(1753, 01, 01) : Birthdate.Get(context);
                var firstName = Firstname.Get(context);
                var lastName  = Lastname.Get(context);
                var userName  = Username.Get(context) == null ? "" : Username.Get(context);

                // made in fetchXML builder
                // Instantiate QueryExpression QEcontact
                var QEcontact = new QueryExpression("contact");

                // Add columns to QEcontact.ColumnSet
                QEcontact.ColumnSet.AddColumns("fullname", "firstname", "lastname", "birthdate", "sdu_brugernavn", "sdu_domne", "emailaddress1", "address1_city", "jobtitle", "sdu_crmomkostningssted", "sdu_brugernavn", "address1_line1");

                // Define filter QEcontact.Criteria // all must match birthdate + sdu_crmudlb + opdateret fra fim
                var QEcontact_Criteria = new FilterExpression();
                QEcontact.Criteria.AddFilter(QEcontact_Criteria);

                // Define filter QEcontact_Criteria // either match on username, or firstname + lastname
                QEcontact_Criteria.FilterOperator = LogicalOperator.Or;
                QEcontact_Criteria.AddCondition("sdu_brugernavn", ConditionOperator.Equal, userName);

                var QEcontact_Criteria_name = new FilterExpression();
                QEcontact_Criteria.AddFilter(QEcontact_Criteria_name);

                // Define filter QEcontact_Criteria_name_birthdate
                QEcontact_Criteria_name.AddCondition("firstname", ConditionOperator.Like, "%" + firstName + "%");
                QEcontact_Criteria_name.AddCondition("lastname", ConditionOperator.Like, "%" + lastName + "%");
                QEcontact_Criteria_name.AddCondition("birthdate", ConditionOperator.On, birthDate);

                var QEcontact_Criteria_state = new FilterExpression();
                QEcontact.Criteria.AddFilter(QEcontact_Criteria_state);

                // define filter QEcontact_Criteria_dates
                QEcontact_Criteria_state.AddCondition("statecode", ConditionOperator.Equal, RecordStatus.Get(context) == false ? 1 : 0);                            // kontoen er inaktiv
                QEcontact_Criteria_state.AddCondition("sdu_crmudlb", ConditionOperator.OnOrAfter, DateTime.Today.AddMonths(ExpirationDateLimit.Get(context) * -1)); // CRM udløb er maksimalt 13 måneder gammelt
                QEcontact_Criteria_state.AddCondition("sdu_crmudlb", ConditionOperator.OnOrBefore, DateTime.Today.AddDays(-1));                                     // CRM er igår eller før
                QEcontact_Criteria_state.AddCondition("jobtitle", ConditionOperator.NotLike, "%Studentermedhjælp%");

                //find records
                var queryResult = service.RetrieveMultiple(QEcontact);

                if (queryResult.Entities.Count == 1)
                {
                    foreach (var record in queryResult.Entities)
                    {
                        // fullname
                        FullnameOutput.Set(context, record.GetAttributeValue <string>("fullname"));

                        // contactid
                        ContactID.Set(context, record.GetAttributeValue <Guid>("contactid").ToString());

                        // omkostningssted
                        var omkStedIdLocal = SearchForRecord(service, "sdu_brugeradmomksted",
                                                             new KeyValuePair <string, string>("sdu_omksted", record.GetAttributeValue <EntityReference>("sdu_crmomkostningssted").Id.ToString()),
                                                             new KeyValuePair <string, string>("", ""),
                                                             "sdu_brugeradmomkstedid");

                        OmkStedId.Set(context, omkStedIdLocal);

                        // domæne
                        String[] seperator_domaene = { "_" };

                        if (omkStedIdLocal != "")
                        {
                            Domaene.Set(context, SearchForRecord(service,
                                                                 "sdu_domner",
                                                                 new KeyValuePair <string, string>("sdu_brugeradmomksted", omkStedIdLocal.Split(seperator_domaene, StringSplitOptions.RemoveEmptyEntries).GetValue(0).ToString()),
                                                                 new KeyValuePair <string, string>("sdu_name", record.GetAttributeValue <string>("sdu_domne")),
                                                                 "sdu_domnerid"));

                            // email domæne
                            String[] seperator_emailDomaene = { "@" };
                            var      emailDomainFromContact = "@" + record.GetAttributeValue <string>("emailaddress1").Split(seperator_emailDomaene, StringSplitOptions.RemoveEmptyEntries).GetValue(1).ToString();

                            EmailDomaene.Set(context, SearchForRecord(service,
                                                                      "sdu_emaildomne",
                                                                      new KeyValuePair <string, string>("sdu_brugeradmomksted", omkStedIdLocal.Split(seperator_domaene, StringSplitOptions.RemoveEmptyEntries).GetValue(0).ToString()),
                                                                      new KeyValuePair <string, string>("sdu_name", emailDomainFromContact.Replace(" ", "")), // remove whitespaces
                                                                      "sdu_emaildomneid"));
                        }
                        else
                        {
                            // set output parameters to empty strings, if no omk sted
                            Domaene.Set(context, "");
                            EmailDomaene.Set(context, "");
                        }

                        // lokation + arbejdsadresse
                        var LokationOptionSetValue = "";

                        switch (record.GetAttributeValue <string>("address1_city"))
                        {
                        case "Odense":
                            LokationOptionSetValue = "100000000";
                            break;

                        case "Odense M":
                            LokationOptionSetValue = "100000000";
                            break;

                        case "Odense C":
                            LokationOptionSetValue = "100000000";
                            break;

                        case "Sønderborg":
                            LokationOptionSetValue = "100000001";
                            break;

                        case "Esbjerg":
                            LokationOptionSetValue = "100000002";
                            break;

                        case "Slagelse":
                            LokationOptionSetValue = "100000003";
                            break;

                        case "Kolding":
                            LokationOptionSetValue = "100000004";
                            break;

                        default:
                            break;
                        }

                        var workAddress = record.GetAttributeValue <string>("address1_line1") == null ? "" : record.GetAttributeValue <string>("address1_line1");

                        if (workAddress.Contains("Campusvej"))
                        {
                            LokationOptionSetValue = LokationOptionSetValue + "_" + "100000000";
                        }
                        else if (workAddress.Contains("J.B. Winsløws Vej"))
                        {
                            LokationOptionSetValue = LokationOptionSetValue + "_" + "100000001";
                        }

                        Lokation.Set(context, LokationOptionSetValue);


                        // stillingsbetegnelse
                        StillingsBetegnelse.Set(context, SearchForRecord(service,
                                                                         "sdu_stikogruppe",
                                                                         new KeyValuePair <string, string>("sdu_name", record.GetAttributeValue <string>("jobtitle") == null ? "" : record.GetAttributeValue <string>("jobtitle")),
                                                                         new KeyValuePair <string, string>("", ""),
                                                                         "sdu_stikogruppeid"));


                        // fødselsdato
                        BirthDateOutput.Set(context, record.GetAttributeValue <DateTime>("birthdate") < new DateTime(1900, 01, 01) ? DateTime.Now : record.GetAttributeValue <DateTime>("birthdate"));

                        // brugernavn
                        UsernameOutput.Set(context, record.GetAttributeValue <string>("sdu_brugernavn"));
                    }
                }
                else
                {
                    FullnameOutput.Set(context, "");
                    ContactID.Set(context, "");
                    OmkStedId.Set(context, "");
                    Domaene.Set(context, "");
                    EmailDomaene.Set(context, "");
                    Lokation.Set(context, "");
                    StillingsBetegnelse.Set(context, "");
                    BirthDateOutput.Set(context, DateTime.Now);
                    UsernameOutput.Set(context, "");
                }
            }
            catch (Exception ex)
            {
                throw (ex);
            }
        }