##### 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 = "\n" # xml << "\n" for order in order_list if order.order_shipping_type shipping_type = order.order_shipping_type.code else shipping_type = '' end pretty_date = order.created_on.strftime("%m/%d/%y") xml << " \n" xml << " PRIORITY\n" xml << " RECTPARCEL\n" # xml << " " # xml << " #{pretty_date}\n" # xml << " #{shipping_type}\n" xml << " #{order.order_number}\n" # Shipping address address = order.shipping_address # xml << " \n" xml << " #{address.first_name} #{address.last_name}\n" # xml << " #{address.last_name}\n" xml << " #{address.address}\n" # xml << " \n" xml << " #{address.city}\n" xml << " #{address.state}\n" xml << " #{address.zip}\n" xml << " #{address.country.fedex_code}\n" xml << " #{address.telephone}\n" xml << " #{order.order_user.email_address}\n" # xml << " \n" # Items # xml << " \n" # for item in order.order_line_items # xml << " \n" # xml << " #{item.product.name}\n" # xml << " #{item.product.code}\n" # xml << " #{item.quantity}\n" # xml << " \n" # end # xml << " \n" # End xml << " \n" end # End orders # xml << "\n" xml << "" return xml end ##### views/admin/oders/list.rhtml line 73-101 #####

<% 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 #####