freenetis-github/application/libraries/importers/Txt_Tatra_Banka_Statement_File_Importer.php @ b4ae00bf
139add4b | jeffraska | <?php defined('SYSPATH') or die('No direct script access.');
|
|
/*
|
|||
* This file is part of open source system FreenetIS
|
|||
* and it is released under GPLv3 licence.
|
|||
*
|
|||
* More info about licence can be found:
|
|||
* http://www.gnu.org/licenses/gpl-3.0.html
|
|||
*
|
|||
* More info about project can be found:
|
|||
* http://www.freenetis.org/
|
|||
*
|
|||
*/
|
|||
require dirname(__FILE__) . '/Tatra_Banka_Statement_File_Importer.php';
|
|||
/**
|
|||
* Parser for Tatra banka E-mail statements
|
|||
*
|
|||
* @author David Raška
|
|||
*/
|
|||
class Txt_Tatra_Banka_Statement_File_Importer extends Tatra_Banka_Statement_File_Importer
|
|||
{
|
|||
3a27a556 | jeffraska | // Date, accout, amount
|
|
const REGEX_DATA = "@(\d{1,2}\.\d{1,2}\.\d{4} \d{1,2}:\d{2}).+(\w{2}\d{2}(\d{4})(\d{16})).* (\d+,\d{2}) (.+)\.@";
|
|||
// Counter account
|
|||
const REGEX_CA = "@ (\d{4})/([\d-]+)@";
|
|||
8ad48b86 | jeffraska | const REGEX_NO_CA = "@Popis transakcie: ()(.*)@";
|
|
3a27a556 | jeffraska | // Variable, specific, constant symbol
|
|
59ac513c | jeffraska | const REGEX_VS = "@VS ?(\d*)@";
|
|
const REGEX_SS = "@SS ?(\d*)@";
|
|||
const REGEX_CS = "@KS ?(\d*)@";
|
|||
3a27a556 | jeffraska | // Current balance
|
|
59ac513c | jeffraska | const REGEX_BALANCE = "@aktualny zostatok:[^0-9]*(\d+,\d{2}) (.+)@";
|
|
7ac21ce8 | jeffraska | // Message
|
|
const REGEX_MSG = "@Informacia pre prijemcu: (.*)@";
|
|||
3a27a556 | jeffraska | ||
139add4b | jeffraska | protected function check_file_data_format()
|
|
{
|
|||
$emails = implode('', $this->get_file_data());
|
|||
// Date, account, amount
|
|||
59ac513c | jeffraska | $match_data = preg_match_all(self::REGEX_DATA, $emails, $data);
|
|
139add4b | jeffraska | ||
$accounts = array();
|
|||
59ac513c | jeffraska | foreach ($data[2] as $e)
|
|
139add4b | jeffraska | {
|
|
$accounts[] = $e;
|
|||
}
|
|||
2a3378d9 | jeffraska | if (count(array_unique($accounts)) > 1)
|
|
{
|
|||
$this->add_error(__('E-mails contains more than one destination account: %s', implode(', ', array_unique($accounts))), FALSE);
|
|||
}
|
|||
b4ae00bf | Ondřej Fibich | return count(array_unique($accounts)) <= 1;
|
|
139add4b | jeffraska | }
|
|
protected function get_header_data()
|
|||
{
|
|||
$emails = $this->get_file_data();
|
|||
2a3378d9 | jeffraska | unset ($emails[self::LAST_DOWNLOAD_SETTINGS_KEY]);
|
|
if (count($emails) == 0)
|
|||
{
|
|||
return NULL;
|
|||
}
|
|||
139add4b | jeffraska | // Newest e-mail
|
|
3a27a556 | jeffraska | preg_match(self::REGEX_DATA,
|
|
139add4b | jeffraska | $emails[0],
|
|
$mN);
|
|||
// Current balance
|
|||
3a27a556 | jeffraska | preg_match(self::REGEX_BALANCE,
|
|
139add4b | jeffraska | $emails[0],
|
|
$mC);
|
|||
// Oldest e-mail
|
|||
3a27a556 | jeffraska | preg_match(self::REGEX_DATA,
|
|
139add4b | jeffraska | $emails[count($emails) - 1],
|
|
$mO);
|
|||
$hd = new Header_Data(
|
|||
$mN[4], //account ID
|
|||
$mN[3] //bank ID
|
|||
);
|
|||
$hd->from = DateTime::createFromFormat('j.n.Y G:i', $mO[1])->format('Y-m-d H:i:s');
|
|||
$hd->to = DateTime::createFromFormat('j.n.Y G:i', $mN[1])->format('Y-m-d H:i:s');
|
|||
$hd->closingBalance = floatval(str_replace(',', '.', $mC[1]));
|
|||
return $hd;
|
|||
}
|
|||
protected function parse_file_data()
|
|||
{
|
|||
$emails = $this->get_file_data();
|
|||
2a3378d9 | jeffraska | $this->last_download_datetime = $emails[self::LAST_DOWNLOAD_SETTINGS_KEY];
|
|
139add4b | jeffraska | foreach ($emails as $email)
|
|
{
|
|||
3a27a556 | jeffraska | $match_data = preg_match(self::REGEX_DATA,
|
|
139add4b | jeffraska | $email,
|
|
59ac513c | jeffraska | $data);
|
|
8ad48b86 | jeffraska | $match_ca = preg_match(self::REGEX_CA,
|
|
59ac513c | jeffraska | $email,
|
|
$ca);
|
|||
139add4b | jeffraska | ||
8ad48b86 | jeffraska | if ($match_ca == 0)
|
|
{
|
|||
preg_match(self::REGEX_NO_CA,
|
|||
$email,
|
|||
$ca);
|
|||
}
|
|||
139add4b | jeffraska | ||
59ac513c | jeffraska | $match_vs = preg_match(self::REGEX_VS,
|
|
139add4b | jeffraska | $email,
|
|
59ac513c | jeffraska | $vs);
|
|
139add4b | jeffraska | ||
59ac513c | jeffraska | $match_ss = preg_match(self::REGEX_SS,
|
|
139add4b | jeffraska | $email,
|
|
59ac513c | jeffraska | $ss);
|
|
139add4b | jeffraska | ||
59ac513c | jeffraska | $match_cs = preg_match(self::REGEX_CS,
|
|
$email,
|
|||
$cs);
|
|||
7ac21ce8 | jeffraska | preg_match(self::REGEX_MSG,
|
|
$email,
|
|||
$msg);
|
|||
170ebe5e | Ondřej Fibich | if (!$match_data)
|
|
139add4b | jeffraska | {
|
|
continue;
|
|||
}
|
|||
7ac21ce8 | jeffraska | $this->data[] = array
|
|
(
|
|||
59ac513c | jeffraska | 'datetime' => DateTime::createFromFormat('j.n.Y G:i', $data[1])->format('Y-m-d H:i:s'),
|
|
'iban' => $data[2],
|
|||
'bank' => $data[3],
|
|||
'account' => $data[4],
|
|||
'amount' => floatval(str_replace(',', '.', $data[5])),
|
|||
5ab3bf57 | Ondřej Fibich | 'counter_account'=> trim(@$ca[2]),
|
|
'counter_bank' => trim(@$ca[1]),
|
|||
59ac513c | jeffraska | 'currency' => $data[6],
|
|
170ebe5e | Ondřej Fibich | 'vs' => @$vs[1],
|
|
'ss' => @$ss[1],
|
|||
'ks' => @$cs[1],
|
|||
7ac21ce8 | jeffraska | 'message' => trim(@$msg[1])
|
|
139add4b | jeffraska | );
|
|
}
|
|||
return TRUE;
|
|||
}
|
|||
protected function do_download(Bank_account_Model $bank_account,
|
|||
Bank_Account_Settings $settings, $url)
|
|||
{
|
|||
93fe8f1c | jeffraska | $key = self::LAST_DOWNLOAD_SETTINGS_KEY;
|
|
$last_download = $settings->$key;
|
|||
2a3378d9 | jeffraska | ||
if (empty($last_download))
|
|||
{
|
|||
$last_download = 0;
|
|||
}
|
|||
139add4b | jeffraska | $hostname = $settings->get_download_statement_url();
|
|
9c58af72 | Ondřej Fibich | $inbox = @imap_open($hostname, $settings->imap_name, $settings->imap_password);
|
|
139add4b | jeffraska | ||
$all_mails = array();
|
|||
if ($inbox === FALSE)
|
|||
{
|
|||
$m = __('Cannot connect to IMAP server');
|
|||
throw new Exception($m . ' (' . implode(" > ", imap_errors()) . ')');
|
|||
}
|
|||
a80ef9ce | jeffraska | if ($last_download > 0)
|
|
{
|
|||
$last_download_prev = $last_download - (60 * 60 * 24); // - 1 day
|
|||
$emails = imap_search($inbox, 'SINCE "'.date('j F Y', $last_download_prev).'"');
|
|||
}
|
|||
else
|
|||
{
|
|||
$emails = imap_search($inbox, 'ALL');
|
|||
}
|
|||
139add4b | jeffraska | ||
2a3378d9 | jeffraska | $first = TRUE;
|
|
$all_mails[self::LAST_DOWNLOAD_SETTINGS_KEY] = 0;
|
|||
139add4b | jeffraska | if ($emails)
|
|
{
|
|||
2a3378d9 | jeffraska | // Sort from newest mail
|
|
139add4b | jeffraska | rsort($emails);
|
|
foreach ($emails as $email_number)
|
|||
{
|
|||
$struct = imap_fetchstructure($inbox, $email_number);
|
|||
2a3378d9 | jeffraska | $header = imap_headerinfo($inbox, $email_number);
|
|
if ($first)
|
|||
{
|
|||
$all_mails[self::LAST_DOWNLOAD_SETTINGS_KEY] = $header->udate;
|
|||
$first = FALSE;
|
|||
}
|
|||
a80ef9ce | jeffraska | if (intval($header->udate) <= intval($last_download))
|
|
2a3378d9 | jeffraska | {
|
|
a80ef9ce | jeffraska | break;
|
|
2a3378d9 | jeffraska | }
|
|
139add4b | jeffraska | ||
9c58af72 | Ondřej Fibich | // fetch body with FT_PEEK disable setting message read
|
|
$body = imap_fetchbody($inbox, $email_number, 1, FT_PEEK);
|
|||
139add4b | jeffraska | ||
$body = $this->decode_body($body, $struct);
|
|||
if ($body === FALSE)
|
|||
{
|
|||
continue;
|
|||
}
|
|||
3a27a556 | jeffraska | preg_match(self::REGEX_DATA,
|
|
139add4b | jeffraska | $body,
|
|
59ac513c | jeffraska | $data);
|
|
139add4b | jeffraska | ||
170ebe5e | Ondřej Fibich | if (!$data)
|
|
139add4b | jeffraska | {
|
|
continue;
|
|||
}
|
|||
9c58af72 | Ondřej Fibich | else
|
|
{
|
|||
// make message read, we want to mark it as imported
|
|||
@imap_fetchbody($inbox, $email_number, 1);
|
|||
}
|
|||
139add4b | jeffraska | ||
a80ef9ce | jeffraska | array_unshift($all_mails, $body);
|
|
139add4b | jeffraska | }
|
|
}
|
|||
imap_close($inbox);
|
|||
return $all_mails;
|
|||
}
|
|||
protected function decode_body($body, $struct)
|
|||
{
|
|||
if ($struct->type == TYPETEXT) // text body
|
|||
{
|
|||
// Decode text
|
|||
switch ($struct->encoding)
|
|||
{
|
|||
case ENC7BIT:
|
|||
break;
|
|||
case ENC8BIT:
|
|||
break;
|
|||
case ENCBINARY:
|
|||
throw new Exception("Unsupported IMAP encoding: ENCBINARY");
|
|||
break;
|
|||
case ENCBASE64:
|
|||
$body = base64_decode($body);
|
|||
break;
|
|||
case ENCQUOTEDPRINTABLE:
|
|||
$body = quoted_printable_decode($body);
|
|||
break;
|
|||
case ENCOTHER:
|
|||
break;
|
|||
}
|
|||
// Convert text to UTF-8
|
|||
if (isset($struct->parameters))
|
|||
{
|
|||
foreach ($struct->parameters as $p)
|
|||
{
|
|||
b180424c | Ondřej Fibich | if ($p->attribute == "charset" &&
|
|
\strtolower($p->value) != "utf-8")
|
|||
139add4b | jeffraska | {
|
|
b180424c | Ondřej Fibich | $body = iconv($p->value, "UTF-8//TRANSLIT", $body);
|
|
139add4b | jeffraska | break;
|
|
}
|
|||
}
|
|||
}
|
|||
}
|
|||
else if ($struct->type == TYPEMULTIPART) // multipart body
|
|||
{
|
|||
foreach ($struct->parts as $p)
|
|||
{
|
|||
if ($p->type == TYPETEXT)
|
|||
{
|
|||
$body = $this->decode_body($body, $p);
|
|||
break;
|
|||
}
|
|||
}
|
|||
}
|
|||
else
|
|||
{
|
|||
return FALSE;
|
|||
}
|
|||
return $body;
|
|||
}
|
|||
8c21a2d4 | Ondřej Fibich | }
|