capsule_crm 1.2.0 → 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/CHANGELOG.md +15 -0
- data/lib/capsule_crm/address.rb +4 -3
- data/lib/capsule_crm/associations/belongs_to.rb +2 -1
- data/lib/capsule_crm/associations/belongs_to_association.rb +19 -2
- data/lib/capsule_crm/associations/belongs_to_finder.rb +46 -0
- data/lib/capsule_crm/associations/has_many_association.rb +23 -9
- data/lib/capsule_crm/associations/has_many_proxy.rb +38 -4
- data/lib/capsule_crm/case.rb +33 -236
- data/lib/capsule_crm/configuration.rb +1 -1
- data/lib/capsule_crm/connection.rb +3 -0
- data/lib/capsule_crm/contactable.rb +1 -1
- data/lib/capsule_crm/country.rb +7 -13
- data/lib/capsule_crm/currency.rb +7 -13
- data/lib/capsule_crm/custom_field.rb +14 -54
- data/lib/capsule_crm/custom_field_definition.rb +36 -0
- data/lib/capsule_crm/email.rb +4 -3
- data/lib/capsule_crm/gettable.rb +11 -0
- data/lib/capsule_crm/hash_helper.rb +5 -0
- data/lib/capsule_crm/history.rb +37 -252
- data/lib/capsule_crm/milestone.rb +9 -9
- data/lib/capsule_crm/normalizer.rb +85 -0
- data/lib/capsule_crm/opportunity.rb +30 -271
- data/lib/capsule_crm/organization.rb +19 -197
- data/lib/capsule_crm/party.rb +13 -26
- data/lib/capsule_crm/persistence/configuration.rb +25 -0
- data/lib/capsule_crm/persistence/deletable.rb +14 -0
- data/lib/capsule_crm/persistence/persistable.rb +76 -0
- data/lib/capsule_crm/persistence.rb +3 -0
- data/lib/capsule_crm/person.rb +19 -194
- data/lib/capsule_crm/phone.rb +4 -3
- data/lib/capsule_crm/querying/configuration.rb +21 -0
- data/lib/capsule_crm/querying/find_all.rb +16 -0
- data/lib/capsule_crm/querying/find_one.rb +14 -0
- data/lib/capsule_crm/querying/findable.rb +14 -0
- data/lib/capsule_crm/querying.rb +4 -0
- data/lib/capsule_crm/serializable.rb +38 -0
- data/lib/capsule_crm/serializer.rb +54 -7
- data/lib/capsule_crm/task.rb +16 -96
- data/lib/capsule_crm/track.rb +5 -10
- data/lib/capsule_crm/user.rb +3 -15
- data/lib/capsule_crm/version.rb +1 -1
- data/lib/capsule_crm/website.rb +4 -2
- data/lib/capsule_crm.rb +15 -5
- data/spec/fabricators/case_fabricator.rb +1 -0
- data/spec/fabricators/history_fabricator.rb +1 -0
- data/spec/fabricators/opportunity_fabricator.rb +1 -0
- data/spec/lib/capsule_crm/associations/belongs_to_finder_spec.rb +48 -0
- data/spec/lib/capsule_crm/associations/belongs_to_spec.rb +34 -0
- data/spec/lib/capsule_crm/associations/has_many_proxy_spec.rb +54 -14
- data/spec/lib/capsule_crm/associations/has_many_spec.rb +15 -2
- data/spec/lib/capsule_crm/case_spec.rb +20 -330
- data/spec/lib/capsule_crm/country_spec.rb +1 -16
- data/spec/lib/capsule_crm/currency_spec.rb +1 -18
- data/spec/lib/capsule_crm/custom_field_definition_spec.rb +59 -0
- data/spec/lib/capsule_crm/custom_field_spec.rb +2 -27
- data/spec/lib/capsule_crm/history_spec.rb +14 -389
- data/spec/lib/capsule_crm/milestone_spec.rb +1 -23
- data/spec/lib/capsule_crm/normalizer_spec.rb +11 -0
- data/spec/lib/capsule_crm/opportunity_spec.rb +22 -341
- data/spec/lib/capsule_crm/organization_spec.rb +39 -60
- data/spec/lib/capsule_crm/party_spec.rb +37 -59
- data/spec/lib/capsule_crm/person_spec.rb +49 -247
- data/spec/lib/capsule_crm/serializer_spec.rb +25 -4
- data/spec/lib/capsule_crm/task_spec.rb +21 -250
- data/spec/lib/capsule_crm/track_spec.rb +1 -15
- data/spec/lib/capsule_crm/user_spec.rb +1 -14
- data/spec/support/{countries.json → all_countries.json} +0 -0
- data/spec/support/{currencies.json → all_currencies.json} +0 -0
- data/spec/support/{milestones.json → all_milestones.json} +0 -0
- data/spec/support/{tracks.json → all_tracks.json} +0 -0
- data/spec/support/custom_field_definitions.json +19 -0
- data/spec/support/helpers.rb +3 -2
- data/spec/support/no_cases.json +5 -0
- data/spec/support/no_countries.json +5 -0
- data/spec/support/no_currencies.json +5 -0
- data/spec/support/no_milestones.json +5 -0
- data/spec/support/no_opportunities.json +5 -0
- data/spec/support/no_tasks.json +5 -0
- data/spec/support/no_tracks.json +5 -0
- data/spec/support/no_users.json +5 -0
- data/spec/support/shared_examples/deletable.rb +15 -0
- data/spec/support/shared_examples/find_all.rb +34 -0
- data/spec/support/shared_examples/find_one.rb +23 -0
- data/spec/support/shared_examples/persistable.rb +318 -0
- data/spec/support/single_person.json +16 -0
- metadata +60 -15
- data/lib/capsule_crm/attributes.rb +0 -11
- data/lib/capsule_crm/capsule_jsonable.rb +0 -13
- data/lib/capsule_crm/collection.rb +0 -9
- data/spec/support/single_user.json +0 -25
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 895602f68388ac5ca0d367ee33568425ea6b9b94
|
4
|
+
data.tar.gz: 426048ab8c437b47607fe449af53455ee22a6c14
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2c0c4236c700a3014c6ed84ed1122d4784047016dfc69b2f8431cac9b23bea80832f17858562e1adf86c0eaf8c3367e0fa21d365187197acce034c91c171400f
|
7
|
+
data.tar.gz: bab4f5d64be4d3bf1f75be0de9d98a1a294307b1fae5af38ee70bee1f26d2ba50c64e70508808d523713c61acb3b94e5e5cdff57c3949a745584aea8c18f4465
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,20 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## 1.3.0
|
4
|
+
|
5
|
+
- Refactored associations to allow classes to reflect on themselves in order to
|
6
|
+
allow serialization to happen in one place
|
7
|
+
- Created a serializer to deal with all converting all objects into capsule crm
|
8
|
+
compliant hashes
|
9
|
+
- Created CapsuleCRM::Normalizer to deal with converting capsule crm hashes into
|
10
|
+
ActiveModel compliant hashes
|
11
|
+
- Extracted querying logic into modules
|
12
|
+
- Extracted persistence logic into modules
|
13
|
+
- Extracted deleting logic into a module
|
14
|
+
- Added CapsuleCRM::Associations::BelongsToFinder to deal with querying the
|
15
|
+
belongs to side of associations
|
16
|
+
- Added CapsuleCRM::CustomFieldDefinitions
|
17
|
+
|
3
18
|
## 1.2.0
|
4
19
|
|
5
20
|
- Refactor associations. Now all classes know about their associations and
|
data/lib/capsule_crm/address.rb
CHANGED
@@ -1,11 +1,12 @@
|
|
1
1
|
module CapsuleCRM
|
2
2
|
class Address
|
3
3
|
include Virtus
|
4
|
-
|
4
|
+
include CapsuleCRM::Serializable
|
5
5
|
extend ActiveModel::Naming
|
6
|
-
include ActiveModel::Serializers::JSON
|
7
6
|
|
8
|
-
|
7
|
+
serializable_config do |config|
|
8
|
+
config.include_root = false
|
9
|
+
end
|
9
10
|
|
10
11
|
attribute :type
|
11
12
|
attribute :street
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require_relative 'belongs_to_association'
|
2
|
+
require_relative 'belongs_to_finder'
|
2
3
|
|
3
4
|
module CapsuleCRM
|
4
5
|
module Associations
|
@@ -41,7 +42,7 @@ module CapsuleCRM
|
|
41
42
|
|
42
43
|
(class << self; self; end).instance_eval do
|
43
44
|
define_method "_for_#{association_name}" do |id|
|
44
|
-
|
45
|
+
CapsuleCRM::Associations::BelongsToFinder.new(association).call(id)
|
45
46
|
end
|
46
47
|
end
|
47
48
|
|
@@ -25,13 +25,21 @@ module CapsuleCRM
|
|
25
25
|
@options = options
|
26
26
|
end
|
27
27
|
|
28
|
+
def inverse
|
29
|
+
@inverse ||=
|
30
|
+
target_klass.has_many_associations.find do |name, association|
|
31
|
+
association.source == association_name &&
|
32
|
+
association.target_klass == defined_on
|
33
|
+
end.try(:last) if target_klass.respond_to?(:has_many_associations)
|
34
|
+
end
|
35
|
+
|
28
36
|
# Public: Build the foreign key column name. If a foreign key name was
|
29
37
|
# supplied in the options during initialization, then that is returned.
|
30
38
|
# Otherwise it is inferred from the association name
|
31
39
|
#
|
32
40
|
# Returns a String foreign key name
|
33
41
|
def foreign_key
|
34
|
-
@foreign_key ||= options[:foreign_key] ||
|
42
|
+
@foreign_key ||= options[:foreign_key] || infer_foreign_key
|
35
43
|
end
|
36
44
|
|
37
45
|
# Public: Find the parent object of the supplied object
|
@@ -72,8 +80,17 @@ module CapsuleCRM
|
|
72
80
|
|
73
81
|
private
|
74
82
|
|
83
|
+
def infer_foreign_key
|
84
|
+
"#{association_name}_id"
|
85
|
+
end
|
86
|
+
|
75
87
|
def target_klass
|
76
|
-
@target_klass ||=
|
88
|
+
@target_klass ||=
|
89
|
+
(options[:class_name] || infer_target_klass).constantize
|
90
|
+
end
|
91
|
+
|
92
|
+
def infer_target_klass
|
93
|
+
"CapsuleCRM::#{association_name.to_s.camelize}"
|
77
94
|
end
|
78
95
|
end
|
79
96
|
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module CapsuleCRM
|
2
|
+
module Associations
|
3
|
+
class BelongsToFinder
|
4
|
+
attr_reader :association
|
5
|
+
attr_writer :singular, :plural, :normalizer
|
6
|
+
|
7
|
+
def initialize(association)
|
8
|
+
@association = association
|
9
|
+
end
|
10
|
+
|
11
|
+
def call(id)
|
12
|
+
id ? find(id) : []
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def inverse
|
18
|
+
@inverse ||= association.inverse
|
19
|
+
end
|
20
|
+
|
21
|
+
def singular
|
22
|
+
@singular ||= inverse.defined_on.queryable_options.singular
|
23
|
+
end
|
24
|
+
|
25
|
+
def plural
|
26
|
+
@plural ||= association.defined_on.queryable_options.plural
|
27
|
+
end
|
28
|
+
|
29
|
+
def find(id)
|
30
|
+
normalizer.normalize_collection get(path(id)) if inverse
|
31
|
+
end
|
32
|
+
|
33
|
+
def get(path_string)
|
34
|
+
CapsuleCRM::Connection.get(path_string)
|
35
|
+
end
|
36
|
+
|
37
|
+
def path(id)
|
38
|
+
"/api/#{singular}/#{id}/#{plural}"
|
39
|
+
end
|
40
|
+
|
41
|
+
def normalizer
|
42
|
+
@normalizer ||= CapsuleCRM::Normalizer.new(association.defined_on)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -38,7 +38,8 @@ module CapsuleCRM
|
|
38
38
|
# Returns a CapsuleCRM::Associations::HasManyProxy
|
39
39
|
def proxy(parent, collection = nil)
|
40
40
|
CapsuleCRM::Associations::HasManyProxy.new(
|
41
|
-
parent, target_klass, build_target(parent, collection), source
|
41
|
+
parent, target_klass, build_target(parent, collection), source,
|
42
|
+
embedded
|
42
43
|
)
|
43
44
|
end
|
44
45
|
|
@@ -49,8 +50,29 @@ module CapsuleCRM
|
|
49
50
|
:has_many
|
50
51
|
end
|
51
52
|
|
53
|
+
def embedded
|
54
|
+
@embedded ||= !!options[:embedded]
|
55
|
+
end
|
56
|
+
|
57
|
+
def source
|
58
|
+
@source ||= options[:source] || infer_source
|
59
|
+
end
|
60
|
+
|
61
|
+
def target_klass
|
62
|
+
@target_klass ||=
|
63
|
+
(options[:class_name] || infer_target_klass).constantize
|
64
|
+
end
|
65
|
+
|
52
66
|
private
|
53
67
|
|
68
|
+
def infer_source
|
69
|
+
defined_on.to_s.demodulize.downcase.singularize.to_sym
|
70
|
+
end
|
71
|
+
|
72
|
+
def infer_target_klass
|
73
|
+
"CapsuleCRM::#{association_name.to_s.singularize.camelize}"
|
74
|
+
end
|
75
|
+
|
54
76
|
def build_target(parent, collection)
|
55
77
|
collection.nil? ? target(parent) : collection_to_array(collection)
|
56
78
|
end
|
@@ -63,18 +85,10 @@ module CapsuleCRM
|
|
63
85
|
end
|
64
86
|
end
|
65
87
|
|
66
|
-
def target_klass
|
67
|
-
@target_klass ||= options[:class_name].constantize
|
68
|
-
end
|
69
|
-
|
70
88
|
def target(parent)
|
71
89
|
target_klass.
|
72
90
|
send("_for_#{parent.class.to_s.demodulize.downcase}", parent.id)
|
73
91
|
end
|
74
|
-
|
75
|
-
def source
|
76
|
-
@source ||= options[:source]
|
77
|
-
end
|
78
92
|
end
|
79
93
|
end
|
80
94
|
end
|
@@ -2,11 +2,12 @@ module CapsuleCRM
|
|
2
2
|
module Associations
|
3
3
|
class HasManyProxy < BasicObject
|
4
4
|
|
5
|
-
def initialize(parent, target_klass, target, source)
|
5
|
+
def initialize(parent, target_klass, target, source, embedded)
|
6
6
|
@target = target
|
7
7
|
@parent = parent
|
8
8
|
@target_klass = target_klass
|
9
9
|
@source = source
|
10
|
+
@embedded = embedded
|
10
11
|
end
|
11
12
|
|
12
13
|
def method_missing(name, *args, &block)
|
@@ -21,9 +22,17 @@ module CapsuleCRM
|
|
21
22
|
end
|
22
23
|
|
23
24
|
def create(attributes = {})
|
24
|
-
build(attributes).tap do |
|
25
|
-
record_not_saved(
|
26
|
-
end
|
25
|
+
record = build(attributes).tap do |r|
|
26
|
+
record_not_saved(r) unless parent.persisted?
|
27
|
+
end
|
28
|
+
embedded? ? save : record.save
|
29
|
+
end
|
30
|
+
|
31
|
+
def create!(attributes = {})
|
32
|
+
record = build(attributes).tap do |r|
|
33
|
+
record_not_saved(r) unless parent.persisted?
|
34
|
+
end
|
35
|
+
embedded? ? save! : record.save!
|
27
36
|
end
|
28
37
|
|
29
38
|
def tap
|
@@ -31,8 +40,33 @@ module CapsuleCRM
|
|
31
40
|
self
|
32
41
|
end
|
33
42
|
|
43
|
+
def to_capsule_json(root = nil)
|
44
|
+
{ root => serializer.serialize_collection(target_klass, target) }
|
45
|
+
end
|
46
|
+
|
34
47
|
private
|
35
48
|
|
49
|
+
def serializer
|
50
|
+
@serializer ||= ::CapsuleCRM::Serializer
|
51
|
+
end
|
52
|
+
|
53
|
+
def save
|
54
|
+
json = to_capsule_json(target_klass.serializable_options.collection_root)
|
55
|
+
path = [
|
56
|
+
'/api', parent.class.queryable_options.singular, parent.id,
|
57
|
+
target_klass.queryable_options.plural
|
58
|
+
].join('/')
|
59
|
+
::CapsuleCRM::Connection.put(path, json)
|
60
|
+
end
|
61
|
+
|
62
|
+
def save!
|
63
|
+
save
|
64
|
+
end
|
65
|
+
|
66
|
+
def embedded?
|
67
|
+
@embedded
|
68
|
+
end
|
69
|
+
|
36
70
|
def record_not_saved(record)
|
37
71
|
raise ::CapsuleCRM::Errors::RecordNotSaved.new(record)
|
38
72
|
end
|
data/lib/capsule_crm/case.rb
CHANGED
@@ -6,10 +6,34 @@ module CapsuleCRM
|
|
6
6
|
include ActiveModel::Conversion
|
7
7
|
include ActiveModel::Validations
|
8
8
|
|
9
|
-
include CapsuleCRM::Collection
|
10
9
|
include CapsuleCRM::Associations
|
10
|
+
include CapsuleCRM::Persistence::Persistable
|
11
|
+
include CapsuleCRM::Persistence::Deletable
|
12
|
+
include CapsuleCRM::Querying::Findable
|
13
|
+
include CapsuleCRM::Serializable
|
11
14
|
include CapsuleCRM::Taggable
|
12
15
|
|
16
|
+
serializable_config do |config|
|
17
|
+
config.collection_root = :kases
|
18
|
+
config.root = :kase
|
19
|
+
config.excluded_keys = [:track_id]
|
20
|
+
end
|
21
|
+
|
22
|
+
queryable_config do |config|
|
23
|
+
config.plural = :kase
|
24
|
+
config.singular = :kase
|
25
|
+
end
|
26
|
+
|
27
|
+
persistable_config do |config|
|
28
|
+
config.create = lambda do |kase|
|
29
|
+
path = "party/#{kase.party.try(:id)}/kase"
|
30
|
+
path += "?trackId=#{kase.track.id}" if kase.track
|
31
|
+
path
|
32
|
+
end
|
33
|
+
config.update = lambda { |kase| "kase/#{kase.id}" }
|
34
|
+
config.destroy = lambda { |kase| "kase/#{kase.id}" }
|
35
|
+
end
|
36
|
+
|
13
37
|
attribute :id, Integer
|
14
38
|
attribute :name, String
|
15
39
|
attribute :description, String
|
@@ -21,247 +45,20 @@ module CapsuleCRM
|
|
21
45
|
validates :name, presence: true
|
22
46
|
validates :party, presence: true
|
23
47
|
|
24
|
-
belongs_to :party
|
25
|
-
belongs_to :track
|
26
|
-
|
27
|
-
has_many :tasks, class_name: 'CapsuleCRM::Task', source: :case
|
28
|
-
|
29
|
-
# Public: Search and retrieve all cases in CapsuleCRM
|
30
|
-
#
|
31
|
-
# options - the Hash of query options (default: {}):
|
32
|
-
# :tag - the String tag to search for
|
33
|
-
# :lastmodified - the Date after which the case was last
|
34
|
-
# modified by
|
35
|
-
# :start - the Integer index of the first record to
|
36
|
-
# return.
|
37
|
-
# :limit - the Integer number of records to return
|
38
|
-
#
|
39
|
-
# Examples
|
40
|
-
#
|
41
|
-
# CapsuleCRM::Case.all(tag: 'Some Tag')
|
42
|
-
#
|
43
|
-
# Returns a CapsuleCRM::ResultsProxy of CapsuleCRM::Case objects
|
44
|
-
def self.all(options = {})
|
45
|
-
init_collection(
|
46
|
-
CapsuleCRM::Connection.get('/api/kase', options)['kases']['kase']
|
47
|
-
)
|
48
|
-
end
|
49
|
-
|
50
|
-
# Public: Search for a single case by ID
|
51
|
-
#
|
52
|
-
# id - the Integer ID of the record to search for
|
53
|
-
#
|
54
|
-
# Examples
|
55
|
-
#
|
56
|
-
# CapsuleCRM::Case.find(1)
|
57
|
-
#
|
58
|
-
# Returns a CapsuleCRM::Case object
|
59
|
-
def self.find(id)
|
60
|
-
new CapsuleCRM::Connection.get("/api/kase/#{id}")['kase']
|
61
|
-
end
|
62
|
-
|
63
|
-
# Public: Create a CapsuleCRM::Case
|
64
|
-
#
|
65
|
-
# attributes - the Hash of attributes (default: {}):
|
66
|
-
# :name - the String name of the case (required)
|
67
|
-
# :description - the String description
|
68
|
-
# :status - the String status (OPEN or CLOSED), default
|
69
|
-
# is OPEN
|
70
|
-
# :owner - the String username of the owner
|
71
|
-
# :close_date - the Date when the case was/will be closed.
|
72
|
-
# Ignored if the status is set to CLOSED
|
73
|
-
#
|
74
|
-
# Examples
|
75
|
-
#
|
76
|
-
# CapsuleCRM::Case.create name: "Matt's test case"
|
77
|
-
#
|
78
|
-
# Returns a CapsuleCRM::Case
|
79
|
-
def self.create(attributes = {})
|
80
|
-
new(attributes).tap(&:save)
|
81
|
-
end
|
82
|
-
|
83
|
-
# Public: Create a CapsuleCRM::Case or raise a error
|
84
|
-
#
|
85
|
-
# attributes - the Hash of attributes (default: {}):
|
86
|
-
# :name - the String name of the case (required)
|
87
|
-
# :description - the String description
|
88
|
-
# :status - the String status (OPEN or CLOSED), default
|
89
|
-
# is OPEN
|
90
|
-
# :owner - the String username of the owner
|
91
|
-
# :close_date - the Date when the case was/will be closed.
|
92
|
-
# Ignored if the status is set to CLOSED
|
93
|
-
#
|
94
|
-
# Examples
|
95
|
-
#
|
96
|
-
# CapsuleCRM::Case.create! name: "Matt's test case"
|
97
|
-
# => CapsuleCRM::Case object
|
98
|
-
#
|
99
|
-
# CapsuleCRM::Case.create! name: nil
|
100
|
-
# => CapsuleCRM::Errors::RecordInvalid
|
101
|
-
#
|
102
|
-
# Returns a CapsuleCRM::Case
|
103
|
-
def self.create!(attributes = {})
|
104
|
-
new(attributes).tap(&:save!)
|
105
|
-
end
|
106
|
-
|
107
|
-
# Public: Updates an existing CapsuleCRM::Case with the supplied attributes
|
108
|
-
#
|
109
|
-
# attributes - the Hash of attributes (default: {}):
|
110
|
-
# :name - the String name of the case (required)
|
111
|
-
# :description - the String description
|
112
|
-
# :status - the String status (OPEN or CLOSED), default
|
113
|
-
# is OPEN
|
114
|
-
# :owner - the String username of the owner
|
115
|
-
# :close_date - the Date when the case was/will be closed.
|
116
|
-
# Ignored if the status is set to CLOSED
|
117
|
-
#
|
118
|
-
# Examples
|
119
|
-
#
|
120
|
-
# kase = CapsuleCRM::Case.find(1)
|
121
|
-
# kase.update_attributes name: 'A new name'
|
122
|
-
#
|
123
|
-
# Returns a CapsuleCRM::Case
|
124
|
-
def update_attributes(attributes = {})
|
125
|
-
self.attributes = attributes
|
126
|
-
save
|
127
|
-
end
|
128
|
-
|
129
|
-
# Public: Updates an existing CapsuleCRM::Case with the supplied attributes
|
130
|
-
# or raises an error
|
131
|
-
#
|
132
|
-
# attributes - the Hash of attributes (default: {}):
|
133
|
-
# :name - the String name of the case (required)
|
134
|
-
# :description - the String description
|
135
|
-
# :status - the String status (OPEN or CLOSED), default
|
136
|
-
# is OPEN
|
137
|
-
# :owner - the String username of the owner
|
138
|
-
# :close_date - the Date when the case was/will be closed.
|
139
|
-
# Ignored if the status is set to CLOSED
|
140
|
-
#
|
141
|
-
# Examples
|
142
|
-
#
|
143
|
-
# kase = CapsuleCRM::Case.find(1)
|
144
|
-
# kase.update_attributes! name: 'A new name'
|
145
|
-
# => CapsuleCRM::Case object
|
146
|
-
#
|
147
|
-
# kase.update_attributes! name: nil
|
148
|
-
# => CapsuleCRM::Errors::RecordInvalid
|
149
|
-
#
|
150
|
-
# Returns a CapsuleCRM::Case
|
151
|
-
def update_attributes!(attributes = {})
|
152
|
-
self.attributes = attributes
|
153
|
-
save!
|
154
|
-
end
|
155
|
-
|
156
|
-
# Public: Saves this CapsuleCRM::Case
|
157
|
-
#
|
158
|
-
# Examples:
|
159
|
-
#
|
160
|
-
# kase = CapsuleCRM::Case.new(
|
161
|
-
# name: 'Case Name', party: person_or_organization
|
162
|
-
# )
|
163
|
-
# kase.save
|
164
|
-
# => CapsuleCRM::Case object
|
165
|
-
#
|
166
|
-
# Returns the CapsuleCRM::Case or false
|
167
|
-
def save
|
168
|
-
if valid?
|
169
|
-
new_record? ? create_record : update_record
|
170
|
-
else
|
171
|
-
false
|
172
|
-
end
|
173
|
-
end
|
174
|
-
|
175
|
-
# Public: Saves this CapsuleCRM::Case or raises an error
|
176
|
-
#
|
177
|
-
# Examples
|
178
|
-
#
|
179
|
-
# kase = CapsuleCRM::Case.find(1)
|
180
|
-
# kase.name = 'Changed name'
|
181
|
-
# kase.save!
|
182
|
-
# => CapsuleCRM::Case object
|
183
|
-
#
|
184
|
-
# kase.name = nil
|
185
|
-
# kase.save!
|
186
|
-
# => CapsuleCRM::Errors::RecordInvalid
|
187
|
-
#
|
188
|
-
# Returns a CapsuleCRM::Case
|
189
|
-
def save!
|
190
|
-
if valid?
|
191
|
-
new_record? ? create_record : update_record
|
192
|
-
else
|
193
|
-
raise CapsuleCRM::Errors::RecordInvalid.new(self)
|
194
|
-
end
|
195
|
-
end
|
48
|
+
belongs_to :party
|
49
|
+
belongs_to :track
|
196
50
|
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
#
|
201
|
-
# CapsuleCRM::Case.find(1).destroy
|
202
|
-
#
|
203
|
-
# Returns the CapsuleCRM::Case object
|
204
|
-
def destroy
|
205
|
-
self.id = nil if CapsuleCRM::Connection.delete("/api/kase/#{id}")
|
206
|
-
self
|
207
|
-
end
|
208
|
-
|
209
|
-
# Public: Is this case a new record?
|
210
|
-
#
|
211
|
-
# Examples
|
212
|
-
#
|
213
|
-
# CapsuleCRM::Case.find(1).new_record?
|
214
|
-
# => false
|
215
|
-
#
|
216
|
-
# CapsuleCRM::Case.new.new_record?
|
217
|
-
# => true
|
218
|
-
#
|
219
|
-
# Returns a Boolean
|
220
|
-
def new_record?
|
221
|
-
!id
|
222
|
-
end
|
51
|
+
has_many :tasks
|
52
|
+
has_many :histories
|
53
|
+
has_many :custom_fields, embedded: true
|
223
54
|
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
#
|
228
|
-
# CapsuleCRM::Case.find(1).persisted?
|
229
|
-
# => true
|
230
|
-
#
|
231
|
-
# CapsuleCRM::Case.new.persisted?
|
232
|
-
# => false
|
233
|
-
#
|
234
|
-
# Returns a Boolean
|
235
|
-
def persisted?
|
236
|
-
!new_record?
|
237
|
-
end
|
238
|
-
|
239
|
-
def to_capsule_json
|
240
|
-
serializer.serialize
|
55
|
+
class << self
|
56
|
+
alias :_for_organization :_for_party
|
57
|
+
alias :_for_person :_for_party
|
241
58
|
end
|
242
59
|
|
243
60
|
def self._for_track(track)
|
244
61
|
raise NotImplementedError.new("There is no way to find cases by trackId in the Capsule API right now")
|
245
62
|
end
|
246
|
-
|
247
|
-
private
|
248
|
-
|
249
|
-
def serializer
|
250
|
-
@serializer ||= CapsuleCRM::Serializer.
|
251
|
-
new(self, excluded_keys: ['track_id'], root: :kaze)
|
252
|
-
end
|
253
|
-
|
254
|
-
def create_record
|
255
|
-
path = "/api/party/#{party_id}/kase"
|
256
|
-
path += "?trackId=#{track_id}" if track_id
|
257
|
-
self.attributes = CapsuleCRM::Connection.post(
|
258
|
-
path, to_capsule_json
|
259
|
-
)
|
260
|
-
self
|
261
|
-
end
|
262
|
-
|
263
|
-
def update_record
|
264
|
-
CapsuleCRM::Connection.put("/api/kase/#{id}", to_capsule_json)
|
265
|
-
end
|
266
63
|
end
|
267
64
|
end
|
@@ -27,8 +27,11 @@ module CapsuleCRM
|
|
27
27
|
private
|
28
28
|
|
29
29
|
def self.request(method, path, params)
|
30
|
+
CapsuleCRM.log "CapsuleCRM: #{method.upcase} #{path} with #{params}"
|
30
31
|
faraday.send(method, path, params) do |req|
|
31
32
|
req.headers.update default_request_headers
|
33
|
+
end.tap do |response|
|
34
|
+
CapsuleCRM.log "CapsuleCRM Response: #{response.body}"
|
32
35
|
end
|
33
36
|
end
|
34
37
|
|
data/lib/capsule_crm/country.rb
CHANGED
@@ -2,20 +2,14 @@ module CapsuleCRM
|
|
2
2
|
class Country
|
3
3
|
include Virtus
|
4
4
|
|
5
|
-
|
5
|
+
include CapsuleCRM::Serializable
|
6
|
+
include CapsuleCRM::Querying::Configuration
|
7
|
+
include CapsuleCRM::Querying::FindAll
|
6
8
|
|
7
|
-
|
8
|
-
|
9
|
-
# Examples
|
10
|
-
#
|
11
|
-
# CapsuleCRM::Country.all
|
12
|
-
#
|
13
|
-
# Returns an Array of CapsuleCRM::Country objects
|
14
|
-
def self.all
|
15
|
-
CapsuleCRM::Connection.
|
16
|
-
get('/api/countries')['countries']['country'].map do |country_name|
|
17
|
-
new name: country_name
|
18
|
-
end
|
9
|
+
serializable_config do |config|
|
10
|
+
config.attribute_to_assign = :name
|
19
11
|
end
|
12
|
+
|
13
|
+
attribute :name
|
20
14
|
end
|
21
15
|
end
|
data/lib/capsule_crm/currency.rb
CHANGED
@@ -6,20 +6,14 @@ module CapsuleCRM
|
|
6
6
|
include ActiveModel::Conversion
|
7
7
|
include ActiveModel::Validations
|
8
8
|
|
9
|
-
|
9
|
+
include CapsuleCRM::Querying::Configuration
|
10
|
+
include CapsuleCRM::Querying::FindAll
|
11
|
+
include CapsuleCRM::Serializable
|
10
12
|
|
11
|
-
|
12
|
-
|
13
|
-
# Examples
|
14
|
-
#
|
15
|
-
# CapsuleCRM::Currency.all
|
16
|
-
#
|
17
|
-
# Returns an Array of CapsuleCRM::Currency objects
|
18
|
-
def self.all
|
19
|
-
CapsuleCRM::Connection.
|
20
|
-
get('/api/currencies')['currencies']['currency'].map do |currency_code|
|
21
|
-
new code: currency_code
|
22
|
-
end
|
13
|
+
serializable_config do |config|
|
14
|
+
config.attribute_to_assign = :code
|
23
15
|
end
|
16
|
+
|
17
|
+
attribute :code, String
|
24
18
|
end
|
25
19
|
end
|