nexus_core 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +28 -0
- data/Rakefile +34 -0
- data/app/accessors/investor_account_accessor.rb +30 -0
- data/app/accessors/journal_entry_accessor.rb +11 -0
- data/app/accessors/member_accessor.rb +28 -0
- data/app/accessors/top_up_accessor.rb +9 -0
- data/app/accessors/wallet_accessor.rb +18 -0
- data/app/accessors/withdrawal_accessor.rb +9 -0
- data/app/constants/investor_constants.rb +13 -0
- data/app/constants/journal_constants.rb +9 -0
- data/app/constants/origin.rb +4 -0
- data/app/constants/top_up_constants.rb +5 -0
- data/app/constants/withdrawal_constants.rb +5 -0
- data/app/delegations/investor_account_delegation.rb +24 -0
- data/app/delegations/member_delegation.rb +16 -0
- data/app/delegations/top_up_delegation.rb +14 -0
- data/app/delegations/withdrawal_delegation.rb +14 -0
- data/app/lifecycle/investor_account_lifecycle.rb +12 -0
- data/app/lifecycle/member_lifecycle.rb +41 -0
- data/app/lifecycle/top_up_lifecycle.rb +21 -0
- data/app/lifecycle/withdrawal_lifecycle.rb +21 -0
- data/app/state_machines/investor_account_state_machine.rb +34 -0
- data/app/state_machines/top_up_state_machine.rb +17 -0
- data/app/state_machines/withdrawal_state_machine.rb +17 -0
- data/lib/nexus_core/engine.rb +4 -0
- data/lib/nexus_core/report_utils.rb +67 -0
- data/lib/nexus_core/version.rb +3 -0
- data/lib/nexus_core.rb +5 -0
- data/lib/tasks/nexus_core_tasks.rake +4 -0
- metadata +142 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: d397d4a83206b0252f4a7a4f3091e3917a9ec952
|
4
|
+
data.tar.gz: 281c0120b3d8960ac303185b6788533cce3038b3
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: afbdaebfcb5a24c6cc732982065fa9eb818f92ffbff8999c9dc4dc143e069b1603dcd7f3b3cf48bf4c48edf2074265adbbb5be40a7774838c951737b5539f142
|
7
|
+
data.tar.gz: b853e48b49862d9ea047f0ff691f425059052e8602402ac3e34f49726fefd6abb6c9c5879f69e288668c9f2c13f82c3c1c89d738559e8cc790fdd9b483293f03
|
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright 2016 Felix Tioh
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# NexusCore
|
2
|
+
Short description and motivation.
|
3
|
+
|
4
|
+
## Usage
|
5
|
+
How to use my plugin.
|
6
|
+
|
7
|
+
## Installation
|
8
|
+
Add this line to your application's Gemfile:
|
9
|
+
|
10
|
+
```ruby
|
11
|
+
gem 'nexus_core'
|
12
|
+
```
|
13
|
+
|
14
|
+
And then execute:
|
15
|
+
```bash
|
16
|
+
$ bundle
|
17
|
+
```
|
18
|
+
|
19
|
+
Or install it yourself as:
|
20
|
+
```bash
|
21
|
+
$ gem install nexus_core
|
22
|
+
```
|
23
|
+
|
24
|
+
## Contributing
|
25
|
+
Contribution directions go here.
|
26
|
+
|
27
|
+
## License
|
28
|
+
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
data/Rakefile
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
begin
|
2
|
+
require 'bundler/setup'
|
3
|
+
rescue LoadError
|
4
|
+
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
5
|
+
end
|
6
|
+
|
7
|
+
require 'rdoc/task'
|
8
|
+
|
9
|
+
RDoc::Task.new(:rdoc) do |rdoc|
|
10
|
+
rdoc.rdoc_dir = 'rdoc'
|
11
|
+
rdoc.title = 'NexusCore'
|
12
|
+
rdoc.options << '--line-numbers'
|
13
|
+
rdoc.rdoc_files.include('README.md')
|
14
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
15
|
+
end
|
16
|
+
|
17
|
+
|
18
|
+
|
19
|
+
|
20
|
+
|
21
|
+
|
22
|
+
require 'bundler/gem_tasks'
|
23
|
+
|
24
|
+
require 'rake/testtask'
|
25
|
+
|
26
|
+
Rake::TestTask.new(:test) do |t|
|
27
|
+
t.libs << 'lib'
|
28
|
+
t.libs << 'test'
|
29
|
+
t.pattern = 'test/**/*_test.rb'
|
30
|
+
t.verbose = false
|
31
|
+
end
|
32
|
+
|
33
|
+
|
34
|
+
task default: :test
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module InvestorAccountAccessor
|
2
|
+
def self.included(base)
|
3
|
+
base.class_eval do
|
4
|
+
belongs_to :member
|
5
|
+
has_many :bank_accounts, dependent: :destroy
|
6
|
+
has_many :wallets, dependent: :destroy
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def investments
|
11
|
+
wallet_ids = wallets.pluck(:id)
|
12
|
+
investment_klass.where(wallet_id: wallet_ids)
|
13
|
+
end
|
14
|
+
|
15
|
+
def account_id
|
16
|
+
'#' + id.to_s.rjust(6, '0')
|
17
|
+
end
|
18
|
+
|
19
|
+
def long_account_id
|
20
|
+
'U' + id.to_s.rjust(6, '0')
|
21
|
+
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
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module MemberAccessor
|
2
|
+
def self.included(base)
|
3
|
+
base.class_eval do
|
4
|
+
has_many :identities, dependent: :destroy, primary_key: :email, foreign_key: :email
|
5
|
+
has_one :member_profile, dependent: :destroy
|
6
|
+
has_one :investor_account, dependent: :destroy
|
7
|
+
alias_method :investor, :investor_account
|
8
|
+
has_one :preference, dependent: :destroy
|
9
|
+
has_many :session_analytics, dependent: :destroy
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def age
|
14
|
+
TimeDifference.between(date_of_birth, Date.today).in_years.to_i if date_of_birth.present?
|
15
|
+
end
|
16
|
+
|
17
|
+
def investments
|
18
|
+
investor_account && investor_account.investments
|
19
|
+
end
|
20
|
+
|
21
|
+
def is_investor?
|
22
|
+
investor.present? and investor.approval_status != ::InvestorConstants::STATUS_NON_INVESTOR
|
23
|
+
end
|
24
|
+
|
25
|
+
def is_approved_investor?
|
26
|
+
is_investor? && investor.approval_status == ::InvestorConstants::STATUS_APPROVED
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module WalletAccessor
|
2
|
+
def self.included(base)
|
3
|
+
base.class_eval do
|
4
|
+
belongs_to :bank_account
|
5
|
+
belongs_to :investor_account
|
6
|
+
alias_method :investor, :investor_account
|
7
|
+
belongs_to :currency
|
8
|
+
has_many :top_ups, dependent: :destroy
|
9
|
+
has_many :withdrawals, dependent: :destroy
|
10
|
+
has_many :journal_entries, dependent: :destroy
|
11
|
+
has_many :investments, dependent: :destroy, class_name: investment_klass.to_s
|
12
|
+
|
13
|
+
scope :idr, ->{ joins(:currency).where('currencies.code' => 'IDR') }
|
14
|
+
scope :sgd, ->{ joins(:currency).where('currencies.code' => 'SGD') }
|
15
|
+
scope :myr, ->{ joins(:currency).where('currencies.code' => 'MYR') }
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module InvestorConstants
|
2
|
+
TIER_ACCREDITED = 'accredited'
|
3
|
+
TIER_INSTITUTIONAL = 'institutional'
|
4
|
+
TIER_SOPHISTICATED = 'sophisticated'
|
5
|
+
TIER_ANGEL = 'angel'
|
6
|
+
TIER_RETAIL = 'retail'
|
7
|
+
|
8
|
+
STATUS_NON_INVESTOR = 'non_investor'
|
9
|
+
STATUS_PENDING_VERIFICATION = 'pending_verification'
|
10
|
+
STATUS_SCREENED = 'screened'
|
11
|
+
STATUS_APPROVED = 'approved'
|
12
|
+
STATUS_DECLINED = 'declined'
|
13
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
module JournalConstants
|
2
|
+
TOP_UP = 'top up'
|
3
|
+
WITHDRAWAL = 'withdrawal'
|
4
|
+
REPAYMENT_INTEREST = 'repayment interest'
|
5
|
+
REPAYMENT_PRINCIPAL = 'repayment principal'
|
6
|
+
RECOVERED_INTEREST = 'recovered interest'
|
7
|
+
RECOVERED_PRINCIPAL = 'recovered principal'
|
8
|
+
INVESTMENT = 'investment'
|
9
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module InvestorAccountDelegation
|
2
|
+
module Instance
|
3
|
+
def method_missing(method_sym, *args)
|
4
|
+
return member.send(method_sym, *args) if member.respond_to?(method_sym)
|
5
|
+
super
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
module Klass
|
10
|
+
def method_missing(method_sym, *args)
|
11
|
+
scope = method_sym.to_s.upcase
|
12
|
+
if InvestorConstants.constants.include?(scope.to_sym)
|
13
|
+
scope_value = const_get scope
|
14
|
+
if scope.split(/_/)[0] == 'TIER'
|
15
|
+
return where(investor_tier: scope_value)
|
16
|
+
end
|
17
|
+
if scope.split(/_/)[0] == 'STATUS'
|
18
|
+
return where(approval_status: scope_value)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
super
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module MemberDelegation
|
2
|
+
module Instance
|
3
|
+
def method_missing(method_sym, *args)
|
4
|
+
if investor_account.respond_to?(method_sym)
|
5
|
+
return investor_account.send(method_sym, *args)
|
6
|
+
end
|
7
|
+
if preference.respond_to?(method_sym)
|
8
|
+
return preference.send(method_sym, *args)
|
9
|
+
end
|
10
|
+
if member_profile.respond_to?(method_sym)
|
11
|
+
return member_profile.send(method_sym, *args)
|
12
|
+
end
|
13
|
+
super
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module TopUpDelegation
|
2
|
+
module Klass
|
3
|
+
def method_missing(method_sym, *args)
|
4
|
+
scope = method_sym.to_s.upcase
|
5
|
+
if TopUpConstants.constants.include?(scope.to_sym)
|
6
|
+
scope_value = const_get scope
|
7
|
+
if scope.split(/_/)[0] == 'STATUS'
|
8
|
+
return where(status: scope_value)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
super
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module WithdrawalDelegation
|
2
|
+
module Klass
|
3
|
+
def method_missing(method_sym, *args)
|
4
|
+
scope = method_sym.to_s.upcase
|
5
|
+
if WithdrawalConstants.constants.include?(scope.to_sym)
|
6
|
+
scope_value = const_get scope
|
7
|
+
if scope.split(/_/)[0] == 'STATUS'
|
8
|
+
return where(status: scope_value)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
super
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
class MemberLifecycle
|
2
|
+
def self.after_create(member)
|
3
|
+
Triggers.send_welcome_email(member)
|
4
|
+
Triggers.construct_member(member)
|
5
|
+
end
|
6
|
+
|
7
|
+
def self.after_save(member)
|
8
|
+
Triggers.record_country_for_reporting(member)
|
9
|
+
end
|
10
|
+
|
11
|
+
class Triggers
|
12
|
+
def self.send_welcome_email(member)
|
13
|
+
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.construct_member(member)
|
17
|
+
investor = member.create_investor_account!
|
18
|
+
bank_account = investor.bank_accounts.create!
|
19
|
+
investor.wallets.create! bank_account: bank_account,
|
20
|
+
currency: Currency.idr
|
21
|
+
investor.wallets.create! bank_account: bank_account,
|
22
|
+
currency: Currency.sgd
|
23
|
+
investor.wallets.create! bank_account: bank_account,
|
24
|
+
currency: Currency.myr
|
25
|
+
member.create_member_profile!
|
26
|
+
member.create_preference!
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.record_country_for_reporting(member)
|
30
|
+
country = NexusCore::ReportUtils.decode_ip member.last_login_from_ip_address
|
31
|
+
if Country[country].present?
|
32
|
+
country = Country[country].name
|
33
|
+
end
|
34
|
+
member.update_column :session_country, country
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
module StateMachineTransitionMixin
|
39
|
+
# not used
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
class TopUpLifecycle
|
2
|
+
def self.after_create(top_up)
|
3
|
+
Triggers.notify_admin(top_up)
|
4
|
+
end
|
5
|
+
|
6
|
+
class Triggers
|
7
|
+
def self.notify_admin(top_up)
|
8
|
+
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
module StateMachineTransitionMixin
|
13
|
+
def save_journal_entry
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
def send_confirmation_email
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
class WithdrawalLifecycle
|
2
|
+
def self.after_create(withdrawal)
|
3
|
+
Triggers.notify_admin(withdrawal)
|
4
|
+
end
|
5
|
+
|
6
|
+
class Triggers
|
7
|
+
def self.notify_admin(withdrawal)
|
8
|
+
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
module StateMachineTransitionMixin
|
13
|
+
def save_journal_entry
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
def send_confirmation_email
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module InvestorAccountStateMachine
|
2
|
+
def self.included(base)
|
3
|
+
base.include InvestorAccountLifecycle::StateMachineTransitionMixin
|
4
|
+
base.class_eval do
|
5
|
+
state_machine :approval_status, initial: :non_investor do
|
6
|
+
audit_trail class: base.investor_state_transition_klass
|
7
|
+
event :application_submitted do
|
8
|
+
transition :non_investor => :pending_verification
|
9
|
+
end
|
10
|
+
|
11
|
+
event :application_resubmitted do
|
12
|
+
transition :declined => :pending_verification
|
13
|
+
end
|
14
|
+
|
15
|
+
event :application_screened do
|
16
|
+
transition :pending_verification => :screened
|
17
|
+
end
|
18
|
+
|
19
|
+
event :application_approved do
|
20
|
+
transition :screened => :approved
|
21
|
+
end
|
22
|
+
|
23
|
+
event :application_declined do
|
24
|
+
transition [:pending_verification, :screened] => :declined
|
25
|
+
end
|
26
|
+
|
27
|
+
after_transition on: :application_submitted, do: :callback_submission
|
28
|
+
after_transition on: [:application_submitted, :application_resubmitted], do: :callback_submission
|
29
|
+
after_transition on: :application_approved, do: :callback_application_approved
|
30
|
+
after_transition on: :application_declined, do: :callback_application_declined
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module TopUpStateMachine
|
2
|
+
def self.included(base)
|
3
|
+
base.include TopUpLifecycle::StateMachineTransitionMixin
|
4
|
+
base.class_eval do
|
5
|
+
state_machine :status, initial: :pending do
|
6
|
+
event :confirm do
|
7
|
+
transition [:pending, :cancelled] => :confirmed
|
8
|
+
end
|
9
|
+
|
10
|
+
event :cancel do
|
11
|
+
transition [:pending] => :cancelled
|
12
|
+
end
|
13
|
+
after_transition on: :confirm, do: [:save_journal_entry, :send_confirmation_email]
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module WithdrawalStateMachine
|
2
|
+
def self.included(base)
|
3
|
+
base.include WithdrawalLifecycle::StateMachineTransitionMixin
|
4
|
+
base.class_eval do
|
5
|
+
state_machine :status, initial: :pending do
|
6
|
+
event :confirm do
|
7
|
+
transition [:pending, :cancelled] => :confirmed
|
8
|
+
end
|
9
|
+
|
10
|
+
event :cancel do
|
11
|
+
transition [:pending] => :cancelled
|
12
|
+
end
|
13
|
+
after_transition on: :confirm, do: [:save_journal_entry, :send_confirmation_email]
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
module NexusCore
|
2
|
+
module ReportUtils
|
3
|
+
module DateDefinition
|
4
|
+
def this_week
|
5
|
+
Date.today.strftime('%Y%W')
|
6
|
+
end
|
7
|
+
|
8
|
+
def last_week
|
9
|
+
Date.today.last_week.strftime('%Y%W')
|
10
|
+
end
|
11
|
+
|
12
|
+
def end_of_last_week
|
13
|
+
Date.today.last_week.end_of_week
|
14
|
+
end
|
15
|
+
|
16
|
+
def end_of_last_month
|
17
|
+
Date.today.last_month.end_of_month
|
18
|
+
end
|
19
|
+
|
20
|
+
def starting_last_month
|
21
|
+
Date.today.last_month.beginning_of_month
|
22
|
+
end
|
23
|
+
end
|
24
|
+
extend DateDefinition
|
25
|
+
|
26
|
+
module PeriodDefinition
|
27
|
+
def last_week_period
|
28
|
+
full_weeks_in_period(Date.today.last_week, Date.today)
|
29
|
+
end
|
30
|
+
|
31
|
+
def last_month_period
|
32
|
+
full_weeks_in_period(Date.today.last_month, Date.today)
|
33
|
+
end
|
34
|
+
|
35
|
+
def full_weeks_in_period(start, till)
|
36
|
+
start = Date.today.last_week.beginning_of_week if start.blank?
|
37
|
+
till = Date.today.last_week.end_of_week if till.blank?
|
38
|
+
start = [Date.today.last_week.beginning_of_week, start.beginning_of_week].min
|
39
|
+
till = [Date.today.last_week.end_of_week, till.end_of_week].min
|
40
|
+
[start, till].sort {|a,b| a <=> b}
|
41
|
+
end
|
42
|
+
end
|
43
|
+
extend PeriodDefinition
|
44
|
+
|
45
|
+
module PercentageHelper
|
46
|
+
def to_percentage(num)
|
47
|
+
"#{to_percentage_number(num)}%"
|
48
|
+
end
|
49
|
+
|
50
|
+
def to_percentage_number(num)
|
51
|
+
(num * 100).round(2)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
extend PercentageHelper
|
55
|
+
|
56
|
+
def self.decode_ip(ip_addr)
|
57
|
+
g = GeoIP.new(File.join(Gem.datadir('nexus_core'), 'GeoIP.dat'))
|
58
|
+
begin
|
59
|
+
country = g.country(ip_addr).country_name
|
60
|
+
rescue
|
61
|
+
country = 'N/A'
|
62
|
+
puts "Unable to Reverse Geocode: '#{ip_addr}'"
|
63
|
+
end
|
64
|
+
return country
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
data/lib/nexus_core.rb
ADDED
metadata
ADDED
@@ -0,0 +1,142 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: nexus_core
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.5.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Felix Tioh
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-11-11 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rails
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 4.0.0
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 4.0.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: time_difference
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.4.2
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 0.4.2
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: countries
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '1.2'
|
48
|
+
- - ">="
|
49
|
+
- !ruby/object:Gem::Version
|
50
|
+
version: 1.2.5
|
51
|
+
type: :runtime
|
52
|
+
prerelease: false
|
53
|
+
version_requirements: !ruby/object:Gem::Requirement
|
54
|
+
requirements:
|
55
|
+
- - "~>"
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
version: '1.2'
|
58
|
+
- - ">="
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: 1.2.5
|
61
|
+
- !ruby/object:Gem::Dependency
|
62
|
+
name: geoip
|
63
|
+
requirement: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - "~>"
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '1.6'
|
68
|
+
- - ">="
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: 1.6.2
|
71
|
+
type: :runtime
|
72
|
+
prerelease: false
|
73
|
+
version_requirements: !ruby/object:Gem::Requirement
|
74
|
+
requirements:
|
75
|
+
- - "~>"
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '1.6'
|
78
|
+
- - ">="
|
79
|
+
- !ruby/object:Gem::Version
|
80
|
+
version: 1.6.2
|
81
|
+
description: ''
|
82
|
+
email:
|
83
|
+
- felixsagitta@gmail.com
|
84
|
+
executables: []
|
85
|
+
extensions: []
|
86
|
+
extra_rdoc_files: []
|
87
|
+
files:
|
88
|
+
- MIT-LICENSE
|
89
|
+
- README.md
|
90
|
+
- Rakefile
|
91
|
+
- app/accessors/investor_account_accessor.rb
|
92
|
+
- app/accessors/journal_entry_accessor.rb
|
93
|
+
- app/accessors/member_accessor.rb
|
94
|
+
- app/accessors/top_up_accessor.rb
|
95
|
+
- app/accessors/wallet_accessor.rb
|
96
|
+
- app/accessors/withdrawal_accessor.rb
|
97
|
+
- app/constants/investor_constants.rb
|
98
|
+
- app/constants/journal_constants.rb
|
99
|
+
- app/constants/origin.rb
|
100
|
+
- app/constants/top_up_constants.rb
|
101
|
+
- app/constants/withdrawal_constants.rb
|
102
|
+
- app/delegations/investor_account_delegation.rb
|
103
|
+
- app/delegations/member_delegation.rb
|
104
|
+
- app/delegations/top_up_delegation.rb
|
105
|
+
- app/delegations/withdrawal_delegation.rb
|
106
|
+
- app/lifecycle/investor_account_lifecycle.rb
|
107
|
+
- app/lifecycle/member_lifecycle.rb
|
108
|
+
- app/lifecycle/top_up_lifecycle.rb
|
109
|
+
- app/lifecycle/withdrawal_lifecycle.rb
|
110
|
+
- app/state_machines/investor_account_state_machine.rb
|
111
|
+
- app/state_machines/top_up_state_machine.rb
|
112
|
+
- app/state_machines/withdrawal_state_machine.rb
|
113
|
+
- lib/nexus_core.rb
|
114
|
+
- lib/nexus_core/engine.rb
|
115
|
+
- lib/nexus_core/report_utils.rb
|
116
|
+
- lib/nexus_core/version.rb
|
117
|
+
- lib/tasks/nexus_core_tasks.rake
|
118
|
+
homepage: https://www.crowdo.com
|
119
|
+
licenses:
|
120
|
+
- MIT
|
121
|
+
metadata: {}
|
122
|
+
post_install_message:
|
123
|
+
rdoc_options: []
|
124
|
+
require_paths:
|
125
|
+
- lib
|
126
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
127
|
+
requirements:
|
128
|
+
- - ">="
|
129
|
+
- !ruby/object:Gem::Version
|
130
|
+
version: '0'
|
131
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
132
|
+
requirements:
|
133
|
+
- - ">="
|
134
|
+
- !ruby/object:Gem::Version
|
135
|
+
version: '0'
|
136
|
+
requirements: []
|
137
|
+
rubyforge_project:
|
138
|
+
rubygems_version: 2.6.7
|
139
|
+
signing_key:
|
140
|
+
specification_version: 4
|
141
|
+
summary: Provides Domain Layer for Nexus/P2P/ECF
|
142
|
+
test_files: []
|