reckon 0.3.8 → 0.3.9

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.
@@ -0,0 +1,393 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: utf-8
3
+
4
+ require "spec_helper"
5
+ require 'rubygems'
6
+ require 'reckon'
7
+
8
+ Reckon::CSVParser.settings[:testing] = true
9
+
10
+ describe Reckon::CSVParser do
11
+ before do
12
+ @chase = Reckon::CSVParser.new(:string => CHASE_CSV)
13
+ @some_other_bank = Reckon::CSVParser.new(:string => SOME_OTHER_CSV)
14
+ @two_money_columns = Reckon::CSVParser.new(:string => TWO_MONEY_COLUMNS_BANK)
15
+ @simple_csv = Reckon::CSVParser.new(:string => SIMPLE_CSV)
16
+ @nationwide = Reckon::CSVParser.new( :string => NATIONWIDE_CSV, :csv_separator => ',', :suffixed => true, :currency => "POUND" )
17
+ @german_date = Reckon::CSVParser.new(:string => GERMAN_DATE_EXAMPLE)
18
+ @danish_kroner_nordea = Reckon::CSVParser.new(:string => DANISH_KRONER_NORDEA_EXAMPLE, :csv_separator => ';', :comma_separates_cents => true)
19
+ @yyyymmdd_date = Reckon::CSVParser.new(:string => YYYYMMDD_DATE_EXAMPLE)
20
+ @spanish_date = Reckon::CSVParser.new(:string => SPANISH_DATE_EXAMPLE, :date_format => '%d/%m/%Y')
21
+ @english_date = Reckon::CSVParser.new(:string => ENGLISH_DATE_EXAMPLE)
22
+ @ing_csv = Reckon::CSVParser.new(:string => ING_CSV, :comma_separates_cents => true )
23
+ @austrian_csv = Reckon::CSVParser.new(:string => AUSTRIAN_EXAMPLE, :comma_separates_cents => true, :csv_separator => ';' )
24
+ @french_csv = Reckon::CSVParser.new(:string => FRENCH_EXAMPLE, :csv_separator => ';', :comma_separates_cents => true)
25
+ @broker_canada = Reckon::CSVParser.new(:string => BROKER_CANADA_EXAMPLE)
26
+ @intuit_mint = Reckon::CSVParser.new(:string => INTUIT_MINT_EXAMPLE)
27
+ end
28
+
29
+ it "should be in testing mode" do
30
+ @chase.settings[:testing].should be_true
31
+ Reckon::CSVParser.settings[:testing].should be_true
32
+ end
33
+
34
+ describe "parse" do
35
+ it "should work with foreign character encodings" do
36
+ app = Reckon::CSVParser.new(:file => File.expand_path(File.join(File.dirname(__FILE__), "..", "data_fixtures", "extratofake.csv")))
37
+ app.columns[0][0..2].should == ["Data", "10/31/2012", "11/01/2012"]
38
+ app.columns[2].first.should == "Hist?rico"
39
+ end
40
+
41
+ it "should work with other separators" do
42
+ Reckon::CSVParser.new(:string => "one;two\nthree;four", :csv_separator => ';').columns.should == [['one', 'three'], ['two', 'four']]
43
+ end
44
+ end
45
+
46
+ describe "columns" do
47
+ it "should return the csv transposed" do
48
+ @simple_csv.columns.should == [["entry1", "entry4"], ["entry2", "entry5"], ["entry3", "entry6"]]
49
+ @chase.columns.length.should == 4
50
+ end
51
+
52
+ it "should be ok with empty lines" do
53
+ lambda {
54
+ Reckon::CSVParser.new(:string => "one,two\nthree,four\n\n\n\n\n").columns.should == [['one', 'three'], ['two', 'four']]
55
+ }.should_not raise_error
56
+ end
57
+ end
58
+
59
+ describe "detect_columns" do
60
+ before do
61
+ @harder_date_example_csv = Reckon::CSVParser.new(:string => HARDER_DATE_EXAMPLE)
62
+ end
63
+
64
+ it "should detect the money column" do
65
+ @chase.money_column_indices.should == [3]
66
+ @some_other_bank.money_column_indices.should == [3]
67
+ @two_money_columns.money_column_indices.should == [3, 4]
68
+ @nationwide.money_column_indices.should == [3, 4]
69
+ @harder_date_example_csv.money_column_indices.should == [1]
70
+ @danish_kroner_nordea.money_column_indices.should == [3]
71
+ @yyyymmdd_date.money_column_indices.should == [3]
72
+ @ing_csv.money_column_indices.should == [6]
73
+ @austrian_csv.money_column_indices.should == [4]
74
+ @french_csv.money_column_indices.should == [6]
75
+ @broker_canada.money_column_indices.should == [8]
76
+ @intuit_mint.money_column_indices.should == [3]
77
+ end
78
+
79
+ it "should detect the date column" do
80
+ @chase.date_column_index.should == 1
81
+ @some_other_bank.date_column_index.should == 1
82
+ @two_money_columns.date_column_index.should == 0
83
+ @harder_date_example_csv.date_column_index.should == 0
84
+ @danish_kroner_nordea.date_column_index.should == 0
85
+ @yyyymmdd_date.date_column_index.should == 1
86
+ @french_csv.date_column_index.should == 2
87
+ @broker_canada.date_column_index.should == 0
88
+ @intuit_mint.date_column_index.should == 0
89
+ end
90
+
91
+ it "should consider all other columns to be description columns" do
92
+ @chase.description_column_indices.should == [0, 2]
93
+ @some_other_bank.description_column_indices.should == [0, 2]
94
+ @two_money_columns.description_column_indices.should == [1, 2, 5]
95
+ @harder_date_example_csv.description_column_indices.should == [2, 3, 4, 5, 6, 7]
96
+ @danish_kroner_nordea.description_column_indices.should == [1, 2, 4]
97
+ @yyyymmdd_date.description_column_indices.should == [0, 2]
98
+ end
99
+ end
100
+
101
+ describe "money_for" do
102
+ it "should return the appropriate fields" do
103
+ @chase.money_for(1).should == -20
104
+ @chase.money_for(4).should == 1558.52
105
+ @chase.money_for(7).should == -116.22
106
+ @some_other_bank.money_for(1).should == -20
107
+ @some_other_bank.money_for(4).should == 1558.52
108
+ @some_other_bank.money_for(7).should == -116.22
109
+ @two_money_columns.money_for(0).should == -76
110
+ @two_money_columns.money_for(1).should == 327.49
111
+ @two_money_columns.money_for(2).should == -800
112
+ @two_money_columns.money_for(3).should == -88.55
113
+ @two_money_columns.money_for(4).should == 88.55
114
+ @nationwide.money_for(0).should == 500.00
115
+ @nationwide.money_for(1).should == -20.00
116
+ @danish_kroner_nordea.money_for(0).should == -48.00
117
+ @danish_kroner_nordea.money_for(1).should == -79.00
118
+ @danish_kroner_nordea.money_for(2).should == 497.90
119
+ @danish_kroner_nordea.money_for(3).should == -995.00
120
+ @danish_kroner_nordea.money_for(4).should == -3452.90
121
+ @danish_kroner_nordea.money_for(5).should == -655.00
122
+ @yyyymmdd_date.money_for(0).should == -123.45
123
+ @ing_csv.money_for(0).should == -136.13
124
+ @ing_csv.money_for(1).should == 375.00
125
+ @austrian_csv.money_for(0).should == -18.00
126
+ @austrian_csv.money_for(2).should == 120.00
127
+ @french_csv.money_for(0).should == -10.00
128
+ @french_csv.money_for(1).should == -5.76
129
+ @broker_canada.money_for(0).should == 12.55
130
+ @broker_canada.money_for(1).should == -81.57
131
+ @intuit_mint.money_for(0).should == 0.01
132
+ @intuit_mint.money_for(1).should == -331.63
133
+ end
134
+
135
+ it "should handle the comma_separates_cents option correctly" do
136
+ european_csv = Reckon::CSVParser.new(:string => "$2,00;something\n1.025,67;something else", :csv_separator => ';', :comma_separates_cents => true)
137
+ european_csv.money_for(0).should == 2.00
138
+ european_csv.money_for(1).should == 1025.67
139
+ end
140
+
141
+ it "should return negated values if the inverse option is passed" do
142
+ inversed_csv = Reckon::CSVParser.new(:string => INVERSED_CREDIT_CARD, :inverse => true)
143
+ inversed_csv.money_for(0).should == -30.00
144
+ inversed_csv.money_for(3).should == 500.00
145
+ end
146
+ end
147
+
148
+ describe "date_for" do
149
+ it "should return a parsed date object" do
150
+ @chase.date_for(1).year.should == Time.parse("2009/12/24").year
151
+ @chase.date_for(1).month.should == Time.parse("2009/12/24").month
152
+ @chase.date_for(1).day.should == Time.parse("2009/12/24").day
153
+ @some_other_bank.date_for(1).year.should == Time.parse("2010/12/24").year
154
+ @some_other_bank.date_for(1).month.should == Time.parse("2010/12/24").month
155
+ @some_other_bank.date_for(1).day.should == Time.parse("2010/12/24").day
156
+ @german_date.date_for(1).year.should == Time.parse("2009/12/24").year
157
+ @german_date.date_for(1).month.should == Time.parse("2009/12/24").month
158
+ @german_date.date_for(1).day.should == Time.parse("2009/12/24").day
159
+ @danish_kroner_nordea.date_for(0).year.should == Time.parse("2012/11/16").year
160
+ @danish_kroner_nordea.date_for(0).month.should == Time.parse("2012/11/16").month
161
+ @danish_kroner_nordea.date_for(0).day.should == Time.parse("2012/11/16").day
162
+ @yyyymmdd_date.date_for(0).year.should == Time.parse("2012/12/31").year
163
+ @yyyymmdd_date.date_for(0).month.should == Time.parse("2012/12/31").month
164
+ @yyyymmdd_date.date_for(0).day.should == Time.parse("2012/12/31").day
165
+ @spanish_date.date_for(1).year.should == Time.parse("2009/12/02").year
166
+ @spanish_date.date_for(1).month.should == Time.parse("2009/12/02").month
167
+ @spanish_date.date_for(1).day.should == Time.parse("2009/12/02").day
168
+ @english_date.date_for(1).year.should == Time.parse("2009/12/24").year
169
+ @english_date.date_for(1).month.should == Time.parse("2009/12/24").month
170
+ @english_date.date_for(1).day.should == Time.parse("2009/12/24").day
171
+ @nationwide.date_for(1).month.should == 10
172
+ @ing_csv.date_for(1).month.should == Time.parse("2012/11/12").month
173
+ @ing_csv.date_for(1).day.should == Time.parse("2012/11/12").day
174
+ @broker_canada.date_for(5).year.should == 2014
175
+ @broker_canada.date_for(5).month.should == 1
176
+ @broker_canada.date_for(5).day.should == 7
177
+ @intuit_mint.date_for(1).year.should == 2014
178
+ @intuit_mint.date_for(1).month.should == 2
179
+ @intuit_mint.date_for(1).day.should == 3
180
+ end
181
+ end
182
+
183
+ describe "description_for" do
184
+ it "should return the combined fields that are not money for date fields" do
185
+ @chase.description_for(1).should == "CHECK; CHECK 2656"
186
+ @chase.description_for(7).should == "CREDIT; PAYPAL TRANSFER PPD ID: PAYPALSDSL"
187
+ end
188
+ end
189
+
190
+ describe "pretty_money_for" do
191
+ it "work with negative and positive numbers" do
192
+ @some_other_bank.pretty_money_for(1).should == "-$20.00"
193
+ @some_other_bank.pretty_money_for(4).should == " $1558.52"
194
+ @some_other_bank.pretty_money_for(7).should == "-$116.22"
195
+ @some_other_bank.pretty_money_for(5).should == " $0.23"
196
+ @some_other_bank.pretty_money_for(6).should == "-$0.96"
197
+ end
198
+
199
+ it "work with other currencies such as €" do
200
+ euro_bank = Reckon::CSVParser.new(:string => SOME_OTHER_CSV, :currency => "€", :suffixed => false )
201
+ euro_bank.pretty_money_for(1).should == "-€20.00"
202
+ euro_bank.pretty_money_for(4).should == " €1558.52"
203
+ euro_bank.pretty_money_for(7).should == "-€116.22"
204
+ euro_bank.pretty_money_for(5).should == " €0.23"
205
+ euro_bank.pretty_money_for(6).should == "-€0.96"
206
+ end
207
+
208
+ it "work with suffixed currencies such as SEK" do
209
+ swedish_bank = Reckon::CSVParser.new(:string => SOME_OTHER_CSV, :currency => 'SEK', :suffixed => true )
210
+ swedish_bank.pretty_money_for(1).should == "-20.00 SEK"
211
+ swedish_bank.pretty_money_for(4).should == " 1558.52 SEK"
212
+ swedish_bank.pretty_money_for(7).should == "-116.22 SEK"
213
+ swedish_bank.pretty_money_for(5).should == " 0.23 SEK"
214
+ swedish_bank.pretty_money_for(6).should == "-0.96 SEK"
215
+ end
216
+
217
+ it "should work with merge columns" do
218
+ @nationwide.pretty_money_for(0).should == " 500.00 POUND"
219
+ @nationwide.pretty_money_for(1).should == "-20.00 POUND"
220
+ end
221
+ end
222
+
223
+ describe "merge_columns" do
224
+ it "should work on adjacent columns" do
225
+ @simple_csv.merge_columns(0,1).should == [["entry1 entry2", "entry4 entry5"], ["entry3", "entry6"]]
226
+ end
227
+
228
+ it "should work on non-adjacent columns" do
229
+ @simple_csv.merge_columns(0,2).should == [["entry1 entry3", "entry4 entry6"], ["entry2", "entry5"]]
230
+ end
231
+ end
232
+
233
+ # Data
234
+
235
+ SIMPLE_CSV = "entry1,entry2,entry3\nentry4,entry5,entry6"
236
+
237
+ CHASE_CSV = (<<-CSV).strip
238
+ DEBIT,20091224120000[0:GMT],"HOST 037196321563 MO 12/22SLICEHOST",-85.00
239
+ CHECK,20091224120000[0:GMT],"CHECK 2656",-20.00
240
+ DEBIT,20091224120000[0:GMT],"GITHUB 041287430274 CA 12/22GITHUB 04",-7.00
241
+ CREDIT,20091223120000[0:GMT],"Some Company vendorpymt PPD ID: 59728JSL20",3520.00
242
+ CREDIT,20091223120000[0:GMT],"Blarg BLARG REVENUE PPD ID: 00jah78563",1558.52
243
+ DEBIT,20091221120000[0:GMT],"WEBSITE-BALANCE-17DEC09 12 12/17WEBSITE-BAL",-12.23
244
+ DEBIT,20091214120000[0:GMT],"WEBSITE-BALANCE-10DEC09 12 12/10WEBSITE-BAL",-20.96
245
+ CREDIT,20091211120000[0:GMT],"PAYPAL TRANSFER PPD ID: PAYPALSDSL",-116.22
246
+ CREDIT,20091210120000[0:GMT],"Some Company vendorpymt PPD ID: 5KL3832735",2105.00
247
+ CSV
248
+
249
+ SOME_OTHER_CSV = (<<-CSV).strip
250
+ DEBIT,2011/12/24,"HOST 037196321563 MO 12/22SLICEHOST",($85.00)
251
+ CHECK,2010/12/24,"CHECK 2656",($20.00)
252
+ DEBIT,2009/12/24,"GITHUB 041287430274 CA 12/22GITHUB 04",($7.00)
253
+ CREDIT,2008/12/24,"Some Company vendorpymt PPD ID: 59728JSL20",$3520.00
254
+ CREDIT,2007/12/24,"Blarg BLARG REVENUE PPD ID: 00jah78563",$1558.52
255
+ DEBIT,2006/12/24,"WEBSITE-BALANCE-17DEC09 12 12/17WEBSITE-BAL",$.23
256
+ DEBIT,2005/12/24,"WEBSITE-BALANCE-10DEC09 12 12/10WEBSITE-BAL",($0.96)
257
+ CREDIT,2004/12/24,"PAYPAL TRANSFER PPD ID: PAYPALSDSL",($116.22)
258
+ CREDIT,2003/12/24,"Some Company vendorpymt PPD ID: 5KL3832735",$2105.00
259
+ CSV
260
+
261
+ INVERSED_CREDIT_CARD = (<<-CSV).strip
262
+ 2013/01/17,2013/01/16,2013011702,DEBIT,2226,"VODAFONE PREPAY VISA M AUCKLAND NZL",30.00
263
+ 2013/01/18,2013/01/17,2013011801,DEBIT,2226,"WILSON PARKING AUCKLAND NZL",4.60
264
+ 2013/01/18,2013/01/17,2013011802,DEBIT,2226,"AUCKLAND TRANSPORT HENDERSON NZL",2.00
265
+ 2013/01/19,2013/01/19,2013011901,CREDIT,2226,"INTERNET PAYMENT RECEIVED ",-500.00
266
+ 2013/01/26,2013/01/23,2013012601,DEBIT,2226,"ITUNES NZ CORK IRL",64.99
267
+ 2013/01/26,2013/01/25,2013012602,DEBIT,2226,"VODAFONE FXFLNE BBND R NEWTON NZL",90.26
268
+ 2013/01/29,2013/01/29,2013012901,CREDIT,2101,"PAYMENT RECEIVED THANK YOU ",-27.75
269
+ 2013/01/30,2013/01/29,2013013001,DEBIT,2226,"AUCKLAND TRANSPORT HENDERSON NZL",3.50
270
+ 2013/02/05,2013/02/03,2013020501,DEBIT,2226,"Z BEACH RD AUCKLAND NZL",129.89
271
+ 2013/02/05,2013/02/03,2013020502,DEBIT,2226,"TOURNAMENT KHYBER PASS AUCKLAND NZL",8.00
272
+ 2013/02/05,2013/02/04,2013020503,DEBIT,2226,"VODAFONE PREPAY VISA M AUCKLAND NZL",30.00
273
+ 2013/02/08,2013/02/07,2013020801,DEBIT,2226,"AKLD TRANSPORT PARKING AUCKLAND NZL",2.50
274
+ 2013/02/08,2013/02/07,2013020802,DEBIT,2226,"AUCKLAND TRANSPORT HENDERSON NZL",3.50
275
+ 2013/02/12,2013/02/11,2013021201,DEBIT,2226,"AKLD TRANSPORT PARKING AUCKLAND NZL",1.50
276
+ 2013/02/17,2013/02/17,2013021701,CREDIT,2226,"INTERNET PAYMENT RECEIVED ",-12.00
277
+ 2013/02/17,2013/02/17,2013021702,CREDIT,2226,"INTERNET PAYMENT RECEIVED ",-18.00
278
+ CSV
279
+
280
+ TWO_MONEY_COLUMNS_BANK = (<<-CSV).strip
281
+ 4/1/2008,Check - 0000000122,122,-$76.00,"","$1,750.06"
282
+ 3/28/2008,BLARG R SH 456930,"","",+$327.49,"$1,826.06"
283
+ 3/27/2008,Check - 0000000112,112,-$800.00,"","$1,498.57"
284
+ 3/26/2008,Check - 0000000251,251,-$88.55,"","$1,298.57"
285
+ 3/26/2008,Check - 0000000251,251,"","+$88.55","$1,298.57"
286
+ CSV
287
+
288
+ NATIONWIDE_CSV = (<<-CSV).strip
289
+ 07 Nov 2013,Bank credit,Bank credit,,£500.00,£500.00
290
+ 09 Oct 2013,ATM Withdrawal,Withdrawal,£20.00,,£480.00
291
+ 09 Dec 2013,Visa,Supermarket,£19.77,,£460.23
292
+ 10 Dec 2013,ATM Withdrawal 2,ATM Withdrawal 4,£100.00,,£360.23
293
+ CSV
294
+
295
+ ING_CSV = (<<-CSV).strip
296
+ 20121115,From1,Acc,T1,IC,Af,"136,13",Incasso,SEPA Incasso, Opm1
297
+ 20121112,Names,NL28 INGB 1200 3244 16,21817,GT,Bij,"375,00", Opm2
298
+ 20091117,Names,NL28 INGB 1200 3244 16,21817,GT,Af,"257,50", Opm3
299
+ CSV
300
+
301
+ HARDER_DATE_EXAMPLE = (<<-CSV).strip
302
+ 10-Nov-9,-123.12,,,TRANSFER DEBIT INTERNET TRANSFER,INTERNET TRANSFER MORTGAGE,0.00,
303
+ 09-Nov-10,123.12,,,SALARY SALARY,NGHSKS46383BGDJKD FOO BAR,432.12,
304
+ 04-Nov-11,-1234.00,,,TRANSFER DEBIT INTERNET TRANSFER,INTERNET TRANSFER SAV TO MECU,0.00,
305
+ 04-Nov-9,1234.00,,,TRANSFER CREDIT INTERNET TRANSFER,INTERNET TRANSFER,1234.00,
306
+ 28-Oct-10,-123.12,,,TRANSFER DEBIT INTERNET TRANSFER,INTERNET TRANSFER SAV TO MORTGAGE,0.00,
307
+ CSV
308
+
309
+ GERMAN_DATE_EXAMPLE = (<<-CSV).strip
310
+ 24.12.2009,Check - 0000000122,122,-$76.00,"","$1,750.06"
311
+ 24.12.2009,BLARG R SH 456930,"","",+$327.49,"$1,826.06"
312
+ 24.12.2009,Check - 0000000112,112,-$800.00,"","$1,498.57"
313
+ CSV
314
+
315
+ DANISH_KRONER_NORDEA_EXAMPLE = (<<-CSV).strip
316
+ 16-11-2012;Dankort-nota DSB Kobenhavn 15149;16-11-2012;-48,00;26550,33
317
+ 26-10-2012;Dankort-nota Ziggy Cafe 19471;26-10-2012;-79,00;26054,54
318
+ 22-10-2012;Dankort-nota H&M Hennes & M 10681;23-10-2012;497,90;25433,54
319
+ 12-10-2012;Visa kob DKK 995,00 WWW.ASOS.COM 00000 ;12-10-2012;-995,00;27939,54
320
+ 12-09-2012;Dankort-nota B.J. TRADING E 14660;12-09-2012;-3452,90;26164,80
321
+ 27-08-2012;Dankort-nota MATAS - 20319 18230;27-08-2012;-655,00;21127,45
322
+ CSV
323
+
324
+ YYYYMMDD_DATE_EXAMPLE = (<<-CSV).strip
325
+ DEBIT,20121231,"ODESK***BAL-27DEC12 650-12345 CA 12/28",-123.45
326
+ CSV
327
+
328
+ SPANISH_DATE_EXAMPLE = (<<-CSV).strip
329
+ 02/12/2009,Check - 0000000122,122,-$76.00,"","$1,750.06"
330
+ 02/12/2009,BLARG R SH 456930,"","",+$327.49,"$1,826.06"
331
+ 02/12/2009,Check - 0000000112,112,-$800.00,"","$1,498.57"
332
+ CSV
333
+
334
+ ENGLISH_DATE_EXAMPLE = (<<-CSV).strip
335
+ 24/12/2009,Check - 0000000122,122,-$76.00,"","$1,750.06"
336
+ 24/12/2009,BLARG R SH 456930,"","",+$327.49,"$1,826.06"
337
+ 24/12/2009,Check - 0000000112,112,-$800.00,"","$1,498.57"
338
+ CSV
339
+
340
+ AUSTRIAN_EXAMPLE = (<<-CSV).strip
341
+ 00075757575;Abbuchung Onlinebanking 654321098765 BG/000002462 BICBICBI AT654000000065432109 Thematische Universität Stadt ;22.01.2014;22.01.2014;-18,00;EUR
342
+ 00075757575;333222111333222 222111333222 OG/000002461 BICBICBIXXX AT333000000003332221 Telekom Land AG RECHNUNG 11/13 333222111333222 ;17.01.2014;17.01.2014;-9,05;EUR
343
+ 00075757575;Helm BG/000002460 10000 00007878787 Muster Dr.Beispiel-Vorname ;15.01.2014;15.01.2014;+120,00;EUR
344
+ 00075757575;Gutschrift Dauerauftrag BG/000002459 BICBICBI AT787000000007878787 Muster Dr.Beispiel-Vorname ;15.01.2014;15.01.2014;+22,00;EUR
345
+ 00075757575;Bezahlung Bankomat MC/000002458 0001 K1 06.01.UM 18.11 Bahn 8020 FSA\\Ort\10 10 2002200EUR ;07.01.2014;06.01.2014;-37,60;EUR
346
+ 00075757575;Bezahlung Bankomat 10.33 MC/000002457 0001 K1 02.01.UM 10.33 Abcdef Electronic\\Wie n\1150 0400444 ;03.01.2014;02.01.2014;-46,42;EUR
347
+ 00075757575;050055556666000 OG/000002456 BKAUATWWXXX AT555500000555566665 JKL Telekommm Stadt GmbH JKL Rechnung 555666555 ;03.01.2014;03.01.2014;-17,15;EUR
348
+ 00075757575;Abbuchung Einzugsermächtigung OG/000002455 INTERNATIONALER AUTOMOBIL-, 10000 00006655665 ;02.01.2014;02.01.2014;-17,40;EUR
349
+ 00075757575;POLIZZE 1/01/0101010 Fondsge010101010101nsverOG/000002454 BICBICBIXXX AT101000000101010101 VERSICHERUNG NAMEDERV AG POLIZZE 1/01/0101010 Fondsgebundene Lebensversicherung - fällig 01.01. 2014 Folg eprämie ;02.01.2014;02.01.2014;-31,71;EUR
350
+ 00075757575;POLIZZE 1/01/0101012 Rentenv010101010102- fälOG/000002453 BICBICBIXXX AT101000000101010102 VERSICHERUNG NAMEDERV AG POLIZZE 1/01/0101012 Rentenversicherung - fällig 01.01.20 14 Folgeprämi e ;02.01.2014;02.01.2014;-32,45;EUR
351
+ 00075757575;Anlass VD/000002452 BKAUATWWBRN AT808800080880880880 Dipl.Ing.Dr. Berta Beispiel ;02.01.2014;02.01.2014;+61,90;EUR
352
+ 00075757575;Abbuchung Onlinebanking 000009999999 BG/000002451 BICBICBI AT099000000009999999 Asdfjklöasdf Asdfjklöasdfjklöasdf ;02.01.2014;02.01.2014;-104,69;EUR
353
+ 00075757575;Abbuchung Onlinebanking FE/000002450 AT556600055665566556 CD Stadt Efghij Club Dipl.Ing. Max Muster M005566 - Mitgliedsbeitrag 2014 ;02.01.2014;02.01.2014;-39,00;EUR
354
+ CSV
355
+
356
+ FRENCH_EXAMPLE = (<<-CSV).strip
357
+ 01234567890;22/01/2014;22/01/2014;CHEQUE 012345678901234578ABC000 0000 4381974748378178473744441;0000037;22/01/2014;-10,00;
358
+ 01234567890;22/01/2014;22/01/2014;CHEQUE 012345678901937845500TS1 0000 7439816947047874387438445;0000038;22/01/2014;-5,76;
359
+ 01234567890;22/01/2014;22/01/2014;CARTE 012345 CB:*0123456 XX XXXXXX XXX 33BORDEAUX;00X0X0X;22/01/2014;-105,90;
360
+ 01234567890;22/01/2014;22/01/2014;CARTE 012345 CB:*0123456 XXXXXXXXXXX 33SAINT ANDRE D;00X0X0X;22/01/2014;-39,99;
361
+ 01234567890;22/01/2014;22/01/2014;CARTE 012345 CB:*0123456 XXXXXXX XXXXX 33BORDEAUX;10X9X6X;22/01/2014;-36,00;
362
+ 01234567890;22/01/2014;22/01/2014;PRLV XXXXXXXX ABONNEMENT XXXXXXXXXXXXXX.NET N.EMETTEUR: 324411;0XX0XXX;22/01/2014;-40,00;
363
+ 01234567890;21/01/2014;21/01/2014;CARTE 012345 CB:*0123456 XXXXX XX33433ST ANDRE DE C;0POBUES;21/01/2014;-47,12;
364
+ 01234567890;21/01/2014;21/01/2014;CARTE 012345 CB:*0123456 XXXXXXXXXXXX33433ST ANDRE DE C;0POBUER;21/01/2014;-27,02;
365
+ 01234567890;21/01/2014;21/01/2014;CARTE 012345 CB:*0123456 XXXXXX XXXXXXXX33ST ANDRE 935/;0POBUEQ;21/01/2014;-25,65;
366
+ CSV
367
+
368
+ BROKER_CANADA_EXAMPLE = (<<-CSV).strip
369
+ 2014-02-10,2014-02-10,Interest,ISHARES S&P/TSX CAPPED REIT IN,XRE,179,,,12.55,CAD
370
+ 2014-01-16,2014-01-16,Reinvestment,ISHARES GLOBAL AGRICULTURE IND,COW,3,,,-81.57,CAD
371
+ 2014-01-16,2014-01-16,Contribution,CONTRIBUTION,,,,,600.00,CAD
372
+ 2014-01-16,2014-01-16,Interest,ISHARES GLOBAL AGRICULTURE IND,COW,200,,,87.05,CAD
373
+ 2014-01-14,2014-01-14,Reinvestment,BMO NASDAQ 100 EQTY HEDGED TO,ZQQ,2,,,-54.72,CAD
374
+ 2014-01-07,2014-01-10,Sell,BMO NASDAQ 100 EQTY HEDGED TO,ZQQ,-300,27.44,CDN,8222.05,CAD
375
+ 2014-01-07,2014-01-07,Interest,BMO S&P/TSX EQUAL WEIGHT BKS I,ZEB,250,,,14.00,CAD
376
+ 2013-07-02,2013-07-02,Dividend,SELECT SECTOR SPDR FD SHS BEN,XLB,130,,,38.70,USD
377
+ 2013-06-27,2013-06-27,Dividend,ICICI BK SPONSORED ADR,IBN,100,,,66.70,USD
378
+ 2013-06-19,2013-06-24,Buy,ISHARES S&P/TSX CAPPED REIT IN,XRE,300,15.90,CDN,-4779.95,CAD
379
+ 2013-06-17,2013-06-17,Contribution,CONTRIBUTION,,,,,600.00,CAD
380
+ 2013-05-22,2013-05-22,Dividend,NATBK,NA,70,,,58.10,CAD
381
+ CSV
382
+
383
+ INTUIT_MINT_EXAMPLE = (<<-CSV).strip
384
+ "12/10/2014","Dn Ing Inv","[DN]ING INV/PLA","0.01","credit","Investments","Chequing","",""
385
+ "2/03/2014","Ds Lms Msp Condo","[DS]LMS598 MSP/DIV","331.63","debit","Condo Fees","Chequing","",""
386
+ "2/10/2014","Ib Granville","[IB] 2601 GRANVILLE","100.00","debit","Uncategorized","Chequing","",""
387
+ "2/06/2014","So Pa","[SO]PA 0005191230116379851","140.72","debit","Mortgage & Rent","Chequing","",""
388
+ "2/03/2014","Dn Sun Life","[DN]SUN LIFE MSP/DIV","943.34","credit","Income","Chequing","",""
389
+ "1/30/2014","Transfer to CBT (Savings)","[CW] TF 0004#3409-797","500.00","debit","Transfer","Chequing","",""
390
+ "1/30/2014","Costco","[PR]COSTCO WHOLESAL","559.96","debit","Business Services","Chequing","",""
391
+ CSV
392
+
393
+ end
@@ -0,0 +1,39 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: utf-8
3
+
4
+ require "spec_helper"
5
+ require 'rubygems'
6
+ require 'reckon'
7
+
8
+ describe Reckon::DateColumn do
9
+ describe "initialize" do
10
+ it "should detect us and world time" do
11
+ Reckon::DateColumn.new( ["01/02/2013", "01/14/2013"] ).endian_precedence.should == [:middle]
12
+ Reckon::DateColumn.new( ["01/02/2013", "14/01/2013"] ).endian_precedence.should == [:little]
13
+ end
14
+ it "should set endian_precedence to default when date format cannot be misinterpreted" do
15
+ Reckon::DateColumn.new( ["2013/01/02"] ).endian_precedence.should == [:middle,:little]
16
+ end
17
+ it "should raise an error when in doubt" do
18
+ expect{ Reckon::DateColumn.new( ["01/02/2013", "01/03/2013"] )}.to raise_error( StandardError )
19
+ end
20
+ end
21
+ describe "for" do
22
+ it "should detect the date" do
23
+ Reckon::DateColumn.new( ["13/12/2013"] ).for( 0 ).should ==
24
+ Time.new( 2013, 12, 13, 12 )
25
+ Reckon::DateColumn.new( ["01/14/2013"] ).for( 0 ).should ==
26
+ Time.new( 2013, 01, 14, 12 )
27
+ Reckon::DateColumn.new( ["13/12/2013", "21/11/2013"] ).for( 1 ).should ==
28
+ Time.new( 2013, 11, 21, 12 )
29
+ end
30
+
31
+ it "should correctly use endian_precedence" do
32
+ Reckon::DateColumn.new( ["01/02/2013", "01/14/2013"] ).for(0).should ==
33
+ Time.new( 2013, 01, 02, 12 )
34
+ Reckon::DateColumn.new( ["01/02/2013", "14/01/2013"] ).for(0).should ==
35
+ Time.new( 2013, 02, 01, 12 )
36
+ end
37
+ end
38
+ end
39
+
@@ -0,0 +1,52 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: utf-8
3
+
4
+ require "spec_helper"
5
+ require 'rubygems'
6
+ require 'reckon'
7
+
8
+ describe Reckon::MoneyColumn do
9
+ describe "initialize" do
10
+ it "should convert strings into Money" do
11
+ Reckon::MoneyColumn.new( ["1.00", "-2.00"] ).should == [
12
+ Reckon::Money.new( 1.00 ), Reckon::Money.new( -2.00 ) ]
13
+ end
14
+ it "should convert empty string into nil" do
15
+ Reckon::MoneyColumn.new( ["1.00", ""] ).should == [
16
+ Reckon::Money.new( 1.00 ), nil ]
17
+ Reckon::MoneyColumn.new( ["", "-2.00"] ).should == [
18
+ nil, Reckon::Money.new( -2.00 ) ]
19
+ end
20
+ end
21
+
22
+ describe "positive?" do
23
+ it "should return false if one entry negative" do
24
+ Reckon::MoneyColumn.new( ["1.00", "-2.00"] ).positive?.should == false
25
+ end
26
+
27
+ it "should return true if all elements positive or nil" do
28
+ Reckon::MoneyColumn.new( ["1.00", "2.00"] ).positive?.should == true
29
+ Reckon::MoneyColumn.new( ["1.00", ""] ).positive?.should == true
30
+ end
31
+ end
32
+
33
+ describe "merge" do
34
+ it "should merge two columns" do
35
+ Reckon::MoneyColumn.new( ["1.00", ""] ).merge!(
36
+ Reckon::MoneyColumn.new( ["", "-2.00"] ) ).should == [
37
+ Reckon::Money.new( 1.00 ), Reckon::Money.new( -2.00 ) ]
38
+ end
39
+
40
+ it "should return nil if columns cannot be merged" do
41
+ Reckon::MoneyColumn.new( ["1.00", ""] ).merge!(
42
+ Reckon::MoneyColumn.new( ["1.00", "-2.00"] ) ).should == nil
43
+ end
44
+
45
+ it "should invert first column if both positive" do
46
+ Reckon::MoneyColumn.new( ["1.00", ""] ).merge!(
47
+ Reckon::MoneyColumn.new( ["", "2.00"] ) ).should == [
48
+ Reckon::Money.new( -1.00 ), Reckon::Money.new( 2.00 ) ]
49
+ end
50
+ end
51
+ end
52
+