##### INSTRUCTIONS #####
set up a new quickbooks company, skip the assistant, don't create accounts, don't track inventory or time, don't set up taxes, so do as little configuration as possible, then import the file initial_import.iif, it will create the accounts necessary, the payment methods, and the shipping options. you can open the file with excel and change shipping options and/or tax rate, the set up is configured for california taxes.
then adjust the three files orders_controller.rb, order.rb, and list.rhtml as described below:
##### controllers/admin/orders_controller.rb line 277-343 #####
def download
@orders = Order.find(params[:ids])
case params[:format]
when 'iif'
content = Order.get_qb_for_orders(@orders)
when 'xml'
content = Order.get_xml_for_orders(@orders)
when 'csv'
content = Order.get_csv_for_orders(@orders)
end
directory = File.join(RAILS_ROOT, "public/assets/order_files")
file_name = Time.now.strftime("%m_%d_%Y_%H-%M")
file = "#{file_name}.#{params[:format]}"
save_to = "#{directory}/#{file}"
# make sure we have the directory to write these files to
if Dir[directory].empty?
FileUtils.mkdir_p(directory)
end
# write the file
File.open(save_to, "w") { |f| f.write(content) }
send_file(save_to, :type => "text/#{params[:format]}")
end
def download_all
@list_options = @@list_options.clone
@viewing_by = params[:key]
case @viewing_by
when @list_options[0]
conditions = 'order_status_code_id = 5'
when @list_options[2]
conditions = 'order_status_code_id = 5
OR order_status_code_id = 6
OR order_status_code_id = 7'
end
@orders = Order.find(:all, :conditions => conditions, :order => 'created_on DESC')
case params[:format]
when 'iif'
content = Order.get_qb_for_orders(@orders)
when 'xml'
content = Order.get_xml_for_orders(@orders)
when 'csv'
content = Order.get_csv_for_orders(@orders)
end
directory = File.join(RAILS_ROOT, "public/assets/order_files")
file_name = Time.now.strftime("%m_%d_%Y_%H-%M")
file = "#{file_name}.#{params[:format]}"
save_to = "#{directory}/#{file}"
# make sure we have the directory to write these files to
if Dir[directory].empty?
FileUtils.mkdir_p(directory)
end
# write the file
File.open(save_to, "w") { |f| f.write(content) }
send_file(save_to, :type => "text/#{params[:format]}")
end
##### models/order.rb line 226-268 quickbooks export #####
def self.get_qb_for_orders(order_list)
@inventory = Item.find(:all)
iif = "!INVITEM\tNAME\tINVITEMTYPE\tDESC\tPURCHASEDESC\tACCNT\tASSETACCNT\tCOGSACCNT\tQNTY\tQNTY\tPRICE\tCOST\tTAXABLE\tSALESTAXCODE\tPAYMETH\tTAXVEND\tPREFVEND\tREORDERPOINT\tEXTRA\tCUSTFLD1\tCUSTFLD2\tCUSTFLD3\tCUSTFLD4\tCUSTFLD5\tDEP_TYPE\tISPASSEDTHRU\tHIDDEN\tDELCOUNT\tUSEID\tISNEW\tPO_NUM\tSERIALNUM\tWARRANTY\tLOCATION\tVENDOR\tASSETDESC\tSALEDATE\tSALEEXPENSE\tNOTES\tASSETNUM\tCOSTBASIS\tACCUMDEPR\tUNRECBASIS\tPURCHASEDATE\r\n"
for qbitem in @inventory
iif << "INVITEM\t#{qbitem.code}\tINVENTORY\t#{qbitem.name}\t\tIncome Account\t\t\t\t\t#{qbitem.price}\t\tY\tTax\t\t\t\t\t\t\t\t\t\t\t0\tN\tN\t0\tN\tY\t\t\t\t\t\t\t\t0\t\t\t0\t0\t0\r\n"
end
iif << "!CUST\tNAME\tBADDR1\tBADDR2\tBADDR3\tBADDR4\tBADDR5\tSADDR1\tSADDR2\tSADDR3\tSADDR4\tSADDR5\tPHONE1\tEMAIL\tFIRSTNAME\tLASTNAME\r\n"
for order in order_list
saddress = order.shipping_address
baddress = order.billing_address
logger.error "#{order.id}"
logger.error "#{order.order_number}"
iif << "CUST\t#{baddress.first_name} #{baddress.last_name}\t#{baddress.address}\t#{baddress.city}\t#{baddress.state}\t#{baddress.zip}\t#{baddress.country.name}\t#{saddress.address}\t#{saddress.city}\t#{saddress.state}\t#{saddress.zip}\t#{saddress.country.name}\t#{baddress.telephone}\t#{order.order_account.order_user.email_address}\t#{baddress.first_name}\t#{baddress.last_name}\r\n"
end
iif << "!TRNS\tTRNSID\tTRNSTYPE\tDATE\tACCNT\tNAME\tCLASS\tAMOUNT\tDOCNUM\tMEMO\tCLEAR\tTOPRINT\tNAMEISTAXABLE\tADDR1\tADDR2\tADDR3\tADDR4\tADDR5\tPAID\tSADDR1\tSADDR2\tSADDR3\tSADDR4\tSADDR5\r\n"
iif << "!SPL\tSPLID\tTRNSTYPE\tDATE\tACCNT\tNAME\tCLASS\tAMOUNT\tDOCNUM\tMEMO\tCLEAR\tQNTY\tPRICE\tINVITEM\tPAYMETH\tTAXABLE\tVALADJ\tREIMBEXP\tEXTRA\r\n"
iif << "!ENDTRNS\r\n"
for order in order_list
saddress = order.shipping_address
baddress = order.billing_address
if order.tax_cost != 0
istaxable = "Y"
else
istaxable = "N"
end
iif << "TRNS\t\tINVOICE\t#{order.created_on.strftime('%m/%d/%y')}\tAccounts Receivable\t#{baddress.first_name} #{baddress.last_name}\t\t#{'%.2f' % order.total}\t#{order.order_number}\t\tN\tY\t#{istaxable}\t#{baddress.address}\t#{baddress.city}\t#{baddress.state}\t#{baddress.zip}\t#{baddress.country.name}\tN\t#{saddress.address}\t#{saddress.city}\t#{saddress.state}\t#{saddress.zip}\t#{saddress.country.name}\r\n"
for oitem in order.order_line_items
if Item.find(oitem.item_id)
logger.error "#{order.id}"
logger.error "#{order.order_number}"
iif << "SPL\t\tINVOICE\t#{order.created_on.strftime('%m/%d/%y')}\tIncome Account\t\t\t-#{oitem.unit_price * oitem.quantity}\t\t#{oitem.name}\tN\t-#{oitem.quantity}\t#{oitem.unit_price}\t#{Item.find(oitem.item_id).code}\t\t#{istaxable}\tN\tNOTHING\r\n"
logger.error "#{order.id}"
logger.error "#{order.order_number}"
end
end
iif << "SPL\t\tINVOICE\t#{order.created_on.strftime('%m/%d/%y')}\tPostage and Delivery\t\t\t-#{order.shipping_cost}\t\t\tN\t\t\tShipping\t\t#{istaxable}\tN\tNOTHING\r\n"
if order.tax_cost != 0
iif << "SPL\t\tINVOICE\t#{order.created_on.strftime('%m/%d/%y')}\tSales Tax Payable\tTaxAgencyVendor\t\t-#{'%.2f' % order.tax_cost}\t\t\tN\t\t7.75%\tSales Tax\t\tN\tN\tNOTHING\t\t\t\tAUTOSTAX\r\n"
end
iif << "ENDTRNS\r\n"
end
return iif
end
##### models/order.rb line 270-321 dazzle export #####
# Returns an XML string for each order in the order list.
# This format is for sending orders to Tony's Fine Foods
def self.get_xml_for_orders(order_list)
# xml = "\n"
xml = "
<% if params[:key] == "Ready To Ship" || params[:key] == "Completed" then %> <%= link_to "Download (current page): IIF", { :action => 'download', :ids => @orders.collect{|o| o.id}, :format => 'iif' }, :class => 'action' %> <%= link_to "Download (all pages): IIF", { :action => 'download_all', :format => 'iif', :key => params[:key]}, :class => 'action' %> <% end %> <%= link_to "Download (current page): XML", { :action => 'download', :ids => @orders.collect{|o| o.id}, :format => 'xml' }, :class => 'action' %> <%= link_to "Download (current page): CSV", { :action => 'download', :ids => @orders.collect{|o| o.id}, :format => 'csv' }, :class => 'action' %>
##### END #####