PageRenderTime 56ms CodeModel.GetById 30ms RepoModel.GetById 0ms app.codeStats 0ms

/CmsData/APIPerson.cs

https://bitbucket.org/mahalowe/bvcms
C# | 431 lines | 428 code | 3 blank | 0 comment | 68 complexity | fa4f161e71b093434c3e16fa39f48650 MD5 | raw file
Possible License(s): CC-BY-SA-3.0, Apache-2.0, BSD-3-Clause, LGPL-2.1, MPL-2.0-no-copyleft-exception, AGPL-3.0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Xml;
  4. using System.Text;
  5. using System.Linq;
  6. using System.Xml.Linq;
  7. using UtilityExtensions;
  8. using IronPython.Hosting;
  9. using System.Data.Linq;
  10. using System.Xml.Serialization;
  11. using System.IO;
  12. using System.Runtime.Serialization;
  13. using System.Net;
  14. namespace CmsData.API
  15. {
  16. public class APIPerson
  17. {
  18. private CMSDataContext Db;
  19. public APIPerson(CMSDataContext Db)
  20. {
  21. this.Db = Db;
  22. }
  23. [Serializable]
  24. public class People
  25. {
  26. [XmlElement("Person")]
  27. public Person[] List { get; set; }
  28. }
  29. [Serializable]
  30. public class Address
  31. {
  32. [XmlElementAttribute(IsNullable = true)]
  33. public string AddressLineOne { get; set; }
  34. [XmlElementAttribute(IsNullable = true)]
  35. public string AddressLineTwo { get; set; }
  36. [XmlElementAttribute(IsNullable = true)]
  37. public string CityName { get; set; }
  38. [XmlElementAttribute(IsNullable = true)]
  39. public string StateCode { get; set; }
  40. [XmlElementAttribute(IsNullable = true)]
  41. public string ZipCode { get; set; }
  42. [XmlElementAttribute(IsNullable = true)]
  43. public string CountryName { get; set; }
  44. public DateTime? AddressFromDate { get; set; }
  45. public DateTime? AddressToDate { get; set; }
  46. public bool? BadAddressFlag { get; set; }
  47. }
  48. [Serializable]
  49. public class AddrItem
  50. {
  51. public static AddrItem New(XElement e)
  52. {
  53. return new AddrItem
  54. {
  55. Text = e != null ? e.Value : ""
  56. };
  57. }
  58. [XmlAttribute]
  59. public string Error { get; set; }
  60. [XmlText]
  61. public string Text { get; set; }
  62. }
  63. [Serializable]
  64. public class Address2
  65. {
  66. public static Address2 New(XElement e, int id, string country)
  67. {
  68. return new Address2
  69. {
  70. Id = id,
  71. type = e.Name.ToString(),
  72. AddressLineOne = AddrItem.New(e.Element("AddressLineOne")),
  73. AddressLineTwo = AddrItem.New(e.Element("AddressLineTwo")),
  74. CityName = AddrItem.New(e.Element("CityName")),
  75. StateCode = AddrItem.New(e.Element("StateCode")),
  76. ZipCode = AddrItem.New(e.Element("ZipCode")),
  77. CountryName = country
  78. };
  79. }
  80. [XmlAttribute()]
  81. public int Id { get; set; }
  82. [XmlAttribute()]
  83. public string type { get; set; }
  84. [XmlAttribute()]
  85. public string Error { get; set; }
  86. public AddrItem AddressLineOne { get; set; }
  87. public AddrItem AddressLineTwo { get; set; }
  88. public AddrItem CityName { get; set; }
  89. public AddrItem StateCode { get; set; }
  90. public AddrItem ZipCode { get; set; }
  91. public string CountryName { get; set; }
  92. }
  93. [Serializable]
  94. public class Person
  95. {
  96. [XmlAttribute]
  97. public int PeopleId { get; set; }
  98. public int FamilyId { get; set; }
  99. [XmlElementAttribute(IsNullable = true)]
  100. public string NickName { get; set; }
  101. [XmlElementAttribute(IsNullable = true)]
  102. public string TitleCode { get; set; }
  103. [XmlElementAttribute(IsNullable = true)]
  104. public string FirstName { get; set; }
  105. [XmlElementAttribute(IsNullable = true)]
  106. public string MiddleName { get; set; }
  107. [XmlElementAttribute(IsNullable = true)]
  108. public string LastName { get; set; }
  109. [XmlElementAttribute(IsNullable = true)]
  110. public string SuffixCode { get; set; }
  111. [XmlElementAttribute(IsNullable = true)]
  112. public string AltName { get; set; }
  113. [XmlElementAttribute(IsNullable = true)]
  114. public string MaidenName { get; set; }
  115. public int GenderId { get; set; }
  116. [XmlElementAttribute(IsNullable = true)]
  117. public string HomePhone { get; set; }
  118. [XmlElementAttribute(IsNullable = true)]
  119. public string CellPhone { get; set; }
  120. [XmlElementAttribute(IsNullable = true)]
  121. public string WorkPhone { get; set; }
  122. [XmlElementAttribute(IsNullable = true)]
  123. public string EmailAddress { get; set; }
  124. public bool? SendEmailAddress1 { get; set; }
  125. [XmlElementAttribute(IsNullable = true)]
  126. public string EmailAddress2 { get; set; }
  127. public bool? SendEmailAddress2 { get; set; }
  128. [XmlElementAttribute(IsNullable = true)]
  129. public string SchoolOther { get; set; }
  130. public int? Grade { get; set; }
  131. [XmlElementAttribute(IsNullable = true)]
  132. public string EmployerOther { get; set; }
  133. [XmlElementAttribute(IsNullable = true)]
  134. public string OccupationOther { get; set; }
  135. public int? MaritalStatusId { get; set; }
  136. public DateTime? WeddingDate { get; set; }
  137. [XmlElementAttribute(IsNullable = true)]
  138. public string DOB { get; set; }
  139. public bool? DoNotCallFlag { get; set; }
  140. public bool? DoNotMailFlag { get; set; }
  141. public bool? DoNotVisitFlag { get; set; }
  142. public int PositionInFamilyId { get; set; }
  143. [XmlElementAttribute(IsNullable = true)]
  144. public string SpouseName { get; set; }
  145. public int? CampusId { get; set; }
  146. public DateTime? DeceasedDate { get; set; }
  147. public int? MemberStatusId { get; set; }
  148. public DateTime? JoinDate { get; set; }
  149. public int? DecisionTypeId { get; set; }
  150. public DateTime? DecisionDate { get; set; }
  151. public int? BaptismTypeId { get; set; }
  152. public DateTime? BaptismDate { get; set; }
  153. public DateTime? BaptismSchedDate { get; set; }
  154. [XmlElementAttribute(IsNullable = true)]
  155. public string OtherPreviousChurch { get; set; }
  156. public int? JoinCodeId { get; set; }
  157. public int? DropCodeId { get; set; }
  158. public DateTime? DropDate { get; set; }
  159. [XmlElementAttribute(IsNullable = true)]
  160. public string OtherNewChurch { get; set; }
  161. public int? NewMemberClassStatusId { get; set; }
  162. public DateTime? NewMemberClassDate { get; set; }
  163. public Address FamilyAddress { get; set; }
  164. public Address PersonalAddress { get; set; }
  165. public int AddressTypeId { get; set; }
  166. public List<string> Usernames { get; set; }
  167. }
  168. public Person GetPersonData(int id)
  169. {
  170. return GetPeopleData(id).SingleOrDefault();
  171. }
  172. public IEnumerable<Person> GetPeopleData(int? id, int? famid = null, string first = null, string last = null)
  173. {
  174. var q = from p in Db.People
  175. where id == null || id == p.PeopleId
  176. where famid == null || famid == p.FamilyId
  177. where first == null || (first == p.FirstName || first == p.NickName)
  178. where last == null || (last == p.LastName || last == p.MaidenName)
  179. let sp = p.Family.People.SingleOrDefault(pp => pp.PeopleId == p.SpouseId)
  180. select new Person
  181. {
  182. PeopleId = p.PeopleId,
  183. FamilyId = p.FamilyId,
  184. NickName = p.NickName,
  185. TitleCode = p.TitleCode,
  186. FirstName = p.FirstName,
  187. MiddleName = p.MiddleName,
  188. LastName = p.LastName,
  189. SuffixCode = p.SuffixCode,
  190. AltName = p.AltName,
  191. MaidenName = p.MaidenName,
  192. GenderId = p.GenderId,
  193. HomePhone = p.HomePhone,
  194. CellPhone = p.CellPhone,
  195. WorkPhone = p.WorkPhone,
  196. EmailAddress = p.EmailAddress,
  197. SendEmailAddress1 = p.SendEmailAddress1,
  198. EmailAddress2 = p.EmailAddress2,
  199. SendEmailAddress2 = p.SendEmailAddress2,
  200. SchoolOther = p.SchoolOther,
  201. Grade = p.Grade,
  202. EmployerOther = p.EmployerOther,
  203. OccupationOther = p.OccupationOther,
  204. MaritalStatusId = p.MaritalStatusId,
  205. WeddingDate = p.WeddingDate,
  206. DOB = p.DOB,
  207. DoNotCallFlag = p.DoNotCallFlag,
  208. DoNotMailFlag = p.DoNotMailFlag,
  209. DoNotVisitFlag = p.DoNotVisitFlag,
  210. PositionInFamilyId = p.PositionInFamilyId,
  211. SpouseName = sp.Name,
  212. CampusId = p.CampusId,
  213. DeceasedDate = p.DeceasedDate,
  214. MemberStatusId = p.MemberStatusId,
  215. JoinDate = p.JoinDate,
  216. BaptismDate = p.BaptismDate,
  217. BaptismSchedDate = p.BaptismSchedDate,
  218. BaptismTypeId = p.BaptismTypeId,
  219. DecisionDate = p.DecisionDate,
  220. DecisionTypeId = p.DecisionTypeId,
  221. DropCodeId = p.DropCodeId,
  222. DropDate = p.DropDate,
  223. JoinCodeId = p.JoinCodeId,
  224. NewMemberClassDate = p.NewMemberClassDate,
  225. NewMemberClassStatusId = p.NewMemberClassStatusId,
  226. OtherNewChurch = p.OtherNewChurch,
  227. OtherPreviousChurch = p.OtherPreviousChurch,
  228. AddressTypeId = p.AddressTypeId,
  229. FamilyAddress = new Address
  230. {
  231. AddressLineOne = p.Family.AddressLineOne,
  232. AddressLineTwo = p.Family.AddressLineTwo,
  233. CityName = p.Family.CityName,
  234. StateCode = p.Family.StateCode,
  235. ZipCode = p.Family.ZipCode,
  236. CountryName = p.Family.CountryName,
  237. BadAddressFlag = p.Family.BadAddressFlag,
  238. AddressFromDate = p.Family.AddressFromDate,
  239. AddressToDate = p.Family.AddressToDate,
  240. },
  241. PersonalAddress = new Address
  242. {
  243. AddressLineOne = p.AddressLineOne,
  244. AddressLineTwo = p.AddressLineTwo,
  245. CityName = p.CityName,
  246. StateCode = p.StateCode,
  247. ZipCode = p.ZipCode,
  248. CountryName = p.CountryName,
  249. BadAddressFlag = p.BadAddressFlag,
  250. AddressFromDate = p.AddressFromDate,
  251. AddressToDate = p.AddressToDate
  252. },
  253. Usernames = (from u in p.Users
  254. select u.Username).ToList()
  255. };
  256. return q.Take(100);
  257. }
  258. public string GetPeopleXml(int? id, int? famid, string first, string last)
  259. {
  260. var xs = new XmlSerializer(typeof(People));
  261. var sw = new StringWriter();
  262. var a = new People { List = GetPeopleData(id, famid, first, last).ToArray() };
  263. xs.Serialize(sw, a);
  264. return sw.ToString();
  265. }
  266. public string GetPersonXml(int id)
  267. {
  268. var xs = new XmlSerializer(typeof(Person));
  269. var sw = new StringWriter();
  270. var p = GetPersonData(id);
  271. if (p == null)
  272. return "<Person error=\"Not found\" />";
  273. xs.Serialize(sw, p);
  274. return sw.ToString();
  275. }
  276. public string UpdatePersonXml(string xml)
  277. {
  278. var x = XDocument.Parse(xml);
  279. var p = Db.LoadPersonById(x.Root.Attribute("PeopleId").Value.ToInt());
  280. var u = new APIPerson.Update(p);
  281. Address2 addr = null;
  282. foreach (var e in x.Root.Elements())
  283. switch (e.Name.ToString())
  284. {
  285. case "PersonalAddress":
  286. foreach (var pa in e.Elements())
  287. u.UpdatePerson(pa);
  288. addr = Address2.New(e, p.PeopleId, p.CountryName);
  289. addr = ValidateAddress(addr);
  290. if (addr.Error.HasValue())
  291. return serialize(addr);
  292. break;
  293. case "FamilyAddress":
  294. foreach (var fa in e.Elements())
  295. u.UpdateFamily(fa);
  296. addr = Address2.New(e, p.PeopleId, p.Family.CountryName);
  297. addr = ValidateAddress(addr);
  298. if (addr.Error.HasValue())
  299. return serialize(addr);
  300. break;
  301. default:
  302. break;
  303. }
  304. foreach (var e in x.Root.Elements())
  305. switch (e.Name.ToString())
  306. {
  307. case "PersonalAddress":
  308. case "FamilyAddress":
  309. case "SpouseName":
  310. case "FamilyId":
  311. break;
  312. case "HomePhone":
  313. u.UpdateFamily(e);
  314. break;
  315. default:
  316. u.UpdatePerson(e);
  317. break;
  318. }
  319. p.LogChanges(DbUtil.Db, u.sb, Util.UserPeopleId.Value);
  320. p.Family.LogChanges(DbUtil.Db, u.fsb, p.PeopleId, Util.UserPeopleId.Value);
  321. Db.SubmitChanges();
  322. return "<Success />";
  323. }
  324. private Address2 ValidateAddress(Address2 a)
  325. {
  326. var sw = new StringWriter();
  327. bool addrok = a.CityName.Text.HasValue() && a.StateCode.Text.HasValue();
  328. if (!addrok && a.ZipCode.Text.HasValue())
  329. addrok = true;
  330. if (!addrok && !a.CityName.Text.HasValue() && !a.StateCode.Text.HasValue() && !a.ZipCode.Text.HasValue())
  331. addrok = true;
  332. if (!addrok)
  333. {
  334. a.Error = "city/state required or zip required (or \"na\" in all)";
  335. return a;
  336. }
  337. if (a.AddressLineOne.Text.HasValue() && (a.CityName.Text.HasValue() || a.StateCode.Text.HasValue() || a.ZipCode.Text.HasValue())
  338. && (a.CountryName == "United States" || !a.CountryName.HasValue()))
  339. {
  340. var r = AddressVerify.LookupAddress(a.AddressLineOne.Text, a.AddressLineTwo.Text, a.CityName.Text, a.StateCode.Text, a.ZipCode.Text);
  341. if (r.Line1 == "error")
  342. {
  343. a.Error = r.address;
  344. return a;
  345. }
  346. if (!r.found)
  347. {
  348. a.Error = r.address + ", if your address will not validate, change the country to 'USA, Not Validated'";
  349. return a;
  350. }
  351. if (r.Line1 != a.AddressLineOne.Text)
  352. {
  353. a.AddressLineOne.Error = "address changed from '{0}'".Fmt(a.AddressLineOne.Text);
  354. a.Error = "changes";
  355. a.AddressLineOne.Text = r.Line1;
  356. }
  357. if (r.Line2 != (a.AddressLineTwo.Text ?? ""))
  358. {
  359. a.AddressLineTwo.Error = "address2 changed from '{0}'".Fmt(a.AddressLineTwo.Text);
  360. a.Error = "changes";
  361. a.AddressLineTwo.Text = r.Line2;
  362. }
  363. if (r.City != (a.CityName.Text ?? ""))
  364. {
  365. a.CityName.Error = "city changed from '{0}'".Fmt(a.CityName.Text);
  366. a.Error = "changes";
  367. a.CityName.Text = r.City;
  368. }
  369. if (r.State != (a.StateCode.Text ?? ""))
  370. {
  371. a.StateCode.Error = "state changed from '{0}'".Fmt(a.StateCode.Text);
  372. a.Error = "changes";
  373. a.StateCode.Text = r.State;
  374. }
  375. if (r.Zip != (a.ZipCode.Text ?? ""))
  376. {
  377. a.ZipCode.Error = "zip changed from '{0}'".Fmt(a.ZipCode.Text);
  378. a.Error = "changes";
  379. a.ZipCode.Text = r.Zip;
  380. }
  381. }
  382. return a;
  383. }
  384. private string serialize(Address2 addr)
  385. {
  386. var sw = new StringWriter();
  387. new XmlSerializer(typeof(Address2)).Serialize(sw, addr);
  388. return sw.ToString();
  389. }
  390. private class Update
  391. {
  392. private CmsData.Person person;
  393. private CmsData.Family family;
  394. public StringBuilder sb { get; set; }
  395. public StringBuilder fsb { get; set; }
  396. private XNamespace xsi = "xsi";
  397. public Update(CmsData.Person p)
  398. {
  399. person = p;
  400. family = p.Family;
  401. sb = new StringBuilder();
  402. fsb = new StringBuilder();
  403. }
  404. public void UpdatePerson(XElement e)
  405. {
  406. var nil = e.Attribute(xsi + "nil");
  407. var name = e.Name.ToString();
  408. if (nil != null && nil.Value == "true")
  409. person.UpdateValue(sb, name, null);
  410. else if (name == "CellPhone" || name == "WorkPhone")
  411. person.UpdateValueFromText(fsb, name, e.Value.GetDigits());
  412. else
  413. person.UpdateValueFromText(sb, name, e.Value);
  414. }
  415. public void UpdateFamily(XElement e)
  416. {
  417. var nil = e.Attribute(xsi + "nil");
  418. var name = e.Name.ToString();
  419. if (nil != null && nil.Value == "true")
  420. family.UpdateValue(fsb, name, null);
  421. else if (name == "HomePhone")
  422. family.UpdateValueFromText(fsb, name, e.Value.GetDigits());
  423. else
  424. family.UpdateValueFromText(fsb, name, e.Value);
  425. }
  426. }
  427. }
  428. }