coop_to_ofx 1.0.1 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/MIT-LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2009 Matt Patterson
2
+
3
+ Permission is hereby granted, free of charge, to any person
4
+ obtaining a copy of this software and associated documentation
5
+ files (the "Software"), to deal in the Software without
6
+ restriction, including without limitation the rights to use,
7
+ copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ copies of the Software, and to permit persons to whom the
9
+ Software is furnished to do so, subject to the following
10
+ conditions:
11
+
12
+ The above copyright notice and this permission notice shall be
13
+ included in all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
17
+ OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
19
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
20
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22
+ OTHER DEALINGS IN THE SOFTWARE.
data/Rakefile CHANGED
@@ -2,7 +2,6 @@ require 'rake'
2
2
  require 'rake/rdoctask'
3
3
  gem 'rspec'
4
4
  require 'spec/rake/spectask'
5
- require 'lib/coop_scraper/version.rb'
6
5
 
7
6
  desc 'Generate documentation for Co-op-to-OFX.'
8
7
  Rake::RDocTask.new(:rdoc) do |rdoc|
@@ -39,103 +38,3 @@ namespace :spec do
39
38
  end
40
39
  end
41
40
 
42
- require "rubygems"
43
- require "rake/gempackagetask"
44
-
45
- # This builds the actual gem. For details of what all these options
46
- # mean, and other ones you can add, check the documentation here:
47
- #
48
- # http://rubygems.org/read/chapter/20
49
- #
50
- spec = Gem::Specification.new do |s|
51
-
52
- # Change these as appropriate
53
- s.name = "coop_to_ofx"
54
- s.version = CoopScraper::Version()
55
- s.summary = "Convert Co-operative bank HTML statements into OFX"
56
- s.description = File.read('README.rdoc')
57
- s.author = "Matt Patterson"
58
- s.email = "matt@reprocessed.org"
59
- s.homepage = "http://reprocessed.org/"
60
-
61
- s.has_rdoc = true
62
- s.extra_rdoc_files = %w(README.rdoc)
63
- s.rdoc_options = %w(--main README.rdoc)
64
-
65
- # Add any extra files to include in the gem
66
- s.files = %w(Rakefile README.rdoc) + Dir.glob("{bin,spec,lib}/**/*")
67
- s.executables = FileList["bin/**"].map { |f| File.basename(f) }
68
-
69
- s.require_paths = ["lib"]
70
-
71
- # If you want to depend on other gems, add them here, along with any
72
- # relevant versions
73
- s.add_dependency("hpricot", "~> 0.6.0")
74
- s.add_dependency("builder", "~> 2.1.0")
75
-
76
- s.add_development_dependency("rspec") # add any other gems for testing/development
77
-
78
- # If you want to publish automatically to rubyforge, you'll may need
79
- # to tweak this, and the publishing task below too.
80
- s.rubyforge_project = "coop_to_ofx"
81
- end
82
-
83
- # This task actually builds the gem. We also regenerate a static
84
- # .gemspec file, which is useful if something (i.e. GitHub) will
85
- # be automatically building a gem for this project. If you're not
86
- # using GitHub, edit as appropriate.
87
- Rake::GemPackageTask.new(spec) do |pkg|
88
- pkg.gem_spec = spec
89
-
90
- # Generate the gemspec file for github.
91
- file = File.dirname(__FILE__) + "/#{spec.name}.gemspec"
92
- File.open(file, "w") {|f| f << spec.to_ruby }
93
- end
94
-
95
- desc 'Clear out RDoc and generated packages'
96
- task :clean => [:clobber_rdoc, :clobber_package] do
97
- rm "#{spec.name}.gemspec"
98
- end
99
-
100
- # If you want to publish to RubyForge automatically, here's a simple
101
- # task to help do that. If you don't, just get rid of this.
102
- # Be sure to set up your Rubyforge account details with the Rubyforge
103
- # gem; you'll need to run `rubyforge setup` and `rubyforge config` at
104
- # the very least.
105
- begin
106
- require "rake/contrib/sshpublisher"
107
- namespace :rubyforge do
108
-
109
- desc "Release gem and RDoc documentation to RubyForge"
110
- task :release => ["rubyforge:release:gem", "rubyforge:release:docs"]
111
-
112
- namespace :release do
113
- desc "Release a new version of this gem"
114
- task :gem => [:package] do
115
- require 'rubyforge'
116
- rubyforge = RubyForge.new
117
- rubyforge.configure
118
- rubyforge.login
119
- rubyforge.userconfig['release_notes'] = spec.summary
120
- path_to_gem = File.join(File.dirname(__FILE__), "pkg", "#{spec.name}-#{spec.version}.gem")
121
- puts "Publishing #{spec.name}-#{spec.version.to_s} to Rubyforge..."
122
- rubyforge.add_release(spec.rubyforge_project, spec.name, spec.version.to_s, path_to_gem)
123
- end
124
-
125
- desc "Publish RDoc to RubyForge."
126
- task :docs => [:rdoc] do
127
- config = YAML.load(
128
- File.read(File.expand_path('~/.rubyforge/user-config.yml'))
129
- )
130
-
131
- host = "#{config['username']}@rubyforge.org"
132
- remote_dir = "/var/www/gforge-projects/coop_to_ofx/" # Should be the same as the rubyforge project name
133
- local_dir = 'rdoc'
134
-
135
- Rake::SshDirPublisher.new(host, remote_dir, local_dir).upload
136
- end
137
- end
138
- end
139
- rescue LoadError
140
- puts "Rake SshDirPublisher is unavailable or your rubyforge environment is not configured."
141
- end
data/bin/coop_to_ofx CHANGED
@@ -1,7 +1,9 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- $:.push(File.expand_path(File.dirname(__FILE__) + '/../lib'))
3
+ # $:.push(File.expand_path(File.dirname(__FILE__) + '/../lib'))
4
+ require 'rubygems'
4
5
  require 'optparse'
6
+ gem 'coop_to_ofx'
5
7
  require 'coop_scraper/version'
6
8
 
7
9
  options = {:format => :ofx2, :statement_type => :credit}
@@ -1,7 +1,9 @@
1
1
  module CoopScraper
2
2
  module Base
3
3
  def coop_date_to_time(coop_date)
4
- day, month, year = coop_date.match(/([0-9]{2})\/([0-9]{2})\/([0-9]{4})/).captures
4
+ date_match = coop_date.match(/([0-9]{2})\/([0-9]{2})\/([0-9]{4})/)
5
+ return nil if date_match.nil?
6
+ day, month, year = date_match.captures
5
7
  Time.utc(year, month, day)
6
8
  end
7
9
  end
@@ -1,5 +1,4 @@
1
- require 'rubygems'
2
- require 'hpricot'
1
+ require 'nokogiri'
3
2
 
4
3
  require 'coop_scraper/base'
5
4
  require 'ofx/statement'
@@ -42,9 +41,9 @@ module CoopScraper
42
41
  transactions = []
43
42
  current_transaction = {}
44
43
  doc.search('tbody.contents tr').each do |statement_row|
45
- date = statement_row.at('td.dataRowL').inner_text
46
- unless date == "?" || date[0] == 194
47
- current_transaction = extract_transaction(statement_row, coop_date_to_time(date))
44
+ date = coop_date_to_time(statement_row.at('td.dataRowL').inner_text)
45
+ unless date.nil?
46
+ current_transaction = extract_transaction(statement_row, date)
48
47
  transactions << current_transaction
49
48
  else
50
49
  transaction = extract_transaction(statement_row, statement.date)
@@ -67,14 +66,14 @@ module CoopScraper
67
66
 
68
67
  def extract_transaction(statement_row, date)
69
68
  details = statement_row.at('td.transData').inner_text.strip
70
- credit = statement_row.at('td.moneyData:first').inner_text.match(/[0-9.]+/)
71
- debit = statement_row.at('td.moneyData:last').inner_text.match(/[0-9.]+/)
69
+ credit = statement_row.css('td.moneyData').first.inner_text.match(/[0-9.]+/)
70
+ debit = statement_row.css('td.moneyData').last.inner_text.match(/[0-9.]+/)
72
71
  amount = credit.nil? ? "-#{debit}" : credit.to_s
73
72
  {:date => date, :amount => amount, :details => details}
74
73
  end
75
74
 
76
75
  def generate_statement(html_statement_io, server_response_time)
77
- doc = Hpricot(html_statement_io)
76
+ doc = Nokogiri::HTML(html_statement_io)
78
77
  statement = OFX::Statement::CreditCard.new
79
78
 
80
79
  statement.server_response_time = server_response_time
@@ -1,5 +1,4 @@
1
- require 'rubygems'
2
- require 'hpricot'
1
+ require 'nokogiri'
3
2
 
4
3
  require 'coop_scraper/base'
5
4
  require 'ofx/statement'
@@ -9,12 +8,16 @@ module CoopScraper
9
8
  class << self
10
9
  include CoopScraper::Base
11
10
 
11
+ def extract_account_details(doc)
12
+ doc.at_xpath("//h4[contains(., 'CURRENT ACCOUNT') or contains(., 'PRIVILEGE') or contains(., 'PRIV SAVINGS')]").inner_text
13
+ end
14
+
12
15
  def extract_account_number(doc)
13
- doc.at("h4[text()*='CURRENT ACCOUNT']").inner_text.match(/([0-9]{8})/)[1]
16
+ extract_account_details(doc).match(/([0-9]{8})/)[1]
14
17
  end
15
18
 
16
19
  def extract_sort_code(doc)
17
- doc.at("h4[text()*='CURRENT ACCOUNT']").inner_text.match(/([0-9]{2}-[0-9]{2}-[0-9]{2})/)[1].tr('-', '')
20
+ extract_account_details(doc).match(/([0-9]{2}-[0-9]{2}-[0-9]{2})/)[1].tr('-', '')
18
21
  end
19
22
 
20
23
  def extract_statement_date(doc)
@@ -23,7 +26,7 @@ module CoopScraper
23
26
 
24
27
  def extract_transaction_rows(doc)
25
28
  a_td = doc.at('td.transData')
26
- a_td.parent.parent.search('tr')
29
+ a_td.parent.parent.css('tr')
27
30
  end
28
31
 
29
32
  def determine_trntype(details)
@@ -49,8 +52,8 @@ module CoopScraper
49
52
  transaction_rows.each do |statement_row|
50
53
  date = statement_row.at('td.dataRowL').inner_text
51
54
  details = statement_row.at('td.transData').inner_text.strip
52
- credit = statement_row.at('td.moneyData:first').inner_text.match(/[0-9.]+/)
53
- debit = statement_row.search('td.moneyData')[1].inner_text.match(/[0-9.]+/)
55
+ credit = statement_row.css('td.moneyData')[0].inner_text.match(/[0-9.]+/)
56
+ debit = statement_row.css('td.moneyData')[1].inner_text.match(/[0-9.]+/)
54
57
  amount = credit.nil? ? "-#{debit}" : credit.to_s
55
58
  options = {}
56
59
  trntype = determine_trntype(details)
@@ -61,7 +64,7 @@ module CoopScraper
61
64
  end
62
65
 
63
66
  def extract_closing_balance(doc)
64
- final_transaction = extract_transaction_rows(doc).last.at('td.moneyData:last').inner_text
67
+ final_transaction = extract_transaction_rows(doc).last.css('td.moneyData').last.inner_text
65
68
  amount = final_transaction.match(/[0-9.]+/).to_s
66
69
  sign = final_transaction.match(/[CD]R/).to_s
67
70
  sign == "CR" ? amount : "-#{amount}"
@@ -72,7 +75,7 @@ module CoopScraper
72
75
  end
73
76
 
74
77
  def generate_statement(html_statement_io, server_response_time)
75
- doc = Hpricot(html_statement_io)
78
+ doc = Nokogiri::HTML(html_statement_io)
76
79
  statement = OFX::Statement::CurrentAccount.new
77
80
 
78
81
  statement.server_response_time = server_response_time
@@ -11,5 +11,9 @@ describe CoopScraper::Base do
11
11
  it "should be able to turn a DD/MM/YYYY string into a YYYYMMDD one" do
12
12
  @instance.coop_date_to_time('03/02/2009').should == Time.utc('2009', '2', '3')
13
13
  end
14
+
15
+ it "returns nil if it's given something weird" do
16
+ @instance.coop_date_to_time(' ').should be_nil
17
+ end
14
18
  end
15
19
  end
@@ -7,7 +7,7 @@ describe CoopScraper::CreditCard do
7
7
 
8
8
  describe "parsing the html components" do
9
9
  def fixture_doc(fixture_file_name = 'cc_statement_fixture.html')
10
- open(fixture_path(fixture_file_name)) { |f| Hpricot(f) }
10
+ open(fixture_path(fixture_file_name)) { |f| Nokogiri::HTML(f) }
11
11
  end
12
12
 
13
13
  def fixture_with_interest_line_doc
@@ -7,7 +7,7 @@ describe CoopScraper::CurrentAccount do
7
7
 
8
8
  describe "parsing the html components" do
9
9
  def fixture_doc(name = 'current_account_fixture.html')
10
- open(fixture_path(name)) { |f| Hpricot(f) }
10
+ open(fixture_path(name)) { |f| Nokogiri::HTML(f) }
11
11
  end
12
12
 
13
13
  def normal_transaction_fixture_doc
@@ -150,5 +150,127 @@ describe CoopScraper::CurrentAccount do
150
150
  CoopScraper::CurrentAccount.generate_statement(fixture, Time.utc('2009', '3', '6'))
151
151
  end
152
152
  end
153
+
154
+ describe "Non-current account statements (Privilege, savings, etc) which use the same HTML structure" do
155
+ describe "Privilege statements" do
156
+ it "should be able to extract the statement date" do
157
+ CoopScraper::CurrentAccount.extract_statement_date(fixture_doc('privilege_fixture.html')).should == Time.utc('2010', '8', '23')
158
+ end
159
+
160
+ it "should be able to extract the account number" do
161
+ CoopScraper::CurrentAccount.extract_account_number(fixture_doc('privilege_fixture.html')).should == "12341234"
162
+ end
163
+
164
+ it "should be able to extract the sort code" do
165
+ CoopScraper::CurrentAccount.extract_sort_code(fixture_doc('privilege_fixture.html')).should == "089273"
166
+ end
167
+
168
+ describe "transactions" do
169
+ before(:all) do
170
+ @transactions = CoopScraper::CurrentAccount.extract_transactions(fixture_doc('privilege_fixture.html'))
171
+ end
172
+
173
+ it "should find the correct number of transactions" do
174
+ @transactions.size.should == 25
175
+ end
176
+
177
+ describe "processing a normal transaction" do
178
+ before(:each) do
179
+ @transaction = @transactions.first
180
+ end
181
+
182
+ it "should pull out the date" do
183
+ @transaction.date.should == Time.utc('2010', '8', '6')
184
+ end
185
+
186
+ it "should pull out the amount" do
187
+ @transaction.amount.should == '-20.00'
188
+ end
189
+
190
+ it "should pull out the details" do
191
+ @transaction.name.should == 'OYSTER AUTOTOPUP'
192
+ end
193
+ end
194
+
195
+ describe "processing a transaction where money was put in" do
196
+ before(:each) do
197
+ @transaction = @transactions[10]
198
+ end
199
+
200
+ it "should pull out the date" do
201
+ @transaction.date.should == Time.utc('2010', '8', '16')
202
+ end
203
+
204
+ it "should pull out the amount" do
205
+ @transaction.amount.should == '1500.00'
206
+ end
207
+
208
+ it "should pull out the details" do
209
+ @transaction.name.should == 'TFR'
210
+ end
211
+ end
212
+ end
213
+ end
214
+
215
+ describe "Privilege Savings statements" do
216
+ it "should be able to extract the statement date" do
217
+ CoopScraper::CurrentAccount.extract_statement_date(fixture_doc('priv_savings_fixture.html')).should == Time.utc('2010', '7', '15')
218
+ end
219
+
220
+ it "should be able to extract the account number" do
221
+ CoopScraper::CurrentAccount.extract_account_number(fixture_doc('priv_savings_fixture.html')).should == "43211234"
222
+ end
223
+
224
+ it "should be able to extract the sort code" do
225
+ CoopScraper::CurrentAccount.extract_sort_code(fixture_doc('priv_savings_fixture.html')).should == "089273"
226
+ end
227
+
228
+ describe "transactions" do
229
+ before(:all) do
230
+ @transactions = CoopScraper::CurrentAccount.extract_transactions(fixture_doc('priv_savings_fixture.html'))
231
+ end
232
+
233
+ it "should find the correct number of transactions" do
234
+ @transactions.size.should == 13
235
+ end
236
+
237
+ describe "processing a normal transaction" do
238
+ before(:each) do
239
+ @transaction = @transactions[1]
240
+ end
241
+
242
+ it "should pull out the date" do
243
+ @transaction.date.should == Time.utc('2010', '4', '27')
244
+ end
245
+
246
+ it "should pull out the amount" do
247
+ @transaction.amount.should == '-500.00'
248
+ end
249
+
250
+ it "should pull out the details" do
251
+ @transaction.name.should == 'TFR'
252
+ end
253
+ end
254
+
255
+ describe "processing a transaction where money was put in" do
256
+ before(:each) do
257
+ @transaction = @transactions.first
258
+ end
259
+
260
+ it "should pull out the date" do
261
+ @transaction.date.should == Time.utc('2010', '4', '23')
262
+ end
263
+
264
+ it "should pull out the amount" do
265
+ @transaction.amount.should == '2000.00'
266
+ end
267
+
268
+ it "should pull out the details" do
269
+ @transaction.name.should == 'DEPOSIT'
270
+ end
271
+ end
272
+ end
273
+ end
274
+ end
153
275
  end
154
276
  end
@@ -0,0 +1,462 @@
1
+ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
2
+
3
+
4
+
5
+ <html>
6
+ <head>
7
+ <TITLE>The Co-operative Bank p.l.c.</TITLE>
8
+ <link rel="stylesheet" href="https://welcome27.co-operativebank.co.uk/CBIBSImages/theme/Master.css" type="text/css">
9
+ <META content="text/html; charset=ISO-8859-1" http-equiv="Content-Type">
10
+ <META http-equiv="Content-Type" content="no-cache">
11
+ <META http-equiv="Pragma" content="no-cache">
12
+ <META http-equiv="Expires" content="-1">
13
+ <META http-equiv="Pragma-directive" content="no-cache">
14
+ <META http-equiv="cache-directive" content="no-cache">
15
+ </head>
16
+
17
+
18
+
19
+
20
+ <body>
21
+ <table width="100%" cellpadding="0" cellspacing="0">
22
+ <tr>
23
+ <td>
24
+
25
+
26
+
27
+
28
+
29
+
30
+
31
+ <table width="100%" cellpadding="0" border="0" cellspacing="0">
32
+ <tr>
33
+ <td class="pageheader" height="0" width="50%">&nbsp;</td>
34
+ <td class="pageheader" width="20%">&nbsp;</td>
35
+ <td class="pageheader" height="10" width="30%">&nbsp;</td>
36
+ </tr>
37
+ <tr>
38
+ <td class="pageheader" valign="TOP" width="50%"><img src="https://welcome27.co-operativebank.co.uk/CBIBSImages/images/coop_logo_top.gif" align="left" alt="Top of the co-operative bank logo"></td>
39
+ <TD class="pageheader" valign="baseline" align="left" width="20%">
40
+ <table border="0" cellspacing="0" cellpadding="0" width="100%"><!--Table is used for vertical alignment-->
41
+ <tr><td>&nbsp;</td></tr>
42
+ <tr>
43
+ <TD class="pageheader" valign="BOTTOM" align="right" width="100%" height="100%">
44
+ <a href="/CBIBSWeb/sidebar.do?action=logoff&amp;org.apache.struts.taglib.html.TOKEN=Nan" title="Log Off" class="whiteLinks"><img src="https://welcome27.co-operativebank.co.uk/CBIBSImages/images/logoffbutton.gif" align="middle" alt="Log Off"></a>
45
+ </TD>
46
+ </tr>
47
+ </table>
48
+ </TD>
49
+
50
+ <TD class="pageheader" valign="baseline" align="left" width="35%">
51
+ <table border="0" cellspacing="0" cellpadding="0" width="100%"><!--Table is used for vertical alignment-->
52
+ <tr><td>&nbsp;</td></tr><!--Used for alignment-->
53
+ <tr>
54
+
55
+
56
+
57
+ <td class="pageheadernew" valign="baseline" width="22.5%"><a href="http://www.co-operativebank.co.uk/helppages/cbibs/statements/currentAccountPreviousStatements.htm" target="_blank" class="whiteLinks" title="New Help Window Opened">
58
+ <img src="https://welcome27.co-operativebank.co.uk/CBIBSImages/images/helpbutton.gif" align="left" alt="Help"></a></coop:HelpLinkTag>
59
+ </td>
60
+ <td class="pageheader" align="left" valign="baseline" width="77.5%"><a href="/CBIBSWeb/printstatementDomestic.do?org.apache.struts.taglib.html.TOKEN=Nan" title="Printer Friendly Page" class="whiteLinks"><img src="https://welcome27.co-operativebank.co.uk/CBIBSImages/images/printbutton.gif" align="left" alt="Print"></a>
61
+ </td>
62
+
63
+
64
+
65
+ </tr>
66
+ </table>
67
+ </td>
68
+ </tr>
69
+ <tr align="left">
70
+ <td>
71
+ <table width="100%" border="0">
72
+ <tr>
73
+ <td align="left">&nbsp;&nbsp;</td>
74
+ <td align="left" valign="baseline" width="40%">Saturday 25 September 2010</td>
75
+ <td align="left" valign="baseline" width="60%"><span class="H4">MR M</span></td>
76
+ </tr>
77
+ <tr><td>&nbsp;</td></tr>
78
+ </table>
79
+ </td>
80
+ </tr>
81
+ </table>
82
+ </td>
83
+ </tr>
84
+ <tr valign="top" align="left">
85
+ <td class="sidebar" >
86
+ <table width="100%">
87
+ <tr valign="top" align="left">
88
+ <td width="20%" class="sidebar">
89
+
90
+
91
+
92
+
93
+
94
+
95
+ <table cellpadding="3" cellspacing="5" width="78%" border="0">
96
+ <tr>
97
+ <td valign="top" height="26"><br></td>
98
+ </tr>
99
+
100
+
101
+
102
+
103
+ <tr valign="top">
104
+ <td valign="top" class="sidebar">
105
+ <a href="/CBIBSWeb/backToAccountBalance.do?org.apache.struts.taglib.html.TOKEN=Nan" title="Your Accounts" class="sidebar">Your Accounts</a>
106
+ </td>
107
+ </tr>
108
+
109
+
110
+
111
+
112
+ <tr valign="top">
113
+ <td valign="top" class="backgroundSelected">
114
+ <a href="/CBIBSWeb/prepareStatements.do?org.apache.struts.taglib.html.TOKEN=Nan" title="Statements" class="sidebarSelected">Statements</a>
115
+ </td>
116
+ </tr>
117
+
118
+
119
+
120
+
121
+ <tr valign="top">
122
+ <td valign="top" class="sidebar">
123
+ <a href="/CBIBSWeb/billPaymentSummaryPrepare.do?org.apache.struts.taglib.html.TOKEN=Nan" title="Pay Bills" class="sidebar">Pay Bills</a>
124
+ </td>
125
+ </tr>
126
+
127
+
128
+
129
+
130
+ <tr valign="top">
131
+ <td valign="top" class="sidebar">
132
+ <a href="/CBIBSWeb/standingOrderSummaryPrepare.do?org.apache.struts.taglib.html.TOKEN=Nan" title="Standing Orders" class="sidebar">Standing Orders</a>
133
+ </td>
134
+ </tr>
135
+
136
+
137
+
138
+
139
+ <tr valign="top">
140
+ <td valign="top" class="sidebar">
141
+ <a href="/CBIBSWeb/fundsTransferSummaryPrepare.do?org.apache.struts.taglib.html.TOKEN=Nan" title="Funds Transfers" class="sidebar">Funds Transfers</a>
142
+ </td>
143
+ </tr>
144
+
145
+
146
+
147
+
148
+ <tr valign="top">
149
+ <td valign="top" class="sidebar">
150
+ <a href="/CBIBSWeb/directDebitsSummaryPrepare.do?org.apache.struts.taglib.html.TOKEN=Nan" title="Direct Debits" class="sidebar">Direct Debits</a>
151
+ </td>
152
+ </tr>
153
+
154
+
155
+
156
+
157
+ <tr valign="top">
158
+ <td valign="top" class="sidebar">
159
+ <a href="/CBIBSWeb/customerServicesSummary.do?org.apache.struts.taglib.html.TOKEN=Nan" title="Customer Services" class="sidebar">Customer Services</a>
160
+ </td>
161
+ </tr>
162
+
163
+ <tr>
164
+ <td>&nbsp;</td>
165
+ </tr>
166
+ </table>
167
+ </td>
168
+ <td width="80%" class="sidebar" >
169
+
170
+
171
+
172
+
173
+
174
+
175
+
176
+ <table width="100%" border="0" cellspacing="0" cellpadding="0">
177
+ <tr>
178
+ <td class="field"><span class="H2">Statement<br>
179
+ </span></td>
180
+ </tr>
181
+ </table>
182
+
183
+ <table cellpadding="0" cellspacing="0" border="0" width="100%">
184
+ <tr>
185
+ <td bgcolor="#000000"><img src="https://welcome27.co-operativebank.co.uk/CBIBSImages/images/spacer.gif" height="1" width="1" alt=""></td>
186
+ </tr>
187
+ </table>
188
+
189
+ <table width="95%" border="0" cellspacing="0" cellpadding="0">
190
+ <tbody>
191
+ <tr><td><br/></td></tr>
192
+ <tr>
193
+ <td class="field">
194
+ <h4>PRIV SAVINGS
195
+ 08-92-73&nbsp;
196
+ 43211234
197
+ </h4>
198
+ </td>
199
+ </tr>
200
+
201
+
202
+
203
+ <tr>
204
+ <td align="left">
205
+ <table cellpadding="0" cellspacing="0" border="0">
206
+ <tbody>
207
+ <tr>
208
+ <td class="field">Page 15</td>
209
+ <td align="right">Date&nbsp;15/07/2010</td>
210
+ </tr>
211
+ <tr>
212
+ <td colspan="2"><br/>
213
+ </td>
214
+ </tr>
215
+ <tr>
216
+ <td colspan="2" align="left">
217
+ <table align="left" cellpadding="0" cellspacing="0" border="1">
218
+
219
+ <thead>
220
+ <tr>
221
+ <th>Date</th>
222
+ <th>Transaction</th>
223
+ <th>Deposits</th>
224
+ <th>Withdrawals</th>
225
+ <th>Balance</th>
226
+ </tr>
227
+ </thead>
228
+ <tbody>
229
+
230
+ <tr>
231
+ <td class="dataRowL"> 15/04/2010 </td>
232
+ <td class="transData">BROUGHT FORWARD</td>
233
+ <td class="moneyData"> &nbsp;</td>
234
+ <td class="moneyData"> &nbsp;</td>
235
+ <td class="moneyData"> �1957.60 CR </td>
236
+ </tr>
237
+
238
+ <tr>
239
+ <td class="dataRowL"> 23/04/2010 </td>
240
+ <td class="transData">DEPOSIT</td>
241
+ <td class="moneyData"> �2000.00 </td>
242
+ <td class="moneyData"> &nbsp; </td>
243
+ <td class="moneyData"> �3957.60 CR </td>
244
+ </tr>
245
+
246
+ <tr>
247
+ <td class="dataRowL"> 27/04/2010 </td>
248
+ <td class="transData">TFR</td>
249
+ <td class="moneyData"> &nbsp; </td>
250
+ <td class="moneyData"> �500.00 </td>
251
+ <td class="moneyData"> �3457.60 CR </td>
252
+ </tr>
253
+
254
+ <tr>
255
+ <td class="dataRowL"> 27/04/2010 </td>
256
+ <td class="transData">TFR</td>
257
+ <td class="moneyData"> &nbsp; </td>
258
+ <td class="moneyData"> �1000.00 </td>
259
+ <td class="moneyData"> �2457.60 CR </td>
260
+ </tr>
261
+
262
+ <tr>
263
+ <td class="dataRowL"> 10/05/2010 </td>
264
+ <td class="transData">DEPOSIT</td>
265
+ <td class="moneyData"> �2000.00 </td>
266
+ <td class="moneyData"> &nbsp; </td>
267
+ <td class="moneyData"> �4457.60 CR </td>
268
+ </tr>
269
+
270
+ <tr>
271
+ <td class="dataRowL"> 19/05/2010 </td>
272
+ <td class="transData">TFR</td>
273
+ <td class="moneyData"> &nbsp; </td>
274
+ <td class="moneyData"> �1500.00 </td>
275
+ <td class="moneyData"> �2957.60 CR </td>
276
+ </tr>
277
+
278
+ <tr>
279
+ <td class="dataRowL"> 24/05/2010 </td>
280
+ <td class="transData">TFR</td>
281
+ <td class="moneyData"> &nbsp; </td>
282
+ <td class="moneyData"> �300.00 </td>
283
+ <td class="moneyData"> �2657.60 CR </td>
284
+ </tr>
285
+
286
+ <tr>
287
+ <td class="dataRowL"> 01/06/2010 </td>
288
+ <td class="transData">TFR</td>
289
+ <td class="moneyData"> &nbsp; </td>
290
+ <td class="moneyData"> �2100.00 </td>
291
+ <td class="moneyData"> �557.60 CR </td>
292
+ </tr>
293
+
294
+ <tr>
295
+ <td class="dataRowL"> 09/06/2010 </td>
296
+ <td class="transData">TFR</td>
297
+ <td class="moneyData"> �1800.00 </td>
298
+ <td class="moneyData"> &nbsp; </td>
299
+ <td class="moneyData"> �2357.60 CR </td>
300
+ </tr>
301
+
302
+ <tr>
303
+ <td class="dataRowL"> 11/06/2010 </td>
304
+ <td class="transData">TFR</td>
305
+ <td class="moneyData"> &nbsp; </td>
306
+ <td class="moneyData"> �300.00 </td>
307
+ <td class="moneyData"> �2057.60 CR </td>
308
+ </tr>
309
+
310
+ <tr>
311
+ <td class="dataRowL"> 11/06/2010 </td>
312
+ <td class="transData">TFR</td>
313
+ <td class="moneyData"> &nbsp; </td>
314
+ <td class="moneyData"> �500.00 </td>
315
+ <td class="moneyData"> �1557.60 CR </td>
316
+ </tr>
317
+
318
+ <tr>
319
+ <td class="dataRowL"> 21/06/2010 </td>
320
+ <td class="transData">TFR</td>
321
+ <td class="moneyData"> &nbsp; </td>
322
+ <td class="moneyData"> �1000.00 </td>
323
+ <td class="moneyData"> �557.60 CR </td>
324
+ </tr>
325
+
326
+ <tr>
327
+ <td class="dataRowL"> 21/06/2010 </td>
328
+ <td class="transData">DEPOSIT</td>
329
+ <td class="moneyData"> �2000.00 </td>
330
+ <td class="moneyData"> &nbsp; </td>
331
+ <td class="moneyData"> �2557.60 CR </td>
332
+ </tr>
333
+
334
+ <tr>
335
+ <td class="dataRowL"> 25/06/2010 </td>
336
+ <td class="transData">TFR</td>
337
+ <td class="moneyData"> &nbsp; </td>
338
+ <td class="moneyData"> �100.00 </td>
339
+ <td class="moneyData"> �2457.60 CR </td>
340
+ </tr>
341
+
342
+ </tbody>
343
+
344
+ </table>
345
+ </td>
346
+ </tr>
347
+ <tr>
348
+ <td>&nbsp;</td>
349
+ </tr>
350
+ <tr>
351
+ <td colspan="2" align="right">
352
+
353
+ &nbsp; &nbsp;
354
+ <a href="/CBIBSWeb/paginateDomesticStatement.do?paginate=previous&amp;org.apache.struts.taglib.html.TOKEN=Nan" title="previous"><span class="bodyhighlight">previous</span></a>
355
+
356
+ </td>
357
+ </tr>
358
+
359
+ </tbody>
360
+ </table>
361
+ </td>
362
+ </tr>
363
+
364
+ </tbody>
365
+ </table>
366
+ <table width="95%" cellspacing="0" cellpadding="0">
367
+
368
+ <tr>
369
+ <td class="field" colspan="2"><br/>
370
+ To view Recent Items click <a href="/CBIBSWeb/domesticRecentItems.do?org.apache.struts.taglib.html.TOKEN=Nan" title="Recent Items"><span class="bodyhighlight">Recent Items</span></a>.<br>
371
+ </td>
372
+ </tr>
373
+ <tr>
374
+ <td class="field" colspan="2"><BR> To select another service click the menu on the left. <BR><BR>
375
+ </td>
376
+ </tr>
377
+ <tr>
378
+ <td>&nbsp;</td>
379
+ </tr>
380
+ <tr>
381
+ <td colspan="2" align="left"> To view another account, please select from the list below </td>
382
+ </tr>
383
+ </table>
384
+ </td>
385
+ </tr>
386
+ <tr valign="top" align="left">
387
+ <td></td>
388
+ <td align="left">
389
+
390
+
391
+
392
+ <form name="viewAccountForm" method="post" action="/CBIBSWeb/prepareDomesticStatements.do"><input type="hidden" name="org.apache.struts.taglib.html.TOKEN" value="Nan">
393
+ <table cellpadding="0" cellspacing="0" border="0">
394
+ <tr>
395
+ <td><label for="accounts" class="nodisplay">accounts</label></td>
396
+ </tr>
397
+ <tr valign="bottom">
398
+ <td class="field" width="56%">
399
+ <select name="selectedAccount" id="accounts">
400
+ <option value ="Select Account">Select Account</option>
401
+ <option value ="Nan">ACCOUNT</option>
402
+
403
+ </select>
404
+ </td>
405
+ <td class="field">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
406
+ <input type="image" name="VIEW" src="https://welcome27.co-operativebank.co.uk/CBIBSImages/images/viewbutton.gif" title="view account" alt="view">
407
+ </td>
408
+ </tr>
409
+ <tr>
410
+ <td class="error" colspan="2"></td>
411
+ </tr>
412
+ <tr>
413
+ <td colspan="2">&nbsp;</td>
414
+ </tr>
415
+
416
+
417
+
418
+
419
+ <tr>
420
+ <td colspan="2" align="left"><strong><font color="#216173">IBAN :</font></strong> GB15 CPBK 0891 0303 4693 05
421
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
422
+ <strong><font color="#216173">BIC :</font></strong> CPBK GB 22
423
+ </td>
424
+ </tr>
425
+
426
+
427
+
428
+ <tr>
429
+ <td colspan="2">&nbsp;</td>
430
+ </tr>
431
+
432
+
433
+
434
+
435
+
436
+
437
+
438
+
439
+
440
+
441
+
442
+
443
+
444
+
445
+
446
+
447
+ </table>
448
+ </form>
449
+ </td>
450
+ </tr>
451
+ </table>
452
+ </td>
453
+ </tr>
454
+ <tr>
455
+ <td align="left"><table width="100%">
456
+ <tr><td/>
457
+ </tr>
458
+ </table></td>
459
+ </tr>
460
+ </table>
461
+ </body>
462
+ </html>