snf_core 0.2.94 → 0.2.95

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.
Files changed (130) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/snf_core/auth_controller.rb +12 -2
  3. data/app/models/snf_core/account_transfer.rb +37 -0
  4. data/app/models/snf_core/item_request.rb +27 -0
  5. data/app/models/snf_core/user.rb +7 -6
  6. data/app/models/snf_core/virtual_account.rb +41 -0
  7. data/app/models/snf_core/virtual_account_transaction.rb +52 -0
  8. data/db/migrate/20250310122954_create_snf_core_virtual_accounts.rb +22 -0
  9. data/db/migrate/20250310123127_add_kyc_attributes_to_user.rb +17 -0
  10. data/db/migrate/20250310133249_create_snf_core_virtual_account_transactions.rb +18 -0
  11. data/db/migrate/20250310143604_create_snf_core_item_requests.rb +14 -0
  12. data/db/migrate/20250311000000_create_snf_core_account_transfers.rb +21 -0
  13. data/lib/snf_core/version.rb +1 -1
  14. data/spec/dummy/db/schema.rb +117 -27
  15. data/spec/dummy/log/development.log +1820 -0
  16. data/spec/dummy/log/test.log +99021 -0
  17. data/spec/dummy/tmp/storage/00/ch/00ch4m884d5bnelqgd2ld1qig6ey +0 -0
  18. data/spec/dummy/tmp/storage/0s/ba/0sbase6mg5sgich6or97cg1faxlw +0 -0
  19. data/spec/dummy/tmp/storage/0x/uy/0xuyfqa0t08zr8vfm8p123o0s34t +0 -0
  20. data/spec/dummy/tmp/storage/1o/ts/1otsbrqkd6n4qiht1wabl7fhjnt3 +0 -0
  21. data/spec/dummy/tmp/storage/1v/54/1v542i134jpb9iwbq9m1v801y0ls +0 -0
  22. data/spec/dummy/tmp/storage/1y/46/1y4617uv2nrk9fa58zfv9xyixmfk +0 -0
  23. data/spec/dummy/tmp/storage/24/kq/24kq40q48k7jry3npyah0td4uend +0 -0
  24. data/spec/dummy/tmp/storage/28/ye/28yeusf04wxopqkg0bxki7mqo9ph +0 -0
  25. data/spec/dummy/tmp/storage/2r/hv/2rhvs6uca2ozrojfuub5d4qk0ugy +0 -0
  26. data/spec/dummy/tmp/storage/2w/r1/2wr14buxnrx4cee19gj6sefnbby5 +0 -0
  27. data/spec/dummy/tmp/storage/3k/7z/3k7zlcd9fm2jwn99kinxpahrmm4u +0 -0
  28. data/spec/dummy/tmp/storage/3o/2a/3o2ahddfby8aqgutow91vo4asm4f +0 -0
  29. data/spec/dummy/tmp/storage/46/zj/46zjkljy84qmg4ebes40e2zolzp7 +0 -0
  30. data/spec/dummy/tmp/storage/4f/fl/4fflxsg2pissq4960wfazyv9mgp1 +0 -0
  31. data/spec/dummy/tmp/storage/4l/6a/4l6ap3t705ektu02kabqobaq8huf +0 -0
  32. data/spec/dummy/tmp/storage/4m/3n/4m3n3r5zl2jevvvw3alq0omnnowk +0 -0
  33. data/spec/dummy/tmp/storage/4t/qc/4tqc587gmu2g7hgntrgjnhkw0e1u +0 -0
  34. data/spec/dummy/tmp/storage/4w/76/4w7656628v1p4mp87fqz3okc6ix4 +0 -0
  35. data/spec/dummy/tmp/storage/50/ct/50ctjwt8y93spjaef1b3rfnav9gb +0 -0
  36. data/spec/dummy/tmp/storage/5m/0k/5m0k5zx08ouqos7rs09bpgmalspu +0 -0
  37. data/spec/dummy/tmp/storage/5m/4n/5m4nvbe3vqwrdpy6hujr1oq5nolv +0 -0
  38. data/spec/dummy/tmp/storage/5r/tv/5rtv2agppt9e52eg0oc81svs896e +0 -0
  39. data/spec/dummy/tmp/storage/5s/b6/5sb6kux9jtdj4du9ihu32tc82s12 +0 -0
  40. data/spec/dummy/tmp/storage/5t/84/5t84ncnwqnv83rndaztqz1dsae3v +0 -0
  41. data/spec/dummy/tmp/storage/6h/9a/6h9a6bxecnlwx7zbb4dc33rmftee +0 -0
  42. data/spec/dummy/tmp/storage/6h/pd/6hpdw0r7w6vpcotirwqz1fv640kk +0 -0
  43. data/spec/dummy/tmp/storage/6i/dm/6idmnfdfriqdmvcvgreyeho4xgra +0 -0
  44. data/spec/dummy/tmp/storage/6n/3b/6n3bufdfx1tvls9lzm3g625l1lyk +0 -0
  45. data/spec/dummy/tmp/storage/78/5u/785ub96ra353qygeubpq4vlifjas +0 -0
  46. data/spec/dummy/tmp/storage/7v/55/7v55c4y5xdiw6qrvbdpmd63v4toz +0 -0
  47. data/spec/dummy/tmp/storage/83/yi/83yiflnj2evgqahmzgiavbywle7h +0 -0
  48. data/spec/dummy/tmp/storage/8a/02/8a02q8tcm3lowda8cvcjh18tka7i +0 -0
  49. data/spec/dummy/tmp/storage/8g/4a/8g4aarquz0mos9gxzq6j7xzwli09 +0 -0
  50. data/spec/dummy/tmp/storage/8k/0m/8k0mv7xql5lr89d0172izqplypwx +0 -0
  51. data/spec/dummy/tmp/storage/8n/lz/8nlzdb800dgr9iax1ez2ko4euh02 +0 -0
  52. data/spec/dummy/tmp/storage/8y/y2/8yy2kqz8sa11vh7naiomyofj30ox +0 -0
  53. data/spec/dummy/tmp/storage/92/hz/92hz15r26fs5wymc6tced4b08bh6 +0 -0
  54. data/spec/dummy/tmp/storage/9k/wj/9kwjdz4yw0jyzddj32u97xciot47 +0 -0
  55. data/spec/dummy/tmp/storage/a0/ve/a0veqfafcpy1hl6jvg6jc4qt08kr +0 -0
  56. data/spec/dummy/tmp/storage/ak/g9/akg9bg7fdwisycbclvmikbzl676j +0 -0
  57. data/spec/dummy/tmp/storage/ap/fs/apfsy6cp4mt4jsyiyscutqhv36id +0 -0
  58. data/spec/dummy/tmp/storage/b2/ux/b2uxv1pu0hjqty7779grby8qxzoo +0 -0
  59. data/spec/dummy/tmp/storage/bh/s1/bhs1yc1jo5vhc1u8lz7zme0sowln +0 -0
  60. data/spec/dummy/tmp/storage/c6/29/c6299u91u1tc5bc7eb24yq8k7xgk +0 -0
  61. data/spec/dummy/tmp/storage/cb/dh/cbdhbsxm7irfbsrniqvxnfukotka +0 -0
  62. data/spec/dummy/tmp/storage/dj/zr/djzriitbyq5sebmjs7nf0wqijzl2 +0 -0
  63. data/spec/dummy/tmp/storage/dk/z6/dkz6yvma826vmeofy924nzacyi6a +0 -0
  64. data/spec/dummy/tmp/storage/e6/5h/e65haeyr0sglopfuo5chz55thi9z +0 -0
  65. data/spec/dummy/tmp/storage/ez/kd/ezkdx2jgksxsm9fdwpx5qw8qd6hb +0 -0
  66. data/spec/dummy/tmp/storage/ft/pz/ftpzprhag9awyjvcac1xiqv9qngf +0 -0
  67. data/spec/dummy/tmp/storage/g1/fp/g1fprpwzsoltdd9atheqqbmt75w1 +0 -0
  68. data/spec/dummy/tmp/storage/g6/7r/g67rz6k8b5kmrfsk91e77d37vnfg +0 -0
  69. data/spec/dummy/tmp/storage/ik/r8/ikr86smhkvxy0yrqxjr0iubcuy5s +0 -0
  70. data/spec/dummy/tmp/storage/ip/yy/ipyyodp4f221bzp384ncz3alga7l +0 -0
  71. data/spec/dummy/tmp/storage/jc/jk/jcjkdsojvg0n7abwcfpscbkrlvoj +0 -0
  72. data/spec/dummy/tmp/storage/jd/ik/jdik45lk030wwyyfs9xy6m4q0sv9 +0 -0
  73. data/spec/dummy/tmp/storage/jo/34/jo34sgi1pzpkbryh3z6bmeccbada +0 -0
  74. data/spec/dummy/tmp/storage/jw/gm/jwgmfnb1z5jahut7upw5lwnh6orj +0 -0
  75. data/spec/dummy/tmp/storage/kv/7m/kv7mdo1kvqnagfcp1dit4pzrlugm +0 -0
  76. data/spec/dummy/tmp/storage/kz/ao/kzao8av3jxls3bjeal7bv2qefcq2 +0 -0
  77. data/spec/dummy/tmp/storage/lp/iz/lpizuy9o61mj9a6nsp66uhxmwifn +0 -0
  78. data/spec/dummy/tmp/storage/lu/ge/lugetp9a4lxzimpwttg2bkmrv1tf +0 -0
  79. data/spec/dummy/tmp/storage/m0/hl/m0hl9jcc1ra6ogfep0yxwon1n8e4 +0 -0
  80. data/spec/dummy/tmp/storage/md/94/md943ike1q6c3z19js6h89ghdqpd +0 -0
  81. data/spec/dummy/tmp/storage/mi/y2/miy2op7reeft1521or0hx3sa03qi +0 -0
  82. data/spec/dummy/tmp/storage/n4/6y/n46y5dyl1uf9ihlyp79fzdxny80f +0 -0
  83. data/spec/dummy/tmp/storage/ng/sy/ngsy8siky5us2x8cr54uxlzwoji5 +0 -0
  84. data/spec/dummy/tmp/storage/nq/9r/nq9rfa8upvcoyx92za4fhzrmob0t +0 -0
  85. data/spec/dummy/tmp/storage/nz/h5/nzh5f9vo9icpp0qvxvvm57ivsy85 +0 -0
  86. data/spec/dummy/tmp/storage/o3/3e/o33eo1zb3spyqgqbtugs43olucmj +0 -0
  87. data/spec/dummy/tmp/storage/oc/zy/oczyqb5chp2fvo9kdu62c3y7pl5i +0 -0
  88. data/spec/dummy/tmp/storage/of/zt/ofzt1knekv9ft8direbw6fiaacvc +0 -0
  89. data/spec/dummy/tmp/storage/ol/u8/olu875ti78gguc82spdkt9z8tpii +0 -0
  90. data/spec/dummy/tmp/storage/pe/xm/pexmtjvhiiepbza9928j2j0uo6ub +0 -0
  91. data/spec/dummy/tmp/storage/q4/wp/q4wpnk0ajsmg3nnpj2xja15tc1az +0 -0
  92. data/spec/dummy/tmp/storage/q7/48/q748a4a7d3qk28vajhbkli5tttsj +0 -0
  93. data/spec/dummy/tmp/storage/qg/qu/qgquu27ysijim1jv06k39a3c3opr +0 -0
  94. data/spec/dummy/tmp/storage/qo/zx/qozxdnemk1fwxcvhe1j10ys7mxcq +0 -0
  95. data/spec/dummy/tmp/storage/rg/hw/rghwbui1nfqvuuja4hqvzvwofucm +0 -0
  96. data/spec/dummy/tmp/storage/rj/4a/rj4a0t2xebuf22tyhuitu7x0h0ct +0 -0
  97. data/spec/dummy/tmp/storage/ro/gg/roggtjpn82v1pf5hi9c72ta6uxt7 +0 -0
  98. data/spec/dummy/tmp/storage/sd/b5/sdb5dbqjlz1nng8qaejdmh94h5kh +0 -0
  99. data/spec/dummy/tmp/storage/t6/h0/t6h0whv9denben7ktf5maaohv9dg +0 -0
  100. data/spec/dummy/tmp/storage/u8/dc/u8dc1at72gpsq6d2fqb81rku7xq9 +0 -0
  101. data/spec/dummy/tmp/storage/v8/cs/v8csqmcgvc4z177g5hfmp7twf6ay +0 -0
  102. data/spec/dummy/tmp/storage/vb/z1/vbz124po6xcx6fbh4nefle8r6of3 +0 -0
  103. data/spec/dummy/tmp/storage/vc/0v/vc0vb76xhipq8d5xrmqnnvlkbxhi +0 -0
  104. data/spec/dummy/tmp/storage/vc/eu/vceu8un4vczdune7r9oaihtx3l09 +0 -0
  105. data/spec/dummy/tmp/storage/vg/qn/vgqnfl62z1s3940ei2s9ifrjufiz +0 -0
  106. data/spec/dummy/tmp/storage/vz/qz/vzqz49sc3hfzbcaawqw6yuqzpocv +0 -0
  107. data/spec/dummy/tmp/storage/w1/9e/w19epnmenhmu0y14exloj2oskf53 +0 -0
  108. data/spec/dummy/tmp/storage/w4/k8/w4k8g0iv6qtdhzyw454un1d048hp +0 -0
  109. data/spec/dummy/tmp/storage/wv/8i/wv8iai6dxxh2wqwnj667p5rre1tn +0 -0
  110. data/spec/dummy/tmp/storage/xd/fp/xdfpr9gw2neskzyq6cfxyj2lsa47 +0 -0
  111. data/spec/dummy/tmp/storage/xh/4e/xh4e0tnk5ysrfndrhyu9u0ywueku +0 -0
  112. data/spec/dummy/tmp/storage/xj/d2/xjd2s558zk0eduk4f25ul4t29b2r +0 -0
  113. data/spec/dummy/tmp/storage/yi/r2/yir26w0pcj2268kp8biw0lcrnimz +0 -0
  114. data/spec/dummy/tmp/storage/yj/d7/yjd7k0ea2d8y6yjp8syfudd0qvhr +0 -0
  115. data/spec/dummy/tmp/storage/z0/il/z0ilfyp3hmqqn6alkocrt7y949ee +0 -0
  116. data/spec/dummy/tmp/storage/zc/i3/zci3kt86sywh9q6u7xv7yt38xznu +0 -0
  117. data/spec/examples.txt +192 -128
  118. data/spec/factories/snf_core/account_transfers.rb +27 -0
  119. data/spec/factories/snf_core/addresses.rb +1 -0
  120. data/spec/factories/snf_core/item_requests.rb +26 -0
  121. data/spec/factories/snf_core/users.rb +10 -1
  122. data/spec/factories/snf_core/virtual_account_transactions.rb +33 -0
  123. data/spec/factories/snf_core/virtual_accounts.rb +32 -0
  124. data/spec/models/snf_core/account_transfer_spec.rb +29 -0
  125. data/spec/models/snf_core/item_request_spec.rb +44 -0
  126. data/spec/models/snf_core/user_spec.rb +5 -8
  127. data/spec/models/snf_core/virtual_account_spec.rb +86 -0
  128. data/spec/models/snf_core/virtual_account_transaction_spec.rb +72 -0
  129. data/spec/requests/snf_core/auth_spec.rb +11 -1
  130. metadata +119 -2
@@ -0,0 +1,86 @@
1
+ require 'rails_helper'
2
+
3
+ module SnfCore
4
+ RSpec.describe VirtualAccount, type: :model do
5
+ attributes = [
6
+ { user: :belong_to },
7
+ { account_number: %i[presence] },
8
+ { cbs_account_number: %i[presence uniqueness] },
9
+ { balance: %i[presence numericality] },
10
+ { interest_rate: %i[presence numericality] },
11
+ { interest_type: :presence },
12
+ { branch_code: :presence },
13
+ { product_scheme: :presence },
14
+ { voucher_type: :presence },
15
+ { active: :presence }
16
+ ]
17
+ include_examples("model_shared_spec", :virtual_account, attributes)
18
+
19
+ describe 'validations' do
20
+ it 'validates interest_rate is between 0 and 1' do
21
+ virtual_account = build(:virtual_account, interest_rate: 1.5)
22
+ expect(virtual_account).not_to be_valid
23
+ expect(virtual_account.errors[:interest_rate]).to include('must be less than or equal to 1')
24
+ end
25
+
26
+ it 'validates branch_code length is 3' do
27
+ virtual_account = build(:virtual_account, branch_code: '1234')
28
+ expect(virtual_account).not_to be_valid
29
+ expect(virtual_account.errors[:branch_code]).to include('is the wrong length (should be 3 characters)')
30
+ end
31
+
32
+ it 'validates product_scheme length is 1' do
33
+ virtual_account = build(:virtual_account, product_scheme: '12')
34
+ expect(virtual_account).not_to be_valid
35
+ expect(virtual_account.errors[:product_scheme]).to include('is the wrong length (should be 1 character)')
36
+ end
37
+
38
+ it 'validates voucher_type length is 1' do
39
+ virtual_account = build(:virtual_account, voucher_type: '12')
40
+ expect(virtual_account).not_to be_valid
41
+ expect(virtual_account.errors[:voucher_type]).to include('is the wrong length (should be 1 character)')
42
+ end
43
+
44
+ it 'validates account_number uniqueness case sensitively' do
45
+ existing_account = create(:virtual_account)
46
+ new_account = build(:virtual_account, account_number: existing_account.account_number)
47
+
48
+ expect(new_account).not_to be_valid
49
+ expect(new_account.errors[:account_number]).to include('has already been taken')
50
+ end
51
+
52
+ it 'validates account_number format' do
53
+ virtual_account = build(:virtual_account, account_number: '12345678901')
54
+ expect(virtual_account.account_number).to match(/\A\d{3}\d\d\d{6}\z/)
55
+ end
56
+ end
57
+
58
+ describe 'account_number generation' do
59
+ it 'generates account number before validation' do
60
+ virtual_account = create(:virtual_account)
61
+ expect(virtual_account.account_number).to be_present
62
+ expect(virtual_account.account_number).to match(/\A\d{3}\d\d\d{6}\z/)
63
+ end
64
+
65
+ it 'uses branch_code, product_scheme, and voucher_type in account number' do
66
+ virtual_account = create(:virtual_account,
67
+ branch_code: '002',
68
+ product_scheme: '3',
69
+ voucher_type: '5'
70
+ )
71
+ expect(virtual_account.account_number).to start_with('00235')
72
+ end
73
+
74
+ it 'increments sequence number for each new account' do
75
+ first_account = create(:virtual_account)
76
+ second_account = create(:virtual_account)
77
+
78
+ first_seq = first_account.account_number[-6..-1].to_i
79
+ second_seq = second_account.account_number[-6..-1].to_i
80
+
81
+ expect(second_seq).to be > first_seq
82
+ end
83
+ end
84
+
85
+ end
86
+ end
@@ -0,0 +1,72 @@
1
+ require 'rails_helper'
2
+
3
+ module SnfCore
4
+ RSpec.describe VirtualAccountTransaction, type: :model do
5
+ attributes = [
6
+ { amount: %i[presence numericality] },
7
+ { reference_number: %i[presence uniqueness] },
8
+ { transaction_type: :presence },
9
+ { status: :presence }
10
+ ]
11
+ include_examples("model_shared_spec", :virtual_account_transaction, attributes)
12
+
13
+ describe 'validations' do
14
+ describe 'transaction type validations' do
15
+ it 'requires both accounts for transfer' do
16
+ transaction = build(:virtual_account_transaction, :transfer, from_account: nil)
17
+ expect(transaction).not_to be_valid
18
+ expect(transaction.errors[:base]).to include('Transfer requires both from and to accounts')
19
+ end
20
+
21
+ it 'requires to_account for deposit' do
22
+ transaction = build(:virtual_account_transaction, :deposit, to_account: nil)
23
+ expect(transaction).not_to be_valid
24
+ expect(transaction.errors[:base]).to include('Deposit requires to_account')
25
+ end
26
+
27
+ it 'requires from_account for withdrawal' do
28
+ transaction = build(:virtual_account_transaction, :withdrawal, from_account: nil)
29
+ expect(transaction).not_to be_valid
30
+ expect(transaction.errors[:base]).to include('Withdrawal requires from_account')
31
+ end
32
+
33
+ it 'prevents transfer to same account' do
34
+ account = create(:virtual_account)
35
+ transaction = build(:virtual_account_transaction, from_account: account, to_account: account)
36
+ expect(transaction).not_to be_valid
37
+ expect(transaction.errors[:base]).to include('Cannot transfer to same account')
38
+ end
39
+ end
40
+
41
+ describe 'balance validation' do
42
+ it 'validates sufficient balance for transfer' do
43
+ from_account = create(:virtual_account, balance: 100)
44
+ transaction = build(:virtual_account_transaction,
45
+ from_account: from_account,
46
+ amount: 150
47
+ )
48
+ expect(transaction).not_to be_valid
49
+ expect(transaction.errors[:amount]).to include('Insufficient balance')
50
+ end
51
+
52
+ it 'validates sufficient balance for withdrawal' do
53
+ from_account = create(:virtual_account, balance: 100)
54
+ transaction = build(:virtual_account_transaction, :withdrawal,
55
+ from_account: from_account,
56
+ amount: 150
57
+ )
58
+ expect(transaction).not_to be_valid
59
+ expect(transaction.errors[:amount]).to include('Insufficient balance')
60
+ end
61
+ end
62
+ end
63
+
64
+ describe 'transaction types' do
65
+ it { is_expected.to define_enum_for(:transaction_type).with_values(transfer: 0, deposit: 1, withdrawal: 2) }
66
+ end
67
+
68
+ describe 'status types' do
69
+ it { is_expected.to define_enum_for(:status).with_values(pending: 0, completed: 1, failed: 2, reversed: 3) }
70
+ end
71
+ end
72
+ end
@@ -17,7 +17,17 @@ module SnfCore
17
17
  password: Faker::Internet.password(min_length: 8),
18
18
  business_name: Faker::Company.name,
19
19
  tin_number: Faker::Company.ein,
20
- business_type: "retailer" }
20
+ business_type: "retailer",
21
+ date_of_birth: Date.today,
22
+ gender: "male",
23
+ verified_at: DateTime.now,
24
+ verified_by_id: nil,
25
+ address_id: create(:address).id,
26
+ nationality: Faker::Address.country,
27
+ occupation: Faker::Job.title,
28
+ source_of_funds: "Salary",
29
+ kyc_status: "pending"
30
+ }
21
31
  }
22
32
  end
23
33
 
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: snf_core
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.94
4
+ version: 0.2.95
5
5
  platform: ruby
6
6
  authors:
7
7
  - Asrat
8
8
  bindir: bin
9
9
  cert_chain: []
10
- date: 2025-03-07 00:00:00.000000000 Z
10
+ date: 2025-03-11 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: active_model_serializers
@@ -290,6 +290,7 @@ files:
290
290
  - app/jobs/snf_core/application_job.rb
291
291
  - app/mailers/snf_core/application_mailer.rb
292
292
  - app/mailers/snf_core/auth_mailer.rb
293
+ - app/models/snf_core/account_transfer.rb
293
294
  - app/models/snf_core/address.rb
294
295
  - app/models/snf_core/application_record.rb
295
296
  - app/models/snf_core/business.rb
@@ -298,6 +299,7 @@ files:
298
299
  - app/models/snf_core/customer_group.rb
299
300
  - app/models/snf_core/delivery_order.rb
300
301
  - app/models/snf_core/group.rb
302
+ - app/models/snf_core/item_request.rb
301
303
  - app/models/snf_core/order.rb
302
304
  - app/models/snf_core/order_item.rb
303
305
  - app/models/snf_core/product.rb
@@ -306,6 +308,8 @@ files:
306
308
  - app/models/snf_core/store_inventory.rb
307
309
  - app/models/snf_core/user.rb
308
310
  - app/models/snf_core/user_role.rb
311
+ - app/models/snf_core/virtual_account.rb
312
+ - app/models/snf_core/virtual_account_transaction.rb
309
313
  - app/models/snf_core/wallet.rb
310
314
  - app/services/snf_core/token_service.rb
311
315
  - app/views/layouts/snf_core/mailer.html.erb
@@ -330,6 +334,11 @@ files:
330
334
  - db/migrate/20250305232529_create_snf_core_roles.rb
331
335
  - db/migrate/20250305232530_create_snf_core_user_roles.rb
332
336
  - db/migrate/20250306074713_add_password_fields_to_snf_core_users.rb
337
+ - db/migrate/20250310122954_create_snf_core_virtual_accounts.rb
338
+ - db/migrate/20250310123127_add_kyc_attributes_to_user.rb
339
+ - db/migrate/20250310133249_create_snf_core_virtual_account_transactions.rb
340
+ - db/migrate/20250310143604_create_snf_core_item_requests.rb
341
+ - db/migrate/20250311000000_create_snf_core_account_transfers.rb
333
342
  - lib/snf_core.rb
334
343
  - lib/snf_core/engine.rb
335
344
  - lib/snf_core/version.rb
@@ -372,57 +381,81 @@ files:
372
381
  - spec/dummy/tmp/letter_opener/1741263812_8855171_0bf8e2b/rich.html
373
382
  - spec/dummy/tmp/local_secret.txt
374
383
  - spec/dummy/tmp/restart.txt
384
+ - spec/dummy/tmp/storage/00/ch/00ch4m884d5bnelqgd2ld1qig6ey
375
385
  - spec/dummy/tmp/storage/05/zb/05zbh3dr63t1ktnsxkwk2ugbglbu
376
386
  - spec/dummy/tmp/storage/0d/06/0d06loox3k7eov84ctxqlr7es62y
377
387
  - spec/dummy/tmp/storage/0f/mg/0fmgfbcjx3062446r5sb74i1yaop
378
388
  - spec/dummy/tmp/storage/0g/42/0g42chjo4kjajnwuko4pxh65xioi
379
389
  - spec/dummy/tmp/storage/0j/yl/0jylvdj86zcf9py4jreuxm4jd27y
380
390
  - spec/dummy/tmp/storage/0l/au/0lauwyvh2jz4cb7crwjdi4dalw6o
391
+ - spec/dummy/tmp/storage/0s/ba/0sbase6mg5sgich6or97cg1faxlw
381
392
  - spec/dummy/tmp/storage/0u/er/0uerkm5uy46p3lvg18c7ond00lih
393
+ - spec/dummy/tmp/storage/0x/uy/0xuyfqa0t08zr8vfm8p123o0s34t
382
394
  - spec/dummy/tmp/storage/13/1y/131yod70wqijazn3ix829yvuuvge
383
395
  - spec/dummy/tmp/storage/16/na/16na9nc1z98jt6fyn3axj3bhudes
384
396
  - spec/dummy/tmp/storage/17/wb/17wbd1yhh3pyg3j1sko570vsjnpq
385
397
  - spec/dummy/tmp/storage/1e/s9/1es9g1a309tf4bs04mr0i70usjz1
386
398
  - spec/dummy/tmp/storage/1j/tj/1jtjythzzcpbajktrsn08af3x66m
387
399
  - spec/dummy/tmp/storage/1n/sv/1nsv43xgjo50ouaifq757ef6gy5f
400
+ - spec/dummy/tmp/storage/1o/ts/1otsbrqkd6n4qiht1wabl7fhjnt3
388
401
  - spec/dummy/tmp/storage/1r/lw/1rlwjla8z1riqvrga2a3rvms670e
389
402
  - spec/dummy/tmp/storage/1t/oy/1toyz0i6f9u5xexr4cpwttr04ood
403
+ - spec/dummy/tmp/storage/1v/54/1v542i134jpb9iwbq9m1v801y0ls
390
404
  - spec/dummy/tmp/storage/1v/u3/1vu3btk2ukaxgp84qfmk5izonqmi
391
405
  - spec/dummy/tmp/storage/1x/i3/1xi33eqr5ipoaz0upakb8yy7qc4o
406
+ - spec/dummy/tmp/storage/1y/46/1y4617uv2nrk9fa58zfv9xyixmfk
392
407
  - spec/dummy/tmp/storage/20/p4/20p4ymzjd3qy3sh9f9bbpxw2a8h2
393
408
  - spec/dummy/tmp/storage/22/xs/22xscg5bqqtdykdaxrbr388lxkmf
394
409
  - spec/dummy/tmp/storage/24/69/2469t9kpepg4fd8ki960h025li0b
410
+ - spec/dummy/tmp/storage/24/kq/24kq40q48k7jry3npyah0td4uend
411
+ - spec/dummy/tmp/storage/28/ye/28yeusf04wxopqkg0bxki7mqo9ph
395
412
  - spec/dummy/tmp/storage/2a/0u/2a0uyihfk1wn5c1fuz09unocwy2m
396
413
  - spec/dummy/tmp/storage/2e/f9/2ef9j9go5h1v9ain8zq8m9zpjsf3
397
414
  - spec/dummy/tmp/storage/2i/e3/2ie3ve4rajer9sx5zf6r45b3r9ar
398
415
  - spec/dummy/tmp/storage/2n/56/2n569vuf39piqdtbtbxsztn3r6kl
399
416
  - spec/dummy/tmp/storage/2n/r6/2nr6p9wt4jgsyk0pbvf7vagvrh8t
400
417
  - spec/dummy/tmp/storage/2o/te/2ote6co29576cnoptsem3lhupuxy
418
+ - spec/dummy/tmp/storage/2r/hv/2rhvs6uca2ozrojfuub5d4qk0ugy
401
419
  - spec/dummy/tmp/storage/2r/ny/2rnybicjbrsw6pdmaoyj8f9sxxaq
420
+ - spec/dummy/tmp/storage/2w/r1/2wr14buxnrx4cee19gj6sefnbby5
402
421
  - spec/dummy/tmp/storage/32/ur/32ur9eb5d0h01m2oe9kc5avpm31u
403
422
  - spec/dummy/tmp/storage/35/ov/35ovg8m7ij4fjqy3v4bh28e5hld2
404
423
  - spec/dummy/tmp/storage/37/x2/37x2up33wqtrua85c089e6ltr49p
405
424
  - spec/dummy/tmp/storage/38/wp/38wpttcqfkmm1sqh4rugrsli6arz
406
425
  - spec/dummy/tmp/storage/3i/8d/3i8dbcb1dk9ri0kumm3th8wo61gc
426
+ - spec/dummy/tmp/storage/3k/7z/3k7zlcd9fm2jwn99kinxpahrmm4u
427
+ - spec/dummy/tmp/storage/3o/2a/3o2ahddfby8aqgutow91vo4asm4f
407
428
  - spec/dummy/tmp/storage/3t/1f/3t1fhar9eatf4oh3kh5ne77wjlo8
408
429
  - spec/dummy/tmp/storage/3u/jh/3ujhd5drl4t2nfbqw7ij2jzijxn1
409
430
  - spec/dummy/tmp/storage/41/ud/41udni7kfampfsa6dwynr7273y3v
410
431
  - spec/dummy/tmp/storage/42/cf/42cf3l7nla3bl64wezbhwd5yc6yi
411
432
  - spec/dummy/tmp/storage/44/ww/44wwsc9by5wv1u70y9suhuq92bwi
433
+ - spec/dummy/tmp/storage/46/zj/46zjkljy84qmg4ebes40e2zolzp7
412
434
  - spec/dummy/tmp/storage/4b/qe/4bqe6i8rtzlu196bvama05xnumrb
435
+ - spec/dummy/tmp/storage/4f/fl/4fflxsg2pissq4960wfazyv9mgp1
436
+ - spec/dummy/tmp/storage/4l/6a/4l6ap3t705ektu02kabqobaq8huf
437
+ - spec/dummy/tmp/storage/4m/3n/4m3n3r5zl2jevvvw3alq0omnnowk
413
438
  - spec/dummy/tmp/storage/4n/9p/4n9pgwj5byodmx46ffhpvlydbrmh
414
439
  - spec/dummy/tmp/storage/4t/86/4t862kv9wcz0p7wgdvpmtmczdadt
415
440
  - spec/dummy/tmp/storage/4t/ke/4tkejzaafw2hopionhrbemj6jrij
441
+ - spec/dummy/tmp/storage/4t/qc/4tqc587gmu2g7hgntrgjnhkw0e1u
416
442
  - spec/dummy/tmp/storage/4u/gx/4ugxo9x3cqbwg3d58u13xmtgc6f6
443
+ - spec/dummy/tmp/storage/4w/76/4w7656628v1p4mp87fqz3okc6ix4
444
+ - spec/dummy/tmp/storage/50/ct/50ctjwt8y93spjaef1b3rfnav9gb
417
445
  - spec/dummy/tmp/storage/52/ed/52ed6pa5bayxu966bnzd4r7vfr5i
418
446
  - spec/dummy/tmp/storage/57/kn/57kn4d3oyb3uqr0y0hwq4wl4d80i
419
447
  - spec/dummy/tmp/storage/5c/1i/5c1i8vfr81kibsmy2id9plp74oc5
420
448
  - spec/dummy/tmp/storage/5g/4k/5g4kyd9z59me1jqxw94tcdijfy6u
421
449
  - spec/dummy/tmp/storage/5j/ls/5jlsuxajthpnn769oy836amrsavi
422
450
  - spec/dummy/tmp/storage/5l/n8/5ln8h3958owro1x84wkcgdnu0jqc
451
+ - spec/dummy/tmp/storage/5m/0k/5m0k5zx08ouqos7rs09bpgmalspu
452
+ - spec/dummy/tmp/storage/5m/4n/5m4nvbe3vqwrdpy6hujr1oq5nolv
423
453
  - spec/dummy/tmp/storage/5n/ys/5nyszrcfj6fl2spwxjn1yea42ax0
424
454
  - spec/dummy/tmp/storage/5o/sq/5osq7rdic48at5pkcoqdpf0ios2p
455
+ - spec/dummy/tmp/storage/5r/tv/5rtv2agppt9e52eg0oc81svs896e
456
+ - spec/dummy/tmp/storage/5s/b6/5sb6kux9jtdj4du9ihu32tc82s12
425
457
  - spec/dummy/tmp/storage/5s/zb/5szbksq6mg3768g9vtk788gc49gw
458
+ - spec/dummy/tmp/storage/5t/84/5t84ncnwqnv83rndaztqz1dsae3v
426
459
  - spec/dummy/tmp/storage/5y/zf/5yzft7e8r6cz5pcu78z6jj8dhmbz
427
460
  - spec/dummy/tmp/storage/60/ap/60apljsclrdokzuqhu179rt7obh2
428
461
  - spec/dummy/tmp/storage/62/jx/62jxz09uvpyv1okycwh7mv6z0gz5
@@ -432,7 +465,11 @@ files:
432
465
  - spec/dummy/tmp/storage/6a/8k/6a8k0jyqprv0z2q3a0p9bwiyy8av
433
466
  - spec/dummy/tmp/storage/6d/4e/6d4eiwu6oegnp12mwt27bwhkxe8v
434
467
  - spec/dummy/tmp/storage/6g/dc/6gdc40iivivwbln1zs4dqedt5ni7
468
+ - spec/dummy/tmp/storage/6h/9a/6h9a6bxecnlwx7zbb4dc33rmftee
469
+ - spec/dummy/tmp/storage/6h/pd/6hpdw0r7w6vpcotirwqz1fv640kk
470
+ - spec/dummy/tmp/storage/6i/dm/6idmnfdfriqdmvcvgreyeho4xgra
435
471
  - spec/dummy/tmp/storage/6m/ry/6mrynv03esjb64ohdo4q4xd0wr6t
472
+ - spec/dummy/tmp/storage/6n/3b/6n3bufdfx1tvls9lzm3g625l1lyk
436
473
  - spec/dummy/tmp/storage/6o/7a/6o7ax3ihg25bswxp4d601mqo7tl3
437
474
  - spec/dummy/tmp/storage/6w/uj/6wujip3kahx619bqpcc4myv7tz5n
438
475
  - spec/dummy/tmp/storage/6x/o7/6xo7qmei42tzx4fkkos3vansvfm6
@@ -441,37 +478,52 @@ files:
441
478
  - spec/dummy/tmp/storage/71/rq/71rqssbyrwzhseipt1ojj2aucm2f
442
479
  - spec/dummy/tmp/storage/74/nt/74ntaj9azigfadsry359nl8jwbva
443
480
  - spec/dummy/tmp/storage/76/qk/76qkxksbv7v7meswa7mcnshr777l
481
+ - spec/dummy/tmp/storage/78/5u/785ub96ra353qygeubpq4vlifjas
444
482
  - spec/dummy/tmp/storage/7f/uh/7fuhzmriza5m3agsu0l0yovug7xi
445
483
  - spec/dummy/tmp/storage/7g/z0/7gz0olv00p0i3xqdy3f4fa6e73u2
484
+ - spec/dummy/tmp/storage/7v/55/7v55c4y5xdiw6qrvbdpmd63v4toz
446
485
  - spec/dummy/tmp/storage/82/zv/82zvnds6te3el62i8vxv8rzkc4ms
447
486
  - spec/dummy/tmp/storage/83/b1/83b1ejivo3bxawg0kv4f1jufwarp
448
487
  - spec/dummy/tmp/storage/83/ks/83ksy3z3h9c3zbtkdys99orqxnel
488
+ - spec/dummy/tmp/storage/83/yi/83yiflnj2evgqahmzgiavbywle7h
449
489
  - spec/dummy/tmp/storage/84/44/8444l1dt5w3csoc2jwnrnke5ug7p
450
490
  - spec/dummy/tmp/storage/84/xr/84xr5dqonkroxjj0nkf3cznat5qt
451
491
  - spec/dummy/tmp/storage/86/ca/86calk6vmutaxfekc7egxnnca43l
492
+ - spec/dummy/tmp/storage/8a/02/8a02q8tcm3lowda8cvcjh18tka7i
493
+ - spec/dummy/tmp/storage/8g/4a/8g4aarquz0mos9gxzq6j7xzwli09
452
494
  - spec/dummy/tmp/storage/8h/c8/8hc8rt6dfy91bjewm7tsybana0u6
495
+ - spec/dummy/tmp/storage/8k/0m/8k0mv7xql5lr89d0172izqplypwx
496
+ - spec/dummy/tmp/storage/8n/lz/8nlzdb800dgr9iax1ez2ko4euh02
453
497
  - spec/dummy/tmp/storage/8q/oh/8qohqcrf9fh6oc374ewp0lxid5lf
454
498
  - spec/dummy/tmp/storage/8v/yv/8vyvd9q13xzmav17gvu5tr1mvlws
499
+ - spec/dummy/tmp/storage/8y/y2/8yy2kqz8sa11vh7naiomyofj30ox
455
500
  - spec/dummy/tmp/storage/91/35/9135ona6a51xpv669i6wz75kz8pr
456
501
  - spec/dummy/tmp/storage/92/hw/92hw9u9j6728qgwpcn7oqphe9tzj
502
+ - spec/dummy/tmp/storage/92/hz/92hz15r26fs5wymc6tced4b08bh6
457
503
  - spec/dummy/tmp/storage/96/2l/962l3tf45ebi2ji3gj2vm6puqi8g
458
504
  - spec/dummy/tmp/storage/9a/3q/9a3qd5qc7j6dzzmg16wcpvwoowmp
459
505
  - spec/dummy/tmp/storage/9b/2w/9b2w9oc0quy4lsa7y4zvvq8pfnh5
506
+ - spec/dummy/tmp/storage/9k/wj/9kwjdz4yw0jyzddj32u97xciot47
460
507
  - spec/dummy/tmp/storage/9p/cd/9pcdjfvbqndd5dxue0ttlfeew1ht
461
508
  - spec/dummy/tmp/storage/9r/pj/9rpjb9yprd0r2l3jxcdef35mkste
509
+ - spec/dummy/tmp/storage/a0/ve/a0veqfafcpy1hl6jvg6jc4qt08kr
462
510
  - spec/dummy/tmp/storage/a5/od/a5odckpcox2euydeaq71bxrjrewq
511
+ - spec/dummy/tmp/storage/ak/g9/akg9bg7fdwisycbclvmikbzl676j
463
512
  - spec/dummy/tmp/storage/al/8s/al8szf81ccm4ckpvxh3bv6vlgp0y
464
513
  - spec/dummy/tmp/storage/ao/tx/aotxomcc2m5ojywmr335fc27br55
465
514
  - spec/dummy/tmp/storage/ap/d0/apd00py96d0r36yugx13tpd5zbwx
515
+ - spec/dummy/tmp/storage/ap/fs/apfsy6cp4mt4jsyiyscutqhv36id
466
516
  - spec/dummy/tmp/storage/ap/n7/apn7pi3fqwhljpt62qukpk6mn68r
467
517
  - spec/dummy/tmp/storage/as/3k/as3k29j61efclm810sdnopepmgl2
468
518
  - spec/dummy/tmp/storage/ax/ci/axci3ungck10rkvktcx9qtvawrrp
469
519
  - spec/dummy/tmp/storage/b0/wa/b0wa1zer7y7x8udydx3puofxd3fd
520
+ - spec/dummy/tmp/storage/b2/ux/b2uxv1pu0hjqty7779grby8qxzoo
470
521
  - spec/dummy/tmp/storage/b8/8l/b88ln7wuq13v4akgwgc0dgac8887
471
522
  - spec/dummy/tmp/storage/b9/6v/b96v26bb40vjk7rzeqh5pakid6br
472
523
  - spec/dummy/tmp/storage/bb/iy/bbiyfh0r4f3szj4bmfwp7ptcst6k
473
524
  - spec/dummy/tmp/storage/bd/qj/bdqj5lortwlvne25ff3yyalbb36s
474
525
  - spec/dummy/tmp/storage/bg/h0/bgh0cuyn7744wfbm8zuob9lugpxu
526
+ - spec/dummy/tmp/storage/bh/s1/bhs1yc1jo5vhc1u8lz7zme0sowln
475
527
  - spec/dummy/tmp/storage/bi/6q/bi6qcv9yadwuy9au0q4vojvtqibp
476
528
  - spec/dummy/tmp/storage/bm/s6/bms684574m329zo33bmdzw4y05q8
477
529
  - spec/dummy/tmp/storage/bn/8g/bn8gi5i69ysnnedgg57lg6r48hc0
@@ -479,7 +531,9 @@ files:
479
531
  - spec/dummy/tmp/storage/bs/y9/bsy9t4961ra8hwlq06wjtgrrcflp
480
532
  - spec/dummy/tmp/storage/c3/qp/c3qp7hmde07vm5h6l6knks723882
481
533
  - spec/dummy/tmp/storage/c4/34/c434kxxkpwr1tu5bbxdw9gnaojcc
534
+ - spec/dummy/tmp/storage/c6/29/c6299u91u1tc5bc7eb24yq8k7xgk
482
535
  - spec/dummy/tmp/storage/ca/u3/cau32ihv1n1onmqmxf9pbpvwwp42
536
+ - spec/dummy/tmp/storage/cb/dh/cbdhbsxm7irfbsrniqvxnfukotka
483
537
  - spec/dummy/tmp/storage/cf/gf/cfgfauaxy8972di6j3j7jhw5wnfl
484
538
  - spec/dummy/tmp/storage/ci/3u/ci3ujw5b51cm3av9ng0p65eglpsg
485
539
  - spec/dummy/tmp/storage/ck/1p/ck1pqdlwjggav333jasfbrtptqs8
@@ -493,6 +547,8 @@ files:
493
547
  - spec/dummy/tmp/storage/d5/aa/d5aag1rh6b9stocz1m1pg5c8mnfw
494
548
  - spec/dummy/tmp/storage/d9/cf/d9cfyu98zmmi511iwma09ovl6com
495
549
  - spec/dummy/tmp/storage/df/bm/dfbmp6rymaqlly3dbpc24gh664gy
550
+ - spec/dummy/tmp/storage/dj/zr/djzriitbyq5sebmjs7nf0wqijzl2
551
+ - spec/dummy/tmp/storage/dk/z6/dkz6yvma826vmeofy924nzacyi6a
496
552
  - spec/dummy/tmp/storage/dm/c1/dmc1zx12pfl41f9br9f1l86953ew
497
553
  - spec/dummy/tmp/storage/dn/0t/dn0t6pcrja6cjxglc7g30ir7yk64
498
554
  - spec/dummy/tmp/storage/dp/0f/dp0fx9ji1bqvx1najwjgns6n7fhf
@@ -503,12 +559,14 @@ files:
503
559
  - spec/dummy/tmp/storage/dx/iu/dxiu87gi66esp528s27d805z6b1v
504
560
  - spec/dummy/tmp/storage/dz/8f/dz8ftt7idroaj4i1e6dlwnmtuu9y
505
561
  - spec/dummy/tmp/storage/e2/uo/e2uoyhzlaj5538p6rjs37pbl0z9g
562
+ - spec/dummy/tmp/storage/e6/5h/e65haeyr0sglopfuo5chz55thi9z
506
563
  - spec/dummy/tmp/storage/ef/ih/efihy3gyspz150a8mpmhvj01xr07
507
564
  - spec/dummy/tmp/storage/ej/20/ej20a2w7j929ut3zwo0kk5zyzp96
508
565
  - spec/dummy/tmp/storage/ek/3j/ek3jzmz9919dhom6hbmhglq7e64b
509
566
  - spec/dummy/tmp/storage/em/kc/emkc4tc71k65mfcurv6k8z1ylswl
510
567
  - spec/dummy/tmp/storage/em/vx/emvx0c15o74mr0nlcvdc7m88j2gi
511
568
  - spec/dummy/tmp/storage/ew/n0/ewn0vyho1jbc7i76nat14codqc38
569
+ - spec/dummy/tmp/storage/ez/kd/ezkdx2jgksxsm9fdwpx5qw8qd6hb
512
570
  - spec/dummy/tmp/storage/f6/c0/f6c0mrb0xbsinndib67dmwk6wggb
513
571
  - spec/dummy/tmp/storage/f8/hf/f8hf7vk5c1h8s3upvdsgqbrdkokl
514
572
  - spec/dummy/tmp/storage/fa/1u/fa1ugjfxcd8hrm98brl062qgxcq3
@@ -519,6 +577,9 @@ files:
519
577
  - spec/dummy/tmp/storage/fq/zk/fqzkdm8w8n6irytwui5qhmndmjwk
520
578
  - spec/dummy/tmp/storage/fr/6y/fr6yhpy998uho3r0db4prsqfd30u
521
579
  - spec/dummy/tmp/storage/fr/cc/frccz5in1239kncwgb50cfcs8ujo
580
+ - spec/dummy/tmp/storage/ft/pz/ftpzprhag9awyjvcac1xiqv9qngf
581
+ - spec/dummy/tmp/storage/g1/fp/g1fprpwzsoltdd9atheqqbmt75w1
582
+ - spec/dummy/tmp/storage/g6/7r/g67rz6k8b5kmrfsk91e77d37vnfg
522
583
  - spec/dummy/tmp/storage/ga/7e/ga7eiyyv0llme2i4xby0kdp4a4h8
523
584
  - spec/dummy/tmp/storage/gc/bb/gcbbnsf6rq5xftpvxt4vfo39v2tx
524
585
  - spec/dummy/tmp/storage/gc/nn/gcnnb8yfz775d91vymz929zy2b7l
@@ -539,7 +600,9 @@ files:
539
600
  - spec/dummy/tmp/storage/i7/q5/i7q5v5qq4zfexcpe0x9jfw5iwi6e
540
601
  - spec/dummy/tmp/storage/i9/6r/i96r6te3tutbwgxgl0maf3tgud51
541
602
  - spec/dummy/tmp/storage/ih/xa/ihxalwtv9q6k97ryw0x3di5or5xw
603
+ - spec/dummy/tmp/storage/ik/r8/ikr86smhkvxy0yrqxjr0iubcuy5s
542
604
  - spec/dummy/tmp/storage/in/jg/injgf3gi3v8yhpjwy4h8s96k0w8x
605
+ - spec/dummy/tmp/storage/ip/yy/ipyyodp4f221bzp384ncz3alga7l
543
606
  - spec/dummy/tmp/storage/ir/zq/irzqn6i8886usqy6bcnsghmr01kg
544
607
  - spec/dummy/tmp/storage/iu/p5/iup5sduqqzumtymzw6g75kmtj4kq
545
608
  - spec/dummy/tmp/storage/iw/19/iw191t6h61ig4a68n3rk73vjvldc
@@ -547,8 +610,12 @@ files:
547
610
  - spec/dummy/tmp/storage/j6/ym/j6ymkvvvhcdf7snmc6cardtsy9nd
548
611
  - spec/dummy/tmp/storage/j7/6x/j76x0oirv7i4t6p3blseuaknp7pw
549
612
  - spec/dummy/tmp/storage/ja/gd/jagd3s4q6qfpo12dhrit2p49dyic
613
+ - spec/dummy/tmp/storage/jc/jk/jcjkdsojvg0n7abwcfpscbkrlvoj
614
+ - spec/dummy/tmp/storage/jd/ik/jdik45lk030wwyyfs9xy6m4q0sv9
615
+ - spec/dummy/tmp/storage/jo/34/jo34sgi1pzpkbryh3z6bmeccbada
550
616
  - spec/dummy/tmp/storage/jq/95/jq95rqhv5usgucn2d2mmkhjufapu
551
617
  - spec/dummy/tmp/storage/jr/uw/jruwp015m0chh50nxgkklum2ta3u
618
+ - spec/dummy/tmp/storage/jw/gm/jwgmfnb1z5jahut7upw5lwnh6orj
552
619
  - spec/dummy/tmp/storage/jz/ku/jzku30iopsxhh5quij3dov92vpyd
553
620
  - spec/dummy/tmp/storage/k0/wi/k0wijnkceisaxvkmc3hbr4croete
554
621
  - spec/dummy/tmp/storage/k9/8i/k98igdz816l8eodso61imb4dvqx3
@@ -557,8 +624,10 @@ files:
557
624
  - spec/dummy/tmp/storage/km/5u/km5uprp4d8w6l4h7yzix3dono3pl
558
625
  - spec/dummy/tmp/storage/kn/z4/knz4o9yqqnipvbbo2fum9sz2528v
559
626
  - spec/dummy/tmp/storage/ko/j0/koj0d9vpwacdvxlzb68kllhfx2kv
627
+ - spec/dummy/tmp/storage/kv/7m/kv7mdo1kvqnagfcp1dit4pzrlugm
560
628
  - spec/dummy/tmp/storage/ky/1y/ky1ys68lmat11bxs2395dqugiyig
561
629
  - spec/dummy/tmp/storage/kz/4h/kz4hr1f97wfp44jkt5i3tvheo2hm
630
+ - spec/dummy/tmp/storage/kz/ao/kzao8av3jxls3bjeal7bv2qefcq2
562
631
  - spec/dummy/tmp/storage/l0/4j/l04jyb0j5ak89dqnliwqx1wyzftu
563
632
  - spec/dummy/tmp/storage/l1/f8/l1f8gfo9kkiv8cq3ag179j24dntk
564
633
  - spec/dummy/tmp/storage/l2/rf/l2rfsult7ix6hrssrjn7ntsk4ln2
@@ -569,43 +638,61 @@ files:
569
638
  - spec/dummy/tmp/storage/lf/za/lfza3dsbodpk6z7iy09qbpl40frd
570
639
  - spec/dummy/tmp/storage/li/di/lidigrxrlew69ebcfx5ubeb203ck
571
640
  - spec/dummy/tmp/storage/ln/0f/ln0fz4opsdycu80q7urfez9ar7kn
641
+ - spec/dummy/tmp/storage/lp/iz/lpizuy9o61mj9a6nsp66uhxmwifn
572
642
  - spec/dummy/tmp/storage/lp/v0/lpv0oveyj4fimz5qnr3m00qxto1y
573
643
  - spec/dummy/tmp/storage/lr/6l/lr6lqlqemfz0aorfbyot2lo9ck4o
644
+ - spec/dummy/tmp/storage/lu/ge/lugetp9a4lxzimpwttg2bkmrv1tf
574
645
  - spec/dummy/tmp/storage/lu/no/lunox74fm54ctc4qbfo2lj9l56sv
575
646
  - spec/dummy/tmp/storage/lv/o6/lvo6jno7mebvf0hssv20pgwfyum6
647
+ - spec/dummy/tmp/storage/m0/hl/m0hl9jcc1ra6ogfep0yxwon1n8e4
576
648
  - spec/dummy/tmp/storage/m0/tm/m0tml6mrt7hiab73wgr0m9kaizn6
577
649
  - spec/dummy/tmp/storage/m1/5t/m15t6klkta6age0fefcmjovfle8o
578
650
  - spec/dummy/tmp/storage/m5/kb/m5kb1ipzihfx7zp95bd9ycxj6bqr
579
651
  - spec/dummy/tmp/storage/mb/n3/mbn3iedn8zetkcwyb1mvahy9tqvx
652
+ - spec/dummy/tmp/storage/md/94/md943ike1q6c3z19js6h89ghdqpd
580
653
  - spec/dummy/tmp/storage/mg/j1/mgj1jsli6wiilzm3jobz59s35pow
581
654
  - spec/dummy/tmp/storage/mg/z6/mgz6nnkcl4j37w3ev6yolkfxe95o
582
655
  - spec/dummy/tmp/storage/mh/fj/mhfj18ll8xk1a6torxs7qvp2aa4l
656
+ - spec/dummy/tmp/storage/mi/y2/miy2op7reeft1521or0hx3sa03qi
583
657
  - spec/dummy/tmp/storage/mk/4w/mk4w528bsn47ewri0odui9s40f87
584
658
  - spec/dummy/tmp/storage/ms/l9/msl9xauqjm3xnmfpxuiccmznlvnr
585
659
  - spec/dummy/tmp/storage/mu/ln/muln4ptnkbcff0s2p54j36goygbx
586
660
  - spec/dummy/tmp/storage/n2/ve/n2ve8ei20je4jmgn9j0gg2chgnxp
661
+ - spec/dummy/tmp/storage/n4/6y/n46y5dyl1uf9ihlyp79fzdxny80f
587
662
  - spec/dummy/tmp/storage/na/6r/na6rrohinrnjofsq27u95up5rp8k
588
663
  - spec/dummy/tmp/storage/na/ft/naft1014ecwdt1jycd5ytz6xb71v
589
664
  - spec/dummy/tmp/storage/nd/9y/nd9yeusukf9brbkzbm7af1yygidd
590
665
  - spec/dummy/tmp/storage/nf/sp/nfspv0s1uw5xo4qtxd8vsvvqy9v7
666
+ - spec/dummy/tmp/storage/ng/sy/ngsy8siky5us2x8cr54uxlzwoji5
591
667
  - spec/dummy/tmp/storage/nn/32/nn32kv58hv553251wquaguwave7c
668
+ - spec/dummy/tmp/storage/nq/9r/nq9rfa8upvcoyx92za4fhzrmob0t
592
669
  - spec/dummy/tmp/storage/nr/f9/nrf9wi6n0guazfp9gluc36do0dx1
593
670
  - spec/dummy/tmp/storage/nw/le/nwle0hzkvkdl27fqqtm4nmpgzcvp
594
671
  - spec/dummy/tmp/storage/nx/64/nx64klyyxu3u3qz5lov4zf23fgco
672
+ - spec/dummy/tmp/storage/nz/h5/nzh5f9vo9icpp0qvxvvm57ivsy85
595
673
  - spec/dummy/tmp/storage/nz/kd/nzkd3xlsbohxa2dgfyrz26iqb723
674
+ - spec/dummy/tmp/storage/o3/3e/o33eo1zb3spyqgqbtugs43olucmj
596
675
  - spec/dummy/tmp/storage/o6/xf/o6xfczmxpom0laekvp59gute2p5d
597
676
  - spec/dummy/tmp/storage/oc/f8/ocf8zs18lm9fnkpqj6wpshdpyf43
598
677
  - spec/dummy/tmp/storage/oc/xk/ocxkae9a9kkycvpfw71sdhnpqn85
678
+ - spec/dummy/tmp/storage/oc/zy/oczyqb5chp2fvo9kdu62c3y7pl5i
599
679
  - spec/dummy/tmp/storage/oe/bq/oebq593a6bpwkbxpx6segtwyy0jy
680
+ - spec/dummy/tmp/storage/of/zt/ofzt1knekv9ft8direbw6fiaacvc
681
+ - spec/dummy/tmp/storage/ol/u8/olu875ti78gguc82spdkt9z8tpii
600
682
  - spec/dummy/tmp/storage/p5/4w/p54wycc6tln36b54yfsz2zk7hcdt
601
683
  - spec/dummy/tmp/storage/p9/hd/p9hddsr7pgksgl6vuqgtkp1ad7x2
684
+ - spec/dummy/tmp/storage/pe/xm/pexmtjvhiiepbza9928j2j0uo6ub
602
685
  - spec/dummy/tmp/storage/ph/va/phvajdvl6g28vluah7d38rpaj2el
603
686
  - spec/dummy/tmp/storage/pi/4i/pi4izeatwyrz6e8zdwvri4f4h4tl
604
687
  - spec/dummy/tmp/storage/pu/rl/purlhr67132j7c4k548memz2w2q1
605
688
  - spec/dummy/tmp/storage/pv/bo/pvboa7wami2p1zjkuytzj9epmj14
689
+ - spec/dummy/tmp/storage/q4/wp/q4wpnk0ajsmg3nnpj2xja15tc1az
606
690
  - spec/dummy/tmp/storage/q5/i8/q5i8dg12fdmm5jura53gaw3zj6u4
691
+ - spec/dummy/tmp/storage/q7/48/q748a4a7d3qk28vajhbkli5tttsj
692
+ - spec/dummy/tmp/storage/qg/qu/qgquu27ysijim1jv06k39a3c3opr
607
693
  - spec/dummy/tmp/storage/qj/cu/qjcun2xcpf24hyilgh4s0wmw2e4p
608
694
  - spec/dummy/tmp/storage/qn/1h/qn1hgmvsrnd8dkn4nvcyvqy3q2sb
695
+ - spec/dummy/tmp/storage/qo/zx/qozxdnemk1fwxcvhe1j10ys7mxcq
609
696
  - spec/dummy/tmp/storage/qp/hi/qphia48836lod6l2ao5ca6ocd8ws
610
697
  - spec/dummy/tmp/storage/qs/jk/qsjkqiiarr85uobud0qsnnmpraol
611
698
  - spec/dummy/tmp/storage/qw/7z/qw7zsf91njf7ga6454nrjpvddjn5
@@ -616,7 +703,10 @@ files:
616
703
  - spec/dummy/tmp/storage/ra/s0/ras0iwcg9lufnjah5yxyola73jsk
617
704
  - spec/dummy/tmp/storage/rd/e4/rde4tqu10zhrceb4uvvorhse4itt
618
705
  - spec/dummy/tmp/storage/rf/po/rfpocvfi81i4au539e67w8o94bbr
706
+ - spec/dummy/tmp/storage/rg/hw/rghwbui1nfqvuuja4hqvzvwofucm
619
707
  - spec/dummy/tmp/storage/rh/0h/rh0h80b8er9vp1u8dcocy1u58obf
708
+ - spec/dummy/tmp/storage/rj/4a/rj4a0t2xebuf22tyhuitu7x0h0ct
709
+ - spec/dummy/tmp/storage/ro/gg/roggtjpn82v1pf5hi9c72ta6uxt7
620
710
  - spec/dummy/tmp/storage/ro/wb/rowb68g2iif1e8hsbjdjsmxj94h7
621
711
  - spec/dummy/tmp/storage/rz/9e/rz9e1eck0jk7ponsnlwi1gav505a
622
712
  - spec/dummy/tmp/storage/s1/22/s122jwsnbcabv9fxp54nhoaaf34u
@@ -624,6 +714,7 @@ files:
624
714
  - spec/dummy/tmp/storage/s8/o0/s8o0enbem94835cqjla6onwncqpz
625
715
  - spec/dummy/tmp/storage/s9/lw/s9lwslyf5co34pvbt3n9ay06ui2w
626
716
  - spec/dummy/tmp/storage/sb/bo/sbboin8iacxsa7ywl1xp401f7tmj
717
+ - spec/dummy/tmp/storage/sd/b5/sdb5dbqjlz1nng8qaejdmh94h5kh
627
718
  - spec/dummy/tmp/storage/sd/he/sdhe8pgaioyf7kdmdok21dy8enr3
628
719
  - spec/dummy/tmp/storage/sg/30/sg30putzvuc4p01earzjr0u7f65i
629
720
  - spec/dummy/tmp/storage/si/24/si24loctkg3h900v6vaoxwnruih7
@@ -631,6 +722,7 @@ files:
631
722
  - spec/dummy/tmp/storage/st/hv/sthv2tx2r8zv6tyn9yxi5am0pgzh
632
723
  - spec/dummy/tmp/storage/su/ng/sungqllfkjesc0p9c8hz3y2ior41
633
724
  - spec/dummy/tmp/storage/sy/wq/sywqphj8vgv0imntn38s286yjjc3
725
+ - spec/dummy/tmp/storage/t6/h0/t6h0whv9denben7ktf5maaohv9dg
634
726
  - spec/dummy/tmp/storage/t7/bd/t7bdp3p4o9z3bmmla22dr2sej9le
635
727
  - spec/dummy/tmp/storage/t8/3p/t83p5pkfd8ageym4qcdzvwbg8i3h
636
728
  - spec/dummy/tmp/storage/ta/s3/tas35nm4h81nhaecpeybk8kxzt62
@@ -642,6 +734,7 @@ files:
642
734
  - spec/dummy/tmp/storage/u1/vf/u1vfyawqqy7wpkthgardxs358car
643
735
  - spec/dummy/tmp/storage/u2/xa/u2xaxpjz4fdxtxxinaxq2r7biovv
644
736
  - spec/dummy/tmp/storage/u6/8m/u68mm1ppbb9zuk1w8cpgwq4fxnfl
737
+ - spec/dummy/tmp/storage/u8/dc/u8dc1at72gpsq6d2fqb81rku7xq9
645
738
  - spec/dummy/tmp/storage/ue/i3/uei37wn7tdo938m1ih3jponomr7k
646
739
  - spec/dummy/tmp/storage/uf/67/uf67aznvgtom02vj8q4jl60hycfm
647
740
  - spec/dummy/tmp/storage/ui/xi/uixi7xtks88zuqr4gwi6cjbk4m47
@@ -651,19 +744,31 @@ files:
651
744
  - spec/dummy/tmp/storage/ux/te/uxtezp2rqztn4cernmn7477gukxe
652
745
  - spec/dummy/tmp/storage/v1/a2/v1a2h0c0xy9cuejexqy3a8ix794i
653
746
  - spec/dummy/tmp/storage/v4/yi/v4yieu5kcx0jz3ephiptzr46djev
747
+ - spec/dummy/tmp/storage/v8/cs/v8csqmcgvc4z177g5hfmp7twf6ay
654
748
  - spec/dummy/tmp/storage/va/sc/vascc4h0c7dv7uwwcn2wdvx6qyhy
749
+ - spec/dummy/tmp/storage/vb/z1/vbz124po6xcx6fbh4nefle8r6of3
750
+ - spec/dummy/tmp/storage/vc/0v/vc0vb76xhipq8d5xrmqnnvlkbxhi
751
+ - spec/dummy/tmp/storage/vc/eu/vceu8un4vczdune7r9oaihtx3l09
752
+ - spec/dummy/tmp/storage/vg/qn/vgqnfl62z1s3940ei2s9ifrjufiz
655
753
  - spec/dummy/tmp/storage/vp/ub/vpub3n9dk3ts14cvq9tvkez7crqq
754
+ - spec/dummy/tmp/storage/vz/qz/vzqz49sc3hfzbcaawqw6yuqzpocv
755
+ - spec/dummy/tmp/storage/w1/9e/w19epnmenhmu0y14exloj2oskf53
656
756
  - spec/dummy/tmp/storage/w2/3f/w23f3igzkn7bddqxry5x4wsu2ths
657
757
  - spec/dummy/tmp/storage/w4/1j/w41judbhn1j3quwhs36myqwnypkz
658
758
  - spec/dummy/tmp/storage/w4/d3/w4d3qfnguynfuw4oxo5hek8q5w66
759
+ - spec/dummy/tmp/storage/w4/k8/w4k8g0iv6qtdhzyw454un1d048hp
659
760
  - spec/dummy/tmp/storage/w9/na/w9na14949rr42w928n9srevxecbl
660
761
  - spec/dummy/tmp/storage/wo/81/wo813rsnwvoa55h0vq0fr79iajuw
661
762
  - spec/dummy/tmp/storage/wp/zs/wpzs5finp3t36za2bykcoxueu5b6
763
+ - spec/dummy/tmp/storage/wv/8i/wv8iai6dxxh2wqwnj667p5rre1tn
662
764
  - spec/dummy/tmp/storage/wv/9t/wv9t3gxm6dqah7kdq74pimjdb156
663
765
  - spec/dummy/tmp/storage/ww/40/ww40d8rykhlpxwfh0ggfs7mrh0jl
664
766
  - spec/dummy/tmp/storage/wy/14/wy14megn3o5zqplv9xg6u32uwkr6
665
767
  - spec/dummy/tmp/storage/xd/4h/xd4h96rdmw5t9pujgz831cnfgj8o
768
+ - spec/dummy/tmp/storage/xd/fp/xdfpr9gw2neskzyq6cfxyj2lsa47
769
+ - spec/dummy/tmp/storage/xh/4e/xh4e0tnk5ysrfndrhyu9u0ywueku
666
770
  - spec/dummy/tmp/storage/xi/en/xiensi0706n8m0x5lxp0fbwg8ipk
771
+ - spec/dummy/tmp/storage/xj/d2/xjd2s558zk0eduk4f25ul4t29b2r
667
772
  - spec/dummy/tmp/storage/xj/yy/xjyygdd3znvvpt9ufz1vv4lfsx3w
668
773
  - spec/dummy/tmp/storage/xs/x1/xsx109k9pb83qze3raurxo22dnms
669
774
  - spec/dummy/tmp/storage/xv/gf/xvgf6x0othqxlxcbgwz4sg7th3p9
@@ -675,19 +780,24 @@ files:
675
780
  - spec/dummy/tmp/storage/yf/49/yf49a4ydheqf3cqs0u49sanbl4ms
676
781
  - spec/dummy/tmp/storage/yh/lt/yhlt1d30zxc5e074164sw9f2lwtb
677
782
  - spec/dummy/tmp/storage/yh/q1/yhq1muao2dpuykmj12bxhd0x4ntk
783
+ - spec/dummy/tmp/storage/yi/r2/yir26w0pcj2268kp8biw0lcrnimz
784
+ - spec/dummy/tmp/storage/yj/d7/yjd7k0ea2d8y6yjp8syfudd0qvhr
678
785
  - spec/dummy/tmp/storage/ym/5n/ym5ndg2m03vfnoeryvb9tex8xj72
679
786
  - spec/dummy/tmp/storage/ys/kt/yskt9vfrlpw90zaqxorq9pfa383r
680
787
  - spec/dummy/tmp/storage/yx/jp/yxjpumjyo1jysjpg20qaxgsqg4fw
788
+ - spec/dummy/tmp/storage/z0/il/z0ilfyp3hmqqn6alkocrt7y949ee
681
789
  - spec/dummy/tmp/storage/z1/gr/z1grp34d5vw7mi4g8vw8yfu91ny2
682
790
  - spec/dummy/tmp/storage/z5/qs/z5qs5fq00igr3xv5izgcyhhsdw7y
683
791
  - spec/dummy/tmp/storage/z5/sg/z5sgd1au9gcfkqb3kq82f3yry6a6
684
792
  - spec/dummy/tmp/storage/z7/8n/z78nuzozxx53c7cpp3e4kt3nghaa
685
793
  - spec/dummy/tmp/storage/zb/ke/zbkeh8j7fx7u3fqu28anb6mso6xz
794
+ - spec/dummy/tmp/storage/zc/i3/zci3kt86sywh9q6u7xv7yt38xznu
686
795
  - spec/dummy/tmp/storage/zf/bm/zfbmpgsfvuwwpvsa2i11z5x5usgp
687
796
  - spec/dummy/tmp/storage/zk/3v/zk3vlz1al2rba9wlkzoa6p8wpli0
688
797
  - spec/dummy/tmp/storage/zk/xs/zkxsr1zywhaydz0cep4eh8mmos46
689
798
  - spec/dummy/tmp/storage/zx/ur/zxuraz59df480azmknqbfeb37ktm
690
799
  - spec/examples.txt
800
+ - spec/factories/snf_core/account_transfers.rb
691
801
  - spec/factories/snf_core/addresses.rb
692
802
  - spec/factories/snf_core/business_documents.rb
693
803
  - spec/factories/snf_core/businesses.rb
@@ -695,6 +805,7 @@ files:
695
805
  - spec/factories/snf_core/customer_groups.rb
696
806
  - spec/factories/snf_core/delivery_orders.rb
697
807
  - spec/factories/snf_core/groups.rb
808
+ - spec/factories/snf_core/item_requests.rb
698
809
  - spec/factories/snf_core/order_items.rb
699
810
  - spec/factories/snf_core/orders.rb
700
811
  - spec/factories/snf_core/products.rb
@@ -703,9 +814,12 @@ files:
703
814
  - spec/factories/snf_core/stores.rb
704
815
  - spec/factories/snf_core/user_roles.rb
705
816
  - spec/factories/snf_core/users.rb
817
+ - spec/factories/snf_core/virtual_account_transactions.rb
818
+ - spec/factories/snf_core/virtual_accounts.rb
706
819
  - spec/factories/snf_core/wallets.rb
707
820
  - spec/mailers/previews/snf_core/auth_mailer_preview.rb
708
821
  - spec/mailers/snf_core/auth_mailer_spec.rb
822
+ - spec/models/snf_core/account_transfer_spec.rb
709
823
  - spec/models/snf_core/address_spec.rb
710
824
  - spec/models/snf_core/business_document_spec.rb
711
825
  - spec/models/snf_core/business_spec.rb
@@ -713,6 +827,7 @@ files:
713
827
  - spec/models/snf_core/customer_group_spec.rb
714
828
  - spec/models/snf_core/delivery_order_spec.rb
715
829
  - spec/models/snf_core/group_spec.rb
830
+ - spec/models/snf_core/item_request_spec.rb
716
831
  - spec/models/snf_core/order_item_spec.rb
717
832
  - spec/models/snf_core/order_spec.rb
718
833
  - spec/models/snf_core/product_spec.rb
@@ -721,6 +836,8 @@ files:
721
836
  - spec/models/snf_core/store_spec.rb
722
837
  - spec/models/snf_core/user_role_spec.rb
723
838
  - spec/models/snf_core/user_spec.rb
839
+ - spec/models/snf_core/virtual_account_spec.rb
840
+ - spec/models/snf_core/virtual_account_transaction_spec.rb
724
841
  - spec/models/snf_core/wallet_spec.rb
725
842
  - spec/rails_helper.rb
726
843
  - spec/requests/snf_core/auth_spec.rb