gtmtech-crypto 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/gtmtech-crypto.gemspec +2 -1
- data/lib/gtmtech/crypto/data.rb +126 -26
- data/lib/gtmtech/crypto/subcommands/txn.rb +13 -3
- data/lib/gtmtech/crypto/utils.rb +7 -4
- data/lib/gtmtech/crypto.rb +1 -1
- metadata +15 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 666f62b7fcb98a96d19bfdd61f882db3af5c53f4
|
4
|
+
data.tar.gz: bf86844efd07b576b48b66d3d27de5c8491b4917
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1d36a2cac0f0d375c6d1c743058d756f3f86519867a4c5ac92be9591b13b9b49897410b301eba4ccb2cd030f933c879fbc9359081dad016a2e4c69ef1dfd2bac
|
7
|
+
data.tar.gz: 6082adda14f0351d4610a34540fbedcd1ec849b4e979922016bc0a656d5b2b66f5f81938e2fb13d3275adf0488c5604a40f592a963314ae1a0047dad8fe1770d
|
data/gtmtech-crypto.gemspec
CHANGED
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
|
5
5
|
Gem::Specification.new do |gem|
|
6
6
|
gem.name = "gtmtech-crypto"
|
7
|
-
gem.version = "0.1.
|
7
|
+
gem.version = "0.1.1"
|
8
8
|
gem.description = "Simple tool for accounting of cryptocurrencies"
|
9
9
|
gem.summary = "Simple tool for accounting of cryptocurrencies"
|
10
10
|
gem.author = "Geoff Meakin"
|
@@ -16,4 +16,5 @@ Gem::Specification.new do |gem|
|
|
16
16
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
17
17
|
gem.require_paths = ["lib"]
|
18
18
|
gem.add_dependency('trollop', '~> 2.0')
|
19
|
+
gem.add_dependency('colorize', '~> 0.8.1')
|
19
20
|
end
|
data/lib/gtmtech/crypto/data.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'securerandom'
|
2
2
|
require 'gtmtech/crypto/utils'
|
3
|
+
require 'colorize'
|
3
4
|
|
4
5
|
module Gtmtech
|
5
6
|
module Crypto
|
@@ -46,7 +47,7 @@ module Gtmtech
|
|
46
47
|
true
|
47
48
|
end
|
48
49
|
|
49
|
-
def self.add_transaction date, source_account, source_currency, source_amount, dest_account, dest_currency, dest_amount, fees_account, fees_currency, fees_amount
|
50
|
+
def self.add_transaction date, source_account, source_currency, source_amount, dest_account, dest_currency, dest_amount, fees_account, fees_currency, fees_amount, references, percentage
|
50
51
|
if date.downcase == "now"
|
51
52
|
date = Time.now.to_s.split(" ").take(2).join(",")
|
52
53
|
end
|
@@ -64,24 +65,110 @@ module Gtmtech
|
|
64
65
|
"dest_amount" => dest_amount,
|
65
66
|
"fees_account" => fees_account,
|
66
67
|
"fees_currency" => fees_currency,
|
67
|
-
"fees_amount" => fees_amount
|
68
|
+
"fees_amount" => fees_amount,
|
69
|
+
"references" => references,
|
70
|
+
"percentage" => percentage }
|
68
71
|
end
|
69
72
|
|
70
73
|
def self.list_transactions
|
71
|
-
|
72
|
-
|
73
|
-
puts "
|
74
|
+
outputs = []
|
75
|
+
|
76
|
+
puts "Transactions for profile \"#{ENV['CRYPTO_PROFILE'] || 'main'}\":\n".red
|
77
|
+
cols = "%-36s %-20s %-14s %-15s %-15s %-15s %-12s %-14s %s"
|
78
|
+
puts sprintf("#{cols}",
|
79
|
+
"id",
|
80
|
+
"date",
|
81
|
+
"%age",
|
82
|
+
"src account",
|
83
|
+
"src amount",
|
84
|
+
"dest account",
|
85
|
+
"dest amount",
|
86
|
+
"ratio",
|
87
|
+
"reference_ids").light_blue
|
88
|
+
puts "-" * 160
|
74
89
|
@@document[ "transactions" ].each do |id, txn|
|
75
90
|
ratio = ""
|
76
91
|
if txn["source_currency"] != txn["dest_currency"]
|
77
92
|
ratio = Utils.decimal_divide( txn["source_amount"], txn["dest_amount"] )
|
78
93
|
end
|
79
|
-
|
80
|
-
|
94
|
+
outputs << { :date => txn["date"],
|
95
|
+
:lines => [] }
|
96
|
+
if Utils.decimal_equal?( txn[ "percentage" ], "100.0" )
|
97
|
+
outputs.last[ :lines ] << sprintf("#{cols}",
|
98
|
+
id,
|
99
|
+
txn["date"],
|
100
|
+
"-",
|
101
|
+
"#{txn[ "source_account"] }.#{txn[ "source_currency"] }",
|
102
|
+
txn["source_amount"],
|
103
|
+
"#{txn[ "dest_account"] }.#{txn[ "dest_currency"] }",
|
104
|
+
txn[ "dest_amount" ],
|
105
|
+
ratio,
|
106
|
+
txn[ "references" ][0..20] )
|
107
|
+
else
|
108
|
+
outputs.last[ :lines ] << sprintf("#{cols}",
|
109
|
+
id,
|
110
|
+
txn["date"],
|
111
|
+
"100.0",
|
112
|
+
"#{txn["source_account"]}.#{txn["source_currency"]}",
|
113
|
+
txn["source_amount"],
|
114
|
+
"#{txn["dest_account"]}.#{txn["dest_currency"]}",
|
115
|
+
txn[ "dest_amount" ],
|
116
|
+
ratio,
|
117
|
+
txn[ "references" ][0..20] ).light_black
|
118
|
+
outputs.last[ :lines ] << sprintf("#{cols}",
|
119
|
+
"",
|
120
|
+
"",
|
121
|
+
Utils.decimal_add( txn["percentage"], "0.0" ),
|
122
|
+
"#{txn["source_account"]}.#{txn["source_currency"]}",
|
123
|
+
Utils.decimal_multiply( txn["source_amount"], txn["percentage"], "0.01" ),
|
124
|
+
"#{txn["dest_account"]}.#{txn["dest_currency"]}",
|
125
|
+
Utils.decimal_multiply( txn[ "dest_amount" ], txn[ "percentage" ], "0.01" ),
|
126
|
+
"",
|
127
|
+
"" )
|
128
|
+
end
|
81
129
|
if txn["fees_account"]
|
82
|
-
|
130
|
+
if Utils.decimal_equal?( txn[ "percentage" ], "100.0" )
|
131
|
+
outputs.last[ :lines ] << sprintf("#{cols}",
|
132
|
+
"",
|
133
|
+
"",
|
134
|
+
"-",
|
135
|
+
"#{txn["fees_account"]}.#{txn["fees_currency"]}",
|
136
|
+
txn["fees_amount"],
|
137
|
+
"FEES.#{txn["fees_currency"]}",
|
138
|
+
txn[ "fees_amount" ],
|
139
|
+
"",
|
140
|
+
"" )
|
141
|
+
else
|
142
|
+
outputs.last[ :lines ] << sprintf("#{cols}",
|
143
|
+
"",
|
144
|
+
"",
|
145
|
+
"100.0",
|
146
|
+
"#{txn["fees_account"]}.#{txn["fees_currency"]}",
|
147
|
+
txn["fees_amount"],
|
148
|
+
"FEES.#{txn["fees_currency"]}",
|
149
|
+
txn[ "fees_amount" ],
|
150
|
+
"",
|
151
|
+
"" ).light_black
|
152
|
+
outputs.last[ :lines ] << sprintf("#{cols}",
|
153
|
+
"",
|
154
|
+
"",
|
155
|
+
Utils.decimal_add( txn["percentage"], "0.0" ),
|
156
|
+
"#{txn["fees_account"]}.#{txn["fees_currency"]}",
|
157
|
+
Utils.decimal_multiply( txn["fees_amount"], txn["percentage"], "0.01" ),
|
158
|
+
"FEES.#{txn["fees_currency"]}",
|
159
|
+
Utils.decimal_multiply( txn[ "fees_amount" ], txn["percentage"], "0.01" ),
|
160
|
+
"",
|
161
|
+
"" )
|
162
|
+
end
|
83
163
|
end
|
84
164
|
end
|
165
|
+
|
166
|
+
outputs.sort_by { |k| k[ :date ] }.each do |k|
|
167
|
+
k[ :lines ].each do |line|
|
168
|
+
puts line
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
85
172
|
end
|
86
173
|
|
87
174
|
def self.delete_transaction id
|
@@ -91,48 +178,57 @@ module Gtmtech
|
|
91
178
|
def self.reconcile_transactions conversions
|
92
179
|
self.list_transactions
|
93
180
|
puts ""
|
94
|
-
|
181
|
+
cols = "%-20s %-10s %-20s %-30s"
|
182
|
+
puts sprintf("#{cols}", "account", "currency", "amount", "GBP equivalent").light_blue
|
95
183
|
puts "-" * 120
|
96
184
|
fees = {}
|
97
185
|
currencies = {}
|
98
186
|
@@document[ "accounts" ].each do | name, account_info |
|
99
187
|
account_info[ "currencies" ].sort.each do | currency |
|
100
|
-
|
188
|
+
total = "0.0"
|
189
|
+
txn_total = "0.0"
|
101
190
|
@@document[ "transactions" ].each do |id, txn|
|
191
|
+
|
102
192
|
# explicit fees
|
103
193
|
if txn[ "fees_account" ] == name and txn[ "fees_currency" ] == currency
|
104
|
-
|
194
|
+
# print "#{txn_total} : - #{txn[ "percentage" ]}% of #{txn[ "fees_amount" ]}".blue
|
195
|
+
txn_total = Utils.decimal_minus( txn_total, Utils.decimal_multiply( txn[ "fees_amount" ], txn[ "percentage" ], "0.01" ) )
|
196
|
+
# puts " = #{txn_total}".blue
|
105
197
|
unless fees.key? currency
|
106
198
|
fees[ currency ] = "0.0"
|
107
199
|
end
|
108
|
-
fees[ currency ] = Utils.decimal_add( fees[ currency ], txn[ "fees_amount" ])
|
200
|
+
fees[ currency ] = Utils.decimal_add( fees[ currency ], Utils.decimal_multiply( txn[ "fees_amount" ], txn[ "percentage" ], "0.01" ) )
|
109
201
|
end
|
110
202
|
|
111
203
|
# account reconciliation
|
112
204
|
if txn[ "source_account" ] == name and txn[ "source_currency" ] == currency
|
113
|
-
|
114
|
-
|
205
|
+
# print "#{txn_total} : - #{txn[ "percentage" ]}% of #{txn[ "source_amount" ]}".blue
|
206
|
+
txn_total = Utils.decimal_minus( txn_total, Utils.decimal_multiply( txn[ "source_amount" ], txn[ "percentage" ], "0.01" ) )
|
207
|
+
# puts " = #{txn_total}".blue
|
208
|
+
|
115
209
|
# implicit fees
|
116
210
|
if txn[ "source_currency" ] == txn[ "dest_currency" ] and txn[ "source_amount" ] != txn[ "dest_amount" ]
|
117
211
|
implicit_fees = Utils.decimal_minus( txn[ "source_amount" ], txn[ "dest_amount" ] )
|
118
212
|
unless fees.key? currency
|
119
213
|
fees[ currency ] = "0.0"
|
120
214
|
end
|
121
|
-
fees[ currency ] = Utils.decimal_add( fees[ currency ], implicit_fees )
|
215
|
+
fees[ currency ] = Utils.decimal_add( fees[ currency ], Utils.decimal_multiply( implicit_fees, txn[ "percentage" ], "0.01" ) )
|
122
216
|
end
|
123
217
|
|
124
218
|
end
|
125
219
|
if txn[ "dest_account" ] == name and txn[ "dest_currency" ] == currency
|
126
|
-
|
220
|
+
# print "#{txn_total} : + #{txn[ "percentage" ]}% of #{txn[ "dest_amount" ]}".blue
|
221
|
+
txn_total = Utils.decimal_add( txn_total, Utils.decimal_multiply( txn[ "dest_amount" ], txn[ "percentage" ], "0.01" ) )
|
222
|
+
# puts " = #{txn_total}".blue
|
127
223
|
end
|
128
224
|
end
|
129
225
|
unless currencies.key? currency
|
130
226
|
currencies[ currency ] = "0.0"
|
131
227
|
end
|
132
|
-
currencies[ currency ] = Utils.decimal_add( currencies[ currency ],
|
228
|
+
currencies[ currency ] = Utils.decimal_add( currencies[ currency ], txn_total )
|
133
229
|
gbp_equiv = "?"
|
134
|
-
gbp_equiv = Utils.decimal_multiply(
|
135
|
-
|
230
|
+
gbp_equiv = Utils.decimal_multiply( txn_total, conversions[ currency ] ) if conversions.key? currency
|
231
|
+
puts sprintf( "#{cols}", name, currency, txn_total, gbp_equiv )
|
136
232
|
end
|
137
233
|
end
|
138
234
|
fees.keys.sort.each do |currency|
|
@@ -141,11 +237,12 @@ module Gtmtech
|
|
141
237
|
end
|
142
238
|
gbp_equiv = "?"
|
143
239
|
gbp_equiv = Utils.decimal_multiply( fees[ currency ], conversions[ currency ] ) if conversions.key? currency
|
144
|
-
|
240
|
+
puts sprintf( "#{cols}", "**FEES**", currency, fees[ currency ], gbp_equiv)
|
145
241
|
end
|
146
242
|
|
147
243
|
puts ""
|
148
|
-
|
244
|
+
cols = "%-10s %-20s"
|
245
|
+
puts sprintf( "#{cols}", "currency", "reconciliation" ).light_blue
|
149
246
|
puts "-" * 120
|
150
247
|
currencies.keys.sort.each do |currency|
|
151
248
|
currency_fees = fees[ currency ] || "0.0"
|
@@ -155,25 +252,28 @@ module Gtmtech
|
|
155
252
|
gbp_total = "0.0"
|
156
253
|
gbp_known = true
|
157
254
|
puts ""
|
158
|
-
|
255
|
+
cols = "%-10s %-20s %-20s"
|
256
|
+
puts sprintf( "#{cols}", "currency", "totals", "GBP equivalent" ).light_blue
|
159
257
|
puts "-" * 120
|
160
258
|
currencies.keys.sort.each do |currency|
|
161
259
|
amount = currencies[ currency ]
|
162
260
|
if conversions.key? currency
|
163
261
|
gbp_equiv = Utils.decimal_multiply( amount, conversions[ currency ] )
|
164
|
-
|
262
|
+
puts sprintf( "#{cols}", currency, currencies[ currency ], gbp_equiv )
|
165
263
|
gbp_total = Utils.decimal_add( gbp_total, gbp_equiv )
|
166
264
|
else
|
167
|
-
|
265
|
+
puts sprintf( "#{cols}", currency, currencies[ currency ], "?" )
|
168
266
|
gbp_known = false
|
169
267
|
end
|
170
268
|
end
|
171
269
|
|
172
270
|
puts ""
|
271
|
+
puts "profit/loss (equivalent GBP)".blue
|
272
|
+
puts "----------------------------"
|
173
273
|
if gbp_known
|
174
|
-
puts
|
274
|
+
puts gbp_total
|
175
275
|
else
|
176
|
-
puts "
|
276
|
+
puts "unknown - specify conversions on command-line - see --help"
|
177
277
|
end
|
178
278
|
end
|
179
279
|
|
@@ -14,7 +14,7 @@ module Gtmtech
|
|
14
14
|
<<-EOS
|
15
15
|
Usage (crypto #{self.prettyname})
|
16
16
|
|
17
|
-
crypto #{self.prettyname} new --date=<s> --from=<s> --to=<s> [--fees=<s>]
|
17
|
+
crypto #{self.prettyname} new --date=<s> --from=<s> --to=<s> [--fees=<s>] [--references=<s>] [--percentage=<s>]
|
18
18
|
- create a new transaction
|
19
19
|
|
20
20
|
crypto #{self.prettyname} delete --id=<s>
|
@@ -51,7 +51,17 @@ EOS
|
|
51
51
|
{:name => :id,
|
52
52
|
:description => "Specify the id you wish to amend/delete in a delete operation",
|
53
53
|
:short => 'i',
|
54
|
-
:type => :string}
|
54
|
+
:type => :string},
|
55
|
+
{:name => :references,
|
56
|
+
:description => "Specify any thirdparty / blockchain reference IDs associated with the transaction (Optional)",
|
57
|
+
:short => 'r',
|
58
|
+
:type => :string,
|
59
|
+
:default => ""},
|
60
|
+
{:name => :percentage,
|
61
|
+
:description => "Percentage of the transaction which actually applies to this profile (for the case of a transaction which spans multiple profiles and should only be counted in part) (Optional)",
|
62
|
+
:short => 'p',
|
63
|
+
:type => :string,
|
64
|
+
:default => "100.0"}
|
55
65
|
]
|
56
66
|
end
|
57
67
|
|
@@ -93,7 +103,7 @@ EOS
|
|
93
103
|
Data.load
|
94
104
|
self.error "The account #{source_account}.#{source_currency} does not yet exist" unless Data.account_exists? source_account, source_currency
|
95
105
|
self.error "The account #{dest_account}.#{dest_currency} does not yet exist" unless Data.account_exists? dest_account, dest_currency
|
96
|
-
Data.add_transaction @@options[:date], source_account, source_currency, source_amount, dest_account, dest_currency, dest_amount, fees_account, fees_currency, fees_amount
|
106
|
+
Data.add_transaction @@options[:date], source_account, source_currency, source_amount, dest_account, dest_currency, dest_amount, fees_account, fees_currency, fees_amount, @@options[ :references ], @@options[ :percentage ]
|
97
107
|
Data.save
|
98
108
|
end
|
99
109
|
|
data/lib/gtmtech/crypto/utils.rb
CHANGED
@@ -60,21 +60,24 @@ module Gtmtech
|
|
60
60
|
end
|
61
61
|
|
62
62
|
def self.decimal_add decimal1, decimal2
|
63
|
-
( BigDecimal( decimal1 ) + BigDecimal( decimal2 ) ).to_s("F")
|
63
|
+
( BigDecimal( decimal1 ) + BigDecimal( decimal2 ) ).truncate(8).to_s("F")
|
64
64
|
end
|
65
65
|
|
66
66
|
def self.decimal_minus decimal1, decimal2
|
67
|
-
( BigDecimal( decimal1 ) - BigDecimal( decimal2 ) ).to_s("F")
|
67
|
+
( BigDecimal( decimal1 ) - BigDecimal( decimal2 ) ).truncate(8).to_s("F")
|
68
68
|
end
|
69
69
|
|
70
|
-
def self.decimal_multiply decimal1, decimal2
|
71
|
-
( BigDecimal( decimal1 ) * BigDecimal( decimal2 ) ).truncate(8).to_s("F")
|
70
|
+
def self.decimal_multiply decimal1, decimal2, decimal3 = "1.0"
|
71
|
+
( BigDecimal( decimal1 ) * BigDecimal( decimal2 ) * BigDecimal( decimal3 ) ).truncate(8).to_s("F")
|
72
72
|
end
|
73
73
|
|
74
74
|
def self.decimal_divide decimal1, decimal2
|
75
75
|
( BigDecimal( decimal1 ) / BigDecimal( decimal2 ) ).truncate(8).to_s("F")
|
76
76
|
end
|
77
77
|
|
78
|
+
def self.decimal_equal? decimal1, decimal2
|
79
|
+
BigDecimal( decimal1 ) == BigDecimal( decimal2 )
|
80
|
+
end
|
78
81
|
end
|
79
82
|
end
|
80
83
|
end
|
data/lib/gtmtech/crypto.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gtmtech-crypto
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Geoff Meakin
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - ~>
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '2.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: colorize
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ~>
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.8.1
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ~>
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 0.8.1
|
27
41
|
description: Simple tool for accounting of cryptocurrencies
|
28
42
|
email:
|
29
43
|
executables:
|