Added better error handling + added bulk handling of payable import BOD-152
This commit is contained in:
@@ -46,6 +46,9 @@
|
||||
<setting name="AutoStartMonitor" serializeAs="String">
|
||||
<value>True</value>
|
||||
</setting>
|
||||
<setting name="QuickBooksFilePath" serializeAs="String">
|
||||
<value />
|
||||
</setting>
|
||||
</BodyshopPartner.Properties.Settings>
|
||||
</userSettings>
|
||||
</configuration>
|
||||
54
BodyshopUploader/Properties/Resources.Designer.cs
generated
54
BodyshopUploader/Properties/Resources.Designer.cs
generated
@@ -267,6 +267,60 @@ namespace BodyshopPartner.Properties {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Successfully connected to QuickBooks. Processing requests....
|
||||
/// </summary>
|
||||
public static string Msg_QbConnected_Msg {
|
||||
get {
|
||||
return ResourceManager.GetString("Msg_QbConnected_Msg", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to QuickBooks Connection.
|
||||
/// </summary>
|
||||
public static string Msg_QbConnected_Title {
|
||||
get {
|
||||
return ResourceManager.GetString("Msg_QbConnected_Title", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Please do not close ImEX Online or ImEX Partner during the connection process..
|
||||
/// </summary>
|
||||
public static string Msg_QbConnection_Msg {
|
||||
get {
|
||||
return ResourceManager.GetString("Msg_QbConnection_Msg", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to QuickBooks Connection Request.
|
||||
/// </summary>
|
||||
public static string Msg_QbConnection_Title {
|
||||
get {
|
||||
return ResourceManager.GetString("Msg_QbConnection_Title", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Successfully disconnected from QuickBooks..
|
||||
/// </summary>
|
||||
public static string Msg_QbDisconnection_Msg {
|
||||
get {
|
||||
return ResourceManager.GetString("Msg_QbDisconnection_Msg", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to QuickBooks Disconnection.
|
||||
/// </summary>
|
||||
public static string Msg_QbDisconnection_Title {
|
||||
get {
|
||||
return ResourceManager.GetString("Msg_QbDisconnection_Title", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Password.
|
||||
/// </summary>
|
||||
|
||||
@@ -186,6 +186,24 @@
|
||||
<data name="Msg_NewJobUploadError" xml:space="preserve">
|
||||
<value>Error uploading job.</value>
|
||||
</data>
|
||||
<data name="Msg_QbConnected_Msg" xml:space="preserve">
|
||||
<value>Successfully connected to QuickBooks. Processing requests...</value>
|
||||
</data>
|
||||
<data name="Msg_QbConnected_Title" xml:space="preserve">
|
||||
<value>QuickBooks Connection</value>
|
||||
</data>
|
||||
<data name="Msg_QbConnection_Msg" xml:space="preserve">
|
||||
<value>Please do not close ImEX Online or ImEX Partner during the connection process.</value>
|
||||
</data>
|
||||
<data name="Msg_QbConnection_Title" xml:space="preserve">
|
||||
<value>QuickBooks Connection Request</value>
|
||||
</data>
|
||||
<data name="Msg_QbDisconnection_Msg" xml:space="preserve">
|
||||
<value>Successfully disconnected from QuickBooks.</value>
|
||||
</data>
|
||||
<data name="Msg_QbDisconnection_Title" xml:space="preserve">
|
||||
<value>QuickBooks Disconnection</value>
|
||||
</data>
|
||||
<data name="Password" xml:space="preserve">
|
||||
<value>Password</value>
|
||||
</data>
|
||||
|
||||
12
BodyshopUploader/Properties/Settings.Designer.cs
generated
12
BodyshopUploader/Properties/Settings.Designer.cs
generated
@@ -92,5 +92,17 @@ namespace BodyshopPartner.Properties {
|
||||
this["AutoStartMonitor"] = value;
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("")]
|
||||
public string QuickBooksFilePath {
|
||||
get {
|
||||
return ((string)(this["QuickBooksFilePath"]));
|
||||
}
|
||||
set {
|
||||
this["QuickBooksFilePath"] = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,5 +20,8 @@
|
||||
<Setting Name="AutoStartMonitor" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">True</Value>
|
||||
</Setting>
|
||||
<Setting Name="QuickBooksFilePath" Type="System.String" Scope="User">
|
||||
<Value Profile="(Default)" />
|
||||
</Setting>
|
||||
</Settings>
|
||||
</SettingsFile>
|
||||
@@ -127,7 +127,7 @@
|
||||
To="0"
|
||||
Storyboard.TargetProperty="Opacity"
|
||||
Duration="0:0:1"
|
||||
BeginTime="0:0:2" />
|
||||
BeginTime="0:0:3" />
|
||||
</Storyboard>
|
||||
</BeginStoryboard>
|
||||
</EventTrigger>
|
||||
|
||||
@@ -46,28 +46,48 @@ namespace BodyshopPartner.Utils
|
||||
List<QbRequestItem> AllRequests = ParseRequest(req);
|
||||
List<QbResponseItem> HttpResponse = new List<QbResponseItem>();
|
||||
|
||||
// string requestXMLstring = ParseBodyToString(req);
|
||||
hlog("Connecting to QuickBooks. This may take a moment...");
|
||||
QuickBooksInterop.ConnectToQuickBooks();
|
||||
|
||||
foreach (QbRequestItem request in AllRequests)
|
||||
{
|
||||
XDocument response = XDocument.Parse(QuickBooksInterop.ProcessQBXmlRequest(request.QbXML));
|
||||
QbXmlResponse ResponseStatus = QuickBooksInterop.ParseResponseXml(response);
|
||||
|
||||
logger.Trace(response.ToString());
|
||||
logger.Debug(ResponseStatus.ToString());
|
||||
hlog(ResponseStatus.ToString());
|
||||
|
||||
QbResponseItem r = new QbResponseItem()
|
||||
try
|
||||
{
|
||||
Id = request.Id,
|
||||
Success = ResponseStatus.StatusCode == "0" || request.OkStatusCodes.Contains(ResponseStatus.StatusCode),
|
||||
ErrorMessage = ResponseStatus.StatusMessage
|
||||
};
|
||||
hlog("Processing QuickBooks request. ImEX Online Record ID:" + request.Id);
|
||||
XDocument response = XDocument.Parse(QuickBooksInterop.ProcessQBXmlRequestUnManaged(request.QbXML));
|
||||
QbXmlResponse ResponseStatus = QuickBooksInterop.ParseResponseXml(response);
|
||||
|
||||
logger.Trace(response.ToString());
|
||||
logger.Debug(ResponseStatus.ToString());
|
||||
hlog(ResponseStatus.ToString());
|
||||
|
||||
QbResponseItem r = new QbResponseItem()
|
||||
{
|
||||
Id = request.Id,
|
||||
Success = ResponseStatus.StatusCode == "0" || request.OkStatusCodes.Contains(ResponseStatus.StatusCode),
|
||||
ErrorMessage = ResponseStatus.StatusMessage
|
||||
};
|
||||
|
||||
HttpResponse.Add(r);
|
||||
}
|
||||
catch (Exception Ex)
|
||||
{
|
||||
//Shouldn't really get here unless something is malformed.
|
||||
logger.Error(Ex, "Error encountered when processing QbXML Request.\n {0}", request.QbXML);
|
||||
QbResponseItem r = new QbResponseItem()
|
||||
{
|
||||
Id = request.Id,
|
||||
Success = false,
|
||||
ErrorMessage = Ex.Message
|
||||
};
|
||||
|
||||
HttpResponse.Add(r);
|
||||
}
|
||||
|
||||
HttpResponse.Add(r);
|
||||
}
|
||||
QuickBooksInterop.DisconnectFromQuickBooks();
|
||||
|
||||
hlog("Completed QuickBooks request.");
|
||||
|
||||
hlog("Completed QuickBooks requests.");
|
||||
res.WithCORS().AsText(JsonConvert.SerializeObject(HttpResponse));
|
||||
}
|
||||
|
||||
|
||||
@@ -5,6 +5,7 @@ using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Xml;
|
||||
using System.Xml.Linq;
|
||||
using BodyshopPartner.Utils.Growls;
|
||||
using Interop.QBFC13;
|
||||
using Interop.QBXMLRP2;
|
||||
|
||||
@@ -16,20 +17,43 @@ namespace BodyshopPartner.Utils
|
||||
private static string ticket;
|
||||
private static RequestProcessor2 rp;
|
||||
private static string maxVersion;
|
||||
private static string companyFile = "";
|
||||
//public static string companyFile; //= @"C:\Users\pfic\Development\QB Testing\Testing\DANS2014.QBW";
|
||||
private static QBFileMode mode = QBFileMode.qbFileOpenDoNotCare;
|
||||
private static string appID = "ImEXBSP";
|
||||
private static string appName = "BodyshopPartner";
|
||||
private static GrowlNotification Growler;
|
||||
|
||||
public static void ConnectToQuickBooks()
|
||||
{
|
||||
try
|
||||
{
|
||||
logger.Debug("Attempting to connect to QuickBooks...");
|
||||
App.Current.Dispatcher.Invoke(() =>
|
||||
{
|
||||
Growler.AddNotification(new Notification()
|
||||
{
|
||||
Id = new Random().Next(),
|
||||
Title = Properties.Resources.Msg_QbConnection_Title,
|
||||
Message = Properties.Resources.Msg_QbConnection_Msg
|
||||
});
|
||||
});
|
||||
|
||||
rp = new RequestProcessor2Class();
|
||||
rp.OpenConnection(appID, appName);
|
||||
ticket = rp.BeginSession(companyFile, mode);
|
||||
ticket = rp.BeginSession(Properties.Settings.Default.QuickBooksFilePath, mode);
|
||||
string[] versions = rp.get_QBXMLVersionsForSession(ticket);
|
||||
maxVersion = versions[versions.Length - 1];
|
||||
logger.Debug("Connected to QuickBooks. Ticket: " + ticket.ToString());
|
||||
|
||||
App.Current.Dispatcher.Invoke(() =>
|
||||
{
|
||||
Growler.AddNotification(new Notification()
|
||||
{
|
||||
Id = new Random().Next(),
|
||||
Title = Properties.Resources.Msg_QbConnected_Title,
|
||||
Message = Properties.Resources.Msg_QbConnected_Msg
|
||||
});
|
||||
});
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
@@ -47,6 +71,16 @@ namespace BodyshopPartner.Utils
|
||||
rp.EndSession(ticket);
|
||||
ticket = null;
|
||||
rp.CloseConnection();
|
||||
App.Current.Dispatcher.Invoke(() =>
|
||||
{
|
||||
Growler.AddNotification(new Notification()
|
||||
{
|
||||
Id = new Random().Next(),
|
||||
Title = Properties.Resources.Msg_QbDisconnection_Title,
|
||||
Message = Properties.Resources.Msg_QbDisconnection_Msg
|
||||
});
|
||||
});
|
||||
logger.Debug("Disconnected from QuickBooks successfully.");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
@@ -70,7 +104,22 @@ namespace BodyshopPartner.Utils
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public static string ProcessQBXmlRequestUnManaged(string request)
|
||||
{
|
||||
try
|
||||
{
|
||||
//ConnectToQuickBooks();
|
||||
var ret = rp.ProcessRequest(ticket, request);
|
||||
//DisconnectFromQuickBooks();
|
||||
return ret;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
logger.Error(e.Message);
|
||||
// DisconnectFromQuickBooks();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
public static Models.QbXmlResponse ParseResponseXml(XDocument response)
|
||||
{
|
||||
XElement QueryResponse = response.Root.Descendants("QBXMLMsgsRs").Descendants().FirstOrDefault();
|
||||
@@ -87,6 +136,10 @@ namespace BodyshopPartner.Utils
|
||||
Response = response
|
||||
};
|
||||
}
|
||||
public static void SetGrowler(GrowlNotification g)
|
||||
{
|
||||
Growler = g;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,6 +33,7 @@ namespace BodyshopPartner.ViewModels
|
||||
|
||||
Growler = new GrowlNotification(this);
|
||||
Utils.JobProcessingQueue.SetGrowler(Growler);
|
||||
Utils.QuickBooksInterop.SetGrowler(Growler);
|
||||
}
|
||||
|
||||
private void Bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
|
||||
@@ -227,7 +228,7 @@ namespace BodyshopPartner.ViewModels
|
||||
{
|
||||
Notification _n = new Notification()
|
||||
{
|
||||
Id = 123,
|
||||
Id = new Random().Next(),
|
||||
Title = "This is a title",
|
||||
Subtitle = "Subtitle",
|
||||
Message = "Somethin"
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
FontFamily="{DynamicResource MaterialDesignFont}"
|
||||
Loaded="Window_Loaded"
|
||||
xmlns:util="clr-namespace:BodyshopPartner.Utils"
|
||||
xmlns:properties="clr-namespace:BodyshopPartner.Properties"
|
||||
Closing="Window_Closing">
|
||||
<Window.DataContext>
|
||||
<vm:MainViewModel />
|
||||
@@ -205,13 +206,17 @@
|
||||
</DataGridTemplateColumn>
|
||||
</DataGrid.Columns>
|
||||
</DataGrid>
|
||||
<StackPanel Grid.Column="1"
|
||||
Height="Auto">
|
||||
<TextBox Text="{Binding Source={x:Static properties:Settings.Default},
|
||||
Path=QuickBooksFilePath}"
|
||||
materialDesign:HintAssist.Hint="QuickBooks File Path" TextChanged="TextBox_TextChanged"/>
|
||||
<TextBox Height="Auto"
|
||||
Text="{Binding HttpServerLog}"
|
||||
TextWrapping="Wrap"
|
||||
AcceptsReturn="True" />
|
||||
</StackPanel>
|
||||
|
||||
<TextBox Grid.Column="1"
|
||||
Height="Auto"
|
||||
Text="{Binding HttpServerLog}"
|
||||
TextWrapping="Wrap"
|
||||
AcceptsReturn="True"
|
||||
/>
|
||||
</Grid>
|
||||
|
||||
</DockPanel>
|
||||
|
||||
@@ -35,5 +35,11 @@ namespace BodyshopPartner.Views
|
||||
e.Cancel = true ;
|
||||
this.Hide();
|
||||
}
|
||||
|
||||
private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
|
||||
{
|
||||
Properties.Settings.Default.QuickBooksFilePath = ((System.Windows.Controls.TextBox)sender).Text;
|
||||
Properties.Settings.Default.Save();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user