Revize 708
Přidáno uživatelem Ondřej Fibich před asi 14 roky(ů)
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, Mp=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 sluby",
|
||
"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 sluby ([0-9 ]+,[0-9]{2})"
|
||
),
|
||
"mms" => array(
|
||
"smss", "MMS sluby",
|
||
"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 sluby ([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 "Mp":
|
||
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();
|
||
}
|
Také k dispozici: Unified diff
Přidán parser faktur Vodafonu + datové třídy. Do konfigu přidána hodnota defaultního telefoního předčíslí země.