I'm using the Quickbooks XML API to import salesorders, items, and customers. Everything works great, however I haven't figured out how to handle things that are deleted in Quickbooks. Querying the imported data in my system is not an option because I have 20,000+ salesorders. My question is, does Quickbooks have a query for deleted items?
QuickBooks for Windows:
If you're using QuickBooks for Windows, then you can do a TxnDeletedQueryRq request to get a list of recently deleted transactions.
Example:
<?xml version="1.0" encoding="utf-8"?>
<?qbxml version="9.0"?>
<QBXML>
<QBXMLMsgsRq onError="stopOnError">
<TxnDeletedQueryRq>
<!-- TxnDelType may have one of the following values: ARRefundCreditCard, Bill, BillPaymentCheck, BillPaymentCreditCard, BuildAssembly, Charge, Check, CreditCardCharge, CreditCardCredit, CreditMemo, Deposit, Estimate, InventoryAdjustment, Invoice, ItemReceipt, JournalEntry, PayrollLiabilityAdjustment [PRIVATE], PayrollPriorPayment [PRIVATE], PayrollYearToDateAdjustment [PRIVATE], PurchaseOrder, ReceivePayment, SalesOrder, SalesReceipt, SalesTaxPaymentCheck, TimeTracking, TransferInventory, VehicleMileage, VendorCredit -->
<TxnDelType>Invoice</TxnDelType>
<TxnDelType>ReceivePayment</TxnDelType>
</TxnDeletedQueryRq>
</QBXMLMsgsRq>
</QBXML>
Example from here:
http://www.consolibyte.com/docs/index.php/QbXML_for_Querying_for_Deleted_Objects
http://www.consolibyte.com/docs/index.php/Example_qbXML_Requests
The full syntax with all options/flags you can set can be found in the QuickBooks OSR:
https://developer-static.intuit.com/qbSDK-current/Common/newOSR/index.html
QuickBooks Online:
If you're using QuickBooks Online, then you can use the CDC requests to poll for recently changed data, including things that have been deleted.
https://quickbooks.api.intuit.com/v3/company/1234/cdc?entities=Class,Item,Invoice&changedSince=2012-07-20T22:25:51-07:00
Will return something like:
<IntuitResponse xmlns="http://schema.intuit.com/finance/v3" time="2013-04-03T10:36:19.393Z">
<CDCResponse>
<QueryResponse>
<Customer>...
</Customer>
...
Some of which may have a status="Deleted" attribute to let you know it's been deleted.
Related
I have two web portals (different domains) but i want to import clients, vendors and invoices from both web portals to my quickbooks using webconnector. What i have tried is creating two qwc files and and configured in the webconnector but whenever i try to import invoice from second company i am getting error of invalid reference.... not found (but the name of client matches exactly like i have on quickbooks with the xml i am creating to run import for invoices ). Below is the error i get when i run import
3140: There is an invalid reference to QuickBooks Term "Client, Test" in the Invoice. QuickBooks error message: Invalid argument. The specified record does not exist in the list.
Below is the xml i use to import invoice
<?xml version="1.0" encoding="utf-8"?>
<?qbxml version="13.0"?>
<QBXML>
<QBXMLMsgsRq onError="continueOnError">
<InvoiceAddRq requestID="39">
<InvoiceAdd>
<CustomerRef>
<FullName>Client, Test</FullName>
</CustomerRef>
<TxnDate>0000-00-00</TxnDate>
<RefNumber>Zaztest</RefNumber>
<ShipAddress>
<Addr1>6050 Hellyer Ave #100C</Addr1>
<Addr2></Addr2>
<City>San Jose</City>
<State>California</State>
<PostalCode>95136</PostalCode>
<Country></Country>
</ShipAddress>
<PONumber>Client</PONumber>
<TermsRef>
<FullName>Client, Test</FullName>
</TermsRef>
<DueDate>0000-00-00</DueDate>
<InvoiceLineAdd>
<ItemRef>
<FullName>Bill:ZigSig Fee</FullName>
</ItemRef>
<Rate>141</Rate>
</InvoiceLineAdd>
</InvoiceAdd>
</InvoiceAddRq>
</QBXMLMsgsRq>
</QBXML>
You say that the client (customer) exists...
" not found (but the name of client matches exactly like i have on quickbooks with the xml"
However, that's not what the error message is telling you. The error message has nothing to do with the customer name. It's about the terms name. The error:
invalid reference to QuickBooks ****Term**** "Client, Test"
(Emphasis on Term mine). The error message isn't about how the customer is named, it's about how the terms are named.
Terms are usually something like Net 30 or Due on Receipt. They should not be the same as the customer name.
TLDR: Fix your qbXML to send a valid TermRef/FullName value:
<TermsRef>
<FullName>Client, Test</FullName>
</TermsRef>
Bill payment add cannot find matching bill in Enteprise 14 and the bill does exist for the customer. Could it have something to do with the length of the bill number? Please see XML below.
<OUTGOING>
<?xml version="1.0" encoding="ISO-8859-1"?><!DOCTYPE QBXML PUBLIC '-//INTUIT//DTD QBXML QBD 12.0//EN' ><QBXML><QBXMLMsgsRq onError = "continueOnError"><BillQueryRq><RefNumberRangeFilter><FromRefNumber>February Publisher P</FromRefNumber><ToRefNumber>February Publisher P</ToRefNumber></RefNumberRangeFilter><PaidStatus>NotPaidOnly</PaidStatus></BillQueryRq></QBXMLMsgsRq></QBXML>
</OUTGOING>
<RETURNS>
<QBXML>
<QBXMLMsgsRs>
<BillQueryRs statusCode="1" statusSeverity="Info" statusMessage="A query request did not find a matching object in QuickBooks" />
</QBXMLMsgsRs>
</QBXML>
</RETURNS>
I can't get this to work either. It appears to be a bug in the Bill Query ref number range filter. The query works OK if the ref number range filter is removed.
The filter also works if you use (SOF cuts of part of the answer)
StartsWithFebruary Publisher P
I try this code it's work.(now, I can add Name : TestCustomer3)
And I want to add other data to Quickbook.
Can you Help me about qbXML Language.
Example : I want to add "Company Name", "Full Name", "Bill To"
Example Code
string input = #"<?xml version=""1.0"" encoding=""utf-8""?>
<?qbxml version=""2.0""?>
<QBXML>
<QBXMLMsgsRq onError=""stopOnError"">
<CustomerAddRq requestID=""15"">
<CustomerAdd>
<Name>TestCustomer3</Name> <!-- required -->
</CustomerAdd>
</CustomerAddRq>
</QBXMLMsgsRq>
</QBXML>";
The appropriate place to find this information is in the QuickBooks OSR:
https://developer-static.intuit.com/qbSDK-current/Common/newOSR/index.html
To use the un-Intuit-ive QuickBooks OSR (pun intended) you should:
Use the "Select Message" drop-down box from the top of the screen to choose a command/request type
Click the "XML Ops" tab to view the XML request and response
Note that the XML request/response will be jumbled together a little, so make sure you look at the XML carefully to determine where the request ends, and the response starts.
We also have some other QuickBooks qbXML examples on our QuickBooks integration wiki.
The info can be found by reviewing the on screen reference for QBXML
https://developer-static.intuit.com/qbSDK-current/Common/newOSR/index.html
thanks
I've edited the question to make it more clean and focused now that I've investigated more.
Syncing orders are working for today's date and future dates, but not for dates in the past. I'm testing now directly in the API explorer.
Here is the add order request and response:
<!--Add order request-->
<Add xmlns="http://www.intuit.com/sb/cdm/v2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
RequestId="ecc53f53d70f0a52de4c88021721ba32"
xsi:schemaLocation="http://www.intuit.com/sb/cdm/v2 ./RestDataFilter.xsd ">
<OfferingId>ipp</OfferingId>
<ExternalRealmId>688875295</ExternalRealmId>
<Object xsi:type="SalesOrder">
<Header>
<DocNumber>6</DocNumber>
<TxnDate>2010-12-25</TxnDate>
<CustomerId idDomain="QB">4</CustomerId>
<SalesRepId idDomain="QB">1</SalesRepId>
</Header>
<Line>
<ItemId idDomain="QB">1</ItemId>
<Qty>6</Qty>
</Line>
</Object>
</Add>
<!--Add order response-->
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<RestResponse xmlns="http://www.intuit.com/sb/cdm/v2">
<Success RequestId="ecc53f53d70f0a52de4c88021721ba32">
<ObjectRef>
<Id idDomain="NG">802721</Id>
<SyncToken>1</SyncToken>
<LastUpdatedTime>2013-04-29T15:26:53Z</LastUpdatedTime>
</ObjectRef>
<RequestName>SalesOrderAdd</RequestName>
<ProcessedTime>2013-04-29T15:26:53Z</ProcessedTime>
</Success>
</RestResponse>
Here is the sync status and sync activity. There was only one entity with SalesOrder, but the times don't match up, so I don't believe its referencing the same order that I added via API explorer. Also, the order that I added did not appear in Quickbooks also.
<SyncStatusResponse>
<NgIdSet>
<NgId>802721</NgId>
<NgObjectType>SalesOrder</NgObjectType>
</NgIdSet>
<RequestId>DB7F4BF877006079E040900A0F1B14C1</RequestId>
<StateCode>8</StateCode>
<StateDesc>Record netted with QB</StateDesc>
<MessageCode>70</MessageCode>
<MessageDesc>MBL Netter success using QB SDK ext_ack_id</MessageDesc>
<ResponseLogTMS>2013-04-29T15:38:02.0Z</ResponseLogTMS>
</SyncStatusResponse>
<SyncActivityResponse>
<SyncType>Writeback</SyncType>
<StartSyncTMS>2013-04-10T12:42:21.0</StartSyncTMS>
<EndSyncTMS>2013-04-29T08:38:02.0</EndSyncTMS>
<EntityName>SalesOrder</EntityName>
<EntityRowCount>20</EntityRowCount>
</SyncActivityResponse>
From the sync status response, state code 8 means
Record netted. Synchronized. Object created in Data Services. Sync Manager has acknowledged synchronizing the object and mapped its NG ID to a QB ID in QuickBooks. Equivalent to StateCode 1 (for object created in QuickBooks).
Message code 70 seems to be ok base on its description, but it wasn't listed in the documentation.
In Quickbooks Destop, by default only the current Fiscal year transactions are displayed. Could you try changing the Date filter to "All", to see if the Sales Order made it ?
So your Request is succeeding but you are not seeing it in QuicKBooks after sync is run.
Check the sync status of the object, or you can see all the sync activity by calling these APIS
http://docs.developer.intuit.com/0025_Intuit_Anywhere/0050_Data_Services/v2/0500_QuickBooks_Windows/0600_Object_Reference/SyncActivity
http://docs.developer.intuit.com/0025_Intuit_Anywhere/0050_Data_Services/v2/0500_QuickBooks_Windows/0600_Object_Reference/SyncStatus
Even though your request succeeded, before it can by synced to QuickBooks it must pass the business rules to be created/updated on the desktop.
If your object encountered an error (lets say it was a duplicate) then you can add an errored object filter on your query to query for it as well.
regards
Jarred
is there any server available that i can use for getting zip codes on the basis on city/state ?
Thanks
You can use geonames postal code search. For example:
http://ws.geonames.org/postalCodeSearch?adminCode1=CA&placename=San+Francisco&maxRows=3
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<geonames>
<totalResultsCount>76</totalResultsCount>
<code>
<postalcode>94102</postalcode>
<name>San Francisco</name>
<countryCode>US</countryCode>
<lat>37.781334</lat>
<lng>-122.416728</lng>
<adminCode1>CA</adminCode1>
<adminName1>California</adminName1>
<adminCode2>075</adminCode2>
<adminName2>San Francisco</adminName2>
<adminCode3/>
<adminName3/>
</code>
<code>
<postalcode>94103</postalcode>
<name>San Francisco</name>
<countryCode>US</countryCode>
<lat>37.77254</lat>
<lng>-122.414664</lng>
<adminCode1>CA</adminCode1>
<adminName1>California</adminName1>
<adminCode2>075</adminCode2>
<adminName2>San Francisco</adminName2>
<adminCode3/>
<adminName3/>
</code>
<code>
<postalcode>94107</postalcode>
<name>San Francisco</name>
<countryCode>US</countryCode>
<lat>37.762147</lat>
<lng>-122.397099</lng>
<adminCode1>CA</adminCode1>
<adminName1>California</adminName1>
<adminCode2>075</adminCode2>
<adminName2>San Francisco</adminName2>
<adminCode3/>
<adminName3/>
</code>
</geonames>
You can use the US Postal Service HTTP/XML API
According to this page on the US Postal Service website which documents their XML based web API, specifically Section 3.0 (page 13) of this PDF document, they have a URL where you can send an XML request containing an address minus the Zip Code and they will respond with an XML document containing the complete address.
You can't do a lookup with just a city and state though, because a single city can contain multiple ZIP codes, so you need to pass the street address as well.
According to their documentation, this is what your request would look like:
GET http://SERVERNAME/ShippingAPITest.dll?API=ZipCodeLookup&XML=<ZipCodeLookupRequest%20USERID="xxxxxxx"><Address ID="0"><Address1></Address1> <Address2>6406 Ivy Lane</Address2><City>Greenbelt</City><State>MD</State></Address></ZipCodeLookupRequest>
And here's what you would receive back:
<?xml version="1.0"?>
<ZipCodeLookupResponse>
<Address ID="0">
<Address2>6406 IVY LN</Address2>
<City>GREENBELT</City>
<State>MD</State>
<Zip5>20770</Zip5>
<Zip4>1441</Zip4>
</Address>
</ZipCodeLookupResponse>
USPS does require that you register with them before you can use the API, but, as far as I could tell, there is no charge for access. By the way, their API has some other features: you can do Address Standardization and Zip Code Lookup, as well as the whole suite of tracking, shipping, labels, etc.