public ActionResult Error()
        {
            StemmingenListVM stemmingenlistVM = new StemmingenListVM();
            string           title            = "ERROR!";
            string           msg   = "";
            string           level = "";

            if (TempData.ContainsKey("BCmessage"))
            {
                msg = TempData["BCmessage"].ToString();
            }
            else
            {
                msg = "Unknown error";
            }
            if (TempData.ContainsKey("BCerrorlevel"))
            {
                level = TempData["BCerrorlevel"].ToString();
            }
            else
            {
                level = stemmingenlistVM.MessageSection.Error;
            }
            stemmingenlistVM.MessageSection.SetMessage(title, level, msg);
            return(View(stemmingenlistVM));
        }
        public ActionResult DeleteConfirmed(string wetid, DateTime stemdatum)
        {
            StemmingenListVM stemmingenlistVM = new StemmingenListVM();

            if ((wetid == null) || (stemdatum == null))
            {
                TempData["BCmessage"]    = "Specificeer een geldige Wet ID en stemdatum!";
                TempData["BCerrorlevel"] = stemmingenlistVM.MessageSection.Error;

                return(RedirectToAction("Error"));
            }

            var query = (from s in db.Stemmingen
                         where ((s.WetID == wetid) && (s.StemDatum == stemdatum))
                         select s).ToList();

            if (query.Count == 0)
            {
                TempData["BCmessage"]    = "Stemming voor Wet ID '" + wetid.Trim() + "' + op datum " + stemdatum.ToString("dd-MMMM-yyyy") + " is niet gevonden";
                TempData["BCerrorlevel"] = stemmingenlistVM.MessageSection.Error;

                return(RedirectToAction("Error"));
            }

            db.Stemmingen.RemoveRange(db.Stemmingen.Where(c => c.WetID == wetid && c.StemDatum == stemdatum));

            db.SaveChanges();

            TempData["BCmessage"]    = "Stemming voor wet '" + wetid.Trim() + "' op datum " + stemdatum.ToString("dd-MMMM-yyyy") + " is succesvol verwijderd";
            TempData["BCerrorlevel"] = stemmingenlistVM.MessageSection.Info;
            return(RedirectToAction("Index"));
        }
        // GET: Stemmingen
        public ActionResult Index()
        {
            StemmingenListVM stemmingenlistvm = new StemmingenListVM();

            string msg   = "Selecteer een bewerking op een stemming of voeg een stemming toe";
            string level = stemmingenlistvm.MessageSection.Info;
            string title = "Overzicht S T E M M I N G E N ";

            var query = from s in db.Stemmingen
                        group s by new { s.WetID, s.StemDatum } into grp
                select new
            {
                WetID     = grp.Key.WetID,
                StemDatum = grp.Key.StemDatum,
                Voor      = grp.Sum(t => t.Voor),
                Tegen     = grp.Sum(t => t.Tegen),
                Blanco    = grp.Sum(t => t.Blanco)
            } into rj1
            join w in db.Wetten on rj1.WetID equals w.WetID into rjoin2
            from rj2 in rjoin2
                select new StemObject
            {
                PartijID        = "** ALL **",
                WetID           = rj1.WetID,
                StemDatum       = rj1.StemDatum,
                Voor            = rj1.Voor,
                Tegen           = rj1.Tegen,
                Blanco          = rj1.Blanco,
                WetLink         = rj2.WetLink,
                WetNaam         = rj2.WetNaam,
                WetOmschrijving = rj2.WetOmschrijving
            }
            ;

            stemmingenlistvm.StemLijst = query.ToList();
            if (stemmingenlistvm.StemLijst.Count == 0)
            {
                level = stemmingenlistvm.MessageSection.Warning;
                msg   = "Geen stemmingen gevonden";
            }
            if (TempData.ContainsKey("BCmessage"))
            {
                msg = TempData["BCmessage"].ToString();
            }
            if (TempData.ContainsKey("BCerrorlevel"))
            {
                level = TempData["BCerrorlevel"].ToString();
            }
            stemmingenlistvm.MessageSection.SetMessage(title, level, msg);

            return(View(stemmingenlistvm));
        }
        // We get here after prompting for a date
        public ActionResult Create(StemmingenListVM stemmingenlistVM)
        {
            stemmingenlistVM = GetStemmingData(stemmingenlistVM);


            if ((stemmingenlistVM.ModelOk) || (stemmingenlistVM.ZetelsOk))
            {
                ModelState.Clear();
                return(View("CreatEdit", stemmingenlistVM));
            }
            else
            {
                return(View(stemmingenlistVM));
            }
        }
        // GET: Stemmingen/Details/5
        public ActionResult Details(string wetid, DateTime stemdatum)
        {
            StemmingenListVM stemmingenVM = new StemmingenListVM();
            string           title        = "Details";
            string           level        = stemmingenVM.MessageSection.Info;
            string           msg          = "Stemverdeling bij deze wet: ";

            if ((wetid == null) || (stemdatum == null))
            {
                TempData["BCmessage"]    = "Specificeer een geldige Wet + Stemdatum";
                TempData["BCerrorlevel"] = stemmingenVM.MessageSection.Error;

                return(RedirectToAction("Error"));
            }

            // Fill the View Model

            var query = from s in db.Stemmingen
                        where ((s.WetID == wetid) && (s.StemDatum == stemdatum))
                        select new
            {
                PartijID  = s.PartijID,
                WetID     = s.WetID,
                StemDatum = s.StemDatum,
                Voor      = s.Voor,
                Tegen     = s.Tegen,
                Blanco    = s.Blanco
            }
            into rj1
            join w in db.Wetten on rj1.WetID equals w.WetID into rjoin2
            from rj2 in rjoin2
                select new StemObject
            {
                PartijID        = rj1.PartijID,
                WetID           = rj1.WetID,
                StemDatum       = rj1.StemDatum,
                Voor            = rj1.Voor,
                Tegen           = rj1.Tegen,
                Blanco          = rj1.Blanco,
                WetLink         = rj2.WetLink,
                WetType         = rj2.WetType,
                WetNaam         = rj2.WetNaam,
                WetOmschrijving = rj2.WetOmschrijving
            }
            ;

            stemmingenVM.StemLijst = query.ToList();
            if (stemmingenVM.StemLijst.Count == 0)
            {
                level = stemmingenVM.MessageSection.Warning;
                msg   = "Geen stemmingen gevonden";
            }
            if (TempData.ContainsKey("BCmessage"))
            {
                msg = TempData["BCmessage"].ToString();
            }
            if (TempData.ContainsKey("BCerrorlevel"))
            {
                level = TempData["BCerrorlevel"].ToString();
            }
            stemmingenVM.MessageSection.SetMessage(title, level, msg);

            return(View(stemmingenVM));
        }
        private StemmingenListVM GetStemmingData(StemmingenListVM stemmingenlistVM)
        {
            string   level     = " ";
            string   msg       = " ";
            string   title     = " ";
            DateTime stemdatum = stemmingenlistVM.StemDatum;
            string   wetid     = stemmingenlistVM.WetID;
            // Date + Wetid are given, get from the database what's there already

            var wetten = db.Wetten.Find(wetid);

            if (wetten == null)
            {
                //return stemmingenlistVM;
                TempData["BCmessage"]    = "Wet '" + wetid.Trim() + "' is onbekend...";
                TempData["BCerrorlevel"] = stemmingenlistVM.MessageSection.Error;

                RedirectToAction("Error");
            }
            // Determine which parties were active at that time
            var query1 = from p in db.Partijen
                         join j1 in db.PartijZetels on p.PartijID equals j1.PartijID
                         where ((j1.VanDatum <= stemdatum) && (j1.TotDatum >= stemdatum))
                         select new
            {
                p.PartijID,
                p.PartijNaam,
                j1.AantalZetels,
                j1.VanDatum,
                j1.TotDatum
            };

            var actievepartijen = query1.ToList();

            stemmingenlistVM.ModelOk = true;
            if (actievepartijen.Count == 0)
            {
                level = stemmingenlistVM.MessageSection.Error;
                msg   = "Op de gegeven datum zijn geen partijen actief in de Tweede Kamer";
                stemmingenlistVM.MessageSection.SetMessage(title, level, msg);
                StemObject so = new StemObject
                {
                    WetID           = wetten.WetID,
                    WetNaam         = wetten.WetNaam,
                    WetLink         = wetten.WetLink,
                    WetOmschrijving = wetten.WetOmschrijving,
                    WetType         = wetten.WetType
                };
                List <StemObject> sl = new List <StemObject>();
                sl.Add(so);

                stemmingenlistVM.Fill(sl);

                stemmingenlistVM.ModelOk  = false;
                stemmingenlistVM.ZetelsOk = false;
                return(stemmingenlistVM);
            }

            // Check if the active parties have exactly 150 seats in total
            stemmingenlistVM.ZetelsOk = true;
            int totalseats = 0;

            foreach (var activeparty in actievepartijen)
            {
                totalseats = totalseats + activeparty.AantalZetels;
            }
            if (totalseats != 150)
            {
                level = stemmingenlistVM.MessageSection.Error;
                msg   = "Op de opgegeven datum hebben de gezamenlijke partijen " + totalseats.ToString() + " zetels i.p.v. 150. Corrigeer dit eerst!";
                stemmingenlistVM.MessageSection.SetMessage(title, level, msg);
                stemmingenlistVM.ZetelsOk = false;
            }

            var query3 = from s in db.Stemmingen
                         where (s.WetID == wetid) && (s.StemDatum == stemdatum)
                         select new
            {
                PartijID  = s.PartijID,
                StemDatum = s.StemDatum,
                Voor      = s.Voor,
                Tegen     = s.Tegen,
                Blanco    = s.Blanco
            };

            var bestaandestemmingen = query3.ToList();

            var combine = from a in actievepartijen
                          join b in bestaandestemmingen on a.PartijID equals b.PartijID into joinedList
                          from sub in joinedList.DefaultIfEmpty()
                          select new StemObject
            {
                StemDatum       = stemdatum,
                WetID           = wetten.WetID,
                WetLink         = wetten.WetLink,
                WetNaam         = wetten.WetNaam,
                WetType         = wetten.WetType,
                WetOmschrijving = wetten.WetOmschrijving,
                PartijID        = a.PartijID,
                PartijNaam      = a.PartijNaam,
                PartijZetels    = a.AantalZetels,
                Voor            = sub == null ? 0 : sub.Voor,
                Tegen           = sub == null ? 0 : sub.Tegen,
                Blanco          = sub == null ? 0 : sub.Blanco
            };

            List <StemObject> vmlist = combine.ToList();

            stemmingenlistVM.Fill(vmlist);
            int tot = stemmingenlistVM.TotaalBlanco + stemmingenlistVM.TotaalVoor + stemmingenlistVM.TotaalTegen;

            if (tot == 0)
            {
                title = "Stemming TOEVOEGEN";
            }
            else
            {
                title = "BESTAANDE stemming WIJZIGEN";
            }

            if (stemmingenlistVM.ZetelsOk)
            {
                level = stemmingenlistVM.MessageSection.Info;
                msg   = "Vul de stemgegevens in voor elke partij bij deze wet en selecteer OPSLAAN";

                stemmingenlistVM.MessageSection.SetMessage(title, level, msg);
            }
            return(stemmingenlistVM);
        }
        public ActionResult CreatEdit(StemmingenListVM stemmingenlistVM)
        {
            string level = "";
            string msg   = " ";
            string title = "BESTAANDE stemming WIJZIGEN";

            if (ModelState.IsValid)
            {
                bool foutje = false;
                // Input validation
                int totaalzetels = 0;
                foreach (StemObject sobj in stemmingenlistVM.StemLijst)
                {
                    totaalzetels = totaalzetels + sobj.PartijZetels;
                    sobj.Error   = "fout";
                    sobj.Message = " ";
                    if (sobj.PartijZetels != (sobj.Tegen + sobj.Voor + sobj.Blanco))
                    {
                        sobj.Error   = "fout";
                        foutje       = true;
                        sobj.Message = "Totaal aantal stemmen moet " + sobj.PartijZetels.ToString() + " zijn";
                        msg          = "Bij één of meer partijen klopt het aantal uitgebrachte stemmen niet met het totaal";
                        level        = stemmingenlistVM.MessageSection.Error;
                    }
                    else
                    {
                        sobj.Error   = "ok";
                        sobj.Message = " ";
                    }
                }
                if (totaalzetels != 150)
                {
                    level  = stemmingenlistVM.MessageSection.Error;
                    msg    = "Totaal aantal stemmen moet uitkomen op 150 (nu: " + totaalzetels.ToString() + ")";
                    foutje = true;
                }
                if (foutje)
                {
                    stemmingenlistVM.MessageSection.SetMessage(title, level, msg);
                    ModelState.Clear();
                    return(View(stemmingenlistVM));
                }
            }
            else
            {
                TempData["BCmessage"]    = "ModelState ERROR";
                TempData["BCerrorlevel"] = stemmingenlistVM.MessageSection.Error;

                return(RedirectToAction("Error"));
            }

            // ok, now update the database
            string   mywetid     = stemmingenlistVM.StemLijst[0].WetID.Trim();
            DateTime mystemdatum = stemmingenlistVM.StemLijst[0].StemDatum;

            db.Stemmingen.RemoveRange(db.Stemmingen.Where(c => c.WetID == mywetid && c.StemDatum == mystemdatum));

            db.SaveChanges();

            foreach (StemObject so in stemmingenlistVM.StemLijst)
            {
                Stemmingen stemmingen = new Stemmingen
                {
                    PartijID  = so.PartijID,
                    WetID     = so.WetID,
                    StemDatum = so.StemDatum,
                    Voor      = so.Voor,
                    Tegen     = so.Tegen,
                    Blanco    = so.Blanco
                };

                db.Stemmingen.Add(stemmingen);
            }

            db.SaveChanges();
            TempData["BCmessage"]    = "Stemming " + mywetid + " is gewijzigd";
            TempData["BCerrorlevel"] = stemmingenlistVM.MessageSection.Info;

            return(RedirectToAction("Details", new { WetID = mywetid, StemDatum = mystemdatum }));
        }
        // GET: Stemmingen/Create/5
        public ActionResult Create(string wetid, DateTime stemdatum)
        {
            StemmingenListVM stemmingenlistVM = new StemmingenListVM();

            stemmingenlistVM.WetID     = wetid;
            stemmingenlistVM.StemDatum = stemdatum;
            string title = "Stemming toevoegen of wijzigen";
            string msg   = " ";
            string level = " ";

            if (wetid == null)
            {
                TempData["BCmessage"]    = "Specificeer een geldige WetID";
                TempData["BCerrorlevel"] = stemmingenlistVM.MessageSection.Error;

                return(RedirectToAction("Error"));
            }
            Wetten wet = db.Wetten.Find(wetid);

            if (wet == null)
            {
                TempData["BCmessage"]    = "WetID '" + wetid.Trim() + "' is niet gevonden";
                TempData["BCerrorlevel"] = stemmingenlistVM.MessageSection.Error;

                return(RedirectToAction("Error"));
            }

            // if date not given, prompt for it

            if (stemdatum == DateTime.MinValue)
            {
                msg   = "Specificeer de stemdatum voor deze wet";
                level = stemmingenlistVM.MessageSection.Info;
                stemmingenlistVM.WetID     = wetid;
                stemmingenlistVM.StemDatum = DateTime.Now;
                StemObject so = new StemObject
                {
                    WetID           = wet.WetID,
                    WetNaam         = wet.WetNaam,
                    WetType         = wet.WetType,
                    WetLink         = wet.WetLink,
                    WetOmschrijving = wet.WetOmschrijving
                };
                List <StemObject> sl = new List <StemObject>();
                sl.Add(so);

                stemmingenlistVM.Fill(sl);
                stemmingenlistVM.MessageSection.SetMessage(title, level, msg);

                return(View("Create", stemmingenlistVM));
            }
            else // Date is given, so present directly the edit screen for Stemming
            {
                stemmingenlistVM = GetStemmingData(stemmingenlistVM);
                if ((stemmingenlistVM.ModelOk) || (stemmingenlistVM.ZetelsOk))
                {
                    return(View("CreatEdit", stemmingenlistVM));
                }
                else
                {
                    return(View(stemmingenlistVM));
                }
            }
        }