QuickBooks Product History
- Now sets Email settings on QuickBooks Online invoices. So, if a company emails their invoices, when the QuickBooks Importer receives an invoice from RPOWER, it can tell QB Online that the invoice needs to be sent, and will also automatically attach the customer's email address to that invoice. This means that the accountant can just press a button in QB Online to email invoices without having to go through each invoice to apply an email address to the invoice and tag it as needing to be sent.
- If account numbers are longer than 7 characters, an error is logged in the log file, and the account number is not added into the AccountAdd request. This is done so that processing can continue un-interrupted.
- Now have the option to delete all invoices, payments, and credit memos for a customer from QuickBooks Desktop versions.
- Bug fix: Importer would not recognize the location of the Windows QuickBooks database.
- Bug fix: Importer would fail on export into Windows QuickBooks database because it would see it as an online database.
- Connects to QuickBooks Online (QBO, used to be QBOE) databases using the new .NET SDK for QB REST v3 API.
- Bug Fix: When the first line in the QBDataImporter.ini file was blank it would cause the importer to think the file was empty, and so it would not pick up the settings on the 2nd line.
- Updated to QuickBooks Foundation Classes 13, the latest QBFC classes at this time.
- Added a setting called customer_export which determines when to run the QB customer export which is returned to RPOWER. For more information, see the QBDataImporter.settings file in the RPOWER.Central\RFX\QBCNX\Importer folder.
- Also changed the way the email preferences are read so that if useemail=no the remaining email settings are not read. If toemail= nothing, that will also turn off email.
- Updated to QuickBooks Foundation Classes 11 for compatibility with Windows 8.1 64-bit systems.
- Inserted a fix for the following error the importer was receiving from QB when extracting a customer list:
Status Code: 0x80040301 Status Message: An exception occurred! Type:UTFDataFormatException, Message:invalid byte 2 (,) of a 3-byte sequence.SAXParseException: error at line 17721, column 11 in XML data.
That error would indicate that there exists an invalid XML character in one of the customers. The fix, however, is creating a fake filter on the TimeModified field in the customer record. So, whatever the problem is internally in QB, adding this filter allows the importer to extract the customer list without issue.
- Now supports sending data to different QBOE databases from a single computer. Needs to run with administrator rights so it can make changes to the Windows registry. This was done so that we can have stores export their QB data here and we can then import that data from our server to their QBOE database.
- If the TotalAmount in a ReceivePaymentAdd, or the Amount in an InvoiceAdd is negative, the RPOWER QuickBooks Importer will convert that request into a CreditMemo.
- The QB Importer now verifies the existence of customers, employees, and accounts in QuickBooks. Previously, a bug had prevented this from working properly.
- The Qb Importer will now fix the edit sequence on a CustomerMod, EmployeeMod, or AccountMod. The edit sequence is a sequential number which QuickBooks uses to track changes to an entity (Account, Customer, Employee, etc.). Periodically, especially if an import with a CustomerMod failed, the number in the export file would be out of sync with the number QB was keeping internally. The importer now re-queries QB for a new edit sequence number if the one it has is out of date.
- Fixed an ongoing issue with modifying customers and employees. If modifying a customer or an employee that did not exist in QuickBooks, the importer would lock up on a file and repeatedly attempt to update that customer or employee. With this fix, the file will process normally, and any requests made on a non-existing QuickBooks customer or employee will be sent to the Failed folder so someone can look into the problem.
- Did some minor fixes on the "Set Preferences..." dialog by removing the close button in the upper right-hand corner. Also, removed the ability to resize the "Set Prefences" dialog window.
- Changed the query file export file names so that they use ticks instead of date. RPOWER imports these files in alphabetical order. It may be possible, since the 6 capital letters in the file name are randomly generated, that RPOWER might import query files out of order. Using ticks instead of date and time prefents that since a new tick is generated each millisecond.
- Now supports Quickbooks Online Edition (QBOE). Instructions are on the RPOWER Wiki on the QuickBooks Server Configuration page.
- Build to work with QB 2010. Caps the qbXML version at 8.
- Build for QBFC8
- Moved back to QBFC7 because of install issues with QBFC8.
- Added Address5 field to CustomerAdd & CustomerMod requests.
- Added AltPhone field to CustomerAdd & CustomerMod requests.
- Compatible with QuickBooks Foundation Classes 8.0
- Fixed a bug dealing with EmployeeMods. If the employee name is changed, such as by adding a \ in front of the last name to indicate 'no longer active', the EmployeeMod should now succeed. This fixes a bug introduced in the 2008-09-29 version.
- Fixed a bug where the account query file returned to RPOWER contained XML elements that contained attributes with capitalized names. The XyzzyTalk specification requires that these attributes be lowercase. This was a bug introduced in the 2008-09-29 version.
- A GUI interface has been added to the importer so that the accounts, customers, and employees can be exported from a QuickBooks database. To use this interface, right-click on the QB icon, and then click on Export QuickBooks Lists.... A dialog box will appear asking for a store serial number, a path to write the lists out to, and which lists to export.
- When importing, if a database path cannot be found for a file, that file is moved into the failed folder.
- The importer now only opens a single connection per import file. It used to open one for verification, one for fragmenting the file, and one for importing the file.
- Instead of repeatedly returning to the QuickBooks database for verification and fragmentation information, it now queries all the customer, employees, and accounts from the QuickBooks database at the start of an import and uses that for verfication and fragmentation.
- The QBSessionManager.OpenConnection call has been deprecated by Intuit. This version of the importer now uses QBSessionManager.OpenConnection2, which requires a connection type.
- The running file is deleted even if the user unexpectedly shuts down the Windows OS. It now handles the WM_QUERYSESSIONENDING message, which Windows throws in the case of an user initiated system shutdown or restart.
- Updated to QuickBooks Foundation Classes (QBFC) version 7.0. This version of the QBFC is backward compatible with QuickBooks versions back to 2002.
- Re-wrote the File Fragmentation portion of the code, so that it only opens a connection to the QuickBooks database once instead of once for each QuickBooks request type.
- If a QBDataImporter.running file already exists when the RPOWER QuickBooks Importer is started up, it throws the error: "This application will not run because the QBDataImporter.running file already exists". This is to distinguish this condition from the condition where an instance of the RPOWER QuickBooks Importer is already running as a separate process. The importe will not run until the QBDataImporter.running file is deleted. For more information, see the notes from 2008-04-25.
- The importer can now handle the situation where a CustomerMod request is made, but not all the address fields have been filled in. QuickBooks requires that all address fields be filled or it throws an error. The importer now fills any address field left empty with spaces so that QuickBooks will accept the CustomerMod request.
- Fixed a condition where an internal database error would be thrown, causing the importer to throw a series of "You cannot make multiple successive calls to the "OpenConnection" method. Call "CloseConnection" before calling "OpenConnection" again." when it tried to import a file.
As relates to the fix made on 2008-05-29, the QuickBooks importer was returning a false positive. Although the importer was being told that the QuickBooks database connection was being closed properly, it was not. I had to make another fix by instantiating a QBSessionManager each time I opened a new connection to the database, instead of keeping the same QBSessionManager for all connections.
- Files will now sit in the Archive-1 folder for a period of 28 days (4 weeks). Previously, the files sat in the Archive-1 directory for 14 days (2 weeks).
- Fixed a bug dealing with file fragmentation. The file fragmenter wasn't alerting an outer tier of code to the fact that a QuickBooks database error had been thrown. This caused the file to be fragmented anyway, and an import was attempted. This problem is now fixed, and the file fragmenter now handles the error like it should.
- Fixed another bug that caused a "You cannot make multiple successive calls to the "OpenConnection" method. Call "CloseConnection" before calling "OpenConnection" again." error.
In this case, if a file threw an error (usually a "Could not start QuickBooks" error) it would send that file to failed or slow poll, and the next file it tried to import would get a "You cannot make multiple successive calls to the "OpenConnection" method. Call "CloseConnection" before calling "OpenConnection" again." even if a connection to the database WASN'T being opened.
I believe QuickBooks holds on to a counter that increments each time OpenConnection is called, and decrements each time CloseConnection is called so that they know when all the connections to the database are closed. In this case, they increment their counter before the lower-level connection to the database is opened. This way, even if a connection isn't opened, the counter is incremented, and QuickBooks sees that a connection exists.
The fix was to call CloseConnection upon any error whether or not the OpenConnection actually opened a connection.
- The importer now properly handles conditions where an error is thrown when a connection is opened for data import (as opposed to data verification or file fragmenting).
- Fixed a bug introduced with the 5-23 changes. During verification of customers, accounts, and employees if the importer was looking for an xml node attribute which did not exist in the xml node, it would throw an exception. It no longer does this.
- Added in more logging to track down "Reference not set to an instance of an object" errors" during verification.
- Removed the use of a deprecated TimeTrackingAdd API call. The IsBillable setting is not used in QBFC 6.0 and later versions.
- Added more error logging. In fact, the whole error logging system got a face-lift. This was done in an attempt to better track down QuickBooks errors and handle the infamous "You cannot make multiple successive calls to the "OpenConnection" method. Call "CloseConnection" before calling "OpenConnection" again.
- Fixed a bug which was causing the importer to not properly find errors in the errors.pipe file.
- Changed the status code on errors which are thrown as generic exceptions. These errors, as opposed to COMExceptions, are now issued the error number 10000.
- The importer now uses the error.pipe file to determine what action to take for a specific error. The error.pipe file contains a list of known status codes and action codes for each error that can be thrown by QuickBooks. More information can be found in the error.pipe file.
- Added in the ability to perform a slow-poll. If an error with an action code of S is encountered (as defined in the error.pipe file), the importer will move that file to the Slow_Poll directory, and attempt, at ten minute intervals, to import that file.
- Files in the Archive-1 folder are now deleted after they become two weeks old.
- The importer now creates a .running file in its home directory when it starts up and deletes it when it shuts down. The .running file acts as a semaphore so that if someone is logged in through Remote Desktop as the same user account the importer is running under, the importer will not start up for the logged in user.
- Added in the ability to override the .running file. Running the importer with the -r switch will cause the importer to ignore the .running file, and it will run anyway.
- Added in support for QuickBooks' class tracking. Imported transactions now contain a ClassRef.FullName attribute which can be used to track transactions by class in case the client wishes to track transactions by store, for example.
- The importer now logs the name of the file placed in pending or failed.
- This release attempts a fix of a Windows RPC Server Unavailable error that appears to be happening during the closing of a connection to the QB database.
- Fixed a bug that might be another cause of the out of sync OpenConnection/CloseConnection error when an exception is thrown. This bug was in QBFileFragmenter when getting the EditSequence.
- Changed api_id in _1_RESET_MIDS.xml and others from DATACNX to QBCNX.
- Fixed a bug that was introduced in the last version. After fragmenting a "QB Daily" file, the importer would retain the original "QB Daily" file information instead of picking up the information for the fragmented (or child) files.
- A fix was made to the code which handles transaction files so that throwing an exception won't throw the OpenConnection/CloseConnection sequence out of whack. This was during the transaction file import process.
- A fix was made to the Initialize method of the ImportVerify class so that a fatal connection error will cause the import to stop. What was happening was that a connection error would not cause the verification process to stop and so it would continue. In the process, it would not be able to verify Accounts and Customers for JournalEntryAdds and InvoiceAdds, and generate a plethora of AccountAdds and CustomerAdds that had no names. This caused a failure when trying to import these Adds into QuickBooks.
- The importer is now able to distinguish which QBFC version to use when connecting to a QuickBooks database. Upon connecting to the database, it queries the database for all compatible QBFC versions. If the database does not support QBFC 6.0, it will connect using QBFC 2.1 functionality.
- The importer now performs account modifications through the AccountMod request.
- To support AccountMod, updated the QuickBooks Request version to 6.0. Throws an incompatible QBXML error in QuickBooks 2004.
- The importer is now able to email RPOWER/K3Software offices when a store either does not export data, or an error occurs during the import.
- A new file was added, QBDataImporter.settings which contains the settings for "Automatic Email on Error" and "Store Rollcall" functionality. "Automatic Email on Error" will automatically email RPOWER/K3Software offices when an error occurs during an import. "Store Rollcall" determines which stores have exported data that day and emails RPOWER when a store does not export data.
- The importer now runs at below normal priority.
- This version fixes a bug during the verification stage where adding an xml element to the import document causes an exception to be thrown: "The reference node is not a child of this node." This error occurs when the importer comes across a 'mod, or an InvoiceAdd or JournalAdd which contains a customer or account that does not exist in the QB database. The importer adds a new xml element to add the missing entity to the database.
- This version of the importer can now delete journal entries by date.
- Fixes a bug in the invoice deletion where the end date was never set. This bug would cause invoices to be deleted from all dates after the start date.
- The importer now has the ability to delete invoices by customer for a specific date range
- Fixed a bug when performing the queries that would throw an exception way out to the outer loop of the importer and cause import files to be fragmented multiple times.
- Updated RESET_EXPORTS.xml, RESET_MIDS.xml, and EXPORT_NOW.xml to work with new RPOWER DATACNX API version 126.96.36.199, in app version 6.092D.
- The importer now sends only RESET_EXPORTS.xml when it needs to notify the store to resend all its account, customer, and employee information
- A bug was fixed which was logging InvoivceAdd sales to RPOWER Customer Sales (OverrideItemAccountRef.FullName)
- The importer only sends RPOWER a RESET_EXPORTS message when it cannot match neither the entity name nor the entity list id.
- The importer has been modified to perform a verification step before the import process starts. The verification step is pretty extensive involving verification of customers, accounts, and employees for each of the transactions in the import file. If an error occurs during the verification step, the importer tries its best to correct the error. Correcting the error is performed according to the following 'rules':
- CustomerMod, AccountMod, EmployeeMod
- if the listid matches but not the name, the error is ignored since mods are performed using listid
- if the name matches but not the listid, the the listid for that name is gotten from QuickBooks and used and RPOWER is told to update its listids
- if the listid does not match and the name does not match, that customer, account, or employee is added to the QuickBooks database
- if both the listid and the name match, they are double-checked to ensure that they both refer to the same record
- if they do, then the mod is left as is
- if not, then the record is removed from the import file because the intention of which record was to be updated is not clear and RPOWER is told to reset its listids
- AccountAdd, CustomerAdd, EmployeeAdd
- no checking is done on these transactions since all adds are done by name and if they do match an already existing account, QuickBooks does not throw an error
- any other Add
- if the listid matches but not the name, then that file is failed since these adds are performed by name
- if the name matches but not the listid, then the error is ignored and the record is processed since these adds are performed by name and RPOWER is told to reset its listids
- if the listid does not match and the name does not match then that account, customer, or employee is added to the QuickBooks database
- if both the listid and the name matches then they are double-checked to ensure that they both refer to the same record
- if they do, the Add record is left as is
- if not, the import is done by name
- CustomerMod, AccountMod, EmployeeMod
- Fixed: when dealing with transaction files (the !AccountAdd files, for example) if a connection to the database was not established, the importer would still try to import the file.
- Fixed: a customer query was being run each time an import was taking place and throwing an error when there were no customers. This customer query was appended to the import and would cause a "The filters used in the query request did not return any matching objects from QuickBooks." error to occur. It did not affect the items imported—they imported successfully—but the error would appear anyway if there were no customers. This customer query has been removed, and the only customer query that occurs is the one done after all the files are imported, which is done in a "safe" mode and won't throw an error if there are no customers.
- handled QB error message 3310 which replies with a null error message.
- fixed a bug in the importer where if a CustomerMod or EmployeeMod fragmentation option had the |s flag appended to it, it would not query the QB database for the EditSequence.
- fixed a bug in the software where a store number not contained in the ini file could throw an exception. What happens now is that if I get a file with a store ID that the importer does not recognize, that file gets deleted.
- Also fixed a bug where a DATACNX file would cause the importer to throw an exception. The importer now checks for QBCNX files. If the file is not a QBCNX file, it throws that file away.
- fixed a bug dealing with how the api_Command is handled. The code was not passing on an api_command of "REVERSE" so that anything marked as "REVERSE" would post a second time. This is now resolved.
- added in the capability to generate employee export and account export files under specific conditions. Employee export occurs after an EmployeeAdd, EmployeeMod, or TimeTracking record import. An account export occurs after an AccountAdd import. Rolled in the ability to perform CustomerMods and EmployeeMods. RPOWER does not need to worry about the EditSequence for these records because the importer queries the database for the EditSequence for each record.
- Fixed a bug that kept EntryAdds from importing in some cases. Fixed for Lenny's 54th St.
- I think I fixed this before, but now I checked it. The importer now bounces off the exception thrown when a modal dialog box is showing in QB. It will try to re-import that file every three minutes until the modal dialog box is closed.
- Added in functionality to reverse InvoiceAdds and JournalEntryAdds. All that needs to be done to rollback the QB database to a pre-import state is to replace api_command="POST" with api_command="REVERSE" in the XyxxyHeaader. Like I said, this will rollback InvoiceAdds and JournalEntryAdds only. It will not rollback ReceivePaymentAdds.
- Major overhaul for performance and readability. Major items are the tracking of an import id number (so that a previous day's import cannot be re-imported), enhanced support for building billing labels in QuickBooks (by providing more information in the customer add request), and re-working the architeture so it is more extensible.
- Fixed a bug where the importer would send an import file with no data in it to the failed folder with an object instance null error.
- sped up the importer by moving the begin and end session calls to QB outside the file loop. So now instead of opening up a connection to the QB database for each transaction (file fragment), I now do it once per import file. This increased import speed by a factor of 10.
- reworked the import a bit so that only one session is used when importing !files. Before, if the importer was started and there were ! files in the ServerIn directory, a separate session was used for each file. Using one session for all the ! files makes the import faster. It also produces less customer query files since the query file is only being produced after all of the ! files have been imported.