blib/lib/Finance/Bank/Commerzbank.pm | |||
---|---|---|---|
Criterion | Covered | Total | % |
statement | 10 | 12 | 83.3 |
branch | n/a | ||
condition | n/a | ||
subroutine | 4 | 4 | 100.0 |
pod | n/a | ||
total | 14 | 16 | 87.5 |
line | stmt | bran | cond | sub | pod | time | code |
---|---|---|---|---|---|---|---|
1 | package Finance::Bank::Commerzbank; | ||||||
2 | 1 | 1 | 15318 | use strict; | |||
1 | 3 | ||||||
1 | 63 | ||||||
3 | 1 | 1 | 15 | use Carp; | |||
1 | 2 | ||||||
1 | 4204 | ||||||
4 | our $VERSION = '0.29'; | ||||||
5 | |||||||
6 | 1 | 1 | 2671 | use WWW::Mechanize; | |||
1 | 274529 | ||||||
1 | 40 | ||||||
7 | 1 | 1 | 1679 | use WWW::Mechanize::FormFiller; | |||
0 | |||||||
0 | |||||||
8 | use URI::URL; | ||||||
9 | our $ua = WWW::Mechanize->new( autocheck => 1 ); | ||||||
10 | our $formfiller = WWW::Mechanize::FormFiller->new(); | ||||||
11 | use Time::localtime; | ||||||
12 | |||||||
13 | sub check_balance { | ||||||
14 | my ($class, %opts) = @_; | ||||||
15 | my %HashOfAccounts; | ||||||
16 | croak "Must provide a Teilnehmernummer" | ||||||
17 | unless exists $opts{Teilnehmernummer}; | ||||||
18 | croak "Must provide a PIN" | ||||||
19 | unless exists $opts{PIN}; | ||||||
20 | my $self = bless { %opts }, $class; | ||||||
21 | |||||||
22 | $ua->env_proxy(); | ||||||
23 | $ua->get('https://portal01.commerzbanking.de/P-Portal/XML/IFILPortal/pgf.html?Tab=1'); | ||||||
24 | $ua->form(1) if $ua->forms and scalar @{$ua->forms}; | ||||||
25 | $ua->form_number(4); | ||||||
26 | { | ||||||
27 | local $^W; $ua->current_form->value('PltLogin_8_txtTeilnehmernummer', $opts{Teilnehmernummer}); | ||||||
28 | } | ||||||
29 | ; | ||||||
30 | { | ||||||
31 | local $^W; $ua->current_form->value('PltLogin_8_txtPIN', $opts{PIN}); | ||||||
32 | } | ||||||
33 | ; | ||||||
34 | $ua->click('PltLogin_8_btnLogin'); | ||||||
35 | my @links=$ua->find_all_links(); | ||||||
36 | my $n; | ||||||
37 | for ($n=0;$n<$#links;$n++) { | ||||||
38 | my ($url,$title)=@{$links[$n]}; | ||||||
39 | if ($opts{"debug"} eq "1") { | ||||||
40 | print "LINK------>".$n." - ".$title."\n"; | ||||||
41 | } | ||||||
42 | } | ||||||
43 | if (0) { | ||||||
44 | $ua->follow_link(text=>"Kontoübersicht"); | ||||||
45 | my $Overview=$ua->content; | ||||||
46 | my $Konto; | ||||||
47 | while (index($Overview,"PltViewAccountOverview_8_STR_KontoNummer")>-1) { | ||||||
48 | $Konto=substr ($Overview,index($Overview,"PltViewAccountOverview_8_STR_KontoNummer")+46,15); | ||||||
49 | $Overview=substr ($Overview,index($Overview,"PltViewAccountOverview_8_STR_KontoNummer")+46); | ||||||
50 | if ($opts{"debug"} eq "1") { | ||||||
51 | print $Konto."\n"; | ||||||
52 | } | ||||||
53 | } | ||||||
54 | } | ||||||
55 | $ua->follow_link(text => "Kontoumsätze"); | ||||||
56 | @links=$ua->find_all_links(); | ||||||
57 | for ($n=0;$n<$#links;$n++) { | ||||||
58 | my ($url,$title)=@{$links[$n]}; | ||||||
59 | print "LINK------>".$n." - ".$title."\n"; | ||||||
60 | } | ||||||
61 | |||||||
62 | if ($opts{"debug"} eq "1") { | ||||||
63 | write_file($ua->content,"/tmp/Commerzbank-0"); | ||||||
64 | } | ||||||
65 | if ( $ua->form_number(5)) { | ||||||
66 | if ($opts{"debug"} eq "1") { | ||||||
67 | write_file($ua->content,"/tmp/Commerzbank-1"); | ||||||
68 | } | ||||||
69 | { | ||||||
70 | local $^W; $ua->current_form->value('PltViewAccountTransactions_8_STR_CodeZeitrahmen', '90 Tage'); | ||||||
71 | local $^W; $ua->current_form->value('PltViewAccountTransactions_8_STR_KontoNr', $opts{Kontonummer}); | ||||||
72 | } | ||||||
73 | ; | ||||||
74 | my $response= $ua->click('PltViewAccountTransactions_8_btnAnzeigen'); | ||||||
75 | write_file($ua->content,"/tmp/Account"); | ||||||
76 | $ua->form_number(4); | ||||||
77 | $ua->click('PltHomeTeaser_3_btnLogout'); | ||||||
78 | } else { | ||||||
79 | print "Could not log on - wait timeout detected..\n"; | ||||||
80 | } | ||||||
81 | |||||||
82 | |||||||
83 | |||||||
84 | use HTML::TableContentParser; | ||||||
85 | my $p = HTML::TableContentParser->new(); | ||||||
86 | |||||||
87 | open(IN," | ||||||
88 | my $Data; | ||||||
89 | my $go; | ||||||
90 | while ( |
||||||
91 | if (index($_,"Buchungstag")>-1) { | ||||||
92 | $go=1; | ||||||
93 | } | ||||||
94 | if ($go) { | ||||||
95 | $Data.=$_; | ||||||
96 | } | ||||||
97 | } | ||||||
98 | if ( ($opts{"debug"} ne "1") && ( -r "/tmp/Account" )) { | ||||||
99 | # We remove the temporary file only in non-debug mode... | ||||||
100 | `rm /tmp/Account`; | ||||||
101 | } | ||||||
102 | |||||||
103 | my $tables = $p->parse($Data); | ||||||
104 | my $t; | ||||||
105 | my $r; | ||||||
106 | my @accounts; | ||||||
107 | for $t (@$tables) { | ||||||
108 | my $j=0; | ||||||
109 | for $r (@{$t->{rows}}) { | ||||||
110 | my $i=0; | ||||||
111 | my $IsOk=0; | ||||||
112 | my $c; | ||||||
113 | my @line; | ||||||
114 | for $c (@{$r->{cells}}) { | ||||||
115 | # print "CELL :$i\n"; | ||||||
116 | my $Data; | ||||||
117 | if (($i == 1 ) || ($i == 5 )|| ($i == 7 ) ) { | ||||||
118 | |||||||
119 | $Data=substr($c->{data},index($c->{data},"tablehead1")+12,1000); | ||||||
120 | $Data =~ s/<\/span> //g; |
||||||
121 | $Data =~s/ /#/g; |
||||||
122 | my $year=localtime->year()+1900; | ||||||
123 | my $year_before=localtime->year()+1900-1; | ||||||
124 | if (($i ==1 ) && ( (index($Data,$year)>-1) || (index($Data,$year_before)>-1))) { | ||||||
125 | $IsOk=1; | ||||||
126 | $j++; | ||||||
127 | # print "Transaction - $j:"; | ||||||
128 | } | ||||||
129 | if ($IsOk) { | ||||||
130 | push @line,$Data; | ||||||
131 | # print "Push IsOK".$Data.";"; | ||||||
132 | } | ||||||
133 | } | ||||||
134 | if ($i == 10) { | ||||||
135 | # print "[$c->{data}]"; | ||||||
136 | if (index($c->{data},'"red">')> -1) { | ||||||
137 | $Data=substr($c->{data},index($c->{data},"red")+5,1000); | ||||||
138 | } | ||||||
139 | if (index($c->{data},'"green">')> -1) { | ||||||
140 | $Data=substr($c->{data},index($c->{data},"green")+7,1000); | ||||||
141 | } | ||||||
142 | $Data =~ s/<\/span> //g; |
||||||
143 | if ($IsOk) { | ||||||
144 | $Data =~ s/\.//g; | ||||||
145 | push @line,$Data; | ||||||
146 | push @accounts, (bless { | ||||||
147 | TradeDate => $line[0], | ||||||
148 | Description => $line[1], | ||||||
149 | ValueDate => $line[2], | ||||||
150 | Amount => $line[3], | ||||||
151 | parent => $self | ||||||
152 | }, "Finance::Bank::Commerzbank::Account"); | ||||||
153 | } | ||||||
154 | } | ||||||
155 | $i++; | ||||||
156 | } | ||||||
157 | } | ||||||
158 | } | ||||||
159 | return @accounts; | ||||||
160 | } | ||||||
161 | |||||||
162 | sub money_transfer { | ||||||
163 | my ($class, %opts) = @_; | ||||||
164 | #Checking all necessary InputParameters | ||||||
165 | croak "Must provide : Teilnehmernummer" | ||||||
166 | unless exists $opts{Teilnehmernummer}; | ||||||
167 | croak "Must provide : PIN" | ||||||
168 | unless exists $opts{PIN}; | ||||||
169 | croak "Must provide : TANPIN" | ||||||
170 | unless exists $opts{TANPIN}; | ||||||
171 | croak "Must provide : EmpfaengerName" | ||||||
172 | unless exists $opts{EmpfaengerName}; | ||||||
173 | croak "Must provide : EmpfaengerKtoNr" | ||||||
174 | unless exists $opts{EmpfaengerKtoNr}; | ||||||
175 | croak "Must provide : EmpfaengerBLZ" | ||||||
176 | unless exists $opts{EmpfaengerBLZ}; | ||||||
177 | croak "Must provide : Betrag_Eingabe" | ||||||
178 | unless exists $opts{Betrag_Eingabe}; | ||||||
179 | |||||||
180 | my $self = bless { %opts }, $class; | ||||||
181 | |||||||
182 | $ua->env_proxy(); | ||||||
183 | |||||||
184 | $ua->get('https://portal01.commerzbanking.de/P-Portal/XML/IFILPortal/pgf.html?Tab=1'); | ||||||
185 | $ua->form(1) if $ua->forms and scalar @{$ua->forms}; | ||||||
186 | $ua->form_number(4); | ||||||
187 | { | ||||||
188 | local $^W; $ua->current_form->value('PltLogin_8_txtTeilnehmernummer', $opts{Teilnehmernummer}); | ||||||
189 | } | ||||||
190 | ; | ||||||
191 | { | ||||||
192 | local $^W; $ua->current_form->value('PltLogin_8_txtPIN', $opts{PIN}); | ||||||
193 | } | ||||||
194 | ; | ||||||
195 | $ua->click('PltLogin_8_btnLogin'); | ||||||
196 | my @links=$ua->find_all_links(); | ||||||
197 | my $n; | ||||||
198 | for ($n=0;$n<$#links;$n++) { | ||||||
199 | my ($url,$title)=@{$links[$n]}; | ||||||
200 | print "LINK------>".$n." - ".$title."\n"; | ||||||
201 | |||||||
202 | } | ||||||
203 | $ua->follow_link(text => "Inlandsüberweisung"); | ||||||
204 | @links=$ua->find_all_links(); | ||||||
205 | for ($n=0;$n<$#links;$n++) { | ||||||
206 | my ($url,$title)=@{$links[$n]}; | ||||||
207 | print "LINK------>".$n." - ".$title."\n"; | ||||||
208 | |||||||
209 | } | ||||||
210 | if ($opts{"debug"} eq "1") { | ||||||
211 | write_file($ua->content,"/tmp/Commerzbank-0"); | ||||||
212 | } | ||||||
213 | if ( $ua->form_number(5)) { | ||||||
214 | if ($opts{"debug"} eq "1") { | ||||||
215 | write_file($ua->content,"/tmp/Commerzbank-1"); | ||||||
216 | } | ||||||
217 | { | ||||||
218 | local $^W; $ua->current_form->value('PltManageDomesticTransfer_8_STR_EmpfaengerName', $opts{EmpfaengerName}); | ||||||
219 | } | ||||||
220 | ; | ||||||
221 | { | ||||||
222 | local $^W; $ua->current_form->value('PltManageDomesticTransfer_8_STR_EmpfaengerKtoNr', $opts{EmpfaengerKtoNr}); | ||||||
223 | } | ||||||
224 | ; | ||||||
225 | { | ||||||
226 | local $^W; $ua->current_form->value('PltManageDomesticTransfer_8_STR_EmpfaengerBLZ', $opts{EmpfaengerBLZ}); | ||||||
227 | } | ||||||
228 | ; | ||||||
229 | { | ||||||
230 | local $^W; $ua->current_form->value('PltManageDomesticTransfer_8_DBL_Betrag_Eingabe',$opts{Betrag_Eingabe}); | ||||||
231 | } | ||||||
232 | ; | ||||||
233 | { | ||||||
234 | local $^W; $ua->current_form->value('PltManageDomesticTransfer_8_STR_Verwendungszweck1', $opts{Verwendungszweck1}); | ||||||
235 | } | ||||||
236 | ; | ||||||
237 | { | ||||||
238 | local $^W; $ua->current_form->value('PltManageDomesticTransfer_8_STR_Verwendungszweck2', $opts{Verwendungszweck2}); | ||||||
239 | } | ||||||
240 | ; | ||||||
241 | { | ||||||
242 | local $^W; $ua->current_form->value('PltManageDomesticTransfer_8_STR_Verwendungszweck3', $opts{Verwendungszweck3}); | ||||||
243 | } | ||||||
244 | ; | ||||||
245 | { | ||||||
246 | local $^W; $ua->current_form->value('PltManageDomesticTransfer_8_STR_Verwendungszweck4', $opts{Verwendungszweck4}); | ||||||
247 | } | ||||||
248 | ; | ||||||
249 | { | ||||||
250 | local $^W; $ua->current_form->value('PltManageDomesticTransfer_8_CBO_Konten', $opts{Auftragskonto}); | ||||||
251 | } | ||||||
252 | ; | ||||||
253 | print "Empfaenger :".$opts{EmpfaengerName}."\n"; | ||||||
254 | print "Empfaenger Kto :".$opts{EmpfaengerKtoNr}."\n"; | ||||||
255 | print "Empfaenger BLZ :".$opts{EmpfaengerBLZ}."\n"; | ||||||
256 | print "Empfaenger Betrag:".$opts{Betrag_Eingabe}."\n"; | ||||||
257 | print "VZ 1 :".$opts{Verwendungszweck1}."\n"; | ||||||
258 | print "VZ 2 :".$opts{Verwendungszweck2}."\n"; | ||||||
259 | print "VZ 3 :".$opts{Verwendungszweck3}."\n"; | ||||||
260 | print "VZ 4 :".$opts{Verwendungszweck4}."\n"; | ||||||
261 | my $response= $ua->click('PltManageDomesticTransfer_8_btnPruefenDomestic'); | ||||||
262 | #$ua->click('PltManageDomesticTransfer_8_btnPruefenDomestic'); | ||||||
263 | sleep(3); | ||||||
264 | $ua->form_number(5); | ||||||
265 | { | ||||||
266 | local $^W; $ua->current_form->value('PltManageDomesticTransfer_8_STR_FECAF5D9B9AF914896', $opts{TANPIN}); | ||||||
267 | #The Form has changed.... below the old input for the tan | ||||||
268 | #local $^W; $ua->current_form->value('PltManageDomesticTransfer_8_txtTANPIN', $opts{TANPIN}); | ||||||
269 | } | ||||||
270 | ; | ||||||
271 | $ua->click('PltManageDomesticTransfer_8_btnFreigebenDomestic'); | ||||||
272 | $ua->form_number(4); | ||||||
273 | |||||||
274 | |||||||
275 | if ($opts{"debug"} eq "1") { | ||||||
276 | write_file($ua->content,"/tmp/Commerzbank-2"); | ||||||
277 | } | ||||||
278 | $ua->form_number(4); | ||||||
279 | $ua->click('PltHomeTeaser_3_btnLogout'); | ||||||
280 | } else { | ||||||
281 | print "Could not log on - wait timeout detected..\n"; | ||||||
282 | } | ||||||
283 | |||||||
284 | |||||||
285 | } | ||||||
286 | |||||||
287 | sub write_file { | ||||||
288 | my ($Data,$FileName)=@_; | ||||||
289 | open( OUT , ">".$FileName); | ||||||
290 | print OUT $Data; | ||||||
291 | close(OUT); | ||||||
292 | } | ||||||
293 | |||||||
294 | |||||||
295 | |||||||
296 | |||||||
297 | package Finance::Bank::Commerzbank::Account; | ||||||
298 | # Basic OO smoke | ||||||
299 | no strict; | ||||||
300 | sub AUTOLOAD { my $self=shift; $AUTOLOAD =~ s/.*:://; $self->{$AUTOLOAD} } | ||||||
301 | |||||||
302 | __END__ |