public static void GenerateCompetiveLineChart(CWFuneralHome ourHome, CWFuneralHome TheirHome, ref CompareViewModel cvm) { DateTime?SmallestMonth = ourHome.CWObituary.Min(o => o.DeathDate); DateTime?competetiorSmallestMonth = TheirHome.CWObituary.Min(o => o.DeathDate); if (SmallestMonth != null && competetiorSmallestMonth != null) { DateTime earliestMonth = new DateTime(); if (SmallestMonth < competetiorSmallestMonth) { earliestMonth = (DateTime)SmallestMonth; } else { earliestMonth = (DateTime)competetiorSmallestMonth; } int monthsAgo = ((DateTime.Now.Year - earliestMonth.Year) * 12) + DateTime.Now.Month - earliestMonth.Month; List <DateTime> monthTimeRange = new List <DateTime>(); List <int> montServices = new List <int>(); StringBuilder monthTimeRangeString = new StringBuilder(); monthTimeRangeString.Append("["); DateTime workingMonth = earliestMonth; List <int> OurServicesPerMonth = new List <int>(); List <int> TheirServicesPerMonth = new List <int>(); for (int i = 0; i < monthsAgo; i++) { int ourServiceCount = ourHome.CWObituary.Where(o => o.DeathDate != null && o.DeathDate.Value.Month == workingMonth.Month && o.DeathDate.Value.Year == workingMonth.Year).Count(); int theirServiceCount = TheirHome.CWObituary.Where(o => o.DeathDate != null && o.DeathDate.Value.Month == workingMonth.Month && o.DeathDate.Value.Year == workingMonth.Year).Count(); monthTimeRange.Add(workingMonth); workingMonth = workingMonth.AddMonths(1); OurServicesPerMonth.Add(ourServiceCount); TheirServicesPerMonth.Add(theirServiceCount); } string seriesData = "["; seriesData = seriesData + WijmoSeriesBuilder.StringfyDateTimeLineChartSeries(ourHome.Name, true, monthTimeRange, OurServicesPerMonth, true, "circle"); seriesData = seriesData + ", " + WijmoSeriesBuilder.StringfyDateTimeLineChartSeries(TheirHome.Name, true, monthTimeRange, TheirServicesPerMonth, true, "circle"); seriesData = seriesData + "]"; //Calculate averages for our Home int sum = OurServicesPerMonth.Sum(); decimal result = (decimal)sum / OurServicesPerMonth.Count(); cvm.AvgMonthlyCalls = result; //Calculate averages for their home int sum1 = TheirServicesPerMonth.Sum(); decimal result1 = (decimal)sum1 / TheirServicesPerMonth.Count(); cvm.CompetitorMonthlyCalls = result1; cvm.CompetiveLineChartMonthly = seriesData; } }
public ActionResult GetObituaries(int CWFuneralHomeId) { CWFuneralHome cwHome = db.CWFuneralHomes.Find(CWFuneralHomeId); if (cwHome != null) { CompetitorWatchHelper cwHelper = new CompetitorWatchHelper(); int numOfObitsInserted = cwHelper.ScrapeObituaries(cwHome); } else { return(Json(new { result = "Error with funeral one api" })); } return(Json(new { result = "success" })); }
public ActionResult Compare(int id, int competitorId) { CWFuneralHome cwYourHome = db.CWFuneralHomes.Find(id); CWFuneralHome cwTheirHome = db.CWFuneralHomes.Find(competitorId); //DateTime old = DateTime.Now.AddYears(-10); //CWObituary toDelete = db.CWObituary.Where(d => d.DeathDate < old).FirstOrDefault(); //db.Entry(toDelete).State = System.Data.Entity.EntityState.Deleted; //db.SaveChanges(); CompareViewModel cvm = new CompareViewModel(); if (cwYourHome != null && cwTheirHome != null) { cvm.AvgAge = cwYourHome.CWObituary.Where(o => o.Age != 0).Average(o => o.Age); cvm.CompetitorAvgAge = cwTheirHome.CWObituary.Where(o => o.Age != 0).Average(o => o.Age); CompetitorWatchHelper.GenerateCompetiveLineChart(cwYourHome, cwTheirHome, ref cvm); } return(View(cvm)); }
public ActionResult AddFuneralHome(CWFuneralHome CWFuneralHome) { db.CWFuneralHomes.Add(CWFuneralHome); db.SaveChanges(); return(RedirectToAction("Index")); }
public ActionResult AddFuneralHome() { CWFuneralHome cwFuneralHome = new CWFuneralHome(); return(View(cwFuneralHome)); }
public int ScrapeObituaries(CWFuneralHome funeralHome) { int recordCounter = 0; //Funeral Home API, However I found that it only returns var client = new RestClient(funeralHome.Website + "/dynamic/tributes-getcurrent.json"); // client.Authenticator = new HttpBasicAuthenticator(username, password); var request = new RestRequest("resource/{id}", Method.GET); request.OnBeforeDeserialization = resp => { resp.ContentType = "application/json"; }; // execute the request //IRestResponse response = client.Execute(request); //var content = response.Content; // raw content as string // or automatically deserialize result // return content type is sniffed but can be explicitly set via RestClient.AddHandler(); IRestResponse <FuneralOneResponse> response = client.Execute <FuneralOneResponse>(request); if (response.Data != null) { foreach (var obit in response.Data.tributes) { CWObituary obituary = new CWObituary { FirstName = obit.fn, LastName = obit.ln, MiddleName = obit.mn, FullName = obit.dn, CWFuneralHomeId = funeralHome.Id, ObituaryText = obit.obit, ObitURL = funeralHome.Website + "/" + obit.u, PictureURL = obit.tu, Age = 0 }; DateTime birthday = new DateTime(); DateTime Deathday = new DateTime(); bool BdayG = false; if (DateTime.TryParse(obit.bd, out birthday)) { obituary.BirthDate = birthday; BdayG = true; } else { obituary.BirthDate = null; } if (DateTime.TryParse(obit.dd, out Deathday)) { obituary.DeathDate = Deathday; if (BdayG == true) { DateTime zeroTime = new DateTime(1, 1, 1); TimeSpan span = Deathday - birthday; // because we start at year 1 for the Gregorian // calendar, we must subtract a year here. int yearsOld = (zeroTime + span).Year - 1; obituary.Age = yearsOld; } } else { obituary.DeathDate = null; } bool insertSuccess = insertObitIntoDatabase(obituary); if (insertSuccess) { recordCounter++; } } } for (int i = 1; i < 6000; i++) { CWObituary cwObit = new CWObituary(); string obitPage = funeralHome.Website + "/obituaries/ObitSearchList/" + i.ToString(); var aboutWebPage = new HtmlWeb(); var document = aboutWebPage.Load(obitPage); var outOfObits = document.DocumentNode.SelectNodes("//*[contains(@class,'no-matches')]"); if (outOfObits != null) { if (outOfObits.Count > 0) { break; } } foreach (HtmlNode li in document.DocumentNode.SelectNodes("//li")) { if (li.Attributes["class"] != null) { if (li.Attributes["class"].Value == "pager") { break; } } var h3 = li.Descendants("h3"); var imageNode = li.Descendants("img").FirstOrDefault(); var aNode = li.Descendants("a").FirstOrDefault(); string href = ""; string imageSrc = ""; if (aNode != null) { if (aNode.Attributes["href"] != null) { href = aNode.Attributes["href"].Value; href = funeralHome.Website + href; } } if (imageNode != null) { if (imageNode.Attributes["src"] != null) { imageSrc = imageNode.Attributes["src"].Value; } } string h3Html = h3.FirstOrDefault().InnerHtml; if (h3Html.Contains("<")) { string fullName = h3Html.Substring(0, h3Html.IndexOf("<")); string firstName = ""; string middleName = ""; string lastName = ""; //Whatever should split the string... var words = fullName.Split(' '); //Mind that the indexes are zero-based List <string> names = new List <string>(); for (var index = 0; index < words.Length; index++) { var word = (String)words.GetValue(index); if (!names.Contains(word)) { names.Add(word); } } firstName = names[0]; //If string contains a quote it usually means they inserted a nick name if (names[1].Contains(""")) { middleName = names[2]; } else { middleName = names[1]; } lastName = names[names.Count() - 1]; if (lastName == "") { lastName = names[names.Count() - 2]; } if (lastName.Contains(',')) { lastName = lastName.Replace(",", ""); } string deatDate = h3.FirstOrDefault().Descendants("span").FirstOrDefault().InnerText; DateTime dateTimeDeath = DateTime.Parse(deatDate); cwObit.FirstName = firstName; cwObit.MiddleName = middleName; cwObit.LastName = lastName; cwObit.ObitURL = href; cwObit.PictureURL = "http:" + imageSrc; cwObit.DeathDate = dateTimeDeath; cwObit.CWFuneralHomeId = funeralHome.Id; bool succuess = insertObitIntoDatabase(cwObit); if (succuess) { recordCounter++; } } } } return(recordCounter); }