capsule_crm 1.2.0 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|