latinum 0.5.6 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b5a04f37290c238dda1763d8a9df4a0a858def89
4
- data.tar.gz: 3afb2e8848f66d1ac4807808ab7981fea0ae4ac0
3
+ metadata.gz: c4a1959c3b1c833751fdc2536ce1db9c040e48be
4
+ data.tar.gz: a870124602130bfcfc036ba61abdbcc529af9645
5
5
  SHA512:
6
- metadata.gz: 7fb26870f5d89b03ebb5f06870fda36f8db2d05d76e9ff9f9ca535ba661d0f11824b3797bf60e3c0102e7fe1e0ef8ed5363c08e76761dbbeaf159aed54e9dadf
7
- data.tar.gz: 0af553ebbef75f2fe4faa3efc70a7e68ebf9a7916548e3cc6ce7f3c5cfae2da23db96323a5f7d84c3a6942b73d59919083afc09b7fbab43fd65d08c60494d5da
6
+ metadata.gz: 85efa5c7e88b2a0e5b41f039054daae59f55848060d24f9d6d0d8a88e406391a77309febdf727c10db505e4bd2de76e656de1e6e996eed485c3f396fdcc72027
7
+ data.tar.gz: c620f6a689945b472cee3290a01f89c4fef33d192c6600fbe5f14346b0071b92c46cb0c5d865b38ffce630d2f4b38825edbca8c9a098692f565c6d50c3a3f496
data/README.md CHANGED
@@ -9,15 +9,15 @@ Latinum is a library for resource and currency calculations. It provides immutab
9
9
 
10
10
  Add this line to your application's Gemfile:
11
11
 
12
- gem 'latinum'
12
+ gem 'latinum'
13
13
 
14
14
  And then execute:
15
15
 
16
- $ bundle
16
+ $ bundle
17
17
 
18
18
  Or install it yourself as:
19
19
 
20
- $ gem install latinum
20
+ $ gem install latinum
21
21
 
22
22
  ## Usage
23
23
 
@@ -58,6 +58,64 @@ To add multiple currencies together, use a collection:
58
58
  > currencies.collect {|currency| collection[currency]}
59
59
  => [10.0 NZD, 20.0 AUD]
60
60
 
61
+ #### Calculating Totals
62
+
63
+ The `Latinum::Collection` is the correct way to sum up a list of transactions or other items with an
64
+ associated `Latinum::Resource`. Here is an example:
65
+
66
+ <table class="listing transactions" data-model="Transaction">
67
+ <thead>
68
+ <tr>
69
+ <th class="name">Name</th>
70
+ <th class="date">Date</th>
71
+ <th class="price">Price</th>
72
+ <th class="quantity">Quantity</th>
73
+ <th class="subtotal">Sub-total</th>
74
+ <th class="tax_rate">Tax</th>
75
+ <th class="total">Total</th>
76
+ </tr>
77
+ </thead>
78
+ <tbody>
79
+ <?r
80
+ currencies = Set.new
81
+
82
+ summary = {
83
+ :subtotal => Latinum::Collection.new(currencies),
84
+ :tax => Latinum::Collection.new(currencies),
85
+ :total => Latinum::Collection.new(currencies)
86
+ }
87
+
88
+ invoice.transactions.each do |transaction|
89
+ subtotal = transaction.subtotal
90
+ summary[:subtotal] << subtotal
91
+ summary[:tax] << subtotal * transaction.tax_rate.to_d
92
+ summary[:total] << transaction.total
93
+
94
+ ?>
95
+ <tr data-id="#{transaction.id}" data-rev="#{transaction.rev}">
96
+ <th class="name">#{f.text transaction.name}</th>
97
+ <td class="date">#{f.text transaction.date}</td>
98
+ <td class="price">#{f.text transaction.price}</td>
99
+ <td class="quantity">#{f.quantity transaction}</td>
100
+ <td class="subtotal">#{f.text subtotal}</td>
101
+ <td class="tax_rate">#{f.tax transaction}</td>
102
+ <td class="total">#{f.text transaction.total}</td>
103
+ </tr>
104
+ <?r end ?>
105
+ </tbody>
106
+ <tfoot>
107
+ <?r currencies.each do |currency| ?>
108
+ <tr>
109
+ <td colspan="5">#{currency} Summary:</td>
110
+ <td class="subtotal">#{f.text summary[:subtotal][currency]}</td>
111
+ <td class="tax_rate">#{f.text summary[:tax][currency]}</td>
112
+ <td class="total">#{f.text summary[:total][currency]}</td>
113
+ <td></td>
114
+ </tr>
115
+ <?r end ?>
116
+ </tfoot>
117
+ </table>
118
+
61
119
  ### Banks and Exchange Rates
62
120
 
63
121
  The bank is responsible for formatting and exchange rates:
@@ -108,6 +166,73 @@ For storage in traditional databases, you may prefer to use integers. Based on t
108
166
 
109
167
  As BitCoin has 8 decimal places, it requires an integer representation with at least 10^8.
110
168
 
169
+ ### ActiveRecord Serialization
170
+
171
+ Latinum can be easily used in a [ActiveRecord](https://github.com/rails/rails/tree/master/activerecord) model simply by declaring a serialized data-type for a string or text column, e.g.
172
+
173
+ class Transaction < ActiveRecord::Base
174
+ serialize :total, Latinum::Resource
175
+ end
176
+
177
+ It can be used like so:
178
+
179
+ > transaction = Transaction.new(:total => "10 NZD")
180
+ > transaction.total * 2
181
+ => "20.0 NZD"
182
+
183
+ To format the output, use a `Latinum::Bank`, e.g. assuming the bank is set up correctly:
184
+
185
+ > bank.format(transaction.total)
186
+ => "$20.00 NZD"
187
+
188
+ > bank.format(transaction.total, name: nil)
189
+ => "$20.00"
190
+
191
+ > bank.format(transaction.total, symbol: nil)
192
+ => "20.00 NZD"
193
+
194
+ ### Relaxo Serialization
195
+
196
+ Latinum is natively supported by [Relaxo](https://github.com/ioquatix/relaxo) (CouchDB) and as such can be used in [Relaxo models](https://github.com/ioquatix/relaxo-model) easily.
197
+
198
+ require 'latinum'
199
+ require 'relaxo/model'
200
+ require 'relaxo/model/properties/latinum'
201
+
202
+ class Transaction
203
+ include Relaxo::Model
204
+
205
+ property :name
206
+ property :price, Attribute[Latinum::Resource]
207
+ end
208
+
209
+ db = Relaxo.connect('test')
210
+ db.create!
211
+
212
+ t = Transaction.create(db, price: Latinum::Resource.load("50 NZD"))
213
+
214
+ t.price
215
+ # => <Latinum::Resource "50.0 NZD">
216
+
217
+ # Save and reload from database server:
218
+ t.save
219
+ t = Transaction.fetch(db, t.id)
220
+
221
+ t.price
222
+ # => <Latinum::Resource "50.0 NZD">
223
+
224
+ It gets stored in the database like so:
225
+
226
+ {
227
+ "_id": "740f4728fc9a571d826688db2f004771",
228
+ "_rev": "1-45a29c63311cfa0d5a765707184b2b3b",
229
+ "type": "transaction",
230
+ "price": [
231
+ "50.0",
232
+ "NZD"
233
+ ]
234
+ }
235
+
111
236
  ## Contributing
112
237
 
113
238
  1. Fork it
data/lib/latinum/bank.rb CHANGED
@@ -115,6 +115,13 @@ module Latinum
115
115
  end
116
116
  end
117
117
 
118
+ def round(resource)
119
+ formatter = @formatters[resource.name]
120
+ raise ArgumentError.new("No formatter found for #{resource.name}") unless formatter
121
+
122
+ Latinum::Resource.new(formatter.round(resource.amount), resource.name)
123
+ end
124
+
118
125
  # Format a resource as a string according to the loaded currencies.
119
126
  def format(resource, *args)
120
127
  formatter = @formatters[resource.name]
@@ -53,6 +53,10 @@ module Latinum
53
53
  @name = options[:name]
54
54
  end
55
55
 
56
+ def round(amount)
57
+ return amount.round(@places)
58
+ end
59
+
56
60
  def format(amount, options = DEFAULT_OPTIONS)
57
61
  # Round to the desired number of places. Truncation used to be the default.
58
62
  amount = amount.round(@places)
@@ -19,5 +19,5 @@
19
19
  # THE SOFTWARE.
20
20
 
21
21
  module Latinum
22
- VERSION = "0.5.6"
22
+ VERSION = "0.6.0"
23
23
  end
@@ -48,6 +48,18 @@ module Latinum::BankSpec
48
48
  expect(@bank.format(resource)).to be == "B⃦1.12345678 BTC"
49
49
  end
50
50
 
51
+ it "should round up using correct precision" do
52
+ resource = Latinum::Resource.new("19.9989", "NZD")
53
+
54
+ expect(@bank.round(resource)).to be == Latinum::Resource.new(20, "NZD")
55
+ end
56
+
57
+ it "should round down using correct precision" do
58
+ resource = Latinum::Resource.new("19.991", "NZD")
59
+
60
+ expect(@bank.round(resource)).to be == Latinum::Resource.new("19.99", "NZD")
61
+ end
62
+
51
63
  it "should round values when formatting" do
52
64
  resource = Latinum::Resource.new("19.9989", "NZD")
53
65
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: latinum
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.6
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samuel Williams
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-08-19 00:00:00.000000000 Z
11
+ date: 2015-08-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler