nexus_core 0.5.0 → 0.6.1
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/app/accessors/bank_account_accessor.rb +8 -0
- data/app/accessors/investor_account_accessor.rb +2 -9
- data/app/accessors/member_accessor.rb +1 -0
- data/app/delegations/member_profile_delegation.rb +8 -0
- data/app/form_models/investor_profile_form.rb +126 -0
- data/app/form_models/investor_tier_form.rb +60 -0
- data/lib/nexus_core.rb +1 -0
- data/lib/nexus_core/geoip_dat_location.rb +3 -0
- data/lib/nexus_core/report_utils.rb +1 -1
- data/lib/nexus_core/version.rb +2 -2
- metadata +21 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4539337c664651ef414aebdb3f59affdb3d6ab7d
|
4
|
+
data.tar.gz: e9c50c15bfbfa5656c58960786abb70dd12781f9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 820bff9ba3cdda432f2e3d0704954552bed71ac2b80fb620ed719b40aaa49a74e558810d62fe5845b7a65d66255bda0a2e9707b48b5522d15d29b1a539663082
|
7
|
+
data.tar.gz: 4bfc0a707e01ac3229b8297e263b5a3216357e8b6d43a644d4dd49cb0d8b5d0978c9f3ce7a6ecc3c78b2ecc68bd88f58419dd78f205a4d89585039d0706e60b7
|
@@ -2,8 +2,9 @@ module InvestorAccountAccessor
|
|
2
2
|
def self.included(base)
|
3
3
|
base.class_eval do
|
4
4
|
belongs_to :member
|
5
|
+
has_many :wallets # will be destroyed by bank account cascade destroy
|
5
6
|
has_many :bank_accounts, dependent: :destroy
|
6
|
-
has_many :
|
7
|
+
has_many :investor_state_transitions, dependent: :destroy, class_name: InvestorAccount.investor_state_transition_klass.to_s
|
7
8
|
end
|
8
9
|
end
|
9
10
|
|
@@ -19,12 +20,4 @@ module InvestorAccountAccessor
|
|
19
20
|
def long_account_id
|
20
21
|
'U' + id.to_s.rjust(6, '0')
|
21
22
|
end
|
22
|
-
|
23
|
-
def approved?
|
24
|
-
approval_status == STATUS_APPROVED
|
25
|
-
end
|
26
|
-
|
27
|
-
def pending?
|
28
|
-
approval_status == STATUS_PENDING_VERIFICATION
|
29
|
-
end
|
30
23
|
end
|
@@ -3,6 +3,7 @@ module MemberAccessor
|
|
3
3
|
base.class_eval do
|
4
4
|
has_many :identities, dependent: :destroy, primary_key: :email, foreign_key: :email
|
5
5
|
has_one :member_profile, dependent: :destroy
|
6
|
+
alias_method :profile, :member_profile
|
6
7
|
has_one :investor_account, dependent: :destroy
|
7
8
|
alias_method :investor, :investor_account
|
8
9
|
has_one :preference, dependent: :destroy
|
@@ -0,0 +1,126 @@
|
|
1
|
+
class InvestorProfileForm
|
2
|
+
include ActiveModel::Model
|
3
|
+
include Virtus.model
|
4
|
+
|
5
|
+
attr_accessor :member, :investor_account, :bank_account
|
6
|
+
attribute :model_id, Integer
|
7
|
+
|
8
|
+
AggregateRoot = Member
|
9
|
+
|
10
|
+
# Member fields
|
11
|
+
attribute :name, String
|
12
|
+
attribute :nationality, String
|
13
|
+
attribute :id_number, String
|
14
|
+
attribute :date_of_birth, Date
|
15
|
+
attribute :phone_number, String
|
16
|
+
attribute :address1, String
|
17
|
+
attribute :address2, String
|
18
|
+
attribute :city, String
|
19
|
+
attribute :postal_code, String
|
20
|
+
attribute :country_of_residence, String
|
21
|
+
attribute :id_document, String
|
22
|
+
attribute :id_document_additional, String
|
23
|
+
attribute :proof_of_residence, String
|
24
|
+
|
25
|
+
# Bank account fields
|
26
|
+
attribute :account_holder, String
|
27
|
+
attribute :account_number, String
|
28
|
+
attribute :account_type, String
|
29
|
+
attribute :bank_name, String
|
30
|
+
attribute :bank_address, String
|
31
|
+
attribute :bank_country, String
|
32
|
+
attribute :swift_code, String
|
33
|
+
|
34
|
+
class << self
|
35
|
+
def find(id)
|
36
|
+
member = AggregateRoot.find id
|
37
|
+
investor_account = member.investor_account
|
38
|
+
bank_account = investor_account.bank_accounts.first
|
39
|
+
attrs = member.attributes.merge(investor_account.attributes).merge(bank_account.attributes)
|
40
|
+
form = self.new attrs
|
41
|
+
form.set_model id
|
42
|
+
return form
|
43
|
+
end
|
44
|
+
|
45
|
+
def update(params)
|
46
|
+
if params[:model_id].blank?
|
47
|
+
raise 'Model ID not found'
|
48
|
+
end
|
49
|
+
form = self.new sanitized_params(params)
|
50
|
+
form.set_model params[:model_id]
|
51
|
+
form.persist(params)
|
52
|
+
return form
|
53
|
+
end
|
54
|
+
|
55
|
+
def sanitized_params(params)
|
56
|
+
params[:date_of_birth] = Date.parse("#{params['date_of_birth(3i)']}-#{params['date_of_birth(2i)']}-#{params['date_of_birth(1i)']}")
|
57
|
+
return params
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def set_model(member_id)
|
62
|
+
@model_id = (member_id.respond_to? :id)? member_id.id : member_id
|
63
|
+
@member = AggregateRoot.find member_id
|
64
|
+
@investor_account = @member.investor_account
|
65
|
+
@bank_account = @investor_account.bank_accounts.first
|
66
|
+
end
|
67
|
+
|
68
|
+
def persist(params)
|
69
|
+
params.each do |k,v|
|
70
|
+
setter_method = "#{k}="
|
71
|
+
if @member.respond_to? setter_method
|
72
|
+
@member.send setter_method, v
|
73
|
+
end
|
74
|
+
if @investor_account.respond_to? setter_method
|
75
|
+
@investor_account.send setter_method, v
|
76
|
+
end
|
77
|
+
if @bank_account.respond_to? setter_method
|
78
|
+
@bank_account.send setter_method, v
|
79
|
+
end
|
80
|
+
end
|
81
|
+
@member.save!
|
82
|
+
@investor_account.save!
|
83
|
+
@bank_account.save!
|
84
|
+
end
|
85
|
+
|
86
|
+
module Validator
|
87
|
+
extend ActiveSupport::Concern
|
88
|
+
|
89
|
+
included do
|
90
|
+
validates_presence_of :name,
|
91
|
+
:id_number, :date_of_birth, :phone_number,
|
92
|
+
:address1, :city, :postal_code,
|
93
|
+
:country_of_residence, :nationality,
|
94
|
+
:account_holder, :account_number, :account_type,
|
95
|
+
:bank_country, :bank_name
|
96
|
+
|
97
|
+
validates_presence_of :id_document, if: :id_document_blank?
|
98
|
+
validates_presence_of :id_document_additional, if: :is_passport_blank_and_not_local_region?
|
99
|
+
validate :age_must_be_above_18
|
100
|
+
validate :name_and_account_holder_must_be_the_same
|
101
|
+
end
|
102
|
+
|
103
|
+
def age_must_be_above_18
|
104
|
+
too_young = date_of_birth.present? && TimeDifference.between(date_of_birth, Date.today).in_years.to_i < 18
|
105
|
+
errors.add(:date_of_birth, I18n.t('investor_form.must_be_older_than_18')) if too_young
|
106
|
+
end
|
107
|
+
|
108
|
+
def name_and_account_holder_must_be_the_same
|
109
|
+
if name.to_s != account_holder.to_s
|
110
|
+
msg = I18n.t('investor_form.name_and_account_holder_must_be_the_same')
|
111
|
+
errors.add(:name, msg)
|
112
|
+
errors.add(:account_holder, msg)
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
def id_document_blank?
|
117
|
+
@member.id_document.blank?
|
118
|
+
end
|
119
|
+
|
120
|
+
def is_passport_blank_and_not_local_region?
|
121
|
+
is_local_region = %w(Singapore Indonesia).include? nationality
|
122
|
+
!is_local_region && @member.id_document_additional.blank?
|
123
|
+
end
|
124
|
+
end
|
125
|
+
include Validator
|
126
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
class InvestorTierForm
|
2
|
+
include ActiveModel::Model
|
3
|
+
include Virtus.model
|
4
|
+
|
5
|
+
attr_accessor :member, :investor_account
|
6
|
+
attribute :model_id, Integer
|
7
|
+
|
8
|
+
|
9
|
+
class << self
|
10
|
+
def find(id)
|
11
|
+
member = Member.find id
|
12
|
+
form = self.new member.attributes.merge(member.investor_account && member.investor_account.attributes || {})
|
13
|
+
form.set_model id
|
14
|
+
return form
|
15
|
+
end
|
16
|
+
|
17
|
+
def update(params)
|
18
|
+
if params[:model_id].blank?
|
19
|
+
raise 'Model ID not found'
|
20
|
+
end
|
21
|
+
form = self.new sanitized_params(params)
|
22
|
+
form.set_model params[:model_id]
|
23
|
+
form.persist(params)
|
24
|
+
return form
|
25
|
+
end
|
26
|
+
|
27
|
+
def sanitized_params(params)
|
28
|
+
return params
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def set_model(member_id)
|
33
|
+
@model_id = (member_id.respond_to? :id)? member_id.id : member_id
|
34
|
+
@member = Member.find member_id
|
35
|
+
@investor_account = @member.investor.blank?? InvestorAccount.create!(member: @member) : @member.investor
|
36
|
+
end
|
37
|
+
|
38
|
+
def persist(params)
|
39
|
+
params.each do |k,v|
|
40
|
+
setter_method = "#{k}="
|
41
|
+
if @member.respond_to? setter_method
|
42
|
+
@member.send setter_method, v
|
43
|
+
end
|
44
|
+
if @investor_account.respond_to? setter_method
|
45
|
+
@investor_account.send setter_method, v
|
46
|
+
end
|
47
|
+
end
|
48
|
+
@member.save!
|
49
|
+
@investor_account.save!
|
50
|
+
end
|
51
|
+
|
52
|
+
module Validator
|
53
|
+
extend ActiveSupport::Concern
|
54
|
+
|
55
|
+
included do
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
include Validator
|
60
|
+
end
|
data/lib/nexus_core.rb
CHANGED
data/lib/nexus_core/version.rb
CHANGED
@@ -1,3 +1,3 @@
|
|
1
1
|
module NexusCore
|
2
|
-
VERSION = '0.
|
3
|
-
end
|
2
|
+
VERSION = '0.6.1'
|
3
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nexus_core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Felix Tioh
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-11-
|
11
|
+
date: 2016-11-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -78,6 +78,20 @@ dependencies:
|
|
78
78
|
- - ">="
|
79
79
|
- !ruby/object:Gem::Version
|
80
80
|
version: 1.6.2
|
81
|
+
- !ruby/object:Gem::Dependency
|
82
|
+
name: virtus
|
83
|
+
requirement: !ruby/object:Gem::Requirement
|
84
|
+
requirements:
|
85
|
+
- - ">="
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: '0'
|
88
|
+
type: :runtime
|
89
|
+
prerelease: false
|
90
|
+
version_requirements: !ruby/object:Gem::Requirement
|
91
|
+
requirements:
|
92
|
+
- - ">="
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: '0'
|
81
95
|
description: ''
|
82
96
|
email:
|
83
97
|
- felixsagitta@gmail.com
|
@@ -88,6 +102,7 @@ files:
|
|
88
102
|
- MIT-LICENSE
|
89
103
|
- README.md
|
90
104
|
- Rakefile
|
105
|
+
- app/accessors/bank_account_accessor.rb
|
91
106
|
- app/accessors/investor_account_accessor.rb
|
92
107
|
- app/accessors/journal_entry_accessor.rb
|
93
108
|
- app/accessors/member_accessor.rb
|
@@ -101,8 +116,11 @@ files:
|
|
101
116
|
- app/constants/withdrawal_constants.rb
|
102
117
|
- app/delegations/investor_account_delegation.rb
|
103
118
|
- app/delegations/member_delegation.rb
|
119
|
+
- app/delegations/member_profile_delegation.rb
|
104
120
|
- app/delegations/top_up_delegation.rb
|
105
121
|
- app/delegations/withdrawal_delegation.rb
|
122
|
+
- app/form_models/investor_profile_form.rb
|
123
|
+
- app/form_models/investor_tier_form.rb
|
106
124
|
- app/lifecycle/investor_account_lifecycle.rb
|
107
125
|
- app/lifecycle/member_lifecycle.rb
|
108
126
|
- app/lifecycle/top_up_lifecycle.rb
|
@@ -112,6 +130,7 @@ files:
|
|
112
130
|
- app/state_machines/withdrawal_state_machine.rb
|
113
131
|
- lib/nexus_core.rb
|
114
132
|
- lib/nexus_core/engine.rb
|
133
|
+
- lib/nexus_core/geoip_dat_location.rb
|
115
134
|
- lib/nexus_core/report_utils.rb
|
116
135
|
- lib/nexus_core/version.rb
|
117
136
|
- lib/tasks/nexus_core_tasks.rake
|