Revize c1bdc1c4
Přidáno uživatelem Michal Kliment před více než 9 roky(ů)
application/libraries/importers/Fio/FioParser.php | ||
---|---|---|
*
|
||
*/
|
||
|
||
require_once "FioException.php";
|
||
|
||
/**
|
||
* Auxiliary class for parsing CSV bank account listings from czech bank "FIO banka".
|
||
* The CSV listings are downloaded from the ebanking web application.
|
||
... | ... | |
* @link http://www.praha12.net
|
||
*/
|
||
class FioParser
|
||
{
|
||
const DATE_INDEX = 0;
|
||
const AMOUNT_INDEX = 7;
|
||
|
||
{
|
||
/**
|
||
* Account number
|
||
*
|
||
... | ... | |
* @param string $csv string containing the original csv file.
|
||
* @return array[array] Integer-indexed array of associative arrays.
|
||
* Each associative array represents one line of the CSV
|
||
* @throws FioException
|
||
* @throws Exception
|
||
*/
|
||
public static function parseCSV($csv)
|
||
{
|
||
... | ... | |
$line_arr = explode('"', $line);
|
||
if (count($line_arr) < 2)
|
||
{
|
||
throw new FioException("Nemohu najít číslo účtu na prvním řádku.");
|
||
throw new Exception("Nemohu najít číslo účtu na prvním řádku.");
|
||
}
|
||
$acc_arr = explode("/", $line_arr[1]);
|
||
if (count($acc_arr) < 2)
|
||
{
|
||
throw new FioException("Nemohu rozlišit číslo účtu a kód banky na prvním řádku.");
|
||
throw new Exception("Nemohu rozlišit číslo účtu a kód banky na prvním řádku.");
|
||
}
|
||
self::$account_nr = $acc_arr[0];
|
||
self::$bank_nr = $acc_arr[1];
|
||
... | ... | |
$line_arr = explode(":", $line);
|
||
if (count($line_arr) < 2)
|
||
{
|
||
throw new FioException("Nemohu najít datum od a do na čtvrtém řádku.");
|
||
throw new Exception("Nemohu najít datum od a do na čtvrtém řádku.");
|
||
}
|
||
$dates = explode("-", $line_arr[1]);
|
||
if (count($dates) < 2)
|
||
{
|
||
throw new FioException("Nemohu najít oddělovač dat od a do na čtvrtém řádku.");
|
||
throw new Exception("Nemohu najít oddělovač dat od a do na čtvrtém řádku.");
|
||
}
|
||
$from_arr = explode(".", $dates[0]);
|
||
if (count($from_arr) < 3)
|
||
{
|
||
throw new FioException("Chybný formát datumu od na čtvrtém řádku.");
|
||
throw new Exception("Chybný formát datumu od na čtvrtém řádku.");
|
||
}
|
||
$from_timestamp = mktime(0, 0, 0, intval($from_arr[1]), intval($from_arr[0]), intval($from_arr[2]));
|
||
self::$from = date("Y-m-d", $from_timestamp);
|
||
$to_arr = explode(".", $dates[1]);
|
||
if (count($to_arr) < 3)
|
||
{
|
||
throw new FioException("Chybný formát datumu do na čtvrtém řádku.");
|
||
throw new Exception("Chybný formát datumu do na čtvrtém řádku.");
|
||
}
|
||
$to_timestamp = mktime(0, 0, 0, intval($to_arr[1]), intval($to_arr[0]), intval($to_arr[2]));
|
||
self::$to = date("Y-m-d", $to_timestamp);
|
||
... | ... | |
$line_arr = explode(":", $line);
|
||
if (count($line_arr) < 2)
|
||
{
|
||
throw new FioException("Nemohu najít počáteční zůstatek.");
|
||
throw new Exception("Nemohu najít počáteční zůstatek.");
|
||
}
|
||
self::$opening_balance = self::normalizeAmount(str_replace("CZK", "", $line_arr[1])) / 100;
|
||
}
|
||
... | ... | |
$line_arr = explode(":", $line);
|
||
if (count($line_arr) < 2)
|
||
{
|
||
throw new FioException("Nemohu najít konečný zůstatek.");
|
||
throw new Exception("Nemohu najít konečný zůstatek.");
|
||
}
|
||
self::$closing_balance = self::normalizeAmount(str_replace("CZK", "", $line_arr[1])) / 100;
|
||
}
|
||
... | ... | |
$number++;
|
||
}
|
||
|
||
throw new FioException('CSV soubor není kompletní.');
|
||
throw new Exception('CSV soubor není kompletní.');
|
||
}
|
||
|
||
/**
|
||
* Checks headers
|
||
*
|
||
* @param integer $line
|
||
* @throws FioException
|
||
* @throws Exception
|
||
*/
|
||
private static function checkHeaders($line)
|
||
{
|
||
$expected = implode(';', self::$fields) . ';';
|
||
if ($line != $expected)
|
||
throw new FioException(__("Nelze parsovat hlavičku Fio výpisu. Ujistěte se, že jste zvolili všech 18 sloupců k importu v internetovém bankovnictví."));
|
||
throw new Exception(__("Nelze parsovat hlavičku Fio výpisu. Ujistěte se, že jste zvolili všech 18 sloupců k importu v internetovém bankovnictví."));
|
||
}
|
||
|
||
/**
|
||
... | ... | |
*
|
||
* @param string $amount
|
||
* @return double
|
||
* @throws FioException
|
||
* @throws Exception
|
||
*/
|
||
private static function normalizeAmount($amount)
|
||
{
|
||
... | ... | |
$amount = str_replace(",", "", $amount);
|
||
|
||
if (!is_numeric($amount))
|
||
throw new FioException('Chybný formát částky převodu.');
|
||
throw new Exception('Chybný formát částky převodu.');
|
||
|
||
return doubleval($amount);
|
||
}
|
||
... | ... | |
* @param string $line
|
||
* @param array $keys
|
||
* @return array
|
||
* @throws FioException
|
||
* @throws Exception
|
||
*/
|
||
private static function parseLine($line, $keys)
|
||
{
|
||
$cols = explode(';', $line);
|
||
|
||
if (count($cols) != count(self::$fields) + 1)
|
||
throw new FioException('Chybný počet políček v položce.');
|
||
throw new Exception('Chybný počet políček v položce.');
|
||
|
||
array_pop($cols);
|
||
|
||
... | ... | |
|
||
// Amount has to be converted
|
||
$cols['castka'] = self::normalizeAmount($cols['castka']);
|
||
|
||
// Trim leading zeros from VS
|
||
$cols['vs'] = ltrim($cols['vs'], '0');
|
||
|
||
return $cols;
|
||
}
|
||
... | ... | |
*
|
||
* @param array $cols
|
||
* @param integer $sum
|
||
* @throws FioException
|
||
* @throws Exception
|
||
*/
|
||
private static function checkLastLine($cols, $sum)
|
||
{
|
||
$amount = $cols['castka'];
|
||
|
||
if ($sum != $amount)
|
||
throw new FioException("Chybný kontrolní součet částky ('$sum' != '$amount').");
|
||
throw new Exception("Chybný kontrolní součet částky ('$sum' != '$amount').");
|
||
}
|
||
|
||
}
|
Také k dispozici: Unified diff
Release 1.1.0