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" />
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
-
+
-
-
-
-
-
-
+ CommandParameter="{Binding .}"
+ Style="{StaticResource MaterialDesignOutlinedButton}"
+ Margin="4"
+ Content="{x:Static p:Resources.Label_Restart}" />
+
+
+
+
+
+
+
+
+
+