public void Can_Create_AdministrationJobsVoting()
        {
            // Arrange

            // Act
            AdministrationJobsVoting administrationJobsVoting = new AdministrationJobsVoting(AdministrationJobsType.Regular, building,
                "Subject", "Description", new DateTime(2011, 11, 11));

            // Assert
            Assert.IsNotNull(administrationJobsVoting);
        }
        /// <summary>
        /// Salje emailom obavijest o zavrsetku posla rada uprave
        /// </summary>
        /// <param name="administrationJobsVoting">posao rada uprave</param>
        /// <param name="url"></param>
        public void NotifyOfAdminJobsVotingCompletition(AdministrationJobsVoting administrationJobsVoting, string url)
        {
            var mailSubject = "Rad uprave:" + administrationJobsVoting.Subject;
            StringBuilder mailBodySb = new StringBuilder();
            mailBodySb.AppendLine("Završen je rad uprave.");
            mailBodySb.AppendLine("----");
            mailBodySb.AppendFormat("Za zgradu: {0}", administrationJobsVoting.Building.Address).AppendLine();
            var type = administrationJobsVoting.AdministrationJobsType == AdministrationJobsType.Regular
                        ? "Regularna"
                        : "Izvanredna";
            mailBodySb.AppendFormat("Vrsta upave: {0}", type).AppendLine();
            mailBodySb.AppendFormat("Naslov: {0}", administrationJobsVoting.Subject).AppendLine();
            mailBodySb.AppendFormat("Tema: {0}", administrationJobsVoting.Description).AppendLine();
            mailBodySb.AppendFormat("Početak: {0}", administrationJobsVoting.StartDateTime.ToShortDateString()).AppendLine();
            mailBodySb.AppendFormat("Kraj: {0}", administrationJobsVoting.EndDateTime.ToShortDateString()).AppendLine();
            mailBodySb.AppendLine();
            mailBodySb.AppendLine();
            mailBodySb.AppendLine("Rezultati");
            mailBodySb.AppendFormat("Rad uprave prihvaćen: {0}", administrationJobsVoting.IsAccepted ? "Da" : "Ne");
            mailBodySb.AppendFormat("Glasali: {0} pozitivno, {1} negativo", administrationJobsVoting.NumberOfPositiveVotes, administrationJobsVoting.NumberOfNegativeVotes);
            mailBodySb.AppendFormat("Detaljnije: {0}", url);

            string mailBody = mailBodySb.ToString();

            using (var smtpClient = new SmtpClient()) {
                string mailTo = null;
                foreach (var owner in administrationJobsVoting.Building.GetOwners()) {

                    var user = housingMgmtUsersRepository.GetUserByPerson(owner);
                    if(user != null) {
                        mailTo = user.Email;
                        using (var mailMessage = new MailMessage(MAIL_FROM, mailTo, mailSubject, null)) {
                            using (
                                var alternateView = AlternateView.CreateAlternateViewFromString(mailBody, mailMessage.BodyEncoding, "text/html")
                                ) {
                                alternateView.TransferEncoding = TransferEncoding.SevenBit;
                                mailMessage.AlternateViews.Add(alternateView);
                                smtpClient.Send(mailMessage);
                            }
                        }
                    }
                }

                mailTo = housingMgmtUsersRepository.GetUserByPerson(administrationJobsVoting.Building.RepresentativeOfPartOwners).Email;
                using (var mailMessage = new MailMessage(MAIL_FROM, mailTo, mailSubject, null)) {
                    using (var alternateView = AlternateView.CreateAlternateViewFromString(mailBody, mailMessage.BodyEncoding, "text/html")) {
                        alternateView.TransferEncoding = TransferEncoding.SevenBit;
                        mailMessage.AlternateViews.Add(alternateView);
                        smtpClient.Send(mailMessage);
                    }
                }

            }
        }
        public void Can_Save_AdminJobsVoting_To_DB()
        {
            // Arrange
            City city = new City(10000, "Zagreb");
            Cadastre cadastre = new Cadastre("Trnje", "12345", city);
            CadastralParticle cadastralParticle = new CadastralParticle(cadastre, "123", 23, "Opis");
            LandRegistry landRegistry = new LandRegistry(cadastralParticle);

            var person = new PhysicalPerson("12345678901", "Ime", "Prezime");
            var partitionSpace = landRegistry.CreatePartitionSpace("123", 12, "Opis etaže", person);

            LegalPerson legalPerson = new LegalPerson("12345678902", "Ime");
            BuildingManager buildingManager = new BuildingManager(legalPerson);

            Building building = new Building(buildingManager) {
                LandRegistry = landRegistry
            };

            AdministrationJobsVoting administrationJobsVoting = new AdministrationJobsVoting(
                AdministrationJobsType.Regular,
                building,
                "Subject",
                "Description",
                new DateTime(2011, 11, 11));

            AdminJobsVotingsNHRepository adminJobsVotingsNhRepository = new AdminJobsVotingsNHRepository(SessionFactory);

            // Act
            AdministrationJobsVoting adminJobsVotingFromDb = null;
            using (var session = SessionFactory.OpenSession()) {
                using (var tx = session.BeginTransaction()) {
                    session.Save(city);
                    session.Save(person);
                    session.Save(legalPerson);
                    session.Save(cadastre);
                    session.Save(landRegistry);
                    session.Save(buildingManager);
                    session.Save(building);

                    adminJobsVotingsNhRepository.SaveOrUpdate(administrationJobsVoting);
                    tx.Commit();
                }

                using (var tx = session.BeginTransaction()) {
                    adminJobsVotingFromDb = adminJobsVotingsNhRepository.GetById(administrationJobsVoting.Id);
                    tx.Commit();
                }
            }

            // Assert
            Assert.AreEqual(administrationJobsVoting, adminJobsVotingFromDb, "Two administration jobs voting entities aren't equal.");
        }
        public void If_Regular_AdministrationJobType_Then_More_Than_Half_Positive_Votes_Is_Success()
        {
            // Arrange
            AdministrationJobsVoting administrationJobsVoting = new AdministrationJobsVoting(AdministrationJobsType.Regular, building,
                "Subject", "Description", new DateTime(2011, 11, 11));

            // Act
            administrationJobsVoting.AddVote(new OwnerVote(true, partitionSpace1));
            administrationJobsVoting.AddVote(new OwnerVote(true, partitionSpace2));
            administrationJobsVoting.AddVote(new OwnerVote(false, partitionSpace4));
            administrationJobsVoting.AddVote(new OwnerVote(true, partitionSpace3));

            // Assert
            Assert.IsTrue(administrationJobsVoting.IsFinished);
            Assert.IsTrue(administrationJobsVoting.IsAccepted);
        }
        /// <summary>
        /// Salje emailom obavijest o stvaranju rada uprave
        /// </summary>
        /// <param name="administrationJobsVoting">posao rada uprave</param>
        public void NotifyOfAdminJobsVotingCreation(AdministrationJobsVoting administrationJobsVoting, string url)
        {
            var mailSubject = "Rad uprave:" + administrationJobsVoting.Subject;
            StringBuilder mailBodySb = new StringBuilder();
            mailBodySb.AppendLine("Kreiran je novi rad uprave.");
            mailBodySb.AppendLine("----");
            mailBodySb.AppendFormat("Za zgradu: {0}", administrationJobsVoting.Building.Address).AppendLine();
            var type = administrationJobsVoting.AdministrationJobsType == AdministrationJobsType.Regular
                       	? "Regularna"
                       	: "Izvanredna";
            mailBodySb.AppendFormat("Vrsta upave: {0}", type).AppendLine();
            mailBodySb.AppendFormat("Naslov: {0}", administrationJobsVoting.Subject).AppendLine();
            mailBodySb.AppendFormat("Tema: {0}", administrationJobsVoting.Description).AppendLine();
            mailBodySb.AppendFormat("Početak: {0}", administrationJobsVoting.StartDateTime.ToShortDateString()).AppendLine();
            mailBodySb.AppendFormat("Kraj: {0}", administrationJobsVoting.EndDateTime.ToShortDateString()).AppendLine();
            mailBodySb.AppendLine();
            mailBodySb.AppendLine("Molimo glasajte").AppendLine();
            mailBodySb.AppendFormat("Detaljnije: {0}", url);

            string mailBody = mailBodySb.ToString();

            using (var smtpClient = new SmtpClient()) {
                foreach(var owner in administrationJobsVoting.Building.GetOwners()) {
                    var user = housingMgmtUsersRepository.GetUserByPerson(owner);
                    if(user != null) {
                        var mailTo = user.Email;
                        using (var mailMessage = new MailMessage(MAIL_FROM, mailTo, mailSubject, null)) {
                            using (var alternateView = AlternateView.CreateAlternateViewFromString(mailBody, mailMessage.BodyEncoding, "text/html")) {
                                alternateView.TransferEncoding = TransferEncoding.SevenBit;
                                mailMessage.AlternateViews.Add(alternateView);
                                smtpClient.Send(mailMessage);
                            }
                        }
                    }
                }
            }
        }
        public ActionResult CreateVoting(int id, CreateVotingModel createVotingModel)
        {
            if (!User.IsInRole("representative")) { return new HttpUnauthorizedResult(); }

            var building = buildingsRepository.GetById(id);

            if(building == null) {
                return HttpNotFound();
            }

            if (ModelState.IsValid) {
                var voting = createVotingModel.Voting;
                try {
                    var administrationJobsType = (AdministrationJobsType) voting.AdministrationJobsType;
                    AdministrationJobsVoting administrationJobsVoting = new AdministrationJobsVoting(administrationJobsType,
                        building, voting.Subject, voting.Description,
                        voting.EndDateTime);

                    adminJobsVotingsRepository.SaveOrUpdate(administrationJobsVoting);
                    var url = Url.Action("voting", "buildingmanagement", new {Id = administrationJobsVoting.Id}, "http");
                    emailNotifier.NotifyOfAdminJobsVotingCreation(administrationJobsVoting, url);
                    return RedirectToAction("building", new { building.Id });

                } catch (BusinessRulesException ex) {
                    ex.CopyTo(ModelState);
                }

            }

            createVotingModel.Roles = Roles.GetRolesForUser();
            createVotingModel.CurrentRole = "representative";
            createVotingModel.Links = new LinksModel() {Id = id, Links = NavLinksGenerator.GetRepresentativeLinks(building, "Rad Uprave")};

            return View(createVotingModel);
        }