Projekt

Obecné

Profil

« Předchozí | Další » 

Revize 708

Přidáno uživatelem Ondřej Fibich před asi 14 roky(ů)

Přidán parser faktur Vodafonu + datové třídy. Do konfigu přidána hodnota defaultního telefoního předčíslí země.

Zobrazit rozdíly:

freenetis/trunk/kohana/application/i18n/cs_CZ/texts.php
'canceling of message for redirection' => 'Rušení zprávy pro přesměrování',
'cannot connect to database' => 'Nelze se připojit k databázi',
'cannot delete, there are other records depending on this one' => 'Nelze smazat, na položce jsou závislé jiné záznamy',
'cash' => 'Pokladna',
'cannot find detail dumps' => 'Nemohu nalézt podrobné výpisy.',
'cannot load heading of invoice' => 'Nemohu načíst hlavičku faktury',
'cannot load services - data missing' => 'Nemohu načíst služby - data chybí',
'cash' => 'Pokladna',
'cash flow' => 'Peněžní tok',
'cash drawn' => 'Výběry hotovosti',
'chairman and agent' => 'Předseda a jednatel',
......
'editing of user' => 'Úprava uživatele',
'eighth-degree certified engineers' => 'Certifikování technici osmého stupně',
'email' => 'E-mail',
'empty input' => 'Prázdný vstup',
'email address' => 'emailová adresa',
'e-mail settings' => 'Nastavení e-mailu',
'e-mail variables' => 'Proměnné e-mailu',
......
'enabled' => 'Zapnuto',
'end membership' => 'Ukončit členství',
'end of month' => 'Konec měsíce',
'end of input' => 'Konec vstupu',
'engineer' => 'Technik',
'engineer has been successfully removed from this device' => 'Technik byl úspěšně odebrán od tohoto zařízení.',
'engineers' => 'Technici',
......
'error - cant end membership' => 'Chyba - nelze ukončit členství.',
'error - cant change password' => 'Chyba - nelze změnit heslo.',
'error - cant change limit' => 'Chyba - nelze změnit limit.',
'error - cant parse invoice' => 'Chyba - nelze parsovat fakturu.',
'error - cant change voicemail' => 'Chyba - nelze změnit hlasovou schránku.',
'error - cant restore membership' => 'Chyba - nelze obnovit členství.',
'error - cant set redirection' => 'Chyba - nelze nastavit přesměrování.',
......
'error - cant update user' => 'Chyba - nelze upravit uživatele.',
'error - cant update work' => 'Chyba - nelze upravit práci.',
'error - debtor credit boundary has not been set' => 'Chyba - hranice kreditu pro dlužníka nebyla nastavena.',
'error - it is not possible to remove admin' => 'Chyba - nelze odebrat správce zařízení.',
'error - during searching long term connections' => 'Chyba - během hledání dlouhotrvajícího připojení.',
'error - during extraction of data' => 'Chyba - během extrakcce dat.',
'error - it is not possible to remove admin' => 'Chyba - nelze odebrat správce zařízení.',
'error - it is not possible to remove engineer' => 'Chyba - nelze odebrat technika zařízení.',
'error - not enough money on origin account' => 'Chyba - nedostatek peněz na zdrojovém účtě.',
'error - payment notice credit boundary has not been set' => 'Chyba - hranice kreditu pro upozornění na placení nebyla nastavena.',
......
'name of the association' => 'Název sdružení',
'name of organization' => 'Název organizace',
'native' => 'Nativní',
'netmask' => 'Maska',
'near number %s wasnt fond data for testing in group: %s' => 'U čísla %s nebyly nalezena data pro kontrolu služeb ve skupině: %s',
'near number %s differs from price of services: %s\ncalculated price: %s\ninvoiced price: %s' => 'Poblíž čísla %s se odlišují ceny služeb: %s\nVypočtená cena: %s\nFakturovaná cena: %s',
'netmask' => 'Maska',
'network address' => 'Síťová adresa',
'network address does not match the mask' => 'Síťová adresa neodpovídá zadané masce.',
'networks' => 'Síť',
......
'of all users work reports' => 'všech pracovních výkazů uživatele',
'of all users works' => 'všech prací uživatele',
'old password' => 'Staré heslo',
'on line' => 'Na řádce',
'one ip address' => 'jedné IP adrese',
'opening balance' => 'Počáteční zůstatek',
'operating account' => 'Provozní účet',
......
'ospf area id' => 'OSPF area ID',
'other' => 'Ostatní',
'other phones' => 'další telefony',
'out of peak' => 'Mimo špičku',
'outbound' => 'Odchozí',
'owner of account' => 'Vlastník účtu',
'page title' => 'Titulek stránky',
......
'payment notice' => 'Upozornění na placení',
'payment notice boundary' => 'Hranice pro upozornění na placení',
'payment notice text' => 'Text pro upozornění na placení',
'penalty' => 'Pokuta',
'peak' => 'Špička',
'penalty' => 'Pokuta',
'penalty and fee' => 'Poplatky a pokuty',
'penalty for unidentified transfer' => 'Pokuta za neidentifikovanou platbu',
'penalty have to be a number' => 'Pokuta musí být číslo',
......
'sms message list' => 'Seznam SMS zpráv',
'sms messages' => 'SMS zprávy',
'sms message has been successfully added' => 'SMS zpráva byla úspěšně pridána.',
'specific symbol' => 'Specifický symbol',
'some phones wasn\'t founded' => 'Některé telefony nebyly nalezeny',
'specific symbol' => 'Specifický symbol',
'start amount' => 'Počáteční částka',
'static ip' => 'Statická IP',
'state' => 'Stav',
......
'waiting for registration' => 'Čekám na registraci',
'warning' => 'Varování',
'website after redirection' => 'Webová stránka po přesměrování',
'whole d' => 'Celé z.',
'weekend' => 'Víkend',
'whole d' => 'Celé z.',
'without change' => 'Beze změny',
'work' => 'Práce',
'work approval' => 'Schválení práce',
......
'work report has been successfully updated' => 'Pracovní výkaz byl úspěšně aktualizován',
'work reports' => 'Pracovní výkazy',
'works' => 'Práce',
'wrong call length' => 'Chybné trvání hovoru',
'write email' => 'Napsat e-mail',
'wrong password' => 'Špatné heslo',
'wrong period' => 'Špatné období',
'wrong phone number' => 'Špatné telefoní číslo',
'wrong date format' => 'Chybný formát dat',
'year' => 'Rok',
'yes' => 'ano',
'you can simply open config-samplephp in a text editor, fill in your information, and save it as configphp' => 'Můžete jednoduše otevřít config-sample.php v textovém editoru, doplnit vaše údaje a uložit jej jako config.php.',
freenetis/trunk/kohana/application/upgrade_sql/upgrade_sql.php
// array of sql queries that upgrade database
$upgrade_sql[get_SVN_rev()] = array(
"UPDATE jobs SET locked = 3 WHERE locked = 1",
"ALTER TABLE `jobs` CHANGE `locked` `state` TINYINT( 1 ) NOT NULL",
"ALTER TABLE `jobs` ADD `approval_template_id` INT( 11 ) NULL DEFAULT NULL AFTER `user_id`",
"ALTER TABLE `votes` ADD `aro_group_id` INT( 11 ) NOT NULL AFTER `fk_id`",
"ALTER TABLE `votes` ADD `priority` INT( 11 ) NOT NULL AFTER `aro_group_id`",
"UPDATE `votes` SET `aro_group_id` = 25",
"ALTER TABLE `approval_types` ADD `default_vote` TINYINT( 1 ) NULL DEFAULT NULL AFTER `interval`",
"ALTER TABLE `approval_types` ADD `majority_percent` INT( 11 ) NOT NULL AFTER `type`",
"ALTER TABLE `approval_templates` ADD `state` INT( 11 ) NOT NULL",
"INSERT INTO `approval_templates` (`id`, `name`, `comment`, `state`) VALUES
(1, 'Default', 'Výchozí hlasovací šablona podle směrnic o.s. UnArt', 1);",
"INSERT INTO `approval_template_items` (`id`, `approval_template_id`, `approval_type_id`, `priority`) VALUES
(1, 1, 1, 0),
(2, 1, 2, 1);",
"INSERT INTO `approval_types` (`id`, `name`, `comment`, `type`, `majority_percent`, `aro_group_id`, `interval`, `default_vote`, `min_suggest_amount`) VALUES
(1, 'Správní rada', 'Výchozí hlasovací typ pro hlasování Správní rady', 1, 51, 25, '0000-00-00 00:00:00', NULL, 0),
(2, 'Revizní komise', 'Výchozí hlasovací typ pro hlasování Revizní komise.', 1, 51, 24, '0000-00-01 00:00:00', NULL, 5000);",
"INSERT INTO `config` (`name`, `value`) VALUES
('default_work_approval_template', '1'),
('default_work_report_approval_template', '1'),
('default_request_approval_template', '1');",
"UPDATE jobs SET approval_template_id = 1 WHERE state < 2"
"INSERT INTO `config` (`name`, `value`) VALUES ('default_phone_prefix', '+420');"
);
?>
freenetis/trunk/kohana/application/upgrade_sql/upgrade_sql_698.php
<?php
$upgrade_sql[698] = array(
"UPDATE jobs SET locked = 3 WHERE locked = 1",
"ALTER TABLE `jobs` CHANGE `locked` `state` TINYINT( 1 ) NOT NULL",
"ALTER TABLE `jobs` ADD `approval_template_id` INT( 11 ) NULL DEFAULT NULL AFTER `user_id`",
"ALTER TABLE `votes` ADD `aro_group_id` INT( 11 ) NOT NULL AFTER `fk_id`",
"ALTER TABLE `votes` ADD `priority` INT( 11 ) NOT NULL AFTER `aro_group_id`",
"UPDATE `votes` SET `aro_group_id` = 25",
"ALTER TABLE `approval_types` ADD `default_vote` TINYINT( 1 ) NULL DEFAULT NULL AFTER `interval`",
"ALTER TABLE `approval_types` ADD `majority_percent` INT( 11 ) NOT NULL AFTER `type`",
"ALTER TABLE `approval_templates` ADD `state` INT( 11 ) NOT NULL",
"INSERT INTO `approval_templates` (`id`, `name`, `comment`, `state`) VALUES
(1, 'Default', 'Výchozí hlasovací šablona podle směrnic o.s. UnArt', 1);",
"INSERT INTO `approval_template_items` (`id`, `approval_template_id`, `approval_type_id`, `priority`) VALUES
(1, 1, 1, 0),
(2, 1, 2, 1);",
"INSERT INTO `approval_types` (`id`, `name`, `comment`, `type`, `majority_percent`, `aro_group_id`, `interval`, `default_vote`, `min_suggest_amount`) VALUES
(1, 'Správní rada', 'Výchozí hlasovací typ pro hlasování Správní rady', 1, 51, 25, '0000-00-00 00:00:00', NULL, 0),
(2, 'Revizní komise', 'Výchozí hlasovací typ pro hlasování Revizní komise.', 1, 51, 24, '0000-00-01 00:00:00', NULL, 5000);",
"INSERT INTO `config` (`name`, `value`) VALUES
('default_work_approval_template', '1'),
('default_work_report_approval_template', '1'),
('default_request_approval_template', '1');",
"UPDATE jobs SET approval_template_id = 1 WHERE state < 2"
);
?>
freenetis/trunk/kohana/application/libraries/Parser_Vodafone_Invoice.php
<?php
/*
*/
defined('SYSPATH') or die('No direct script access.');
define("PVI_MODELS_PATH", "./parser_vodafone_invoice_models");
require_once PVI_MODELS_PATH . "/Period.php";
require_once PVI_MODELS_PATH . "/Bill_Data.php";
require_once PVI_MODELS_PATH . "/Services.php";
require_once PVI_MODELS_PATH . "/Call_Service.php";
require_once PVI_MODELS_PATH . "/Sms_Service.php";
require_once PVI_MODELS_PATH . "/Internet_Service.php";
require_once PVI_MODELS_PATH . "/Vpn_Call_Service.php";
require_once PVI_MODELS_PATH . "/Fixed_Call_Service.php";
require_once PVI_MODELS_PATH . "/Pay_Service.php";
require_once PVI_MODELS_PATH . "/RoamingSms_Service.php";
/**
* Parser_Vodafone_Invoice je parser faktur telefoního operátora Vodafone.
* Faktury Vodafone jsou ukládány v PDF, na které nelze užít unixových utilit pdfto*
* Tento parser zpracovává vstup z programu Adobe Reader. Zkopírovaný uživatelem
* pomocí CTRL+A.
*
* Cílem parseru je získat informace o faktuře, fakturovaných telefoních číslech
* a o službách které byly číslům poskytnuty.
*
* @author Ondřej Fibich - ondrej.fibich(at)gmail(dot)com
* @version 1.1
*/
class Parser_Vodafone_Invoice
{
// Konstanty prohlavičku faktury -->
const BILL_INFO_STARTER = "èíslo úètu kód banky variabilní symbol specifický symbol vystavení";
const BILL_INFO_REGEX = "^([0-9]+) ([0-9]+) ([0-9]+) ([0-9]+) ([0-9]{2})\.([0-9]{2})\.([0-9]{4})$";
const BILL_INFO_PRICE_REGEX = "^Celkový základ DPH ([0-9]+) *%([0-9\, ]+)$";
const BILL_INFO_DPH_REGEX = "^Celkem DPH ([0-9]+) *%([0-9\, ]+)$";
const BILL_INFO_PERIOD_REGEX = "^Zúètovací období ([0-9]{2})\.([0-9]{2})\.([0-9]{4}) \- ([0-9]{2})\.([0-9]{2})\.([0-9]{4})$";
const BILL_INFO_NUMBERS_COUNT_REGEX = "^Poèet telefonních èísel ([0-9]+)$";
const BILL_EXTRACT_START_FL = "Podrobné vyúètování";
const BILL_EXTRACT_START_SL = "Šp=špièka, MŠp=mimo špièku, Vkn=víkend, +=hovor probìhl ve více obdobích";
// <-- Konstanty prohlavičku faktury
const BILL_EXTRACT_DATA_LONG_CONNECTIONS = "^(Pøipojení na dlouho[^\(]*)\(([0-9]{2}).([0-9]{2}).([0-9]{4}) ([0-9]{2}):([0-9]{2})\) [0-9]+ ([0-9\, ]+) ([0-9]+) %";
// Konstanty pro podrobný výpis -->
const BILL_EXTRACT_PHONE_REGEX = "^Telefonní èíslo ([0-9]{3} [0-9]{3} [0-9]{3}) Tarif";
// <-- Konstanty pro podrobný výpis
/** Jméno pole v Services reprezentující dané služby */
const SERVICE_ARRAY = 0;
/** První řádek služby v poli $BILL_EXTRACT_SERVICES */
const FLINE = 1;
/** Druhý řádek služby v poli $BILL_EXTRACT_SERVICES */
const SLINE = 2;
/** Datový řádek služby v poli $BILL_EXTRACT_SERVICES */
const REGEX = 3;
/** Počet datových položek datového řádku služby v poli $BILL_EXTRACT_SERVICES */
const REGEX_COUNT = 4;
/** Patička tabulky v poli $BILL_EXTRACT_SERVICES */
const LLINE = 5;
/**
* Pole parsovacích informací o službách.
* Obsahuje pole o informaci o službě, ve kterém se v tomto pořadí nachází údaje:
* První řádek pro zjištění služny; Druhý; Regulární výraz datového řádku;
* Počet datových položek; Regulární výraz patičky.
* @var array
*/
protected static $BILL_EXTRACT_SERVICES = array(
"vodafone" => array(
"calls", "Sí Vodafone",
"Datum Èas Období Volané èíslo Trvání Sleva Vyèerpáno Kè bez DPH",
// den, měsíc, hodina, minuta, sekunda, období, číslo, trvání, sleva, ?cena?
"^([0-9]{1,2}).([0-9]{1,2}). ([0-9]{2}):([0-9]{2}):([0-9]{2}) ([^0-9]+) (\+?[0-9]+) ([0-9]{2}:[0-9]{2}:[0-9]{2}) ([0-9 ]+,[0-9]{2})([0-9 ]+,[0-9]{2})?$",
10,
"Celkem za Sí Vodafone [0-9]{2}:[0-9]{2}:[0-9]{2} ([0-9 ]+,[0-9]{2})([0-9 ]+,[0-9]{2})?"
),
"others" => array(
"calls", "Ostatní národní mobilní sítì",
"Datum Èas Období Volané èíslo Trvání Sleva Vyèerpáno Kè bez DPH",
// den, měsíc, hodina, minuta, sekunda, období, číslo, trvání, sleva, ?cena?
"^([0-9]{1,2}).([0-9]{1,2}). ([0-9]{2}):([0-9]{2}):([0-9]{2}) ([^0-9]+) (\+?[0-9]+) ([0-9]{2}:[0-9]{2}:[0-9]{2}) ([0-9 ]+,[0-9]{2})([0-9 ]+,[0-9]{2})?$",
10,
"Celkem za Ostatní národní mobilní sítì [0-9]{2}:[0-9]{2}:[0-9]{2} ([0-9 ]+,[0-9]{2})([0-9 ]+,[0-9]{2})?"
),
"fixed" => array(
"fixed_calls", "Pevná sí v ÈR",
"Datum Èas Období Volané èíslo Trvání Cílová Oblast Sleva Vyèerpáno Kè bez DPH",
// den, měsíc, hodina, minuta, sekunda, období, číslo, trvání, cíl, sleva, ?cena?
"^([0-9]{1,2}).([0-9]{1,2}). ([0-9]{2}):([0-9]{2}):([0-9]{2}) ([^0-9]+) (\+?[0-9]+) ([0-9]{2}:[0-9]{2}:[0-9]{2}) ([^0-9]+) ([0-9 ]+,[0-9]{2})([0-9 ]+,[0-9]{2})?$",
11,
"Celkem za Pevná sí v ÈR [0-9]{2}:[0-9]{2}:[0-9]{2} ([0-9 ]+,[0-9]{2})([0-9 ]+,[0-9]{2})?"
),
"fixed_international" => array(
"fixed_calls", "Volání do zahr. - veø. tel. sí",
"Datum Èas Období Volané èíslo Trvání Cílová Oblast Sleva Vyèerpáno Kè bez DPH",
// den, měsíc, hodina, minuta, sekunda, období, číslo, trvání, cíl, sleva, ?cena?
"^([0-9]{1,2}).([0-9]{1,2}). ([0-9]{2}):([0-9]{2}):([0-9]{2}) ([^0-9]+) (\+?[0-9]+) ([0-9]{2}:[0-9]{2}:[0-9]{2}) ([^0-9]+) ([0-9 ]+,[0-9]{2})([0-9 ]+,[0-9]{2})?$",
11,
"Celkem za Volání do zahr. - veø. tel. sí [0-9]{2}:[0-9]{2}:[0-9]{2} ([0-9 ]+,[0-9]{2}) ([0-9 ]+,[0-9]{2})"
),
"sms" => array(
"smss", "SMS služby",
"Datum Èas Období Volané èíslo Popis Sleva Kè bez DPH",
// den, měsíc, hodina, minuta, sekunda, období, číslo, popis, sleva, ?cena?
"^([0-9]{1,2}).([0-9]{1,2}). ([0-9]{2}):([0-9]{2}):([0-9]{2}) ([^0-9]+) (\+?[0-9]+) ([^0-9]+) ([0-9 ]+,[0-9]{2})([0-9 ]+,[0-9]{2})?$",
10,
"Celkem za SMS služby ([0-9 ]+,[0-9]{2})"
),
"mms" => array(
"smss", "MMS služby",
"Datum Èas Období Volané èíslo Popis Sleva Kè bez DPH",
// den, měsíc, hodina, minuta, sekunda, číslo, popis, sleva, ?cena?
"^([0-9]{1,2}).([0-9]{1,2}). ([0-9]{2}):([0-9]{2}):([0-9]{2}) (\+?[0-9]+) ([^0-9]+) ([0-9 ]+,[0-9]{2})([0-9 ]+,[0-9]{2})?$",
9,
"Celkem za MMS služby ([0-9 ]+,[0-9]{2})"
),
"roaming_sms" => array(
"roaming_smss", "Roaming - SMS",
"Datum Èas Roamingová zóna Kè bez DPH",
// den, měsíc, hodina, minuta, sekunda, popis, sleva, ?cena?
"^([0-9]{1,2}).([0-9]{1,2}). ([0-9]{2}):([0-9]{2}):([0-9]{2}) (.+) ([0-9 ]+,[0-9]{2})([0-9 ]+,[0-9]{2})?$",
8,
"Celkem za Roaming - SMS ([0-9 ]+,[0-9]{2})"
),
"vpn" => array(
"vpn_calls", "VPN Firma",
"Datum Èas Období Volané èíslo Trvání Skupina Sleva Kè bez DPH",
// den, měsíc, hodina, minuta, sekunda, období, číslo, trvání, skupina, sleva, ?cena?
"^([0-9]{1,2}).([0-9]{1,2}). ([0-9]{2}):([0-9]{2}):([0-9]{2}) ([^0-9]+) (\+?[0-9]+) ([0-9]{2}:[0-9]{2}:[0-9]{2}) ([^0-9]+) ([0-9 ]+,[0-9]{2})([0-9 ]+,[0-9]{2})?$",
11,
"Celkem za VPN Firma [0-9]{2}:[0-9]{2}:[0-9]{2} ([0-9 ]+,[0-9]{2})"
),
"internet" => array(
"internet", "Pøipojení",
"Datum Èas Období Objem dat v kB APN Volné kB Kè bez DPH",
// den, měsíc, hodina, minuta, sekunda, období, objem, apn, ?cena?
"^([0-9]{1,2}).([0-9]{1,2}). ([0-9]{2}):([0-9]{2}):([0-9]{2}) ([^0-9]+) ([0-9]+) ([^0-9]+) ([0-9 ]+,[0-9]{2})$",
9,
"Celkem za Pøipojení [0-9]+ ([0-9 ]+,[0-9]{2})"
),
"pays" => array(
"pays", "Platby tøetím stranám",
"Datum Èas Trvání Volané èíslo Popis Sleva Kè",
// den, měsíc, hodina, minuta, sekunda, číslo, popis, sleva, ?cena?
"^([0-9]{1,2}).([0-9]{1,2}). ([0-9]{2}):([0-9]{2}):([0-9]{2}) (\+?[0-9]+) ([^0-9]+) ([0-9 ]+,[0-9]{2})([0-9 ]+,[0-9]{2})?$",
9,
"Celkem za Platby tøetím stranám ([0-9 ]+,[0-9]{2})"
)
);
/**
* Převod volaného období
* @param string $period Perioda
* @return integer Perioda v číselné reprezentaci
* @throws InvalidArgumentException Při neznámém období
*/
protected static function parse_period($period)
{
switch ($period)
{
case "Šp":
return Period::PEAK_HOURS;
break;
case "MŠp":
return Period::OUT_PEAK_HOURS;
break;
case "Vkn":
return Period::WEEKEND;
break;
case "+=":
return Period::MORE_PERIOD;
break;
default:
throw new InvalidArgumentException(
url_lang::lang("texts.Wrong period")
);
}
}
/**
* @param string $emess
* @param integer $line
* @return string Chybová zpráva
*/
protected static function em($emess, $line = -1)
{
return url_lang::lang("texts.Error - cant parse invoice") . ".\n" . $emess .
(($line > 0) ? "\n" . url_lang::lang("texts.On line") . " " . $line : "");
}
/**
* Převede číslo z tvaru 7 852 451,60 na float => 7852451.60
* @param string $price
* @return float
*/
protected static function parse_price($price)
{
return floatval(str_replace(array(' ', ','), array('', '.'), $price));
}
/**
* Převede telefoní číslo s mezerami do tvaru po sobě jdoucích číslic.
* Pokud číslo neobsahuje předčíslý, doplní jej dle nastavení systému,
* pokud se jedná o 9-ti místné číslo.
* Předčíslí je ve tvaru: +xxx
*
* @param string $number Číslo ve tvaru [(+|00)xxx ]xxx xxx xxx
* @return string Telefoní číslo
* @throws InvalidArgumentException Při chybném čísle
*/
protected static function parse_phone_number($number)
{
// osekání mezer
$number = str_replace(" ", "", $number);
// kontrola formátu
if (!mb_ereg("^(\+)?([0-9])+$", $number))
{
throw new InvalidArgumentException(
url_lang::lang("tests-Wrong phone number")
);
}
// předčíslí
if ($number[0] != '+')
{
// předvolbu 00 na začátku čísla nahradíme za +
if (strncmp($number, "00", 2) == 0)
{
$number = "+" . substr($number, 3);
}
// pokud je číslo nemá předčíslí a je devítimístné vložím předčíslí z configu
else if (mb_strlen($number) == 9)
{
// @todo freenetis config
$number = Settings::get("default_phone_prefix") . $number;
}
}
return $number;
}
/**
* Převádí čas ve formátu h:m:s na reprezentaci v sekundách
* @param string $length h:m:s
* @return integer Trvání v sekundách
* @throws InvalidArgumentException Při chybném trvání
*/
protected static function parse_length($length)
{
$arr = explode(":", $length);
if (count($arr) != 3)
{
throw new InvalidArgumentException(
url_lang::lang("texts.Wrong call length")
);
}
$sec = intval($arr[0]) * 60 * 60;
$sec += intval($arr[1]) * 60;
$sec += intval($arr[2]);
return $sec;
}
/**
* Parsovací funkce.
* Funkce parsuje text z Adobe Readeru (pzn.: testováno na v 9).
*
* Obsahuje vnitřní testování správnosti parsování a integrity dat ve 2 bodech:
* - Testuje zda-li odpovídá počet fakturovaných a parsovaných čísel.
* - Testuje zda-li odpovídají ceny položek služeb s celkovou cenou za danou službu
* daného čísla.
*
* @param string $text Text k parsování(vstup)
* @return Bill_Data Data faktury
* @throws Exception Při chybě při parsování
* @throws InvalidArgumentException Při prázdném vstupu
*/
public static function parse($text)
{
if (empty($text))
{
throw new InvalidArgumentException(self::em(
url_lang::lang("texts.Empty input")
));
}
$tl = mb_split("\n", $text); // vstup rozdělený na pole po řádcích
$tlc = count($tl); // počet položek pole
$tli = 0; // iterátor (aktuální index pole)
$data = new Bill_Data(); // datový model
$number_count = 0; // počet čísel na faktuře (pro testování výsledků parsování)
//
// 1. INFO o FAKTUŘE
//
while ($tli < $tlc && $line = rtrim($tl[$tli++]))
{ // dokud nenaleznu info o faktuře
// konec textu?
if (strcmp(mb_strtolower($line),
mb_strtolower(self::BILL_INFO_STARTER)) == 0)
{
if ($tli == $tlc)
{
throw new Exception(self::em(
url_lang::lang("texts.Cannot load heading of invoice") . " " .
url_lang::lang("texts.End of input"),
$tli
));
}
// další řádek obsahuje první data
$line = rtrim($tl[$tli]);
// kontrola formátu dat
if (mb_eregi(self::BILL_INFO_REGEX, $line, $r))
{ // načtení prvních dat
$data->variable_symbol = $r[3];
$data->specific_symbol = $r[4];
$data->date_of_issuance->setDate($r[7], $r[6], $r[5]);
}
else
{ // chybný formát dat
throw new Exception(self::em(
url_lang::lang("texts.Cannot load heading of invoice") . " " .
url_lang::lang("texts.Wrong date format"),
$tli
));
}
// pokračujeme v načítání ceny faktury
if (($tli += 2) >= $tlc)
{ // posun o 2 řádky
throw new Exception(self::em(
url_lang::lang("texts.Cannot load heading of invoice") . " " .
url_lang::lang("texts.End of input"),
$tli
));
}
$line = rtrim($tl[$tli]);
// načtení ceny bez DPH
if (mb_eregi(self::BILL_INFO_PRICE_REGEX, $line, $r))
{
$data->dph_rate = $r[1];
$data->total_price = self::parse_price($r[2]);
}
else
{
throw new Exception(self::em(
url_lang::lang("texts.Cannot load heading of invoice") . " " .
url_lang::lang("texts.Wrong date format"),
$tli
));
}
// pokračujeme v načítání DPH
if (++$tli == $tlc)
{ // posun o řádek
throw new Exception(self::em(
url_lang::lang("texts.Cannot load heading of invoice") .
url_lang::lang("texts.End of input"),
$tli
));
}
$line = rtrim($tl[$tli]);
//načtení DPH
if (mb_eregi(self::BILL_INFO_DPH_REGEX, $line, $r))
{
$data->dph = self::parse_price($r[2]);
}
else
{
throw new Exception(self::em(self::BILL_INFO_ERROR_PARSE, $tli));
}
// vyhledání zůčtovacího období
while ($tli < $tlc && $line = rtrim($tl[$tli++]))
{
if (mb_eregi(mb_strtolower(self::BILL_INFO_PERIOD_REGEX),
mb_strtolower($line), $r))
{
$data->billing_period_from->setDate($r[3], $r[2], $r[1]);
$data->billing_period_to->setDate($r[6], $r[5], $r[4]);
break; // konec hledání období
}
}
// @todo: Zde by se mohli načítat další informace pro testování
// pokračujeme ve vyhledání počtu fakturovaných čísel
while ($tli < $tlc && $line = rtrim($tl[$tli++]))
{
if (mb_eregi(self::BILL_INFO_NUMBERS_COUNT_REGEX, $line, $r))
{
$number_count = intval($r[1]);
break; // konec hledání počtu čísel
}
}
// konec čtení hlavičky
break;
}
}
// kontrola, zda-li je hlavička načtena
if ($number_count <= 0)
{
throw new Exception(self::em(
url_lang::lang("texts.Cannot load heading of invoice") .
url_lang::lang("texts.End of input"),
$tli
));
}
// Data internetu pro dlouhé připojení se nezobrazuje v podrobném výpisu,
// proto je potřeba jej načítat z prvních výpisů
$pre_number = null;
while ($tli < $tlc && $line = rtrim($tl[$tli++]))
{
try {
// vyhledání čísla
if (mb_eregi(self::BILL_EXTRACT_PHONE_REGEX, $line, $r))
{
$pre_number = self::parse_phone_number($r[1]);
continue;
}
// vyhledání řádku s připojením
else if (mb_eregi(self::BILL_EXTRACT_DATA_LONG_CONNECTIONS, $line, $r) &&
$pre_number != null)
{
$internet = new Internet_Service();
$internet->date_time->setDate($r[4], $r[3], $r[2]);
$internet->date_time->setTime($r[5], $r[6], "00");
$internet->apn = rtrim($r[1]);
$internet->period = Period::NO_PERIOD;
$internet->transfered = 0;
$internet->price = self::parse_price($r[7]);
try
{
$data->add_bill_number($pre_number, new Services($pre_number));
}
catch (InvalidArgumentException $ignore)
{ // číslo již existuje
}
$data->get_bill_number($pre_number)->add_internet($internet);
}
//
// 2. NALEZENÍ podrobných výpisů
//
// nalezení 2 po sobě jdoucích vět
else if (strcmp(strtolower(self::BILL_EXTRACT_START_FL),
strtolower($line)) == 0)
{
if ($tli == $tlc)
{
throw new Exception(self::em(
url_lang::lang("texts.Cannot find detail dumps")
));
}
$line = rtrim($tl[$tli++]);
if (strcmp(strtolower(self::BILL_EXTRACT_START_SL),
strtolower($line)) == 0)
{
// nalezeny podrobné výpisy
break;
}
}
}
catch (InvalidArgumentException $e)
{
throw new Exception(self::em(
url_lang::lang("texts.Error - during searching long term connections"), $line
));
}
}
// kontrola nalezení výpisů
if ($tli == $tlc)
{
throw new Exception(self::em(
url_lang::lang("texts.Cannot find detail dumps")
));
}
//
// 3. DETAILY ČÍSEL
//
$services = NULL;
// testovací pole cen služeb, čísla indikují
// ==0 - Netestovat
// <0 - Testovat
// >0 - Číslo bylo testováno, hodnota je celková cena služeb
$test = array(
"vodafone" => 0, "others" => 0, "fixed" => 0, "fixed_international" => 0,
"sms" => 0, "mms" => 0, "vpn" => 0, "internet" => 0, "pays" => 0,
"roaming_sms" >= 0
);
// procházení čísel
while ($tli < $tlc && $line = rtrim($tl[$tli++]))
{
if (mb_eregi(self::BILL_EXTRACT_PHONE_REGEX, $line, $r))
{
try
{ // zpracování čísla
$old_number = isset($number) ? $number : NULL;
$number = self::parse_phone_number($r[1]);
// nové číslo?
if ($old_number != $number)
{
// přidání čísla
if ($old_number != NULL)
{
// test služeb čísla na kompletnost
foreach ($test as $i => $v)
{
if ($v < 0)
{
throw new Exception(
url_lang::lang(
"texts.Near number %s wasnt ".
"fond data for testing in ".
"group: %s",
array($old_number, $i)
)
);
}
// reset testu
$test[$i] = 0;
}
// přidání čísla
try
{
$data->add_bill_number($old_number, $services);
}
catch (InvalidArgumentException $i)
{
// číslo již bylo přidáno, přidám již přidané
// internetové připojení do služeb
foreach ($data->get_bill_number($old_number)->internet as $net)
{
$services->add_internet($net);
}
// změním služby
$data->set_bill_number($old_number, $services);
}
}
// vytvořím služby
$services = new Services($number);
}
}
catch (Exception $e)
{
throw new Exception(self::em($e->getMessage(), $tli));
}
// vyhledávám služby
while ($tli < $tlc && $line = rtrim($tl[$tli++]))
{
// hledám služby
foreach (self::$BILL_EXTRACT_SERVICES as $index => $value)
{
// hledání služby, ověření úvodního řádku
if (strcmp(mb_strtolower($value[self::FLINE]),
mb_strtolower($line)) == 0)
{
// konec textu?
if ($tli == $tlc)
{
throw new Exception(self::em(
url_lang::lang(
"texts.Cannot load services ".
"- data missing"
), $tli
));
}
// ověření 2. řádku
if (strcmp(mb_strtolower($value[self::SLINE]),
mb_strtolower(rtrim($tl[$tli]))) != 0)
{
$test[$index] = -1; // aktivace testování
continue; // 2. řádek nenalezen, pokračuji dál v hledání
}
// posun o řádek
$tli++;
// práce s daty
while ($tli < $tlc && $line = rtrim($tl[$tli++]))
{
// kontrola datového řádku
if (mb_eregi($value[self::REGEX], $line, $r))
{
// extrakce dat
try
{
switch ($index)
{
case "vodafone":
case "others":
$call = new Call_Service();
$call->date_time->setDate(
$data->billing_period_to->format("y"),
$r[2], $r[1]
);
$call->date_time->setTime($r[3], $r[4], $r[5]);
$call->period = self::parse_period($r[6]);
$call->number = self::parse_phone_number($r[7]);
$call->length = self::parse_length($r[8]);
$price = self::parse_price($r[9]);
if ($r[self::REGEX_COUNT] !== false)
{
$price += self::parse_price($r[10]);
}
$call->price = $price;
$services->add_call($call);
break;
case "fixed":
$call = new Fixed_Call_Service();
$call->date_time->setDate(
$data->billing_period_to->format("y"),
$r[2], $r[1]
);
$call->date_time->setTime($r[3], $r[4], $r[5]);
$call->period = self::parse_period($r[6]);
$call->number = self::parse_phone_number($r[7]);
$call->length = self::parse_length($r[8]);
$call->destiny = $r[9];
$price = self::parse_price($r[10]);
if ($r[self::REGEX_COUNT] !== false)
{
$price += self::parse_price($r[11]);
}
$call->price = $price;
$services->add_fixed_call($call);
break;
case "sms":
$sms = new Sms_Service();
$sms->date_time->setDate(
$data->billing_period_to->format("y"),
$r[2], $r[1]
);
$sms->date_time->setTime($r[3], $r[4], $r[5]);
$sms->period = self::parse_period($r[6]);
$sms->number = self::parse_phone_number($r[7]);
$sms->description = $r[8];
$price = self::parse_price($r[9]);
if ($r[self::REGEX_COUNT] !== false)
{
$price += self::parse_price($r[10]);
}
$sms->price = $price;
$services->add_sms($sms);
break;
case "roaming_sms":
$sms = new RoamingSms_Service();
$sms->date_time->setDate(
$data->billing_period_to->format("y"),
$r[2], $r[1]
);
$sms->date_time->setTime($r[3], $r[4], $r[5]);
$sms->roaming_zone = $r[6];
$price = self::parse_price($r[7]);
if ($r[self::REGEX_COUNT] !== false)
{
$price += self::parse_price($r[8]);
}
$sms->price = $price;
$services->add_roaming_sms($sms);
break;
case "mms":
$mms = new Sms_Service();
$mms->date_time->setDate(
$data->billing_period_to->format("y"),
$r[2], $r[1]
);
$mms->date_time->setTime($r[3], $r[4], $r[5]);
$mms->period = Period::NO_PERIOD;
$mms->number = self::parse_phone_number($r[6]);
$mms->description = $r[7];
$price = self::parse_price($r[8]);
if ($r[self::REGEX_COUNT] !== false)
{
$price += self::parse_price($r[9]);
}
$mms->price = $price;
$services->add_sms($mms);
break;
case "pays":
$pay = new Pay_Service();
$pay->date_time->setDate(
$data->billing_period_to->format("y"),
$r[2], $r[1]
);
$pay->date_time->setTime($r[3], $r[4], $r[5]);
$pay->number = self::parse_phone_number($r[6]);
$pay->description = $r[7];
$price = self::parse_price($r[8]);
if ($r[self::REGEX_COUNT] !== false)
{
$price += self::parse_price($r[9]);
}
$pay->price = $price;
$services->add_pay($pay);
break;
case "vpn":
$call = new Vpn_Call_Service();
$call->date_time->setDate(
$data->billing_period_to->format("y"),
$r[2], $r[1]
);
$call->date_time->setTime($r[3], $r[4], $r[5]);
$call->period = self::parse_period($r[6]);
$call->number = self::parse_phone_number($r[7]);
$call->length = self::parse_length($r[8]);
$call->group = $r[9];
$price = self::parse_price($r[10]);
if ($r[self::REGEX_COUNT] !== false)
{
$price += self::parse_price($r[11]);
}
$call->price = $price;
$services->add_vpn_call($call);
break;
case "internet":
$net = new Internet_Service();
$net->date_time->setDate(
$data->billing_period_to->format("y"),
$r[2], $r[1]
);
$net->date_time->setTime($r[3], $r[4], $r[5]);
$net->period = self::parse_period($r[6]);
$net->transfered = intval($r[7]);
$net->apn = $r[8];
$net->price = self::parse_price($r[9]);
$services->add_internet($net);
break;
default:
// warning
}
}
catch (InvalidArgumentException $e)
{
throw new Exception(self::em(
url_lang::lang("texts.Error - during extraction of data") .
$e->getMessage(), $tli
));
}
}
else
{
// test celkového součtu služeb kategorie
// pokud naleznu patičku, testuji
if (mb_eregi($value[self::LLINE], $line, $r))
{
// načtení z patičky
$tot_price = self::parse_price($r[1]);
if (count($r) > 2)
{
$tot_price += self::parse_price($r[2]);
}
// získání testovacích dat
$tot_calc_price = 0;
foreach ($services->$value[self::SERVICE_ARRAY] as $s)
{
$tot_calc_price += $s->price;
}
// vodafone a ostatni sdili pole => nutny odpočet
if ($index == "others" && $test["vodafone"] > 0)
{
$tot_calc_price -= $test["vodafone"];
}
// pevna a pevna mezinarodni sdili pole => nutny odpocet
else if ($index == "fixed_international" &&
$test["fixed"] > 0)
{
$tot_calc_price -= $test["fixed"];
}
// mms a sms sdili pole => nutny odpocet
else if ($index == "mms" &&
$test["sms"] > 0)
{
$tot_calc_price -= $test["sms"];
}
// mms a sms sdili pole => nutny odpocet
else if ($index == "sms" &&
$test["mms"] > 0)
{
$tot_calc_price -= $test["mms"];
}
// zaokrouhlední na haléře
$tot_price = round($tot_price, 2);
$tot_calc_price = round($tot_calc_price, 2);
// test správnosti dat
if ($tot_price != $tot_calc_price)
{
throw new Exception(self::em(
url_lang::lang(
"texts.Near number %s ".
"differs from price of".
" services: %s\nCalculated ".
"price: %s\nInvoiced price: %s",
array(
$number, $index,
$tot_calc_price, $tot_price
)
),
$tli
));
}
// uložím testovaná data
$test[$index] = $tot_price;
}
break;
}
}
// pokračuji v hledání služeb
break;
}
}
reset(self::$BILL_EXTRACT_SERVICES);
// hledám číslo
if (mb_eregi(self::BILL_EXTRACT_PHONE_REGEX, $line))
{
// vrátím se na předchozí řádek a na začátek cyklu, kde se číslo vyhodnotí
$tli--;
continue 2;
}
}
// přidání čísla
try
{
// test služeb čísla na kompletnost
foreach ($test as $v)
{
if ($v < 0)
{
throw new Exception(self::em(
url_lang::lang(
"texts.Near number %s wasnt fond ".
"data for testing in group: %s",
array($old_number, $v)
)
));
}
// reset testu
$test[$i] = 0;
}
// přidání čísla (na konci dokumentu)
$data->add_bill_number($number, $services);
}
catch (InvalidArgumentException $e)
{
throw new Exception(self::em($e->getMessage()));
}
}
}
// kontrola načtení všech čísel
if ($number_count != count($data->bill_numbers))
{
$missing = $number_count - count($data->bill_numbers);
throw new Exception(self::em(
url_lang::lang("texts.Some phones wasn't founded") . ".\n" . $missing . " chybí."
));
}
return $data;
}
}
freenetis/trunk/kohana/application/libraries/parser_vodafone_invoice_models/Pay_Service.php
<?php
/*
*/
require_once "Service.php";
/**
* Platební služba
*
* @author Ondřej Fibich
*
* @property DateTime $date_time
* @property float $price
* @property string $number
* @property string $description
*/
class Pay_Service extends Service
{
/**
* Volané číslo
* @var string
*/
protected $number;
/**
* Popis platby
* @var string
*/
protected $description;
}
freenetis/trunk/kohana/application/libraries/parser_vodafone_invoice_models/Fixed_Call_Service.php
<?php
/*
*/
require_once "Call_Service.php";
/**
* Služba volání do pevné sítě
*
* @author Ondřej Fibich
*
* @property DateTime $date_time
* @property float $price
* @property integer $period
* @property string $number
* @property integer $length
* @property string $destiny
*/
class Fixed_Call_Service extends Call_Service {
/**
* Cílová oblast
* @var string
*/
protected $destiny;
}
freenetis/trunk/kohana/application/libraries/parser_vodafone_invoice_models/Call_Service.php
<?php
/*
*/
require_once "Service.php";
require_once "Period.php";
/**
* Služba volání
*
* @author Ondřej Fibich
*
* @property DateTime $date_time
* @property float $price
* @property integer $period
* @property string $number
* @property integer $length
*/
class Call_Service extends Service
{
/**
* Tarifové období
* @see Period
* @var integer
*/
protected $period;
/**
* Volané číslo
* @var string
*/
protected $number;
/**
* Délka hovoru v sekundách
* @var integer
*/
protected $length;
protected function set_period($period)
{
if (!Period::is_valid($period))
{
throw new InvalidArgumentException(
url_lang::lang('texts.Wrong period')
);
}
$this->period = $period;
}
protected function set_length($length)
{
$this->length = intval($length);
}
}
freenetis/trunk/kohana/application/libraries/parser_vodafone_invoice_models/Bill_Data.php
<?php
/*
*/
require_once "Object.php";
/**
* Informace o faktuře a seznam čísel, které jsou fakturované.
* Seznam čísel je ukládán v poli jejichž index je fakturované číslo a hodnota
* třída Services, která obsahuje fakturované položky.
*
* @author Ondřej Fibich
*
* @property DateTime $billing_period_from
* @property DateTime $billing_period_to
* @property DateTime $date_of_issuance
* @property int $variable_symbol
* @property int $specific_symbol
* @property float $total_price
* @property float $dph
* @property-read array $bill_numbers
*/
class Bill_Data extends Object
{
/**
* Zůčtovací období od
* @var DateTime
*/
protected $billing_period_from;
/**
* Zůčtovací období do
* @var DateTime
*/
protected $billing_period_to;
/**
* Datum vystavení
* @var DateTime
*/
protected $date_of_issuance;
/**
* Variabilní symbol
* @var int
*/
protected $variable_symbol;
/**
* Specifický symbol
* @var int
*/
protected $specific_symbol;
/**
* Celková cena
* @var float
*/
protected $total_price;
/**
* Daň
* @var float
*/
protected $dph;
/**
* Sazba daně faktury
* @var integer
*/
protected $dph_rate;
/**
* Pole fakturovaných čísel, index pole je číslo, hodnota třída Services
* @var array
*/
protected $bill_numbers;
/**
* Vytvoří instanci a inicializuje objekty pro datumy
*/
public function __construct()
{
$this->billing_period_from = new DateTime();
$this->billing_period_to = new DateTime();
$this->date_of_issuance = new DateTime();
$this->bill_numbers = array();
}
/**
* Přidá služby čísla
* @param mixed $number
* @param Services $services
* @throws InvalidArgumentException Při neexistujcím čísle
*/
public function add_bill_number($number, Services $services)
{
if (array_key_exists($number, $this->bill_numbers))
{
throw new InvalidArgumentException();
}
$this->bill_numbers[$number] = $services;
}
/**
* Vrací služby čísla
* @param mixed $number
* @return Services
* @throws InvalidArgumentException Při neexistujcím čísle
*/
public function get_bill_number($number)
{
if (!array_key_exists($number, $this->bill_numbers))
{
throw new InvalidArgumentException();
}
return $this->bill_numbers[$number];
}
/**
* Nastaví služby
* @param string $number
* @param Services $services
* @throws InvalidArgumentException Při neexistujcím čísle
*/
public function set_bill_number($number, Services $services)
{
if (!array_key_exists($number, $this->bill_numbers))
{
throw new InvalidArgumentException();
}
$this->bill_numbers[$number] = $services;
}
protected function set_bill_numbers($bill_numbers)
{
if (!is_array($bill_numbers))
{
throw new InvalidArgumentException();
}
$this->bill_numbers = $bill_numbers;
}
protected function set_billing_period_from(DateTime $billing_period_from)
{
$this->billing_period_from = $billing_period_from;
}
protected function set_billing_period_to(DateTime $billing_period_to)
{
$this->billing_period_to = $billing_period_to;
}
protected function set_date_of_issuance(DateTime $date_of_issuance)
{
$this->date_of_issuance = $date_of_issuance;
}
protected function set_variable_symbol($variable_symbol)
{
$this->variable_symbol = intval($variable_symbol);
}
protected function set_specific_symbol($specific_symbol)
{
$this->specific_symbol = intval($specific_symbol);
}
protected function set_total_price($total_price)
{
$this->total_price = floatval($total_price);
}
protected function set_dph($dph)
{
$this->dph = floatval($dph);
}
protected function set_rate($dph_rate)
{
$this->dph_rate = intval($dph_rate);
}
}
freenetis/trunk/kohana/application/libraries/parser_vodafone_invoice_models/Vpn_Call_Service.php
<?php
/*
*/
require_once "Call_Service.php";
/**
* Služba VPN hovorů
*
* @author Ondřej Fibich
*
* @property DateTime $date_time
* @property float $price
* @property integer $period
* @property string $number
* @property integer $length
* @property string $group
*/
class Vpn_Call_Service extends Call_Service
{
/**
* Skupina
* @var string
*/
protected $group;
}
freenetis/trunk/kohana/application/libraries/parser_vodafone_invoice_models/RoamingSms_Service.php
<?php
/*
*/
require_once "Service.php";
/**
* Služba pro roamingové služby - sms
*
* @author Ondřej Fibich
*
* @property string $roaming_zone
*/
class RoamingSms_Service extends Service
{
/**
* Roamingová zóna
* @var string
*/
protected $roaming_zone;
}
freenetis/trunk/kohana/application/libraries/parser_vodafone_invoice_models/Service.php
<?php
/*
*/
require_once "Object.php";
/**
* Předek všech služeb operátora
*
* @author Ondřej Fibich
*
* @property DateTime $date_time
* @property float $price
*/
class Service extends Object
{
/**
* Začátek služby
* @var DateTime
*/
protected $date_time;
/**
* Cena služby bez DPH
* @var float
*/
protected $price;
/**
* Konstruktor
*/
function __construct()
{
$this->date_time = new DateTime();
}
... Rozdílový soubor je zkrácen, protože jeho délka přesahuje max. limit.

Také k dispozici: Unified diff