PageRenderTime 43ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/CmsData/ProtectMyMinistryHelper.cs

https://bitbucket.org/mahalowe/bvcms
C# | 313 lines | 217 code | 64 blank | 32 comment | 34 complexity | a8debfbc97ce3b4ade9cd23276279e8b 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.Collections.Specialized;
  4. using System.Linq;
  5. using System.Text;
  6. using System.IO;
  7. using System.Net;
  8. using System.Xml;
  9. using System.Xml.Linq;
  10. using System.Web;
  11. using UtilityExtensions;
  12. namespace CmsData
  13. {
  14. public class ProtectMyMinistryHelper
  15. {
  16. public const string PMM_URL = "https://services.priorityresearch.com/webservice/default.cfm";
  17. public const string PMM_Append = "/ExternalServices/PMMResults";
  18. public const int TYPE_BACKGROUND = 1;
  19. public const int TYPE_CREDIT = 2;
  20. public static readonly string[] STATUSES = { "Error", "Not Submitted", "Submitted", "Complete" };
  21. public static readonly string[] BACKGROUND_TYPES = { "Combo", "MVR" };
  22. public static readonly string[] CREDIT_TYPES = { "Credit" };
  23. public static void create( int iPeopleID, string sServiceCode, int iType, int iLabel )
  24. {
  25. BackgroundCheck bcNew = new BackgroundCheck();
  26. bcNew.StatusID = 1;
  27. bcNew.UserID = Util.UserPeopleId ?? 0;
  28. bcNew.PeopleID = iPeopleID;
  29. bcNew.ServiceCode = sServiceCode; // "Combo", "MVR"
  30. bcNew.Created = DateTime.Now;
  31. bcNew.Updated = DateTime.Now;
  32. bcNew.ReportTypeID = iType;
  33. bcNew.ReportLabelID = iLabel;
  34. DbUtil.Db.BackgroundChecks.InsertOnSubmit(bcNew);
  35. DbUtil.Db.SubmitChanges();
  36. }
  37. public static bool submit( int iRequestID, string sSSN, string sDLN, string sResponseURL, int iStateID, string sUser, string sPassword )
  38. {
  39. if (sUser == null || sPassword == null) return false;
  40. // Get the already created (via create()) background check request
  41. BackgroundCheck bc = (from e in DbUtil.Db.BackgroundChecks
  42. where e.Id == iRequestID
  43. select e).Single();
  44. if (bc == null) return false;
  45. // Create XML
  46. XmlWriterSettings xws = new XmlWriterSettings();
  47. xws.Indent = false;
  48. xws.NewLineOnAttributes = false;
  49. xws.NewLineChars = "";
  50. // Create Bundle
  51. SubmitBundle sb = new SubmitBundle();
  52. sb.iPeopleID = bc.PeopleID;
  53. sb.sUser = sUser;
  54. sb.sPassword = sPassword;
  55. sb.sBillingReference = bc.Id.ToString();
  56. sb.sSSN = sSSN;
  57. sb.sServiceCode = bc.ServiceCode;
  58. sb.sResponseURL = sResponseURL;
  59. sb.bTestMode = (DbUtil.Db.Setting("PMMTestMode", "true") == "true");
  60. // Get State (if MVR)
  61. if (bc.ServiceCode == "MVR" && iStateID > 0)
  62. {
  63. BackgroundCheckMVRCode bcmc = (from e in DbUtil.Db.BackgroundCheckMVRCodes
  64. where e.Id == iStateID
  65. select e).Single();
  66. if (bcmc == null) return false;
  67. sb.sDNL = sDLN;
  68. sb.sStateCode = bcmc.Code;
  69. sb.sStateAbbr = bcmc.StateAbbr;
  70. }
  71. // Main Request
  72. MemoryStream msRequest = new MemoryStream();
  73. XmlWriter xwWriter = XmlWriter.Create(msRequest, xws);
  74. xmlCreate(xwWriter, sb);
  75. string sXML = Encoding.UTF8.GetString(msRequest.ToArray()).Substring(1);
  76. msRequest.Close();
  77. // Stored Request (for Debug, can be removed later)
  78. MemoryStream msRequestSave = new MemoryStream();
  79. XmlWriter xwWriterSave = XmlWriter.Create(msRequestSave, xws);
  80. xmlCreate(xwWriterSave, sb);
  81. string sXMLSave = Encoding.UTF8.GetString(msRequestSave.ToArray()).Substring(1);
  82. msRequestSave.Close();
  83. bc.RequestXML = sXMLSave;
  84. // End Stored Request
  85. // TODO: Temporary - Remove Later
  86. DbUtil.Db.SubmitChanges();
  87. // Submit Request to PMM
  88. var fields = new NameValueCollection();
  89. fields.Add("REQUEST", sXML);
  90. WebClient wc = new WebClient();
  91. wc.Encoding = System.Text.Encoding.UTF8;
  92. var response = Encoding.UTF8.GetString(wc.UploadValues(PMM_URL, "POST", fields));
  93. bc.ResponseXML = response;
  94. ResponseBundle rbResponse = processResponse(response);
  95. if (rbResponse.bHasErrors)
  96. {
  97. bc.StatusID = 0;
  98. bc.ErrorMessages = rbResponse.sErrors;
  99. }
  100. else
  101. {
  102. bc.StatusID = 2;
  103. bc.ErrorMessages = "";
  104. bc.ReportID = Int32.Parse( rbResponse.sReportID );
  105. }
  106. DbUtil.Db.SubmitChanges();
  107. return true;
  108. }
  109. public static bool xmlCreate( XmlWriter xwWriter, SubmitBundle sb )
  110. {
  111. // Get Person Information
  112. var pPerson = (from e in DbUtil.Db.People
  113. where e.PeopleId == sb.iPeopleID
  114. select e).FirstOrDefault();
  115. // Compile Birthday per requested format
  116. int iBirthMonth = pPerson.BirthMonth ?? 0;
  117. int iBirthDay = pPerson.BirthDay ?? 0;
  118. int iBirthYear = pPerson.BirthYear ?? 0;
  119. String sDOB = iBirthMonth.ToString("D2") + "/" + iBirthDay.ToString("D2") + "/" + iBirthYear.ToString("D4");
  120. // Create OrderId
  121. String sOrderID = DateTime.Now.ToString("yyyyMMddHHmmssfff");
  122. // Open Document
  123. xwWriter.WriteStartDocument();
  124. // Open OrderXML
  125. xwWriter.WriteStartElement("OrderXML");
  126. // Method (Inside OrderXML)
  127. xwWriter.WriteElementString("Method", "SEND ORDER");
  128. // Authentication Section (Inside OrderXML)
  129. xwWriter.WriteStartElement("Authentication");
  130. xwWriter.WriteElementString("Username", sb.sUser);
  131. xwWriter.WriteElementString("Password", sb.sPassword);
  132. xwWriter.WriteFullEndElement();
  133. if( sb.bTestMode ) xwWriter.WriteElementString("TestMode", "YES");
  134. // Return URL (Inside OrderXML)
  135. xwWriter.WriteElementString("ReturnResultURL", sb.sResponseURL);
  136. // Order Section (Inside OrderXML)
  137. xwWriter.WriteStartElement("Order");
  138. // Our Billing Reference Code (Inside Order Section)
  139. xwWriter.WriteElementString("BillingReferenceCode", sb.sBillingReference);
  140. // Subject Section (Inside Order Section)
  141. xwWriter.WriteStartElement("Subject");
  142. xwWriter.WriteElementString("Firstname", pPerson.FirstName);
  143. if (pPerson.MiddleName != null) xwWriter.WriteElementString("Middlename", pPerson.MiddleName);
  144. xwWriter.WriteElementString("Lastname", pPerson.LastName);
  145. if (pPerson.SuffixCode != null) xwWriter.WriteElementString("Generation", pPerson.SuffixCode);
  146. xwWriter.WriteElementString("DOB", sDOB);
  147. xwWriter.WriteElementString("SSN", sb.sSSN);
  148. xwWriter.WriteElementString("Gender", pPerson.Gender.Description);
  149. //xwWriter.WriteElementString("Ethnicity", "Caucasian");
  150. // MVR Option
  151. if (sb.sServiceCode == "MVR")
  152. {
  153. xwWriter.WriteElementString("DLNumber", sb.sDNL);
  154. }
  155. xwWriter.WriteElementString("ApplicantPosition", "Volunteer");
  156. // CurrentAddress Section (Inside Subject Section)
  157. xwWriter.WriteStartElement("CurrentAddress");
  158. xwWriter.WriteElementString("StreetAddress", pPerson.PrimaryAddress);
  159. xwWriter.WriteElementString("City", pPerson.PrimaryCity);
  160. xwWriter.WriteElementString("State", pPerson.PrimaryState);
  161. xwWriter.WriteElementString("Zipcode", pPerson.PrimaryZip);
  162. xwWriter.WriteFullEndElement();
  163. // Close Subject Section
  164. xwWriter.WriteFullEndElement();
  165. if (sb.sServiceCode == "Combo")
  166. {
  167. // Package Service Code - Only if a package (BASIC,PLUS) (Inside Order Section)
  168. xwWriter.WriteStartElement("PackageServiceCode");
  169. xwWriter.WriteAttributeString("OrderId", sOrderID);
  170. xwWriter.WriteString("Basic");
  171. xwWriter.WriteFullEndElement();
  172. }
  173. // Order Detail (Inside Order Section)
  174. xwWriter.WriteStartElement("OrderDetail");
  175. xwWriter.WriteAttributeString("serviceCode", sb.sServiceCode);
  176. xwWriter.WriteAttributeString("OrderId", sOrderID);
  177. // MVR Option
  178. if (sb.sServiceCode == "MVR")
  179. {
  180. xwWriter.WriteElementString("JurisdictionCode", sb.sStateCode);
  181. xwWriter.WriteElementString("State", sb.sStateAbbr);
  182. }
  183. xwWriter.WriteEndElement();
  184. // Close Order Section
  185. xwWriter.WriteFullEndElement();
  186. // Close OrderXML Section
  187. xwWriter.WriteFullEndElement();
  188. // Close Document
  189. xwWriter.WriteEndDocument();
  190. xwWriter.Flush();
  191. return true;
  192. }
  193. public static ResponseBundle processResponse(string sResponse)
  194. {
  195. ResponseBundle sReturn = new ResponseBundle();
  196. XDocument xd = XDocument.Parse(sResponse, LoadOptions.None);
  197. if (xd.Root.Element("Status").Value == "FAILED")
  198. {
  199. sReturn.bHasErrors = true;
  200. var errors = xd.Root.Element("Errors").Elements("Message");
  201. foreach (var item in errors)
  202. {
  203. sReturn.sErrors += item.Value.Replace("<", "&lt;").Replace(">", "&gt;") + "<br>";
  204. }
  205. }
  206. else if (xd.Root.Element("Status").Value == "ERROR")
  207. {
  208. sReturn.bHasErrors = true;
  209. var errors = xd.Root.Elements("Message");
  210. foreach (var item in errors)
  211. {
  212. sReturn.sErrors += item.Value.Replace("<", "&lt;").Replace(">", "&gt;") + "<br>";
  213. }
  214. }
  215. else
  216. {
  217. string sReportID = xd.Root.Element("ReferenceNumber").Value;
  218. if (sReportID != null) sReturn.sReportID = sReportID;
  219. }
  220. return sReturn;
  221. }
  222. public static string getStatus(int iStatusID)
  223. {
  224. return STATUSES[iStatusID];
  225. }
  226. }
  227. public class SubmitBundle
  228. {
  229. // Internal
  230. public bool bTestMode = true;
  231. public string sUser;
  232. public string sPassword;
  233. public string sServiceCode;
  234. public string sBillingReference;
  235. public string sResponseURL;
  236. // Person
  237. public int iPeopleID;
  238. public string sSSN;
  239. public string sDNL;
  240. public string sStateCode;
  241. public string sStateAbbr;
  242. }
  243. public class ResponseBundle
  244. {
  245. public bool bHasErrors = false;
  246. public string sErrors = "";
  247. public string sReportID = "0";
  248. }
  249. }