basecrm 1.2.3 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +70 -1
- data/lib/basecrm.rb +57 -1
- data/lib/basecrm/models/deal.rb +15 -3
- data/lib/basecrm/models/deal_source.rb +25 -0
- data/lib/basecrm/models/lead_source.rb +25 -0
- data/lib/basecrm/models/line_item.rb +43 -0
- data/lib/basecrm/models/order.rb +22 -0
- data/lib/basecrm/models/price.rb +13 -0
- data/lib/basecrm/models/product.rb +43 -0
- data/lib/basecrm/services/deal_sources_service.rb +133 -0
- data/lib/basecrm/services/deals_service.rb +21 -20
- data/lib/basecrm/services/lead_sources_service.rb +133 -0
- data/lib/basecrm/services/line_items_service.rb +111 -0
- data/lib/basecrm/services/orders_service.rb +129 -0
- data/lib/basecrm/services/products_service.rb +136 -0
- data/lib/basecrm/version.rb +1 -1
- data/spec/factories/deal_source.rb +11 -0
- data/spec/factories/lead_source.rb +11 -0
- data/spec/factories/line_item.rb +18 -0
- data/spec/factories/order.rb +12 -0
- data/spec/factories/product.rb +19 -0
- data/spec/services/deal_sources_service_spec.rb +58 -0
- data/spec/services/deals_service_spec.rb +2 -2
- data/spec/services/lead_sources_service_spec.rb +58 -0
- data/spec/services/line_items_service_spec.rb +62 -0
- data/spec/services/orders_service_spec.rb +64 -0
- data/spec/services/products_service_spec.rb +58 -0
- data/spec/support/client_helpers.rb +2 -2
- metadata +57 -26
@@ -0,0 +1,136 @@
|
|
1
|
+
# WARNING: This code is auto-generated from the BaseCRM API Discovery JSON Schema
|
2
|
+
|
3
|
+
module BaseCRM
|
4
|
+
class ProductsService
|
5
|
+
OPTS_KEYS_TO_PERSIST = Set[:name, :description, :sku, :active, :cost, :cost_currency, :prices, :max_discount, :max_markup]
|
6
|
+
|
7
|
+
def initialize(client)
|
8
|
+
@client = client
|
9
|
+
end
|
10
|
+
|
11
|
+
# Retrieve all products
|
12
|
+
#
|
13
|
+
# get '/products'
|
14
|
+
#
|
15
|
+
# If you want to use filtering or sorting (see #where).
|
16
|
+
# @return [Enumerable] Paginated resource you can use to iterate over all the resources.
|
17
|
+
def all
|
18
|
+
PaginatedResource.new(self)
|
19
|
+
end
|
20
|
+
|
21
|
+
# Retrieve all products
|
22
|
+
#
|
23
|
+
# get '/products'
|
24
|
+
#
|
25
|
+
# Returns all products available to the user according to the parameters provided
|
26
|
+
#
|
27
|
+
# @param options [Hash] Search options
|
28
|
+
# @option options [String] :ids Comma-separated list of product IDs to be returned in a request.
|
29
|
+
# @option options [Integer] :organization_id Unique identifier of an organization.
|
30
|
+
# @option options [Integer] :owner_id Unique identifier of the user the product is owned by. Returns all products owned by the user.
|
31
|
+
# @option options [Integer] :page (1) Page number to start from. Page numbering starts at 1, and omitting the `page` parameter will return the first page.
|
32
|
+
# @option options [Integer] :per_page (25) Number of records to return per page. Default limit is *25* and the maximum number that can be returned is *100*.
|
33
|
+
# @option options [String] :sort_by (id:asc) A field to sort by. **Default** ordering is **ascending**. If you want to change the sort ordering to descending, append `:desc` to the field e.g. `sort_by=value:desc`.
|
34
|
+
# @option options [String] :name Name of the product.
|
35
|
+
# @option options [String] :sku SKU of the product.
|
36
|
+
# @option options [Boolean] :active Indicator of whether or not the product is active.
|
37
|
+
# @return [Array<Product>] The list of Products for the first page, unless otherwise specified.
|
38
|
+
def where(options = {})
|
39
|
+
_, _, root = @client.get("/products", options)
|
40
|
+
|
41
|
+
root[:items].map{ |item| Product.new(item[:data]) }
|
42
|
+
end
|
43
|
+
|
44
|
+
|
45
|
+
# Create a product
|
46
|
+
#
|
47
|
+
# post '/products'
|
48
|
+
#
|
49
|
+
# Create a new product
|
50
|
+
#
|
51
|
+
# @param product [Product, Hash] Either object of the Product type or Hash. This object's attributes describe the object to be created.
|
52
|
+
# @return [Product] The resulting object represting created resource.
|
53
|
+
def create(product)
|
54
|
+
validate_type!(product)
|
55
|
+
|
56
|
+
attributes = sanitize(product)
|
57
|
+
_, _, root = @client.post("/products", attributes)
|
58
|
+
|
59
|
+
Product.new(root[:data])
|
60
|
+
end
|
61
|
+
|
62
|
+
|
63
|
+
# Retrieve a single product
|
64
|
+
#
|
65
|
+
# get '/products/{id}'
|
66
|
+
#
|
67
|
+
# Returns a single product, according to the unique product ID provided
|
68
|
+
# If the specified product does not exist, the request will return an error
|
69
|
+
#
|
70
|
+
# @param id [Integer] Unique identifier of a Product
|
71
|
+
# @return [Product] Searched resource object.
|
72
|
+
def find(id)
|
73
|
+
_, _, root = @client.get("/products/#{id}")
|
74
|
+
|
75
|
+
Product.new(root[:data])
|
76
|
+
end
|
77
|
+
|
78
|
+
|
79
|
+
# Update a product
|
80
|
+
#
|
81
|
+
# put '/products/{id}'
|
82
|
+
#
|
83
|
+
# Updates product information
|
84
|
+
# If the specified product does not exist, the request will return an error
|
85
|
+
# <figure class="notice"><p>In order to modify prices used on a record, you need to supply the entire set
|
86
|
+
# <code>prices</code> are replaced every time they are used in a request
|
87
|
+
# </p></figure>
|
88
|
+
#
|
89
|
+
# @param product [Product, Hash] Either object of the Product type or Hash. This object's attributes describe the object to be updated.
|
90
|
+
# @return [Product] The resulting object represting updated resource.
|
91
|
+
def update(product)
|
92
|
+
validate_type!(product)
|
93
|
+
params = extract_params!(product, :id)
|
94
|
+
id = params[:id]
|
95
|
+
|
96
|
+
attributes = sanitize(product)
|
97
|
+
_, _, root = @client.put("/products/#{id}", attributes)
|
98
|
+
|
99
|
+
Product.new(root[:data])
|
100
|
+
end
|
101
|
+
|
102
|
+
|
103
|
+
# Delete a product
|
104
|
+
#
|
105
|
+
# delete '/products/{id}'
|
106
|
+
#
|
107
|
+
# Delete an existing product from the catalog
|
108
|
+
# Existing orders and line items are not affected
|
109
|
+
# If the specified product does not exist, the request will return an error
|
110
|
+
# This operation cannot be undone
|
111
|
+
# Products can be removed only by an account administrator
|
112
|
+
#
|
113
|
+
# @param id [Integer] Unique identifier of a Product
|
114
|
+
# @return [Boolean] Status of the operation.
|
115
|
+
def destroy(id)
|
116
|
+
status, _, _ = @client.delete("/products/#{id}")
|
117
|
+
status == 204
|
118
|
+
end
|
119
|
+
|
120
|
+
|
121
|
+
private
|
122
|
+
def validate_type!(product)
|
123
|
+
raise TypeError unless product.is_a?(Product) || product.is_a?(Hash)
|
124
|
+
end
|
125
|
+
|
126
|
+
def extract_params!(product, *args)
|
127
|
+
params = product.to_h.select{ |k, _| args.include?(k) }
|
128
|
+
raise ArgumentError, "one of required attributes is missing. Expected: #{args.join(',')}" if params.count != args.length
|
129
|
+
params
|
130
|
+
end
|
131
|
+
|
132
|
+
def sanitize(product)
|
133
|
+
product.to_h.select { |k, _| OPTS_KEYS_TO_PERSIST.include?(k) }
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
data/lib/basecrm/version.rb
CHANGED
@@ -0,0 +1,18 @@
|
|
1
|
+
FactoryGirl.define do
|
2
|
+
factory :line_item, class: BaseCRM::LineItem do
|
3
|
+
# transient attributes, required in url
|
4
|
+
order_id nil
|
5
|
+
|
6
|
+
product_id { 5 }
|
7
|
+
value { 1599.99 }
|
8
|
+
variation { 0 }
|
9
|
+
currency { "USD" }
|
10
|
+
quantity { 1 }
|
11
|
+
price { 1599.99 }
|
12
|
+
|
13
|
+
|
14
|
+
to_create do |line_item|
|
15
|
+
client.line_items.create(line_item.order_id, line_item)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
FactoryGirl.define do
|
2
|
+
factory :product, class: BaseCRM::Product do
|
3
|
+
|
4
|
+
name { Faker::Name.name }
|
5
|
+
description { "Includes more storage options" }
|
6
|
+
sku { "enterprise-plan" }
|
7
|
+
active { true }
|
8
|
+
max_discount { 100 }
|
9
|
+
max_markup { 200 }
|
10
|
+
cost { 1599.99 }
|
11
|
+
cost_currency { "USD" }
|
12
|
+
prices { [{"amount"=>"1599.99", "currency"=>"USD"}, {"amount"=>"3599.99", "currency"=>"PLN"}] }
|
13
|
+
|
14
|
+
|
15
|
+
to_create do |product|
|
16
|
+
client.products.create(product)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe BaseCRM::DealSourcesService do
|
4
|
+
describe 'Responds to' do
|
5
|
+
subject { client.deal_sources }
|
6
|
+
|
7
|
+
it { should respond_to :all }
|
8
|
+
it { should respond_to :create }
|
9
|
+
it { should respond_to :destroy }
|
10
|
+
it { should respond_to :find }
|
11
|
+
it { should respond_to :update }
|
12
|
+
it { should respond_to :where }
|
13
|
+
|
14
|
+
end
|
15
|
+
|
16
|
+
describe :all do
|
17
|
+
it "returns a PaginatedResource" do
|
18
|
+
expect(client.deal_sources.all()).to be_instance_of BaseCRM::PaginatedResource
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe :where do
|
23
|
+
it "returns an array" do
|
24
|
+
expect(client.deal_sources.where(page: 1)).to be_an Array
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
describe :create do
|
29
|
+
it "returns instance of DealSource class" do
|
30
|
+
@deal_source = build(:deal_source)
|
31
|
+
expect(client.deal_sources.create(@deal_source)).to be_instance_of BaseCRM::DealSource
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe :find do
|
36
|
+
before :each do
|
37
|
+
@deal_source = create(:deal_source)
|
38
|
+
end
|
39
|
+
|
40
|
+
it "returns an instance of DealSource class" do
|
41
|
+
expect(client.deal_sources.find(@deal_source.id)).to be_instance_of BaseCRM::DealSource
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
describe :update do
|
46
|
+
it "returns an updated instance of DealSource class" do
|
47
|
+
@deal_source = create(:deal_source)
|
48
|
+
expect(client.deal_sources.update(@deal_source)).to be_instance_of BaseCRM::DealSource
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
describe :destroy do
|
53
|
+
it "returns true on success" do
|
54
|
+
@deal_source = create(:deal_source)
|
55
|
+
expect(client.deal_sources.destroy(@deal_source.id)).to be_truthy
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -10,7 +10,7 @@ describe BaseCRM::DealsService do
|
|
10
10
|
it { should respond_to :find }
|
11
11
|
it { should respond_to :update }
|
12
12
|
it { should respond_to :where }
|
13
|
-
|
13
|
+
|
14
14
|
end
|
15
15
|
|
16
16
|
describe :all do
|
@@ -39,7 +39,7 @@ describe BaseCRM::DealsService do
|
|
39
39
|
|
40
40
|
describe :find do
|
41
41
|
before :each do
|
42
|
-
@deal = create(:deal)
|
42
|
+
@deal = create(:deal)
|
43
43
|
end
|
44
44
|
|
45
45
|
it "returns an instance of Deal class" do
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe BaseCRM::LeadSourcesService do
|
4
|
+
describe 'Responds to' do
|
5
|
+
subject { client.lead_sources }
|
6
|
+
|
7
|
+
it { should respond_to :all }
|
8
|
+
it { should respond_to :create }
|
9
|
+
it { should respond_to :destroy }
|
10
|
+
it { should respond_to :find }
|
11
|
+
it { should respond_to :update }
|
12
|
+
it { should respond_to :where }
|
13
|
+
|
14
|
+
end
|
15
|
+
|
16
|
+
describe :all do
|
17
|
+
it "returns a PaginatedResource" do
|
18
|
+
expect(client.lead_sources.all()).to be_instance_of BaseCRM::PaginatedResource
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe :where do
|
23
|
+
it "returns an array" do
|
24
|
+
expect(client.lead_sources.where(page: 1)).to be_an Array
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
describe :create do
|
29
|
+
it "returns instance of LeadSource class" do
|
30
|
+
@lead_source = build(:lead_source)
|
31
|
+
expect(client.lead_sources.create(@lead_source)).to be_instance_of BaseCRM::LeadSource
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe :find do
|
36
|
+
before :each do
|
37
|
+
@lead_source = create(:lead_source)
|
38
|
+
end
|
39
|
+
|
40
|
+
it "returns an instance of LeadSource class" do
|
41
|
+
expect(client.lead_sources.find(@lead_source.id)).to be_instance_of BaseCRM::LeadSource
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
describe :update do
|
46
|
+
it "returns an updated instance of LeadSource class" do
|
47
|
+
@lead_source = create(:lead_source)
|
48
|
+
expect(client.lead_sources.update(@lead_source)).to be_instance_of BaseCRM::LeadSource
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
describe :destroy do
|
53
|
+
it "returns true on success" do
|
54
|
+
@lead_source = create(:lead_source)
|
55
|
+
expect(client.lead_sources.destroy(@lead_source.id)).to be_truthy
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe BaseCRM::LineItemsService do
|
4
|
+
before(:all) do
|
5
|
+
@product = create(:product)
|
6
|
+
@order = create_order
|
7
|
+
end
|
8
|
+
describe 'Responds to' do
|
9
|
+
subject { client.line_items }
|
10
|
+
|
11
|
+
it { should respond_to :all }
|
12
|
+
it { should respond_to :create }
|
13
|
+
it { should respond_to :destroy }
|
14
|
+
it { should respond_to :find }
|
15
|
+
it { should respond_to :where }
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
describe :all do
|
20
|
+
it "returns a PaginatedResource" do
|
21
|
+
order_id = create_order.id
|
22
|
+
expect(client.line_items.all(order_id)).to be_instance_of BaseCRM::PaginatedResource
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe :where do
|
27
|
+
it "returns an array" do
|
28
|
+
order_id = create_order.id
|
29
|
+
expect(client.line_items.where(order_id, page: 1)).to be_an Array
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe :create do
|
34
|
+
it "returns instance of LineItem class" do
|
35
|
+
order_id = create_order.id
|
36
|
+
@line_item = build(:line_item, product_id: @product.id, order_id: @order.id)
|
37
|
+
expect(client.line_items.create(order_id, @line_item)).to be_instance_of BaseCRM::LineItem
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
describe :find do
|
42
|
+
before :each do
|
43
|
+
@line_item = create(:line_item, product_id: @product.id, order_id: @order.id)
|
44
|
+
end
|
45
|
+
|
46
|
+
it "returns an instance of LineItem class" do
|
47
|
+
expect(client.line_items.find(@order.id, @line_item.id)).to be_instance_of BaseCRM::LineItem
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
describe :destroy do
|
52
|
+
it "returns true on success" do
|
53
|
+
@line_item = create(:line_item, product_id: @product.id, order_id: @order.id)
|
54
|
+
expect(client.line_items.destroy(@order.id, @line_item.id)).to be_truthy
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def create_order
|
59
|
+
deal = create(:deal)
|
60
|
+
create(:order, deal_id: deal.id)
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe BaseCRM::OrdersService do
|
4
|
+
describe 'Responds to' do
|
5
|
+
subject { client.orders }
|
6
|
+
|
7
|
+
it { should respond_to :all }
|
8
|
+
it { should respond_to :create }
|
9
|
+
it { should respond_to :destroy }
|
10
|
+
it { should respond_to :find }
|
11
|
+
it { should respond_to :update }
|
12
|
+
it { should respond_to :where }
|
13
|
+
|
14
|
+
end
|
15
|
+
|
16
|
+
describe :all do
|
17
|
+
it "returns a PaginatedResource" do
|
18
|
+
expect(client.orders.all()).to be_instance_of BaseCRM::PaginatedResource
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe :where do
|
23
|
+
it "returns an array" do
|
24
|
+
expect(client.orders.where(page: 1)).to be_an Array
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
describe :create do
|
29
|
+
it "returns instance of Order class" do
|
30
|
+
deal_id = create(:deal).id
|
31
|
+
@order = build(:order, deal_id: deal_id)
|
32
|
+
expect(client.orders.create(@order)).to be_instance_of BaseCRM::Order
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
describe :find do
|
37
|
+
before :each do
|
38
|
+
@order = create_order
|
39
|
+
end
|
40
|
+
|
41
|
+
it "returns an instance of Order class" do
|
42
|
+
expect(client.orders.find(@order.id)).to be_instance_of BaseCRM::Order
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
describe :update do
|
47
|
+
it "returns an updated instance of Order class" do
|
48
|
+
@order = create_order
|
49
|
+
expect(client.orders.update(@order)).to be_instance_of BaseCRM::Order
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
describe :destroy do
|
54
|
+
it "returns true on success" do
|
55
|
+
@order = create_order
|
56
|
+
expect(client.orders.destroy(@order.id)).to be_truthy
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def create_order
|
61
|
+
deal = create(:deal)
|
62
|
+
create(:order, deal_id: deal.id)
|
63
|
+
end
|
64
|
+
end
|