capsule_crm 0.5.7 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 59e0eebbeda04a3250c97232ea18644a14122faf
4
- data.tar.gz: ea18da6190a19d6d2d45b70950d1fbab38eeb92e
3
+ metadata.gz: 3b03a8a029e80b9ea38a3769a8cd9ac51a36a2c8
4
+ data.tar.gz: e43d7db346766c213fc62c30ee08b30aa61a0888
5
5
  SHA512:
6
- metadata.gz: 8cb6dba2711c9b58643bf0770a62a1be126fce21e46846935c32e152517e4a32cc4345ae4ba79985dec406e07d11d2b5c8908cafc5718fb4cef114277d010bb8
7
- data.tar.gz: 75c1f04e11c7d9dcbbd94736d4ba0feb7e8750c26e56bfd145325499a1caab8f2bf71d23f27121e2a9a9b35a4815414c4baa6ccd8f85a306dc18dc148b55fd27
6
+ metadata.gz: 737d7f366484bdea5916fc1cab2680577ca48c6c2a2f2aa2a056c9e0b1da65fcef07abe30636fddfd38bafca4146e38a4126e8e579686d52856e87d39c906fd4
7
+ data.tar.gz: 6229c13b72a40d24d83c53598688be4663cd3dc5c366e6036baf7e0fa24dda029c50e71800714cc64134f2fe45486ca7061abd4b14b42f2070620e33244fdc03
data/.travis.yml CHANGED
@@ -1,5 +1,6 @@
1
1
  language: ruby
2
2
  rvm:
3
+ - 2.0.0
3
4
  - 1.9.3
4
5
  - 1.9.2
5
6
  - jruby-19mode
data/README.md CHANGED
@@ -31,53 +31,271 @@ Or install it yourself as:
31
31
 
32
32
  $ gem install capsule_crm
33
33
 
34
+ ## Getting Started
35
+
36
+ You need to configure CapsuleCRM with your API Token and subdomain before you
37
+ can make any requests to it. If you are using rails then you can put this into
38
+ your config/initializers folder.
39
+ ```ruby
40
+ CapsuleCRM.configure do |config|
41
+ config.api_token = 'API Token here'
42
+ config.subdomain = 'your capsule crm company subdomain here'
43
+ end
44
+ ```
45
+
34
46
  ## Usage
35
47
 
48
+ ### Parties
36
49
  ```ruby
37
- contacts = CapsuleCRM::Contacts.new(
38
- addresses: [CapsuleCRM::Address.new(street: 'Oranieburgerstr', city: 'Berlin')],
39
- emails: [CapsuleCRM::Email.new(email_address: 'mattbeedle@gmail.com')],
40
- phones: [CapsuleCRM::Phone.new(phone_number: '123456789')],
41
- webstes: [CapsuleCRM::Website.new(web_service: 'URL', web_address: 'http://github.com']
42
- )
50
+ # List Parties
51
+ CapsuleCRM::Party.all
43
52
 
44
- person = CapsuleCRM::Person.new(
45
- first_name: 'Matt', last_name: 'Beedle', organisation_name: "Matt's Company",
46
- contacts: contacts
53
+ # With query parameters
54
+ CapsuleCRM::Party.all(
55
+ q: 'search term here', email: 'email to search for here',
56
+ lastmodified: 6.weeks.ago, tag: 'tag to search for here',
57
+ start: 10, limit: 55
47
58
  )
59
+
60
+ # Find one
61
+ # When the party is an organization this returns a CapsuleCRM::Organization
62
+ # otherise it returns a CapsuleCRM::Person
63
+ party = CapsuleCRM::Party.find(ID)
64
+ ```
65
+
66
+ ### People
67
+ ```ruby
68
+ # Find a person
69
+ person = CapsuleCRM::Person.find(ID)
70
+
71
+ # List People
72
+ CapsuleCRM::Person.all
73
+
74
+ # Initialize a new person
75
+ person = CapsuleCRM::Person.new(first_name: 'Matt', last_name: 'Beedle')
76
+
77
+ # Validate a person
78
+ person.valid?
79
+
80
+ # Save a person
48
81
  person.save
49
82
 
50
- person.first_name = 'John'
51
- person.save #=> true
83
+ # Update a person
84
+ person.update_attributes first_name: 'John'
52
85
 
53
- person.valid? #=> true
86
+ # Create a Person
87
+ person = CapsuleCRM::Person.create(first_name: 'Matt', last_name: 'Beedle')
54
88
 
55
- person.organization #=> CapsuleCRM::Organization
89
+ # Get organization associated with a person
90
+ person.organization
56
91
 
57
- person.organization.tap do |org|
58
- org.update_attributes! contacts: CapsuleCRM::Contacts.new(
59
- addresses: CapsuleCRM::Address.new(street: 'Thurneysserstr')
60
- )
92
+ # Delete a person
93
+ person.destroy
61
94
 
62
- org.contacts.phones << CapsuleCRM::Phone.new(phone_number: '234243')
63
- org.save
64
- end
95
+ # List opportunities
96
+ person.opportunities
65
97
 
66
- person.first_name = nil
67
- person.last_name = nil
68
- person.valid? #=> false
98
+ # List tags
99
+ person.tags
69
100
 
70
- person.save #=> false
71
- person.save! #=> CapsuleCRM::Errors::InvalidRecord
101
+ # Add a tag
102
+ person.add_tag 'a test tag'
72
103
 
73
- person.destroy #=> true
104
+ # View history
105
+ person.histories
74
106
 
75
- person = CapsuleCRM::Person.create(first_name: 'Matt', last_name: 'Beedle')
107
+ # Build a new history item
108
+ history_item = person.histories.build note: 'a note'
109
+
110
+ # Create a new history item
111
+ history_item = person.histories.create note: 'a note'
112
+ ```
113
+
114
+ ### Organizations
115
+ ```ruby
116
+ # Find an organization
117
+ organization = CapsuleCRM::Organization.find(ID)
118
+
119
+ # List Organizations
120
+ CapsuleCRM::Organization.all
121
+
122
+ # Initialize a new organization
123
+ org = CapsuleCRM::Organization.new(name: 'Vegan.io')
124
+
125
+ # Validate an organization
126
+ org.valid?
127
+
128
+ # Save an organization
129
+ org.save
130
+
131
+ # Update an organization
132
+ org.update_attributes name: 'Apple Inc'
133
+
134
+ # Create an organization
135
+ org = CapsuleCRM::Organization.create(name: 'Vegan.io')
136
+
137
+ # Get people for an organization
138
+ org.people
139
+
140
+ # Delete an organization
141
+ org.destroy
142
+
143
+ # List opportunities
144
+ org.opportunities
145
+
146
+ # List tags
147
+ org.tags
148
+
149
+ # Add a tag
150
+ org.add_tag 'a test tag'
151
+
152
+ # View history
153
+ org.histories
154
+
155
+ # Build a new history item
156
+ history = org.histories.build note: 'some note text'
157
+
158
+ # Create a new history item
159
+ history = org.histories.create note: 'some note text'
160
+ ```
161
+
162
+ ### Opportunities
163
+ ```ruby
164
+ # Find an opportunity
165
+ opportunity = CapsuleCRM::Opportunity.find(ID)
166
+
167
+ # List all opportunities
168
+ opportunities = CapsuleCRM::Opportunity.all
169
+
170
+ # List tags
171
+ opportunity.tags
172
+
173
+ # Add a tag
174
+ opportunity.add_tag 'tag here'
175
+
176
+ # View history
177
+ opportunity.histories
178
+
179
+ # Build a new history item
180
+ history = opportunity.histories.build note: 'some note text'
181
+
182
+ # Create a new history item
183
+ history_item = opportunity.histories.create note: 'some text here'
184
+ ```
185
+
186
+ ### Cases
187
+ ```ruby
188
+ # Find a case
189
+ kase = CapsuleCRM::Case.find(ID)
190
+
191
+ # List Cases
192
+ kase = CapsuleCRM::Case.all
193
+
194
+ # Update a Case
195
+ kase.update_attributes status: 'CLOSED'
196
+
197
+ # Delete a Case
198
+ kase.destroy
199
+
200
+ # List tags
201
+ kase.tags
202
+
203
+ # Add a tag
204
+ kase.add_tag 'A test tag'
205
+
206
+ # View history
207
+ kase.histories
208
+
209
+ # Build a new history
210
+ history = kase.histories.build note: 'note text here'
211
+
212
+ # Create a new history item
213
+ history_item = kase.histories.create note: 'another note'
214
+ ```
215
+
216
+ ### History
217
+ ```ruby
218
+ # Find a history item
219
+ history_item = CapsuleCRM::History.find(ID)
220
+
221
+ # Get the party
222
+ history_item.party
223
+
224
+ # Get the case
225
+ history_item.case
226
+
227
+ # Get the opportunity
228
+ history_item.opportunity
229
+
230
+ # Update a history item
231
+ history_item.update_attributes note: 'some new note text'
232
+
233
+ # Delete a history item
234
+ history_item.destroy
235
+ ```
236
+
237
+ ### Tasks
238
+ ```ruby
239
+ # List open tasks
240
+ tasks = CapsuleCRM::Task.all
76
241
 
77
- kase = CapsuleCRM::Case.create! name: 'My First Case', party: person
78
- kase.update_attributes name: 'A New Case Name'
242
+ # Query open tasks
243
+ tasks = CapsuleCRM::Task.all(
244
+ category: 'category name', user: 'username', start: 6, limit: 25
245
+ )
246
+
247
+ # Add a task
248
+ CapsuleCRM::Task.create(
249
+ description: 'task description', due_date: Date.tomorrow
250
+ )
251
+
252
+ # Update task
253
+ task.update_attributes description: 'a new improved task description'
254
+
255
+ # Delete a task
256
+ task.destroy
257
+
258
+ # Complete a task
259
+ task.complete
260
+
261
+ # Reopen a task
262
+ task.reopen
263
+
264
+ # List available task categories
265
+ CapsuleCRM::Task.categories
266
+ ```
267
+
268
+ ### Users
269
+ ```ruby
270
+ # List all users
271
+ CapsuleCRM::User.all
272
+
273
+ # Find a user by username
274
+ user = CapsuleCRM::User.find_by_username('username here')
275
+ ```
276
+
277
+ ### Countries
278
+ ```ruby
279
+ # List all countries
280
+ CapsuleCRM::Country.all
79
281
  ```
80
282
 
283
+ ### Currencies
284
+ ```ruby
285
+ # List all currencies
286
+ CapsuleCRM::Currency.all
287
+ ```
288
+
289
+ ## Supported Rubies
290
+
291
+ 1.9.2, 1.9.3, 2.0, jruby-19mode, rbx-19mode
292
+
293
+ ## Feedback
294
+
295
+ Please use github issues to give feedback. If you have a bug to report then an
296
+ accompanying failing test would be great. Extra points for a full pull request
297
+ with fix.
298
+
81
299
  ## Contributing
82
300
 
83
301
  1. Fork it
@@ -27,6 +27,40 @@ module CapsuleCRM
27
27
  validates :party, :kase, :opportunity,
28
28
  presence: { if: :belongs_to_required? }
29
29
 
30
+ def self._for_party(party_id)
31
+ init_collection(
32
+ CapsuleCRM::Connection.
33
+ get("/api/party/#{party_id}/history")['history'].
34
+ fetch('historyItem', nil)
35
+ )
36
+ end
37
+
38
+ class << self
39
+ alias :_for_organization :_for_party
40
+ alias :_for_person :_for_party
41
+ end
42
+
43
+ def self._for_case(case_id)
44
+ init_collection(
45
+ CapsuleCRM::Connection.
46
+ get("/api/kase/#{case_id}/history")['history']['historyItem']
47
+ )
48
+ end
49
+
50
+ def self._for_opportunity(opportunity_id)
51
+ init_collection(
52
+ CapsuleCRM::Connection.
53
+ get("/api/opportunity/#{opportunity_id}/history")\
54
+ ['history']['historyItem']
55
+ )
56
+ end
57
+
58
+ def self.init_collection(collection)
59
+ CapsuleCRM::ResultsProxy.new(
60
+ [collection].flatten.delete_if(&:blank?).map { |item| new(item) }
61
+ )
62
+ end
63
+
30
64
  # Public: Underscore all of the attributes keys and set the attributes of
31
65
  # this history item
32
66
  #
@@ -0,0 +1,34 @@
1
+ module CapsuleCRM
2
+ class Milestone
3
+ include Virtus
4
+
5
+ attribute :id, Integer
6
+ attribute :name, String
7
+ attribute :description, String
8
+ attribute :probability, Float
9
+ attribute :complete, Boolean
10
+
11
+ def self.all
12
+ init_collection(
13
+ CapsuleCRM::Connection.
14
+ get('/api/opportunity/milestones')['milestones']['milestone']
15
+ )
16
+ end
17
+
18
+ def self.find(id)
19
+ all.select { |item| item.id == id }.first
20
+ end
21
+
22
+ def self.find_by_name(name)
23
+ all.select { |item| item.name == name }.first
24
+ end
25
+
26
+ private
27
+
28
+ def self.init_collection(collection)
29
+ CapsuleCRM::ResultsProxy.new(
30
+ collection.map { |attributes| new attributes }
31
+ )
32
+ end
33
+ end
34
+ end
@@ -24,10 +24,19 @@ module CapsuleCRM
24
24
 
25
25
  validates :name, presence: true
26
26
  validates :party_id, presence: true
27
- validates :milestone_id, presence: { unless: :milestone }
28
- validates :milestone, presence: { unless: :milestone_id }
27
+ validates :milestone, presence: true
29
28
 
30
29
  belongs_to :party, class_name: 'CapsuleCRM::Party'
30
+ belongs_to :milestone, class_name: 'CapsuleCRM::Milestone'
31
+
32
+ def milestone=(milestone)
33
+ if milestone.is_a?(String)
34
+ milestone = CapsuleCRM::Milestone.find_by_name(milestone)
35
+ end
36
+ @milestone = milestone
37
+ self.milestone_id = milestone.try(:id)
38
+ self
39
+ end
31
40
 
32
41
  # Public: Set the attributes of a opportunity
33
42
  #
@@ -3,7 +3,7 @@ class CapsuleCRM::Party
3
3
 
4
4
  include CapsuleCRM::Associations::HasMany
5
5
 
6
- has_many :histories, class_name: 'CapsuleCRM::History'
6
+ has_many :histories, class_name: 'CapsuleCRM::History', source: :party
7
7
 
8
8
  def self.all(options = {})
9
9
  attributes = CapsuleCRM::Connection.get('/api/party', options)
@@ -16,6 +16,14 @@ module CapsuleCRM
16
16
  end
17
17
  end
18
18
 
19
+ def remove_tag(tag_name)
20
+ if id
21
+ CapsuleCRM::Connection.delete(
22
+ "/api/#{api_singular_name}/#{id}/#{URI.encode(tag_name)}"
23
+ )
24
+ end
25
+ end
26
+
19
27
  def api_singular_name
20
28
  self.class.to_s.demodulize.downcase.singularize
21
29
  end
@@ -1,3 +1,3 @@
1
1
  module CapsuleCrm
2
- VERSION = '0.5.7'
2
+ VERSION = '0.6.0'
3
3
  end
data/lib/capsule_crm.rb CHANGED
@@ -30,6 +30,7 @@ require 'capsule_crm/opportunity'
30
30
  require 'capsule_crm/organization'
31
31
  require 'capsule_crm/participant'
32
32
  require 'capsule_crm/person'
33
+ require 'capsule_crm/milestone'
33
34
  require 'capsule_crm/version'
34
35
 
35
36
  module CapsuleCRM
@@ -3,8 +3,99 @@ require 'spec_helper'
3
3
  describe CapsuleCRM::History do
4
4
  before { configure }
5
5
 
6
+ before do
7
+ stub_request(:get, /\/api\/users$/).
8
+ to_return(body: File.read('spec/support/all_users.json'))
9
+ stub_request(:get, /\/api\/opportunity\/milestones$/).
10
+ to_return(body: File.read('spec/support/milestones.json'))
11
+ end
12
+
6
13
  it { should validate_presence_of(:note) }
7
14
 
15
+ describe '_.for_party' do
16
+ let(:party) { Fabricate.build(:person, id: 1) }
17
+
18
+ subject { CapsuleCRM::History._for_party(party.id) }
19
+
20
+ context 'when there are some history items' do
21
+ before do
22
+ stub_request(:get, /\/api\/party\/#{party.id}\/history$/).
23
+ to_return(body: File.read('spec/support/all_history.json'))
24
+ end
25
+
26
+ it { should be_a(Array) }
27
+
28
+ it do
29
+ subject.all? { |item| item.is_a?(CapsuleCRM::History) }.should be_true
30
+ end
31
+ end
32
+
33
+ context 'when there are no history items' do
34
+ before do
35
+ stub_request(:get, /\/api\/party\/#{party.id}\/history$/).
36
+ to_return(body: File.read('spec/support/no_history.json'))
37
+ end
38
+
39
+ it { should be_blank }
40
+ end
41
+ end
42
+
43
+ describe '._for_case' do
44
+ let(:kase) { Fabricate.build(:case, id: 1) }
45
+
46
+ subject { CapsuleCRM::History._for_case(kase.id) }
47
+
48
+ context 'when there are some history items' do
49
+ before do
50
+ stub_request(:get, /\/api\/kase\/#{kase.id}\/history$/).
51
+ to_return(body: File.read('spec/support/all_history.json'))
52
+ end
53
+
54
+ it { should be_a(Array) }
55
+
56
+ it do
57
+ subject.all? { |item| item.is_a?(CapsuleCRM::History) }.should be_true
58
+ end
59
+ end
60
+
61
+ context 'when there are no history items' do
62
+ before do
63
+ stub_request(:get, /\/api\/kase\/#{kase.id}\/history$/).
64
+ to_return(body: File.read('spec/support/no_history.json'))
65
+ end
66
+
67
+ it { should be_blank }
68
+ end
69
+ end
70
+
71
+ describe '._for_opportunity' do
72
+ let(:opportunity) { Fabricate.build(:opportunity, id: 1) }
73
+
74
+ subject { CapsuleCRM::History._for_opportunity(opportunity.id) }
75
+
76
+ context 'when there are some history items' do
77
+ before do
78
+ stub_request(:get, /\/api\/opportunity\/#{opportunity.id}\/history$/).
79
+ to_return(body: File.read('spec/support/all_history.json'))
80
+ end
81
+
82
+ it { should be_a(Array) }
83
+
84
+ it do
85
+ subject.all? { |item| item.is_a?(CapsuleCRM::History) }.should be_true
86
+ end
87
+ end
88
+
89
+ context 'when there are no history items' do
90
+ before do
91
+ stub_request(:get, /\/api\/opportunity\/#{opportunity.id}\/history$/).
92
+ to_return(body: File.read('spec/support/no_history.json'))
93
+ end
94
+
95
+ it { should be_blank }
96
+ end
97
+ end
98
+
8
99
  describe 'find' do
9
100
  before do
10
101
  stub_request(:get, /\/api\/history\/100$/).
@@ -0,0 +1,29 @@
1
+ require 'spec_helper'
2
+
3
+ describe CapsuleCRM::Milestone do
4
+ before { configure }
5
+
6
+ describe '.all' do
7
+ before do
8
+ stub_request(:get, /\/api\/opportunity\/milestones$/).
9
+ to_return(body: File.read('spec/support/milestones.json'))
10
+ end
11
+
12
+ subject { CapsuleCRM::Milestone.all }
13
+
14
+ it { should be_a(Array) }
15
+
16
+ it do
17
+ subject.all? { |item| item.is_a?(CapsuleCRM::Milestone) }.should be_true
18
+ end
19
+
20
+ it do
21
+ expect(subject.first.description).
22
+ to eql('You have a potential buyer for your offering')
23
+ end
24
+
25
+ it { expect(subject.first.probability).to eql(10.0) }
26
+
27
+ it { expect(subject.first.complete).to be_false }
28
+ end
29
+ end
@@ -3,24 +3,53 @@ require 'spec_helper'
3
3
  describe CapsuleCRM::Opportunity do
4
4
  before { configure }
5
5
 
6
- it { should validate_presence_of(:name) }
6
+ before do
7
+ stub_request(:get, /\/api\/opportunity\/milestones$/).
8
+ to_return(body: File.read('spec/support/milestones.json'))
9
+ end
7
10
 
8
- it { should validate_presence_of(:milestone_id) }
11
+ it { should validate_presence_of(:name) }
9
12
 
10
13
  it { should validate_presence_of(:milestone) }
11
14
 
12
15
  context 'when milestone_id is set' do
13
16
  subject { CapsuleCRM::Opportunity.new(milestone_id: 1) }
14
17
 
15
- it { should_not validate_presence_of(:milestone) }
18
+ before do
19
+ subject.valid?
20
+ end
21
+
22
+ it { subject.errors[:milestone].should be_blank }
16
23
  end
17
24
 
18
25
  context 'when milestone is set' do
19
- subject { CapsuleCRM::Opportunity.new(milestone: 'a') }
26
+ let(:milestone) { CapsuleCRM::Milestone.new name: 'Bid' }
27
+
28
+ subject { CapsuleCRM::Opportunity.new(milestone: milestone) }
20
29
 
21
30
  it { should_not validate_presence_of(:milestone_id) }
22
31
  end
23
32
 
33
+ describe '#milestone=' do
34
+ context 'when it receives a milestone name' do
35
+ subject { CapsuleCRM::Opportunity.new(milestone: 'Bid') }
36
+
37
+ it { subject.milestone.should be_a(CapsuleCRM::Milestone) }
38
+
39
+ it { subject.milestone_id.should_not be_blank }
40
+ end
41
+
42
+ context 'when it receives a milestone object' do
43
+ let(:milestone) { CapsuleCRM::Milestone.all.first }
44
+
45
+ subject { CapsuleCRM::Opportunity.new(milestone: milestone) }
46
+
47
+ it { subject.milestone.should be_a(CapsuleCRM::Milestone) }
48
+
49
+ it { subject.milestone_id.should_not be_blank }
50
+ end
51
+ end
52
+
24
53
  describe '#party=' do
25
54
  let(:opportunity) { Fabricate.build(:opportunity, party: nil) }
26
55
 
@@ -110,7 +139,7 @@ describe CapsuleCRM::Opportunity do
110
139
 
111
140
  describe '.find' do
112
141
  before do
113
- stub_request(:get, /.*/).
142
+ stub_request(:get, /\/api\/opportunity\/1$/).
114
143
  to_return(body: File.read('spec/support/opportunity.json'))
115
144
  end
116
145
 
@@ -138,7 +167,7 @@ describe CapsuleCRM::Opportunity do
138
167
 
139
168
  it { subject.owner.should eql('a.user') }
140
169
 
141
- it { subject.milestone.should eql('Bid') }
170
+ it { subject.milestone.name.should eql('Bid') }
142
171
 
143
172
  it { subject.probability.should eql(50.0) }
144
173
 
@@ -56,4 +56,29 @@ describe CapsuleCRM::Taggable do
56
56
  it { subject.should be_nil }
57
57
  end
58
58
  end
59
+
60
+ describe '#remove_tag' do
61
+
62
+ subject { taggable_item.remove_tag 'A Test Tag' }
63
+
64
+ context 'when the taggable item has an id' do
65
+ let(:taggable_item) { TaggableItem.new(id: 1) }
66
+
67
+ before do
68
+ loc = 'https://sample.capsulecrm.com/api/party/1000/tag/A%20Test%20Tag'
69
+ stub_request(:delete, /\/api\/taggableitem\/1\/A%20Test%20Tag$/).
70
+ to_return(headers: { 'Location' => loc })
71
+ end
72
+
73
+ it { subject.should be_true }
74
+ end
75
+
76
+ context 'when the taggable item has no id' do
77
+ let(:taggable_item) { TaggableItem.new }
78
+
79
+ subject { taggable_item.remove_tag 'A Test Tag' }
80
+
81
+ it { subject.should be_nil }
82
+ end
83
+ end
59
84
  end
@@ -0,0 +1,32 @@
1
+ {
2
+ "milestones": {
3
+ "milestone": [
4
+ {
5
+ "id": "1",
6
+ "name": "New",
7
+ "description": "You have a potential buyer for your offering",
8
+ "probability": "10",
9
+ "complete": "false"
10
+ },
11
+ {
12
+ "id": "2",
13
+ "name": "Bid",
14
+ "description": "You have put forward a bid for your offering",
15
+ "probability": "50",
16
+ "complete": "false"
17
+ },
18
+ {
19
+ "id": "3",
20
+ "name": "Won",
21
+ "probability": "100",
22
+ "complete": "true"
23
+ },
24
+ {
25
+ "id": "4",
26
+ "name": "Lost",
27
+ "probability": "0",
28
+ "complete": "true"
29
+ }
30
+ ]
31
+ }
32
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "history": {
3
+ "@size": "0"
4
+ }
5
+ }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: capsule_crm
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.7
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matt Beedle
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-05-26 00:00:00.000000000 Z
11
+ date: 2013-05-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activemodel
@@ -257,6 +257,7 @@ files:
257
257
  - lib/capsule_crm/errors/record_invalid.rb
258
258
  - lib/capsule_crm/hash_helper.rb
259
259
  - lib/capsule_crm/history.rb
260
+ - lib/capsule_crm/milestone.rb
260
261
  - lib/capsule_crm/opportunity.rb
261
262
  - lib/capsule_crm/organization.rb
262
263
  - lib/capsule_crm/participant.rb
@@ -285,6 +286,7 @@ files:
285
286
  - spec/lib/capsule_crm/currency_spec.rb
286
287
  - spec/lib/capsule_crm/email_spec.rb
287
288
  - spec/lib/capsule_crm/history_spec.rb
289
+ - spec/lib/capsule_crm/milestone_spec.rb
288
290
  - spec/lib/capsule_crm/opportunity_spec.rb
289
291
  - spec/lib/capsule_crm/organization_spec.rb
290
292
  - spec/lib/capsule_crm/party_spec.rb
@@ -308,6 +310,8 @@ files:
308
310
  - spec/support/deleted_opportunities.json
309
311
  - spec/support/helpers.rb
310
312
  - spec/support/history.json
313
+ - spec/support/milestones.json
314
+ - spec/support/no_history.json
311
315
  - spec/support/opportunity.json
312
316
  - spec/support/organisation.json
313
317
  - spec/support/person.json
@@ -353,6 +357,7 @@ test_files:
353
357
  - spec/lib/capsule_crm/currency_spec.rb
354
358
  - spec/lib/capsule_crm/email_spec.rb
355
359
  - spec/lib/capsule_crm/history_spec.rb
360
+ - spec/lib/capsule_crm/milestone_spec.rb
356
361
  - spec/lib/capsule_crm/opportunity_spec.rb
357
362
  - spec/lib/capsule_crm/organization_spec.rb
358
363
  - spec/lib/capsule_crm/party_spec.rb
@@ -376,6 +381,8 @@ test_files:
376
381
  - spec/support/deleted_opportunities.json
377
382
  - spec/support/helpers.rb
378
383
  - spec/support/history.json
384
+ - spec/support/milestones.json
385
+ - spec/support/no_history.json
379
386
  - spec/support/opportunity.json
380
387
  - spec/support/organisation.json
381
388
  - spec/support/person.json