diff --git a/BodyshopUploader/BodyshopPartner.csproj b/BodyshopUploader/BodyshopPartner.csproj index cc606d2..5ed4fdb 100644 --- a/BodyshopUploader/BodyshopPartner.csproj +++ b/BodyshopUploader/BodyshopPartner.csproj @@ -327,6 +327,7 @@ + Resources.es-MX.resx True diff --git a/BodyshopUploader/Models/QbXmlResponse.cs b/BodyshopUploader/Models/QbXmlResponse.cs new file mode 100644 index 0000000..2936d94 --- /dev/null +++ b/BodyshopUploader/Models/QbXmlResponse.cs @@ -0,0 +1,58 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Xml.Linq; + +namespace BodyshopPartner.Models +{ + public class QbXmlResponse : DTO_Base + { + public QbXmlResponse() + { + + } + + private string _statusCode; + public string StatusCode + { + get { return _statusCode; } + set { SetProperty(ref _statusCode, value); } + } + + private string _statusSeverity; + public string StatusSeverity + { + get { return _statusSeverity; } + set { SetProperty(ref _statusSeverity, value); } + } + + private string _statusMessage; + public string StatusMessage + { + get { return _statusMessage; } + set { SetProperty(ref _statusMessage, value); } + } + + private string _responseType; + public string ResponseType + { + get { return _responseType; } + set { SetProperty(ref _responseType, value); } + } + + private XDocument _response; + public XDocument Response + { + get { return _response; } + set { SetProperty(ref _response, value); } + } + + public override string ToString() + { + string r = $"Response Type: {ResponseType} | Severity: {StatusSeverity} | Code: {StatusCode} | {StatusMessage}"; + return r; + } + } +} diff --git a/BodyshopUploader/Utils/ApplicationExceptionHandler.cs b/BodyshopUploader/Utils/ApplicationExceptionHandler.cs index 71ee5e7..0509c67 100644 --- a/BodyshopUploader/Utils/ApplicationExceptionHandler.cs +++ b/BodyshopUploader/Utils/ApplicationExceptionHandler.cs @@ -18,7 +18,7 @@ namespace BodyshopPartner.Utils public static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) { - logger.Fatal((e.ExceptionObject as Exception), "Unhandled generic exception."); + logger.Fatal((e.ExceptionObject as Exception), "Unhandled generic exception. "); } } } diff --git a/BodyshopUploader/Utils/HTTPServer.cs b/BodyshopUploader/Utils/HTTPServer.cs index a736e19..d6e1c4b 100644 --- a/BodyshopUploader/Utils/HTTPServer.cs +++ b/BodyshopUploader/Utils/HTTPServer.cs @@ -5,14 +5,18 @@ using System.Text; using System.Threading.Tasks; using SimpleHttp; using System.Xml.Linq; +using Newtonsoft; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; namespace BodyshopPartner.Utils { public static class HTTPServer { private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); - - public static void InitHttpServer() + public delegate void HttpLogger(string s); + private static HttpLogger hlog; + public static void InitHttpServer(HttpLogger HttpLogger) { Route.Add("/qb/receivables", (req, res, props) => { @@ -26,7 +30,8 @@ namespace BodyshopPartner.Utils , "POST"); logger.Trace("Starting HTTP server..."); - + hlog = HttpLogger; + hlog("Starting HTTP server..."); //TODO As a part of the installer, add netsh http add urlacl url=http://+:1337/ user="Everyone HttpServer.ListenAsync(1337, System.Threading.CancellationToken.None, Route.OnHttpRequestAsync).Wait(); } @@ -34,28 +39,44 @@ namespace BodyshopPartner.Utils private static void HandleQbReceivables(System.Net.HttpListenerRequest req, System.Net.HttpListenerResponse res) { logger.Debug("/qb/receivables - POST"); + //Input will be an array of XMLs. - string requestXMLstring = ParseBodyToString(req); - XDocument requestXMLdoc = ParseStringToXml(requestXMLstring); + string[] requestXMLstrings = ParseBodyToArray(req); + hlog("Received QuickBooks Receivable request."); - string CustomerId = QuickBooksInterop.CreateCustomerIfNotExist(requestXMLdoc); - - - string InvoiceAddResponse = QuickBooksInterop.ProcessQBXmlRequest(requestXMLstring); - - - string[] status = new string[3]; - if (InvoiceAddResponse != null) status = QuickBooksInterop.parseInvoiceAddRs(InvoiceAddResponse); - - if (InvoiceAddResponse != null && status[0] == "0") + // string requestXMLstring = ParseBodyToString(req); + foreach (var requestXMLstring in requestXMLstrings) { - logger.Debug("Invoice added successfully."); + XDocument requestXMLdoc = ParseStringToXml(requestXMLstring); + XDocument response = XDocument.Parse(QuickBooksInterop.ProcessQBXmlRequest(requestXMLstring)); + Models.QbXmlResponse ResponseStatus = QuickBooksInterop.ParseResponseXml(response); + + + logger.Info(response.ToString()); + logger.Info(ResponseStatus.ToString()); + hlog(ResponseStatus.ToString()); + //string[] status = new string[3]; + //if (InvoiceAddResponse != null) status = QuickBooksInterop.parseInvoiceAddRs(InvoiceAddResponse); + //if (InvoiceAddResponse != null && status[0] == "0") + //{ logger.Debug("Invoice added successfully."); res.StatusCode = 200; } + //else + //{ logger.Error("Error adding Invoice.\nStatus Code: {0} \nSeverity: {1} \nMessage {2}", status[0], status[1], status[2]); res.StatusCode = 400; } + } - else - { - logger.Error("Error adding Invoice.\nStatus Code: {0} \nSeverity: {1} \nMessage {2}", status[0], status[1], status[2]); - } - res.WithCORS().AsText("Hello."); + hlog("Completed QuickBooks Receivable request."); + res.WithCORS().Close(); + } + + public static string[] ParseBodyToArray(System.Net.HttpListenerRequest req) + { + System.IO.Stream body = req.InputStream; + System.Text.Encoding encoding = req.ContentEncoding; + System.IO.StreamReader reader = new System.IO.StreamReader(body, encoding); + string s = reader.ReadToEnd(); + body.Close(); + reader.Close(); + + return JArray.Parse(s).Select(jv => jv.ToString()).ToArray(); } public static string ParseBodyToString(System.Net.HttpListenerRequest req) @@ -63,17 +84,7 @@ namespace BodyshopPartner.Utils System.IO.Stream body = req.InputStream; System.Text.Encoding encoding = req.ContentEncoding; System.IO.StreamReader reader = new System.IO.StreamReader(body, encoding); - //if (req.ContentType != null) - //{ - // Console.WriteLine("Client data content type {0}", req.ContentType); - //} - //Console.WriteLine("Client data content length {0}", req.ContentLength64); - - //Console.WriteLine("Start of client data:"); - // Convert the data to a string and display it on the console. string s = reader.ReadToEnd(); - //Console.WriteLine(s); - //Console.WriteLine("End of client data:"); body.Close(); return s; } diff --git a/BodyshopUploader/Utils/QuickBooksInterop.cs b/BodyshopUploader/Utils/QuickBooksInterop.cs index fb68004..dcb651e 100644 --- a/BodyshopUploader/Utils/QuickBooksInterop.cs +++ b/BodyshopUploader/Utils/QuickBooksInterop.cs @@ -71,113 +71,49 @@ namespace BodyshopPartner.Utils } } - public static string[] parseInvoiceAddRs(string xml) + public static Models.QbXmlResponse ParseResponseXml(XDocument response) { - string[] retVal = new string[3]; - try + XElement QueryResponse = response.Root.Descendants("QBXMLMsgsRs").Descendants().FirstOrDefault(); + XAttribute StatusCode = QueryResponse.Attribute("statusCode"); + XAttribute StatusSeverity = QueryResponse.Attribute("statusSeverity"); + XAttribute statusMessage = QueryResponse.Attribute("statusMessage"); + + return new Models.QbXmlResponse() { - XmlNodeList RsNodeList = null; - XmlDocument Doc = new XmlDocument(); - Doc.LoadXml(xml); - RsNodeList = Doc.GetElementsByTagName("InvoiceAddRs"); - XmlAttributeCollection rsAttributes = RsNodeList.Item(0).Attributes; - XmlNode statusCode = rsAttributes.GetNamedItem("statusCode"); - retVal[0] = Convert.ToString(statusCode.Value); - XmlNode statusSeverity = rsAttributes.GetNamedItem("statusSeverity"); - retVal[1] = Convert.ToString(statusSeverity.Value); - XmlNode statusMessage = rsAttributes.GetNamedItem("statusMessage"); - retVal[2] = Convert.ToString(statusMessage.Value); - } - catch (Exception e) - { - logger.Error("Error encountered when parsing Invoice info returned from QuickBooks: " + e.Message); - retVal = null; - } - return retVal; + StatusCode = System.Text.RegularExpressions.Regex.Unescape(StatusCode.Value), + StatusMessage = System.Text.RegularExpressions.Regex.Unescape(statusMessage.Value), + StatusSeverity = System.Text.RegularExpressions.Regex.Unescape(StatusSeverity.Value), + ResponseType = System.Text.RegularExpressions.Regex.Unescape(QueryResponse.Name.LocalName), + Response = response + }; + //response. } - public static string CreateCustomerIfNotExist(XDocument requestXML) - { - string ListID = ParseCustomerId(requestXML); - if (string.IsNullOrEmpty(ListID)) - //Could be null or exist, we need to check. - { - QBSessionManager sessionManager = new QBSessionManager(); - IMsgSetRequest requestMsgSet = sessionManager.CreateMsgSetRequest("CA", 13, 0); - requestMsgSet.Attributes.OnError = ENRqOnError.roeContinue; + //public static string[] parseInvoiceAddRs(string xml) + //{ + // string[] retVal = new string[3]; + // try + // { + // XmlNodeList RsNodeList = null; + // XmlDocument Doc = new XmlDocument(); + // Doc.LoadXml(xml); + // RsNodeList = Doc.GetElementsByTagName("InvoiceAddRs"); + // XmlAttributeCollection rsAttributes = RsNodeList.Item(0).Attributes; + // XmlNode statusCode = rsAttributes.GetNamedItem("statusCode"); + // retVal[0] = Convert.ToString(statusCode.Value); + // XmlNode statusSeverity = rsAttributes.GetNamedItem("statusSeverity"); + // retVal[1] = Convert.ToString(statusSeverity.Value); + // XmlNode statusMessage = rsAttributes.GetNamedItem("statusMessage"); + // retVal[2] = Convert.ToString(statusMessage.Value); + // } + // catch (Exception e) + // { + // logger.Error("Error encountered when parsing Invoice info returned from QuickBooks: " + e.Message); + // retVal = null; + // } + // return retVal; + //} - ICustomerAdd CustomerAddRq = requestMsgSet.AppendCustomerAddRq(); - //Get the address & Other information from the request XML DOC. - CustomerAddRq.Name.SetValue(requestXML.Descendants("CustomerRef").First()?.Element("FullName")?.Value); - - // ICustomerQuery CustomerQueryRq = requestMsgSet.AppendCustomerQueryRq(); - //CustomerQueryRq.ORCustomerListQuery.ListIDList.Add(ListID); - - string ret = ProcessQBXmlRequest(requestMsgSet.ToXMLString()); - return ret; - } - else - { - return ListID; - } - - } - public static string[] parseCustomerQueryRs(string xml) - { - string[] retVal; - try - { - XDocument responseXml = XDocument.Parse(xml); - XElement CustomerQueryRs = responseXml.Descendants("CustomerQueryRs").First(); - XAttribute statusCode = CustomerQueryRs.Attribute(XName.Get("statusCode")); - - if (statusCode.Value?.ToString() == "0") - { - //All good, return the ID. - } - else - { - //Need to create a new customer and return that ID. - } - - //XmlNodeList RsNodeList = null; - //XmlDocument Doc = new XmlDocument(); - //Doc.LoadXml(xml); - //RsNodeList = Doc.GetElementsByTagName("CustomerQueryRs"); - //XmlAttributeCollection rsAttributes = RsNodeList.Item(0).Attributes; - //XmlNode statusCode = rsAttributes.GetNamedItem("statusCode"); - //if (Convert.ToString(statusCode.Value) == "0") - //{ - // //Found an ID for this person. Looks all good. - // retVal = new string[1]; - // //xml.Desce - //} - //else - //{ - // retVal = new string[3]; - // retVal[0] = Convert.ToString(statusCode.Value); - // XmlNode statusSeverity = rsAttributes.GetNamedItem("statusSeverity"); - // retVal[1] = Convert.ToString(statusSeverity.Value); - // XmlNode statusMessage = rsAttributes.GetNamedItem("statusMessage"); - // retVal[2] = Convert.ToString(statusMessage.Value); - //} - //; - - } - catch (Exception e) - { - logger.Error("Error encountered when parsing Invoice info returned from QuickBooks: " + e.Message); - retVal = null; - } - return retVal; - } - - private static string ParseCustomerId(XDocument xml) - { - XElement CustomerRef = xml.Descendants("CustomerRef").First(); - string ListId = CustomerRef.Element("ListID")?.Value; - return ListId; - } } } diff --git a/BodyshopUploader/ViewModels/MainViewModel.cs b/BodyshopUploader/ViewModels/MainViewModel.cs index 6b8cf60..d76a12e 100644 --- a/BodyshopUploader/ViewModels/MainViewModel.cs +++ b/BodyshopUploader/ViewModels/MainViewModel.cs @@ -76,7 +76,7 @@ namespace BodyshopPartner.ViewModels _callingThread.ReportProgress(80); - Utils.HTTPServer.InitHttpServer(); + Utils.HTTPServer.InitHttpServer(AddHttpStatus); logger.Debug("VM Init Complete"); _callingThread.ReportProgress(100); @@ -215,22 +215,29 @@ namespace BodyshopPartner.ViewModels IndeterminateLoading = false; } + public void AddHttpStatus(string s) + { + string newLine = $"\n{DateTime.Now.ToString("MM/dd/yy hh:mm:ss tt")}: {s}"; + HttpServerLog += newLine; + logger.Trace(newLine); + } + private FirebaseAuthLink al = BodyshopPartner.Utils.Auth.authlink; public async Task TestGql() { - //Notification _n = new Notification() - //{ - // Id = 123, - // Title = "This is a title", - // Subtitle = "Subtitle", - // Message = "Somethin" - //}; - //Growler.AddNotification(_n); + Notification _n = new Notification() + { + Id = 123, + Title = "This is a title", + Subtitle = "Subtitle", + Message = "Somethin" + }; + Growler.AddNotification(_n); Console.WriteLine(al.FirebaseToken); FirebaseAuthLink t = await al.GetFreshAuthAsync(); Console.WriteLine(t.FirebaseToken); - + AddHttpStatus(t.FirebaseToken); //var r = new GraphQLRequest //{ // Query = @"query MyQuery($key: String!) { diff --git a/BodyshopUploader/ViewModels/MainViewModel.props.cs b/BodyshopUploader/ViewModels/MainViewModel.props.cs index 6825a8d..62e0db7 100644 --- a/BodyshopUploader/ViewModels/MainViewModel.props.cs +++ b/BodyshopUploader/ViewModels/MainViewModel.props.cs @@ -48,5 +48,12 @@ namespace BodyshopPartner.ViewModels get { return _activeShop; } set { SetProperty(ref _activeShop, value); Task.Run(async () => await SetActiveBodyshop()); } } + + private string _httpServerLog = "Status Log\nNewLine\n"; + public string HttpServerLog + { + get { return _httpServerLog; } + set { SetProperty(ref _httpServerLog, value); } + } } } diff --git a/BodyshopUploader/Views/Main.xaml b/BodyshopUploader/Views/Main.xaml index 98a0f2d..c3291b3 100644 --- a/BodyshopUploader/Views/Main.xaml +++ b/BodyshopUploader/Views/Main.xaml @@ -141,21 +141,26 @@ Content="_TEST" /> - - - - - - - - - - -