Web コネクタを使用して請求書を QuickBooks v13 に追加しています。請求書がまだQuickBooksに追加されていない場合は、請求書を追加するために提供されたロジックも追加しました。
API を自動的に呼び出すように、Web コネクタの AutoRun オプションを設定した場合。追加する請求書が 1 つしかない場合、最初の実行では問題なく動作します。しかし、webconnector による 2 回目の呼び出しでは、QuickBooks の請求書の検索結果が statusCode="0" のレコードを送信します。これは、既に存在していることを意味しますが、同じ請求書を QuickBooks に再度追加したことを意味します。同じ請求書を複数回追加することを制限できません
以下は、請求書を QuickBooks に挿入するための Rails コードです。Railsアプリケーションでqbwc gemを使用してQBXMLリクエストを送信し、レスポンスを解析しています
def api
if request.get?
render :nothing => true
return
end
if params["Envelope"]["Body"].keys.first =="authenticate"
add_invoice #add invoice method will be called to search/add invoice
end
req = request
Rails.logger.info "=== #{ params["Envelope"]["Body"].keys.first} ==="
res = QBWC::SoapWrapper.route_request(req)
Rails.logger.info render :xml => res, :content_type => 'text/xml'
end
# 請求書検索・追加アクション
def add_invoice
#searching the invoice from QuickBooks
QBWC.add_job('search_invoice') do
'<QBXML>
<QBXMLMsgsRq onError="continueOnError">
<InvoiceQueryRq requestID="1">
<RefNumber>58869</RefNumber>
</InvoiceQueryRq>
</QBXMLMsgsRq>
</QBXML>'
end
#response of the search result
QBWC.jobs['search_invoice'].set_response_proc do |r|
if r["xml_attributes"]["statusCode"] == "500" || r["xml_attributes"]["statusCode"] == "1"
#Add the invoice
QBWC.add_job('add_invoice') do
'<QBXML>
<QBXMLMsgsRq onError="continueOnError">
<InvoiceAddRq requestID="58869">
<InvoiceAdd>
<CustomerRef>
<ListID>8000000D-1365397507</ListID>
<FullName>john.doe@test.com</FullName>
</CustomerRef>
<TxnDate>2013-04-08</TxnDate>
<RefNumber>58869</RefNumber>
<BillAddress>
<Addr1>N Dallas Parkway</Addr1>
<City>Addison</City>
<State>TX</State>
<PostalCode>75001</PostalCode>
<Country>United States</Country>
</BillAddress>
<ShipAddress>
<Addr1>N Dallas Parkway</Addr1>
<City>Addison</City>
<State>TX</State>
<PostalCode>75001</PostalCode>
<Country>United States</Country>
</ShipAddress>
<IsPending>true</IsPending>
<PONumber>Test QB</PONumber>
<TermsRef>
<FullName>VISA</FullName>
</TermsRef>
<ShipDate>2013-04-15</ShipDate>
<InvoiceLineAdd>
<ItemRef>
<FullName>test Invoice</FullName>
</ItemRef>
<Desc>test Description</Desc>
<Quantity>1</Quantity>
<Rate>1000</Rate>
</InvoiceLineAdd>
</InvoiceAdd>
</InvoiceAddRq>
</QBXMLMsgsRq>
</QBXML>'
end
end
end
end
Web コネクタの AutoRun オプションを 5 分に設定したので、5 分間隔で自動的に実行され、API が呼び出されます。
RefNumber#58869 の請求書が新しく、QuickBooks に存在しないとします。
WebConnector が API を呼び出すと、RefNumber#58869 の請求書を検索する QBXML リクエストが QuickBooks に送信されます。次の応答が得られます
<?xml version=\"1.0\" ?>\n<QBXML>\n<QBXMLMsgsRs>\n<InvoiceQueryRs requestID=\"1\" statusCode=\"500\" statusSeverity=\"Warn\" statusMessage=\"The query request has not been fully completed. There was a required element ("58869" that could not be found in QuickBooks.\" />\n</QBXMLMsgsRs>\n</QBXML>\n"
その後、請求書が QuickBooks に正常に追加されます
webconnector が 5 分間隔で api を呼び出すと、RefNumber#58869 の請求書を検索する QBXML 要求が QuickBooks に送信されます。次の応答が得られます
<?xml version=\"1.0\" ?>\n<QBXML>\n<QBXMLMsgsRs>\n<InvoiceQueryRs requestID=\"1\" statusCode=\"0\" statusSeverity=\"Info\" statusMessage=\"Status OK\">\n<InvoiceRet>\n<TxnID>15F-1365397789</TxnID>\n<TimeCreated>2013-04-08T10:39:49+05:30</TimeCreated>\n<TimeModified>2013-04-08T10:39:49+05:30</TimeModified>\n<EditSequence>1365397789</EditSequence>\n<TxnNumber>62</TxnNumber>\n<CustomerRef>\n<ListID>8000000D-1365397507</ListID>\n<FullName>john.doe@test.com</FullName>\n</CustomerRef>\n<ARAccountRef>\n<ListID>8000001E-1364292331</ListID>\n<FullName>John Doe</FullName>\n</ARAccountRef>\n<TemplateRef>\n<ListID>80000001-1364291996</ListID>\n<FullName>Intuit Product Invoice</FullName>\n</TemplateRef>\n<TxnDate>2013-04-08</TxnDate>\n<RefNumber>58869</RefNumber>\n<BillAddress>\n<Addr1>16001 N Dallas Parkway</Addr1>\n<City>Addison</City>\n<State>TX</State>\n<PostalCode>75001</PostalCode>\n<Country>USA</Country>\n</BillAddress>\n<BillAddressBlock>\n<Addr1>16001 N Dallas Parkway</Addr1>\n<Addr2>Addison, TX 75001</Addr2>\n<Addr3>United States</Addr3>\n</BillAddressBlock>\n<ShipAddress>\n<Addr1>16001 N Dallas Parkway</Addr1>\n<City>Addison</City>\n<State>TX</State>\n<PostalCode>75001</PostalCode>\n<Country>USA</Country>\n</ShipAddress>\n<ShipAddressBlock>\n<Addr1>16001 N Dallas Parkway</Addr1>\n<Addr2>Addison, TX 75001</Addr2>\n<Addr3>United States</Addr3>\n</ShipAddressBlock>\n<IsPending>true</IsPending>\n<IsFinanceCharge>false</IsFinanceCharge>\n<PONumber>United Way</PONumber>\n<TermsRef>\n<ListID>8000000C-1364361757</ListID>\n<FullName>Visa</FullName>\n</TermsRef>\n<DueDate>2013-04-08</DueDate>\n<ShipDate>2013-04-15</ShipDate>\n<Subtotal>67.24</Subtotal>\n<ItemSalesTaxRef>\n<ListID>80000012-1364967363</ListID>\n<FullName>Sales Tax</FullName>\n</ItemSalesTaxRef>\n<SalesTaxPercentage>0.00</SalesTaxPercentage>\n<SalesTaxTotal>0.00</SalesTaxTotal>\n<AppliedAmount>0.00</AppliedAmount>\n<BalanceRemaining>67.24</BalanceRemaining>\n<IsPaid>false</IsPaid>\n<IsToBePrinted>true</IsToBePrinted>\n<IsToBeEmailed>false</IsToBeEmailed>\n<CustomerSalesTaxCodeRef>\n<ListID>80000001-1364291997</ListID>\n<FullName>Tax</FullName>\n</CustomerSalesTaxCodeRef>\n</InvoiceQueryRs>\n</QBXMLMsgsRs>\n</QBXML>\n
ここで、'statusCode' は "0" で、請求書が既に QuickBooks に存在するという応答を意味します。
それでも同じ請求書が再び QuickBooks に追加されました。また、同じ請求書を複数回追加することを制限する解決策を見つけることができません。
「statusCode」を追跡したところ、QuickBooks が正しいステータス コードを送信していることがわかりました。また、注文テーブルにフラグを付けて、注文のために既に追加されている請求書を QuickBooks に追跡するかどうかを確認しています。私の問題は WebConnector にあると思います。WebConnector の AutoRun オプションが有効な場合、QuickBooks に追加する注文が残っていない場合、最後の注文の請求書が何度も追加されます。