PageRenderTime 75ms CodeModel.GetById 31ms RepoModel.GetById 0ms app.codeStats 0ms

/CmsData/APIPerson.cs

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