Projekt

Obecné

Profil

Stáhnout (6.36 KB) Statistiky
| Větev: | Tag: | Revize:
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
}