mirror of
https://github.com/retailcrm/api-client-ruby.git
synced 2024-11-22 04:56:06 +03:00
392 lines
9.9 KiB
Ruby
392 lines
9.9 KiB
Ruby
# encoding: utf-8
|
||
|
||
require 'net/http'
|
||
require 'net/https'
|
||
require 'uri'
|
||
require 'json'
|
||
|
||
# RetailCRM API Client
|
||
class Retailcrm
|
||
|
||
def initialize(url, key)
|
||
@rr_version = 3
|
||
@rr_url = "#{url}/api/v#{@rr_version}/"
|
||
@rr_key = key
|
||
@rr_params = { :apiKey => @rr_key }
|
||
end
|
||
|
||
def self.up(params)
|
||
@rr_params = params
|
||
end
|
||
|
||
##
|
||
# === Get orders by filter
|
||
# http://www.retailcrm.ru/docs/Разработчики/СправочникМетодовAPIV3
|
||
#
|
||
# Example:
|
||
# >> Retailcrm.orders(50, 2, {:email => 'test@example.com', :status => 'new'})
|
||
# => {...}
|
||
#
|
||
# Arguments:
|
||
# limit (Integer) (20|50|100)
|
||
# page (Integer)
|
||
# filter (Array)
|
||
def orders(filter = nil, limit = 20, page = 1)
|
||
url = "#{@rr_url}orders"
|
||
@rr_params[:limit] = limit
|
||
@rr_params[:page] = page
|
||
@rr_params[:filter] = filter
|
||
make_request(url)
|
||
end
|
||
|
||
##
|
||
# === Get orders by id (or externalId)
|
||
# http://www.retailcrm.ru/docs/Разработчики/СправочникМетодовAPIV3
|
||
#
|
||
# Example:
|
||
# >> Retailcrm.orders_get(345, 'id')
|
||
# => {...}
|
||
#
|
||
# Arguments:
|
||
# id (Integer)
|
||
# by (String)
|
||
def orders_get(id, by = 'externalId')
|
||
url = "#{@rr_url}orders/#{id}"
|
||
if by != 'externalId'
|
||
@rr_params[:by] = by
|
||
end
|
||
make_request(url)
|
||
end
|
||
|
||
##
|
||
# === Create order
|
||
# http://www.retailcrm.ru/docs/Разработчики/СправочникМетодовAPIV3
|
||
#
|
||
# Example:
|
||
# >> Retailcrm.orders_create(order)
|
||
# => {...}
|
||
#
|
||
# Arguments:
|
||
# order (Array)
|
||
def orders_create(order)
|
||
url = "#{@rr_url}orders/create"
|
||
@rr_params[:order] = order.to_json
|
||
make_request(url, 'post')
|
||
end
|
||
|
||
##
|
||
# === Edit order
|
||
# http://www.retailcrm.ru/docs/Разработчики/СправочникМетодовAPIV3
|
||
#
|
||
# Example:
|
||
# >> Retailcrm.orders_edit(order)
|
||
# => {...}
|
||
#
|
||
# Arguments:
|
||
# order (Array)
|
||
def orders_edit(order)
|
||
id = order[:externalId]
|
||
url = "#{@rr_url}orders/#{id}/edit"
|
||
@rr_params[:order] = order.to_json
|
||
make_request(url, 'post')
|
||
end
|
||
|
||
##
|
||
# === Upload orders
|
||
# http://www.retailcrm.ru/docs/Разработчики/СправочникМетодовAPIV3
|
||
#
|
||
# Example:
|
||
# >> Retailcrm.orders_upload(orders)
|
||
# => {...}
|
||
#
|
||
# Arguments:
|
||
# orders (Array)
|
||
def orders_upload(orders)
|
||
url = "#{@rr_url}orders/upload"
|
||
@rr_params[:orders] = orders.to_json
|
||
make_request(url, 'post')
|
||
end
|
||
|
||
##
|
||
# === Set external ids for orders created into CRM
|
||
# http://www.retailcrm.ru/docs/Разработчики/СправочникМетодовAPIV3
|
||
#
|
||
# Example:
|
||
# >> Retailcrm.orders_fix_external_ids([{:id => 200, :externalId => 334}, {:id => 201, :externalId => 364}])
|
||
# => {...}
|
||
#
|
||
# Arguments:
|
||
# orders (Array)
|
||
def orders_fix_external_ids(orders)
|
||
url = "#{@rr_url}orders/fix-external-ids"
|
||
@rr_params[:orders] = orders.to_json
|
||
make_request(url, 'post')
|
||
end
|
||
|
||
##
|
||
# === Get orders history
|
||
# http://www.retailcrm.ru/docs/Разработчики/СправочникМетодовAPIV3
|
||
#
|
||
# Example:
|
||
# >> Retailcrm.orders_history('2015-04-10 22:23:12', '2015-04-10 23:33:12')
|
||
# => {...}
|
||
#
|
||
# Arguments:
|
||
# start_date (Time) (Time.strftime('%Y-%m-%d %H:%M:%S'))
|
||
# end_date (Time) (Time.strftime('%Y-%m-%d %H:%M:%S'))
|
||
# limit (Integer) (20|50|100)
|
||
# offset (Integer)
|
||
# skip_my_changes (Boolean)
|
||
def orders_history(start_date = nil, end_date = nil, limit = 100, offset = 0, skip_my_changes = true)
|
||
url = "#{@rr_url}orders/history"
|
||
@rr_params[:startDate] = start_date
|
||
@rr_params[:endDate] = end_date
|
||
@rr_params[:limit] = limit
|
||
@rr_params[:offset] = offset
|
||
@rr_params[:skipMyChanges] = skip_my_changes
|
||
make_request(url)
|
||
end
|
||
|
||
##
|
||
# === Get orders statuses
|
||
# http://www.retailcrm.ru/docs/Разработчики/СправочникМетодовAPIV3
|
||
#
|
||
# Example:
|
||
# >> Retailcrm.orders_statuses([231,244,356,564])
|
||
# => {...}
|
||
#
|
||
# Arguments:
|
||
# ids (Array)
|
||
def orders_statuses(ids)
|
||
url = "#{@rr_url}orders/statuses/#{ids}"
|
||
make_request(url)
|
||
end
|
||
|
||
##
|
||
# === Get customers by id (or externalId)
|
||
# http://www.retailcrm.ru/docs/Разработчики/СправочникМетодовAPIV3
|
||
#
|
||
# Example:
|
||
# >> Retailcrm.customers_get(345, 'id')
|
||
# => {...}
|
||
#
|
||
# Arguments:
|
||
# id (Integer)
|
||
# by (String)
|
||
def customers_get(id, by = 'externalId')
|
||
url = "#{@rr_url}customers/#{id}"
|
||
if by != 'externalId'
|
||
@rr_params[:by] = by
|
||
end
|
||
make_request(url)
|
||
end
|
||
|
||
##
|
||
# === Create customer
|
||
# http://www.retailcrm.ru/docs/Разработчики/СправочникМетодовAPIV3
|
||
#
|
||
# Example:
|
||
# >> Retailcrm.customer_create(customer)
|
||
# => {...}
|
||
#
|
||
# Arguments:
|
||
# customer (Array)
|
||
def customers_create(customer)
|
||
url = "#{@rr_url}customers/create"
|
||
@rr_params[:customer] = customer.to_json
|
||
make_request(url, 'post')
|
||
end
|
||
|
||
##
|
||
# === Edit customer
|
||
# http://www.retailcrm.ru/docs/Разработчики/СправочникМетодовAPIV3
|
||
#
|
||
# Example:
|
||
# >> Retailcrm.customers_edit(customer)
|
||
# => {...}
|
||
#
|
||
# Arguments:
|
||
# customer (Array)
|
||
def customers_edit(customer)
|
||
id = customer[:externalId]
|
||
url = "#{@rr_url}customers/#{id}/edit"
|
||
@rr_params[:customer] = customer.to_json
|
||
make_request(url, 'post')
|
||
end
|
||
|
||
##
|
||
# === Upload customers
|
||
# http://www.retailcrm.ru/docs/Разработчики/СправочникМетодовAPIV3
|
||
#
|
||
# Example:
|
||
# >> Retailcrm.customers_upload(customers)
|
||
# => {...}
|
||
#
|
||
# Arguments:
|
||
# customers (Array)
|
||
def customers_upload(customers)
|
||
url = "#{@rr_url}customers/upload"
|
||
@rr_params[:customers] = customers.to_json
|
||
make_request(url, 'post')
|
||
end
|
||
|
||
##
|
||
# === Set external ids for customers created into CRM
|
||
# http://www.retailcrm.ru/docs/Разработчики/СправочникМетодовAPIV3
|
||
#
|
||
# Example:
|
||
# >> Retailcrm.customers_fix_external_ids([{:id => 200, :externalId => 334}, {:id => 201, :externalId => 364}])
|
||
# => {...}
|
||
#
|
||
# Arguments:
|
||
# customers (Array)
|
||
def customers_fix_external_ids(customers)
|
||
url = "#{@rr_url}customers/fix-external-ids"
|
||
@rr_params[:customers] = customers.to_json
|
||
make_request(url, 'post')
|
||
end
|
||
|
||
##
|
||
# === Get delivery services
|
||
# http://www.retailcrm.ru/docs/Разработчики/СправочникМетодовAPIV3
|
||
#
|
||
def delivery_services
|
||
url = "#{@rr_url}reference/delivery-services"
|
||
make_request(url)
|
||
end
|
||
|
||
# Get delivery types
|
||
# http://www.retailcrm.ru/docs/Разработчики/СправочникМетодовAPIV3
|
||
#
|
||
def delivery_types
|
||
url = "#{@rr_url}reference/delivery-types"
|
||
make_request(url)
|
||
end
|
||
|
||
##
|
||
# === Get order methods
|
||
# http://www.retailcrm.ru/docs/Разработчики/СправочникМетодовAPIV3
|
||
#
|
||
def order_methods
|
||
url = "#{@rr_url}reference/order-methods"
|
||
make_request(url)
|
||
end
|
||
|
||
##
|
||
# === Get order types
|
||
# http://www.retailcrm.ru/docs/Разработчики/СправочникМетодовAPIV3
|
||
#
|
||
def order_types
|
||
url = "#{@rr_url}reference/order-types"
|
||
make_request(url)
|
||
end
|
||
|
||
# Get payment statuses
|
||
# http://www.retailcrm.ru/docs/Разработчики/СправочникМетодовAPIV3
|
||
#
|
||
def payment_statuses
|
||
url = "#{@rr_url}reference/payment-statuses"
|
||
make_request(url)
|
||
end
|
||
|
||
##
|
||
# === Get payment types
|
||
# http://www.retailcrm.ru/docs/Разработчики/СправочникМетодовAPIV3
|
||
#
|
||
def payment_types
|
||
url = "#{@rr_url}reference/payment-types"
|
||
make_request(url)
|
||
end
|
||
|
||
##
|
||
# === Get product statuses
|
||
# http://www.retailcrm.ru/docs/Разработчики/СправочникМетодовAPIV3
|
||
#
|
||
def product_statuses
|
||
url = "#{@rr_url}reference/product-statuses"
|
||
make_request(url)
|
||
end
|
||
|
||
# Get sites list
|
||
# http://www.retailcrm.ru/docs/Разработчики/СправочникМетодовAPIV3
|
||
#
|
||
def sites
|
||
url = "#{@rr_url}reference/sites"
|
||
make_request(url)
|
||
end
|
||
|
||
##
|
||
# === Get status groups
|
||
# http://www.retailcrm.ru/docs/Разработчики/СправочникМетодовAPIV3
|
||
#
|
||
def status_groups
|
||
url = "#{@rr_url}reference/status-groups"
|
||
make_request(url)
|
||
end
|
||
|
||
# Get statuses
|
||
# http://www.retailcrm.ru/docs/Разработчики/СправочникМетодовAPIV3
|
||
#
|
||
def statuses
|
||
url = "#{@rr_url}reference/statuses"
|
||
make_request(url)
|
||
end
|
||
|
||
##
|
||
# === Get stores
|
||
# http://www.retailcrm.ru/docs/Разработчики/СправочникМетодовAPIV3
|
||
#
|
||
def stores
|
||
url = "#{@rr_url}reference/stores"
|
||
make_request(url)
|
||
end
|
||
|
||
|
||
##
|
||
# === Statistic update
|
||
# http://www.retailcrm.ru/docs/Разработчики/СправочникМетодовAPIV3
|
||
#
|
||
def statistic_update
|
||
url = "#{@rr_url}statistic/update"
|
||
make_request(url)
|
||
end
|
||
|
||
protected
|
||
|
||
def make_request(url, method='get')
|
||
raise ArgumentError, 'url must be not empty' unless !url.empty?
|
||
filter = nil
|
||
uri = URI.parse(url)
|
||
https = Net::HTTP.new(uri.host, uri.port)
|
||
https.use_ssl = true
|
||
if method == 'post'
|
||
request = Net::HTTP::Post.new(uri)
|
||
request.set_form_data(@rr_params)
|
||
elsif method == 'get'
|
||
unless @rr_params[:filter].nil?
|
||
filter = @rr_params[:filter].to_a.map { |x| "filter[#{x[0]}]=#{x[1]}" }.join("&")
|
||
end
|
||
request = Net::HTTP::Get.new(uri.path)
|
||
request.set_form_data(@rr_params)
|
||
data = filter.nil? ? "#{request.body}" : "#{request.body}&#{filter}"
|
||
request = Net::HTTP::Get.new("#{uri.path}?#{data}")
|
||
|
||
end
|
||
response = https.request(request)
|
||
Retailcrm::Response.new(response.code, response.body)
|
||
end
|
||
end
|
||
|
||
class Retailcrm::Response
|
||
attr_reader :status, :response
|
||
|
||
def initialize(status, body)
|
||
@status = status
|
||
@response = body.empty? ? [] : JSON.parse(body)
|
||
end
|
||
|
||
def is_successfull?
|
||
@status.to_i < 400
|
||
end
|
||
end
|