coop_to_ofx 1.0.1 → 1.1.0

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.
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>