ruckus / quickbooks-ruby Goto Github PK
View Code? Open in Web Editor NEWQuickbooks Online REST API V3 - Ruby
License: MIT License
Quickbooks Online REST API V3 - Ruby
License: MIT License
Hi, since, quickbooks
gem was supporting QBD V2
, I am curious, does this gem support QBD V3? Can anyone please help me connecting QBD V3 with rails.
Is there anyway I can create a persistent connection between our app and QBO without requiring the "Connect to QuickBooks" button or the oauth_callback token & secret or atleast persisting it to the DB or saving as constants (realmID, etc) in the app after getting it once or do they have a preset TTL?
Hey there, so I'm working with this gem heavily now and I'm wondering if it would make sense to implement some kind of "hardy service" like the Harvested
gem has... essentially instead of throwing an error when the server rate-limits the calls, it would detect the rate limiting and wait the appropriate amount of time before calling the same request over again.
Thoughts on a mechanism like this?
Getting this error, even though I'm not invoking the PhysicalAddress model at all.
ArgumentError (lat: invalid value for Float(): "INVALID" for class Quickbooks::Model::PhysicalAddress for class Quickbooks::Model::Invoice):
Either with or without support for pagination?
You can call enumerable methods on #entries, but it seems like the collection should implement it, even if it just delegates 'each' to entries.
It seems easy to add an #each, and get a lot of nice stuff.
If you make a query without setting the realm, you just get "RuntimeError: HTTP Error Code: 404" with a HTML error message from Intuit. I can imagine a few reasonable things that could happen:
If you tell me which you think is best, I'll be happy it implement it.
Don't have time to write specs right now, but I've got journal entries implemented and working. Would you want a PR with just the code and no specs or would you rather I wait?
To make a new customer, for instance, you (I think) say:
Quickbooks::Model::Customer.new(
...
primary_email_address: Quickbooks::Model::EmailAddress.new("[email protected]"),
primary_phone: Quickbooks::Model::TelephoneNumber.new(free_form_number: "123.123.1234")
It seems like at the least, either phone number should be able to be initialized with a string, or email address should be able to be initialized with a hash. Perhaps each should take both.
Thoughts?
Is there currently any way to create more that 1 TimeActivity record per request?
Hey Guys:
Seeing an issue when trying to update the :track_quantity_on_hand field in the Item. So for instance, if I want to set that particular field to True, and I assign a date value to the :inv_start_date field in addition to assigning a BigDecimal value to the :quantity_on_hand field, and then when I call the .update on the Item Service, I get the below error. I've done a bit of research and I'm thinking this may be an error on QB's side but not completely positive. Has anyone seen this error before?
Quickbooks::IntuitRequestException: An application error has occurred while processing your request:
System Failure Error: java.lang.NullPointerException
from /Users/sunnyisrani/.bundler/ruby/1.9.1/quickbooks-ruby-141059e9b88b/lib/quickbooks/service/base_service.rb:258:in parse_and_raise_exception' from /Users/sunnyisrani/.bundler/ruby/1.9.1/quickbooks-ruby-141059e9b88b/lib/quickbooks/service/base_service.rb:243:in
check_response'
from /Users/sunnyisrani/.bundler/ruby/1.9.1/quickbooks-ruby-141059e9b88b/lib/quickbooks/service/base_service.rb:212:in do_http' from /Users/sunnyisrani/.bundler/ruby/1.9.1/quickbooks-ruby-141059e9b88b/lib/quickbooks/service/base_service.rb:176:in
do_http_post'
from /Users/sunnyisrani/.bundler/ruby/1.9.1/quickbooks-ruby-141059e9b88b/lib/quickbooks/service/service_crud.rb:47:in update' from (irb):17 from /Users/sunnyisrani/.rvm/gems/ruby-1.9.3-p448/gems/railties-4.0.0/lib/rails/commands/console.rb:90:in
start'
from /Users/sunnyisrani/.rvm/gems/ruby-1.9.3-p448/gems/railties-4.0.0/lib/rails/commands/console.rb:9:in start' from /Users/sunnyisrani/.rvm/gems/ruby-1.9.3-p448/gems/railties-4.0.0/lib/rails/commands.rb:64:in
<top (required)>'
from bin/rails:4:in require' from bin/rails:4:in
As far as I can tell, this is a bug with the API, but I figured that someone that uses this library may have dealt with the problem before.
Here's the Stack Overflow question with the details.
Hi!
Thanks for the gem ๐ป!
I've been trying to query the Item service like this:
item_service.query "select * from Item where Name = 'Something'"
But I always get:
IntuitRequestException: An application error has occurred while processing your request
Regardless of the presence of the record.
This is what the request looks like:
RESOURCE = https://qb.sbfinance.intuit.com/v3/company/<id>/query?query=select%20*%20from%20Item%20where%20Name%20=%20'Something'%20STARTPOSITION%201%20MAXRESULTS%2020
BODY(Hash) = {}
HEADERS = {"Content-Type"=>"application/xml"}
I've managed to successfully perform this request on the APIExplorer, and the request created by your gem looks perfect.
Do you have any suspicion on what might be happening?
First, thank you for creating this gem. It's a huge help for me!
quickbooks-ruby has a runtime dependency on Nokogiri ~>1.5.9. Is there a reason it can't be bumped to 1.6.1?
The 1.6.0 release of Nokogiri was a big one, as it now "compiles libxml2 and libxslt with the gem. This should fix most installation issues." The 1.5.9 dependency in a Rails Gemfile conflicts with gems with runtime dependencies on more recent versions of Nokogiri - capybara
and roo
to name two.
I forked, bumped the version, and ran the specs. Everything passes, but I don't know if there are bigger upstream concerns for quickbooks-ruby.
Payment#line_items should be initialized as an empty array; otherwise it can take payment.line_items << line_item
.
Hi,
We gotta handle lot of records and wanna use Batch operations of Quickbooks API
Does this gem support now/anytime soon?
New to Quickbooks and API-ing it Making good headway with your gem (big Tx) but can't seem to retrieve the line number of bill lines - I can do this for invoices no problem, and I can get various other attributes of the bill line e.g. description.
Still checking my code and not a confident enough developer to be sure but think there may be an issue.
Note. as part of my troubleshoot I checked the intuit API to make sure attributes were mapped OK - it is there. However, I used the API explorer on the Intuit dev site to query a test bill and test invoice - the line numbers do get returned for the invoice but not the bill. Both test records were created in QuickBooks and appear to have line numbers. Is this an Intuit problem?
Is it possible to manually create JournalEntries (Both Debit & Credit)?
Currently this is implemented in the Invoice
entity - add same support to SalesReceipt
Hey Guys:
Not too sure if this error is just specific to my account or not, but when updating a purchase order i get the following error:
System Failure Error: Could not find resource for relative
Has anyone encountered this before?
Hi there. Thanks for a great gem.
A quick question. I would like to serialize and persist the query or query_in_batches result (for debugging purposes). I would normally use Marshal.dump, but Marshal doesn't support singleton_methods (same problem with to_yaml and procs).
Have anyone been able to accomplish something similar?
Hey guys, thank you so much for this library!
I'm trying to figure out how to add a new line item to an existing invoice. Do I use the Invoice Service? Or the Item Service? If you have any reference URLs for me, I'd be most appreciative.
Thanks in advance for your help for rookies like me :)
I get a XPath::SyntaxError on parsing a sales receipt. I don't know xpath too well but looking into it.
The sales receipt is created
Any suggestions?
Exception:
Nokogiri::XML::XPath::SyntaxError: Undefined namespace prefix: //xmlns:IntuitResponse/xmlns:SalesReceipt
from /Users/jwils/.rvm/gems/ruby-2.0.0-p353@intuit_clover/gems/nokogiri-1.5.11/lib/nokogiri/xml/node.rb:159:in `evaluate'
from /Users/jwils/.rvm/gems/ruby-2.0.0-p353@intuit_clover/gems/nokogiri-1.5.11/lib/nokogiri/xml/node.rb:159:in `block in xpath'
from /Users/jwils/.rvm/gems/ruby-2.0.0-p353@intuit_clover/gems/nokogiri-1.5.11/lib/nokogiri/xml/node.rb:150:in `map'
from /Users/jwils/.rvm/gems/ruby-2.0.0-p353@intuit_clover/gems/nokogiri-1.5.11/lib/nokogiri/xml/node.rb:150:in `xpath'
Steps to reproduce
service = Quickbooks::Service::SalesReceipt.new
service.company_id = [relm_id]
service.access_token = [access_token]
line = Quickbooks::Model::Line.new
line.line_num = 1
line.description = "My first order."
line.amount = 4.00
line.detail_type = 'SalesItemLineDetail'
detail = Quickbooks::Model::SalesItemLineDetail.new
line.sales_item_line_detail = detail
detail.unit_price = 4.00
detail.quantity = 1
receipt = Quickbooks::Model::SalesReceipt.new
receipt.line_items = [line]
receipt.placed_on = Time.now
service.create(receipt)
IntuitRequestException: Invalid query:
QueryValidationError: value 1500 is too large. Max allowed value is 1000
The relevant line is in base_service.rb line 100. When calculating max_results you shouldn't multiply by the page number. That will keep increasing the max_results value until it overruns the maximum value allowed by Quickbooks online.
I believe the line should be:
max_results = per_page
I've been trying to create a SalesReceipt unsuccessfully. I've looked at the spec examples, but I keep running into a few errors.
each' for #<Quickbooks::Model::Line:0x007fac35488558> if I add
Model::Line` as given in the specs.to_xml
for "[email protected]":String`It looks like QBO recently exposed a reports API. I'd like to take a stab at implementing some of the more important reports (Balance Sheet, P&L).
Any tips as to approach? I was planning to create a Report base class and inherit for the individual reports, but I'm not sure how much is shared.
The Rails 4.1 session api changed a bit, so you'd have to use
session[:qb_request_token] = Marshal.dump(token)
and
at = Marshal.load(session[:qb_request_token]).get_access_token(:oauth_verifier => params[:oauth_verifier])
I'll be happy to make a PR, if you like.
I did't see StringValue on custom_field.rb model.
how can I assign value when I create invoice?
Thanks!
When I try to create an Invoice, I am getting the following error:
/Users/dlindahl/app/qbo/.bundle/gems/quickbooks-ruby-0.0.5/lib/quickbooks/service/base_service.rb:268:in `parse_and_raise_exception': An application error has occurred while processing your request: (IntuitRequestException)
System Failure Error: Bad arguments passed to public com.intuit.schema.finance.v3.IntuitResponse com.intuit.qbo.servicev3.rest.Customer.create(java.lang.String,com.intuit.schema.finance.v3.Customer,java.lang.String,java.lang.String,java.lang.String) throws com.intuit.qbo.servicev3.FdmException ( java.lang.String 1032845425, com.intuit.schema.finance.v3.Invoice com.intuit.schema.finance.v3.Invoice@59687eb7, null, null, null )
from /Users/dlindahl/app/qbo/.bundle/gems/quickbooks-ruby-0.0.5/lib/quickbooks/service/base_service.rb:255:in `check_response'
from /Users/dlindahl/app/qbo/.bundle/gems/quickbooks-ruby-0.0.5/lib/quickbooks/service/base_service.rb:228:in `do_http'
from /Users/dlindahl/app/qbo/.bundle/gems/quickbooks-ruby-0.0.5/lib/quickbooks/service/base_service.rb:194:in `do_http_post'
from /Users/dlindahl/app/qbo/.bundle/gems/quickbooks-ruby-0.0.5/lib/quickbooks/service/service_crud.rb:17:in `create'
from /Users/dlindahl/app/qbo/lib/qbo/tasks/invoicing.rb:63:in `create'
from /Users/dlindahl/app/qbo/.bundle/gems/thor-0.18.1/lib/thor/command.rb:27:in `run'
from /Users/dlindahl/app/qbo/.bundle/gems/thor-0.18.1/lib/thor/invocation.rb:120:in `invoke_command'
from /Users/dlindahl/app/qbo/.bundle/gems/thor-0.18.1/lib/thor.rb:363:in `dispatch'
from /Users/dlindahl/app/qbo/.bundle/gems/thor-0.18.1/lib/thor/base.rb:439:in `start'
from bin/qbo:5:in `<main>'
Any ideas what I'm missing or might be doing wrong?
The invoice and line item validations return true
if that helps weed out anything.
Is there anyway I can create a payment against a specific invoice id? I was looking at payment.rb, but wasn't sure where to set the invoice id. Any ideas?
Hi, I raised 130 - turned out to be an Intuit bug, but I now need the customer currency and it is in the response but doesn't seem to come through the model. I can get it fine (as the name and value hash) for the other entities where I need it i.e. vendors, invoice lines and bill lines.
e.g. fake company below
------ QUICKBOOKS-RUBY REQUEST ------
METHOD = get
RESOURCE = https://qb.sbfinance.intuit.com/v3/company/1230511455/customer/5
REQUEST BODY:
{}
REQUEST HEADERS = {"Content-Type"=>"application/xml", "Accept"=>"application/xml", "Accept-Encoding"=>"gzip, deflate"}
Completed 200 OK in 1545ms (Views: 1.1ms | ActiveRecord: 27.7ms)
------ QUICKBOOKS-RUBY RESPONSE ------
RESPONSE CODE = 200
RESPONSE BODY:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<IntuitResponse xmlns="http://schema.intuit.com/finance/v3" time="2014-06- 30T05:00:18.470-07:00">
<Customer domain="QBO" sparse="false">
<Id>5</Id>
<SyncToken>1</SyncToken>
<MetaData>
<CreateTime>2014-06-23T08:49:53-07:00</CreateTime>
<LastUpdatedTime>2014-06-23T08:53:04-07:00</LastUpdatedTime>
</MetaData>
<FullyQualifiedName>Delta Services ltd.</FullyQualifiedName>
<CompanyName>Delta Services ltd.</CompanyName>
<DisplayName>Delta Services ltd.</DisplayName>
<PrintOnCheckName>Delta Services ltd.</PrintOnCheckName>
<Active>true</Active>
<Taxable>false</Taxable>
<Job>false</Job>
<BillWithParent>false</BillWithParent>
<Balance>0</Balance>
<BalanceWithJobs>0</BalanceWithJobs>
<CurrencyRef name="British Pound Sterling">GBP</CurrencyRef>
<PreferredDeliveryMethod>Email</PreferredDeliveryMethod>
{"id"=>5, "sync_token"=>1, "meta_data"=>{"create_time"=>2014-06-23 16:49:53 +0100, "last_updated_time"=>2014-06-23 16:53:04 +0100}, "title"=>nil, "given_name"=>nil, "middle_name"=>nil, "family_name"=>nil, "company_name"=>"Delta Services ltd.", "display_name"=>"Delta Services ltd.", "print_on_check_name"=>"Delta Services ltd.", "active?"=>true, "primary_phone"=>nil, "alternate_phone"=>nil, "mobile_phone"=>nil, "fax_phone"=>nil, "primary_email_address"=>nil, "web_site"=>nil, "billing_address"=>nil, "shipping_address"=>nil, "job"=>"false", "bill_with_parent"=>"false", "parent_ref"=>nil, "level"=>nil, "sales_term_ref"=>nil, "payment_method_ref"=>nil, "balance"=>#<BigDecimal:7ff5f1b7edc0,'0.0',9(18)>, "open_balance_date"=>nil, "balance_with_jobs"=>#<BigDecimal:7ff5ed890130,'0.0',9(18)>, "preferred_delivery_method"=>"Email", "resale_num"=>nil, "suffix"=>nil, "fully_qualified_name"=>"Delta Services ltd.", "taxable"=>"false", "notes"=>nil}
I'm sure not whether this is bug or not. Here is my code of creating an invoice:
def create_invoice_test
current_user.invoices do |invoice|
data = {
"Line" => [
{
"Amount" => 100.00,
"DetailType" => "SalesItemLineDetail", "SalesItemLineDetail" => {"ItemRef" => {value: 1, name: "Services"}}
}
],
"CustomerRef" => {value: 21}
}
consumer = create_consumer
response = consumer.post "https://quickbooks.api.intuit.com/v3/company/#{my_company_id}/invoice", data
p "-------response:-------", response
end
end
def create_consumer
access_token = current_user.organization.qb_access_token
access_token_secret = current_user.organization.qb_access_token_secret
OAuth::AccessToken.new(QuickBooksHelper.oauth_consumer, access_token, access_token_secret)
end
It doesn't print anything. What am I doing wrong? How do I create an invoice?
Yes, I'm using quickbooks-ruby gem.
There doesn't seem to be a way to set the Invoice terms and to_be_email variable to allow email delivery in this version as there were in Quickeebooks.
I keep getting this when it hits: created_invoice = service.create(invoice)
NoMethodError (undefined method 'each' for #<Quickbooks::Model::InvoiceLineItem:0x007ffadb78f310>): lib/quickbooks_api/model/base_model.rb:14:in 'to_xml_inject_ns' lib/quickbooks_api/model/base_model.rb:26:in 'to_xml_ns' lib/quickbooks_api/service/service_crud.rb:20:in 'create'
Refund receipts were just recently added to the api, docs can be found here.
An app I am working on requires this integration so I have forked the repo and will take a stab at adding support myself.
I am trying to search a customer with an apostrophe in the name. The query that the query explorer generates is
Select * from customer where companyname %3D'mcgee%5C's'
which returns the correct data. The gem generates the following query which fails
Select+*+from+customer+where+companyname+%3D%27mcgee%255C%27s%27
The query builder uses URI.encode_www_form_component to generate the proper encoded string but i think apostrophes need to be ignored.
Is this service should be implemented in the future or with V3 there is another way to disconnect or reconnect company account?
Never mind, getting an error for another reason.
It feels like there should be a standard way to page through a Quickbooks::Collection
instance.
I'm currently using something like this pattern most of the time.
page = 1
begin
results = Vendor.query(nil, page: page, per_page: 1_000)
results.entries.each do |entry|
# ...
end
page += 1
end until results.count < per_page
I'd be happy to implement the feature but wanted to get thoughts from others about the design before I start. Is this something that others would want to? Are there any thoughts about the design?
Is it possible to set a customer_id (for eg: their unique user_id in the Rails app), so that we can also generate Invoices / Sales Receipt for the customer with the same id?
If we can't, are there any other ways to creating Invoices / Sales receipts for particular customers?
Usecase: I'll be creating customers on QBO only after they initiate a transaction, and later on refer to the recently created customer_id to record payment / generate invoices / sales receipts, etc.
Great to have so many contributors. Can we get an instance of CircleCI setup to ensure the tests are passing?
Not an issue per se, but I figured I'd post my methodology for getting ALL records from a given service using the drained
design pattern.
Lets take customers for instance. I've got more than 1000 customers, so I'm going to have to make more than one API call to get these customers. Here's how I'm doing it:
class QuickbooksHelper
def self.all_customers
all('Customer')
end
def self.all(model)
drained = false
page = 1
count = 1000
v = []
while !drained
res = new_service(model).query("Select * From #{model}", :page => page, :per_page => count)
v.concat(res.entries)
page = page + 1
drained = true if res.entries.count < count
end
v
end
def self.new_service(name)
service_class = "Quickbooks::Service::#{name}".split('::').inject(Object) {|o,c| o.const_get c}
service_class.new(access_token: access_token, company_id: REALM)
end
end
# Now I can get all customers by using:
QuickbooksHelper.all_customers
Wondering if this might be something we might want to integrate into the base service class so that we can do something like:
customers_service = Quickbooks::Service::Customer.new
all_customers = customers_service.all
This would provide a more "activerecord" style interface for getting all the results from the api. If we don't integrate it into the base service class, at least this comment is here for people to reference ๐
I'm not sure if I'm providing an incorrect object, but when creating a customer, I set the primary email address as a string. The email address validation looks for: primary_email_address.address (see here: https://github.com/ruckus/quickbooks-ruby/blob/master/lib/quickbooks/util/name_entity.rb#L23)
Is the validation wrong, or how should I be setting the email address?
Hello! While working with the gem, we noticed it is locked to the last version of nokogiri that supports 1.8.7. However, when you do a fresh install of the gem, it grabs the latest activemodel (and activesupport) that only supports 1.9.3.
Is there a reason why REE support is being kept in?
Hi,
I tried create company with name Children's
and got error
Display name :display_name cannot contain a colon (:).
also, can you update gem in rubygems
QueryBuilder not available from there.
Thanks!
There are 2 related issues:
BatchRequest#add
does not take options (e.g. sparse). Changing that seems non-trivial.Customer#delete
, the batch operation should be smart enough to inactivate a Name List Entity instead of deleting it. When the operation is set to "delete", BatchRequest#add
can covert the operation to "update" and set active = false
as a sparse update.when you try select Customer with Name = 'Children's etc....'
request like this - you get an error
customer = @service.query("SELECT * FROM CUSTOMER WHERE DisplayName = '#{company.name[0..49]}'").entries.first
if you try use gsub("'", "'") for escape quote it's doesn't work correct
Support the JSON Api.
I've got a Python script which is supposed to upload files to Quick Books by their API. I've faced into some issues which I couldn't have solved such as "This type can't be consumed" (for application/pdf, xml and others) or when I used "multipart/form-data" it said "Could find no content-disposition header with in a part" or when I'd changed it a bit, it seemed to work well (there were no errors in the response) but the attachments weren't really uploaded.
I'd like to upload a file (pdf, jpeg, xls....) using this gem to make sure it really works well and there is no mistake in the API of Quick Books. I'm familiar with this gem but didn't find a model or service in its source code which looked like the one I was looking for (Attachable, File or something else).
So is there any simple example?
I am getting following errors, when I am trying to instantiate a customer service:
service = Quickbooks::Service::Customer.new
NameError: uninitialized constant Quickbooks
[NOTE: Quickbooks connection is successful and is able to generate new access_token, access_secret and realmid].
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.