Really return undef when parsing fails
[cascardo/Finance-Bank-BR-Santander-Spreadsheet.git] / lib / Finance / Bank / BR / Santander / Spreadsheet.pm
index 51038ab..e388aeb 100644 (file)
@@ -3,22 +3,10 @@ package Finance::Bank::BR::Santander::Spreadsheet;
 use strict;
 use warnings;
 
-=head1 COPYRIGHT AND LICENSE
-
-  Copyright (C) 2015 Thadeu Lima de Souza Cascardo <cascardo@cascardo.eti.br>
-
-  This program is free software; you can redistribute it and/or modify it under
-  the terms of the GNU General Public License; either version 2 of the License,
-  or (at your option) any later version.
-
-  This program is distributed in the hope that it will be useful, but WITHOUT
-  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
-  FOR A PARTICULAR PURPOSE.
-
-=cut
-
 use Spreadsheet::ParseExcel::Simple;
 
+use DateTime::Format::Strptime qw(strptime);
+
 our $VERSION = '0.01';
 
 sub new {
@@ -26,7 +14,9 @@ sub new {
     my $self = {};
     bless $self, $class;
     $self->_init;
-    $self->load(@_);
+    if ($self->load(@_)) {
+        return undef;
+    }
     return $self;
 }
 
@@ -47,7 +37,7 @@ sub _parse {
     while ($sheet->has_data) {
         my @line = $sheet->next_row;
         my $obj = {
-            'date' => $line[0],
+            'date' => strptime("%d/%m/%Y", $line[0]),
             'name' => $line[2],
             'extra' => $line[3],
             'value' => $line[4],
@@ -64,10 +54,11 @@ sub load {
     if (defined($filename)) {
         my $xls = Spreadsheet::ParseExcel::Simple->read($filename);
         if (!defined($xls)) {
-            return;
+            return 1;
         }
         $self->_parse($xls);
     }
+    return 0;
 }
 
 sub balance {
@@ -81,3 +72,78 @@ sub statement {
 }
 
 1;
+
+__END__
+
+=head1 NAME
+
+Finance::Bank::BR::Santander::Spreadsheet - Parse statement exported from Brazilian branch of Santander Internet Banking
+
+=head1 SYNOPSIS
+
+    use Finance::Bank::BR::Santander::Spreadsheet;
+
+    my $spreadsheet = Finance::Bank::BR::Santander::Spreadsheet->new($filename);
+    my $balance = $spreadsheet->balance;
+    my $data = $spreadsheet->statement;
+    foreach my $transaction (@{$data}) {
+        say "$transaction->{date}, $transaction->{name}, $transaction->{extra}, $transaction->{value}, $transaction->{balance}";
+    }
+
+=head1 Description
+
+This module is an object-oriented interface that parses statements exported as XLS from the Internet Banking for the Brazilian branch of Santander.
+
+=head1 Spreadsheet
+
+=head2 new($filename)
+
+The C<new()> method creates a new Spreadsheet object containing the data parsed from C<$filename>.
+
+If an error occurs while loading the file, C<new()> returns C<undef>.
+
+=head2 balance()
+
+The C<balance()> method returns the last balance found in the sheet.
+
+=head2 statement()
+
+The C<statement()> method returns a reference to an array of transactions, described as below.
+
+=head1 Transaction
+
+The transaction is a hash containing the following keys:
+
+=head2 name
+
+A string with a name describing the transaction.
+
+=head2 value
+
+A floating number containing the credit (positive) or debit (negative) of the transaction.
+
+=head2 date
+
+A DateTime object representing the date when the transaction occurred.
+
+=head2 balance
+
+A floating number containing the balance resulting from the transaction.
+
+=head2 extra
+
+Data provided by the bank identifying the transaction. In this case, a number specific to the type of transaction. It can be used to help uniquely identify the transaction.
+
+=head1 COPYRIGHT AND LICENSE
+
+  Copyright (C) 2015 Thadeu Lima de Souza Cascardo <cascardo@cascardo.eti.br>
+
+  This program is free software; you can redistribute it and/or modify it under
+  the terms of the GNU General Public License; either version 2 of the License,
+  or (at your option) any later version.
+
+  This program is distributed in the hope that it will be useful, but WITHOUT
+  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+  FOR A PARTICULAR PURPOSE.
+
+=cut