class Omniorder::ImportStrategy::Groupon
Groupon
Import
Strategy See: scm.commerceinterface.com/api-doc/v2/
Constants
- API_URL
Attributes
access_token[RW]
supplier_id[RW]
Public Class Methods
new(import, options = {})
click to toggle source
Calls superclass method
Omniorder::ImportStrategy::Base::new
# File lib/omniorder/import_strategy/groupon.rb, line 12 def initialize(import, options = {}) super unless self.supplier_id = options[:supplier_id] and !supplier_id.to_s.empty? raise "Omniorder::ImportStrategy::Groupon requires a supplier_id" end unless self.access_token = options[:access_token] and !access_token.to_s.empty? raise "Omniorder::ImportStrategy::Groupon requires an access_token" end end
Public Instance Methods
get_orders_url()
click to toggle source
# File lib/omniorder/import_strategy/groupon.rb, line 67 def get_orders_url URI.join(API_URL, "get_orders?supplier_id=#{supplier_id}&token=#{access_token}") end
import_orders() { |create_order(order_info)| ... }
click to toggle source
# File lib/omniorder/import_strategy/groupon.rb, line 24 def import_orders get_order_info['data'].to_a.each do |order_info| success = yield create_order(order_info) if success && options[:mark_exported] result = Crack::JSON.parse do_request(mark_exported_url(order_info), :post) unless result['success'] raise "Failed to mark Groupon order ##{order_info['orderid']} as exported (#{result['reason']})" end end end end
mark_exported_url(order_info)
click to toggle source
# File lib/omniorder/import_strategy/groupon.rb, line 71 def mark_exported_url(order_info) lids = order_info['line_items'].map { |li| li["ci_lineitemid"] } URI.join(API_URL, "mark_exported?supplier_id=#{supplier_id}&token=#{access_token}&ci_lineitem_ids=[#{lids.join(',')}]") end
tracking_notification_url(orders)
click to toggle source
# File lib/omniorder/import_strategy/groupon.rb, line 76 def tracking_notification_url(orders) tracking_info = orders.map do |order| order.external_data[:line_item_ids].map do |line_item_id| { "carrier" => order.external_carrier_reference, "ci_lineitem_id" => line_item_id, "tracking" => order.shipping_reference } end end.flatten File.join(API_URL, "tracking_notification?supplier_id=#{supplier_id}&token=#{access_token}&tracking_info=#{tracking_info.to_json}") end
update_order_tracking!(orders)
click to toggle source
# File lib/omniorder/import_strategy/groupon.rb, line 38 def update_order_tracking!(orders) orders = [*orders].select do |order| if order.respond_to?(:shipping_reference) && !order.shipping_reference.nil? if order.external_carrier_reference.nil? || order.external_carrier_reference == '' raise "Cannot send tracking info for Groupon order ##{order.order_number} since it has no external_carrier_reference" end if order.external_data.nil? || order.external_data[:line_item_ids].nil? || order.external_data[:line_item_ids].empty? raise "Cannot send tracking info for Groupon order ##{order.order_number} since there is no line item external data" end true end end unless orders.empty? result = Crack::JSON.parse do_request(tracking_notification_url(orders), :post) end if result && result['success'].nil? # Include order number too if there is only one order if orders.count == 1 raise "Failed to update Groupon tracking data for order ##{orders.first.order_number} (#{result['reason']})" else raise "Failed to update Groupon tracking data (#{result['reason']})" end end end
Private Instance Methods
create_customer(order, customer_info)
click to toggle source
# File lib/omniorder/import_strategy/groupon.rb, line 113 def create_customer(order, customer_info) # NOTE: Can't find existing customer as no username or email given order.generate_customer( :name => customer_info['name'], :phone => customer_info['phone'], :address1 => customer_info['address1'], :address2 => customer_info['address2'], :address3 => customer_info['city'], :address4 => customer_info['state'], :postcode => customer_info['zip'].to_s.squeeze(' ').upcase, :country => customer_country_or_default(customer_info['country']) ) end
create_order(order_info)
click to toggle source
# File lib/omniorder/import_strategy/groupon.rb, line 92 def create_order(order_info) order = import.generate_order( :order_number => order_info['orderid'], :total_price => order_info['amount']['total'].to_f, :date => DateTime.strptime(order_info['date'], '%m/%d/%Y %I:%M%p UTC'), :external_data => { :line_item_ids => order_info['line_items'].map { |li| li['ci_lineitemid'] } } ) order.customer = create_customer(order, order_info['customer']) order_info['line_items'].each do |line_item_info| order.add_product_by_code( line_item_info['sku'].to_s, line_item_info['quantity'].to_i, line_item_info['ci_lineitemid'].to_i ) end after_build_order order, order_info end
do_request(url, type = :get)
click to toggle source
# File lib/omniorder/import_strategy/groupon.rb, line 134 def do_request(url, type = :get) host_and_path, query = url.to_s.split('?') uri = URI(type == :get ? url : host_and_path) http = Net::HTTP.new(uri.host, 443) http.use_ssl = true http.verify_mode = OpenSSL::SSL::VERIFY_PEER # Send post request params in body if type == :get http.request(Net::HTTP::Get.new(uri.request_uri)).body else request = Net::HTTP::Post.new(host_and_path) request.body = query http.request(request).body end end
get_order_info()
click to toggle source
NOTE: We don't appear to get an email address for customers
# File lib/omniorder/import_strategy/groupon.rb, line 128 def get_order_info Crack::JSON.parse do_request(get_orders_url) end