520 lines
19 KiB
C#
520 lines
19 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using AyaNova.PlugIn;
|
|
using System.Windows.Forms;
|
|
using GZTW.AyaNova.BLL;
|
|
using System.Threading;
|
|
using System.Collections;
|
|
|
|
namespace AyaNova.PlugIn.QBOI
|
|
{
|
|
|
|
|
|
/*
|
|
* Note assembly binding redirect needed for this project see here:
|
|
* https://stackoverflow.com/questions/21876887/assembly-reference-cannot-be-resolved-dependentassembly-issue/22611079#22611079
|
|
*
|
|
* Calling project only, so that's all set in AyaNova.exe application config file.
|
|
*/
|
|
class QBOIPlugin : IAyaNovaPlugin
|
|
{
|
|
private static bool bLicensed = false;
|
|
private static bool bPFCDone = false;
|
|
private static List<RootObjectTypes> ObjectsWeCanDealWith = null;
|
|
|
|
#region IAyaNovaPlugin Members
|
|
|
|
#region Interface Properties
|
|
public string PluginName
|
|
{
|
|
get { return "AyaNova QBOI"; }
|
|
}
|
|
|
|
public Guid PluginID
|
|
{
|
|
get { return new Guid("{DE6694A6-7F78-44A1-A732-83DAF0407AE9}"); }
|
|
}
|
|
|
|
|
|
|
|
public System.Drawing.Image PluginSmallIcon
|
|
{
|
|
get
|
|
{
|
|
return Resource.QBI16;
|
|
}
|
|
|
|
}
|
|
|
|
public System.Drawing.Image PluginLargeIcon
|
|
{
|
|
get
|
|
{
|
|
return Resource.QBI32;
|
|
}
|
|
|
|
}
|
|
|
|
public string PluginVersion
|
|
{
|
|
get { return "7.5 (patch 4)"; }//if patch then 7.3 (patch 1) etc
|
|
}
|
|
|
|
public string About
|
|
{
|
|
get
|
|
{
|
|
return
|
|
"AyaNova QBOI plugin\r\n" +
|
|
"Built " + AyaNova.PlugIn.QBOI.Timestamp.BuildAt.ToString() + "\r\n" +
|
|
"Copyright 2017-2018 Ground Zero Tech-Works Inc.";
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public System.Resources.ResourceManager AyaNovaResourceManager
|
|
{
|
|
set
|
|
{
|
|
Util.AyaResource = value;
|
|
}
|
|
}
|
|
|
|
#endregion interface props
|
|
|
|
#region Initialization and close
|
|
public bool Initialize(Version AyaNovaVersion, LocalizedTextTable localizedText)
|
|
{
|
|
Util.LocaleText = localizedText;
|
|
//case 1841
|
|
//if (AyaBizUtils.Trial)
|
|
//{
|
|
// //case 1031
|
|
// //MessageBox.Show("AyaNova QBI can not be used with a trial AyaNova database");
|
|
// return false;
|
|
//}
|
|
|
|
//case 1590
|
|
// bLicensed = (!string.IsNullOrEmpty(AyaBizUtils.PluginLicensedVersion("QBI - QuickBooks interface")));
|
|
//case 2094
|
|
bLicensed = AyaBizUtils.PluginAllowed("QBOI - QuickBooks Online interface", AyaNova.PlugIn.QBOI.Timestamp.BuildAt);
|
|
|
|
if (!bLicensed && AyaBizUtils.PluginTooNew("QBOI - QuickBooks Online interface", AyaNova.PlugIn.QBOI.Timestamp.BuildAt))
|
|
{
|
|
MessageBox.Show(
|
|
"NOT LICENSED!\r\n\r\nThis QBOI plugin was built " +
|
|
AyaNova.PlugIn.QBOI.Timestamp.BuildAt.ToString() + "\r\n" +
|
|
"but your license subscription for it ended " +
|
|
AyaBizUtils.PluginSubscriptionDate("QBOI - QuickBooks Online interface").ToString() + "\r\n" +
|
|
"\r\nDowngrade back to your previous version or purchase a subscription to use this plugin.");
|
|
return false;
|
|
}
|
|
|
|
|
|
if (AyaNovaVersion.Major != 7)
|
|
{
|
|
MessageBox.Show("This AyaNovaQBOI plugin requires AyaNova version 7");
|
|
return false;
|
|
}
|
|
|
|
Util.GlobalSettings = AyaBizUtils.GlobalSettings;
|
|
|
|
ObjectsWeCanDealWith = new List<RootObjectTypes>();
|
|
|
|
//case 976 keep this if not licensed
|
|
//so we can show a license required message when they take the option
|
|
ObjectsWeCanDealWith.Add(RootObjectTypes.Nothing);
|
|
ObjectsWeCanDealWith.Add(RootObjectTypes.Client);
|
|
ObjectsWeCanDealWith.Add(RootObjectTypes.Part);
|
|
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
|
|
public void Close()
|
|
{
|
|
;
|
|
}
|
|
|
|
#endregion init and close
|
|
|
|
#region Show menu?
|
|
|
|
public bool SingleObjectMenuShow(RootObjectTypes objectType)
|
|
{
|
|
|
|
return (ObjectsWeCanDealWith.Contains(objectType));
|
|
}
|
|
|
|
public bool MultipleObjectsMenuShow(RootObjectTypes objectType)
|
|
{
|
|
|
|
return (ObjectsWeCanDealWith.Contains(objectType));
|
|
}
|
|
|
|
#endregion Show menu
|
|
|
|
#region menu options
|
|
|
|
/// <summary>
|
|
/// SINGLE OBJECT
|
|
/// </summary>
|
|
/// <param name="objectType"></param>
|
|
/// <param name="ayaNovaObject"></param>
|
|
/// <returns></returns>
|
|
public List<AyaNovaPluginMenuItem> SingleObjectMenuOptions(RootObjectTypes objectType, object ayaNovaObject)
|
|
{
|
|
if (!ObjectsWeCanDealWith.Contains(objectType)) return null;
|
|
|
|
if (!bLicensed)
|
|
{
|
|
MessageBox.Show("An AyaNova QBOI license is required to use this QuickBooks Online integration plugin\r\n");
|
|
return null;
|
|
}
|
|
|
|
if (!DoPFC()) return null;
|
|
|
|
List<AyaNovaPluginMenuItem> list = new List<AyaNovaPluginMenuItem>();
|
|
switch (objectType)
|
|
{
|
|
case RootObjectTypes.Nothing:
|
|
list.Add(new AyaNovaPluginMenuItem("MAIN", "QBOI Main", Resource.QBI32, Resource.QBI16));
|
|
if (bPFCDone)
|
|
list.Add(new AyaNovaPluginMenuItem("RESCANQB", "Refresh Quick Books connection", null, null));
|
|
break;
|
|
case RootObjectTypes.Client:
|
|
if (Util.IsLinked(((Client)ayaNovaObject).ID))
|
|
{
|
|
list.Add(new AyaNovaPluginMenuItem("CLIENTSYNCFROMQB", "Refresh AyaNova record", null, null));
|
|
list.Add(new AyaNovaPluginMenuItem("CLIENTSYNCFROMAYA", "Refresh QuickBooks Online record", null, null));
|
|
}
|
|
else
|
|
{
|
|
list.Add(new AyaNovaPluginMenuItem("CLIENTEXPORTTOQB", "Export to QuickBooks Online", null, null));
|
|
}
|
|
break;
|
|
case RootObjectTypes.Part:
|
|
|
|
if (Util.IsLinked(((Part)ayaNovaObject).ID))
|
|
{
|
|
list.Add(new AyaNovaPluginMenuItem("PARTSYNCFROMQB", "Refresh AyaNova record", null, null));
|
|
list.Add(new AyaNovaPluginMenuItem("PARTSYNCFROMAYA", "Refresh QuickBooks Online record", null, null));
|
|
}
|
|
else
|
|
{
|
|
list.Add(new AyaNovaPluginMenuItem("PARTEXPORTTOQB", "Export to QuickBooks Online", null, null));
|
|
}
|
|
break;
|
|
}
|
|
return list;
|
|
|
|
|
|
}
|
|
|
|
/// <summary>
|
|
/// LIST OBJECTS
|
|
/// </summary>
|
|
/// <param name="objectType"></param>
|
|
/// <returns></returns>
|
|
public List<AyaNovaPluginMenuItem> MultipleObjectsMenuOptions(RootObjectTypes objectType)
|
|
{
|
|
if (!ObjectsWeCanDealWith.Contains(objectType)) return null;
|
|
if (!bLicensed)
|
|
{
|
|
MessageBox.Show("An AyaNova QBOI license is required to use this QuickBooks Online integration plugin\r\n");
|
|
return null;
|
|
}
|
|
if (!DoPFC()) return null;
|
|
List<AyaNovaPluginMenuItem> list = new List<AyaNovaPluginMenuItem>();
|
|
switch (objectType)
|
|
{
|
|
case RootObjectTypes.Client:
|
|
list.Add(new AyaNovaPluginMenuItem("CLIENTSYNCFROMQB", "Refresh AyaNova record", null, null));
|
|
list.Add(new AyaNovaPluginMenuItem("CLIENTSYNCFROMAYA", "Refresh QuickBooks record", null, null));
|
|
list.Add(new AyaNovaPluginMenuItem("CLIENTEXPORTTOQB", "Export unlinked items to Quickbooks", null, null));
|
|
break;
|
|
case RootObjectTypes.Part:
|
|
list.Add(new AyaNovaPluginMenuItem("PARTSYNCFROMQB", "Refresh AyaNova record", null, null));
|
|
list.Add(new AyaNovaPluginMenuItem("PARTSYNCFROMAYA", "Refresh QuickBooks record", null, null));
|
|
list.Add(new AyaNovaPluginMenuItem("PARTEXPORTTOQB", "Export unlinked items to Quickbooks", null, null));
|
|
break;
|
|
|
|
}
|
|
|
|
if (list.Count > 0)
|
|
return list;
|
|
else
|
|
return null;
|
|
|
|
}
|
|
#endregion menu options
|
|
|
|
#region Commands
|
|
public bool CommandSelectedForList(string commandKey, RootObjectTypes objectType, List<Guid> objectIDList, object listObject)
|
|
{
|
|
|
|
|
|
if (!ObjectsWeCanDealWith.Contains(objectType)) return false;
|
|
|
|
if (objectIDList == null || objectIDList.Count < 1) return false;
|
|
|
|
switch (commandKey)
|
|
{
|
|
case "CLIENTSYNCFROMQB":
|
|
{
|
|
if (Util.AreYouSure("Update selected clients in AyaNova to QuickBook's values?", "Sync from QuickBooks"))
|
|
{
|
|
Util.RefreshAyaNovaClientFromQB(objectIDList);
|
|
MessageBox.Show("Done");
|
|
}
|
|
}
|
|
break;
|
|
case "CLIENTSYNCFROMAYA":
|
|
{
|
|
if (Util.AreYouSure("Update selected clients in QuickBooks to AyaNova's values?", "Sync from AyaNova"))
|
|
{
|
|
Util.RefreshQBClientFromAyaNova(objectIDList);
|
|
MessageBox.Show("Done");
|
|
}
|
|
}
|
|
break;
|
|
case "CLIENTEXPORTTOQB":
|
|
{
|
|
if (Util.AreYouSure("Export unlinked selected clients in AyaNova to QuickBooks customers?", "Export to QuickBooks"))
|
|
{
|
|
Util.ImportAyaClient(objectIDList);
|
|
MessageBox.Show("Done");
|
|
}
|
|
}
|
|
break;
|
|
|
|
|
|
|
|
|
|
case "PARTSYNCFROMQB":
|
|
{
|
|
if (Util.AreYouSure("Update selected parts in AyaNova to QuickBook's values?", "Sync from QuickBooks"))
|
|
{
|
|
Util.RefreshAyaNovaPartFromQB(objectIDList);
|
|
MessageBox.Show("Done");
|
|
}
|
|
}
|
|
break;
|
|
case "PARTSYNCFROMAYA":
|
|
{
|
|
if (Util.AreYouSure("Update selected items in QuickBooks to AyaNova's values?", "Sync from AyaNova"))
|
|
{
|
|
Util.RefreshQBPartFromAyaNova(objectIDList);
|
|
MessageBox.Show("Done");
|
|
}
|
|
}
|
|
break;
|
|
case "PARTEXPORTTOQB":
|
|
{
|
|
if (Util.AreYouSure("Export unlinked selected parts in AyaNova to QuickBooks items?", "Export to QuickBooks"))
|
|
{
|
|
SetQBImportInventoryAccounts s = new SetQBImportInventoryAccounts();
|
|
if (s.ShowDialog() == DialogResult.OK)
|
|
{
|
|
Util.ImportAyaPart(objectIDList,s.ImportPartAsInventory);
|
|
MessageBox.Show("Done");
|
|
}
|
|
s.Dispose();
|
|
}
|
|
}
|
|
break;
|
|
|
|
}
|
|
return true;
|
|
}
|
|
|
|
public void CommandSelectedForSingleObject(string commandKey, RootObjectTypes objectType, object ayaNovaObject)
|
|
{
|
|
|
|
if (!ObjectsWeCanDealWith.Contains(objectType)) return;
|
|
|
|
switch (commandKey)
|
|
{
|
|
case "MAIN":
|
|
|
|
if (!Util.bMainWindowOpen)
|
|
{
|
|
MainForm mMainForm = new MainForm();
|
|
mMainForm.Show();
|
|
}
|
|
break;
|
|
|
|
case "RESCANQB":
|
|
Util.PopulateQBListCache();
|
|
Util.PopulateAyaListCache();
|
|
break;
|
|
|
|
case "CLIENTSYNCFROMQB":
|
|
{
|
|
if (Util.AreYouSure("Update selected client in AyaNova to QuickBook's values?", "Sync from QuickBooks"))
|
|
{
|
|
Util.RefreshAyaNovaClientFromQB((Client)ayaNovaObject);
|
|
MessageBox.Show("Done");
|
|
}
|
|
}
|
|
break;
|
|
case "CLIENTSYNCFROMAYA":
|
|
{
|
|
if (Util.AreYouSure("Update selected client in QuickBooks to AyaNova's values?", "Sync from AyaNova"))
|
|
{
|
|
Util.RefreshQBClientFromAyaNova((Client)ayaNovaObject);
|
|
MessageBox.Show("Done");
|
|
}
|
|
}
|
|
break;
|
|
case "CLIENTEXPORTTOQB":
|
|
{
|
|
if (Util.AreYouSure("Export client to QuickBooks customer?", "Export to QuickBooks"))
|
|
{
|
|
//case 3278 ask for taxes
|
|
//WARNING: BEFORE MAKING CHANGES HERE SEE
|
|
//MAP.CS line 1606 same code
|
|
//AND QBOI.CS single client command code line 378
|
|
//AND in UTIL class line 3026
|
|
|
|
//Only USA uses one tax code for the whole customer
|
|
//other regions are taxed by item and set with items
|
|
if (Util.QUSA)
|
|
{
|
|
SetQBImportCustomerTaxCode s = new SetQBImportCustomerTaxCode();
|
|
if (s.ShowDialog() != DialogResult.OK)
|
|
{
|
|
s.Dispose();
|
|
return;
|
|
}
|
|
s.Dispose();
|
|
}
|
|
|
|
ArrayList alErrors = new ArrayList();
|
|
Util.ImportAyaClient(((Client)ayaNovaObject).ID, alErrors);
|
|
if (alErrors.Count != 0)
|
|
{
|
|
|
|
|
|
StringBuilder sb = new StringBuilder();
|
|
sb.Append("Export completed with some errors:\r\n\r\n");
|
|
foreach (object o in alErrors)
|
|
{
|
|
sb.Append((string)o);
|
|
sb.Append("\r\n************\r\n");
|
|
|
|
}
|
|
|
|
CopyableMessageBox cb = new CopyableMessageBox(sb.ToString());
|
|
cb.ShowDialog();
|
|
cb.Dispose();
|
|
|
|
}
|
|
MessageBox.Show("Done");
|
|
}
|
|
}
|
|
break;
|
|
|
|
|
|
|
|
case "PARTSYNCFROMQB":
|
|
{
|
|
if (Util.AreYouSure("Update selected part in AyaNova to QuickBook's values?", "Sync from QuickBooks"))
|
|
{
|
|
Util.RefreshAyaNovaPartFromQB((Part)ayaNovaObject);
|
|
MessageBox.Show("Done");
|
|
}
|
|
}
|
|
break;
|
|
case "PARTSYNCFROMAYA":
|
|
{
|
|
if (Util.AreYouSure("Update selected part in QuickBooks to AyaNova's values?", "Sync from AyaNova"))
|
|
{
|
|
Util.RefreshQBPartFromAyaNova((Part)ayaNovaObject);
|
|
MessageBox.Show("Done");
|
|
}
|
|
}
|
|
break;
|
|
case "PARTEXPORTTOQB":
|
|
{
|
|
if (Util.AreYouSure("Export part to QuickBooks item?", "Export to QuickBooks"))
|
|
{
|
|
SetQBImportInventoryAccounts s = new SetQBImportInventoryAccounts();
|
|
if (s.ShowDialog() != DialogResult.OK)
|
|
{
|
|
s.Dispose();
|
|
return;
|
|
}
|
|
//case 3296
|
|
bool ImportAsTypeInventoryItem = s.ImportPartAsInventory;
|
|
s.Dispose();
|
|
|
|
ArrayList alErrors = new ArrayList();
|
|
Util.ImportAyaPart(((Part)ayaNovaObject).ID, alErrors, ImportAsTypeInventoryItem);
|
|
if (alErrors.Count != 0)
|
|
{
|
|
|
|
|
|
StringBuilder sb = new StringBuilder();
|
|
sb.Append("Export completed with some errors:\r\n\r\n");
|
|
foreach (object o in alErrors)
|
|
{
|
|
sb.Append((string)o);
|
|
sb.Append("\r\n************\r\n");
|
|
|
|
}
|
|
|
|
CopyableMessageBox cb = new CopyableMessageBox(sb.ToString());
|
|
cb.ShowDialog();
|
|
cb.Dispose();
|
|
|
|
}
|
|
MessageBox.Show("Done");
|
|
}
|
|
}
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
#endregion commands
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
#region Pre flight check
|
|
private bool DoPFC()
|
|
{
|
|
|
|
if (bPFCDone) return true;
|
|
|
|
|
|
if (Util.PreFlightCheck() != Util.pfstat.OK)
|
|
{
|
|
IntegrationLog.Log(Util.QBID, "QBOI Preflight check failed, shutting down");
|
|
bPFCDone = false;
|
|
return false;
|
|
}
|
|
bPFCDone = true;
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
}
|
|
}
|