| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304 |
- <?php
- namespace NavOnlineInvoice;
- use Exception;
- class Reporter {
- protected $connector;
- protected $config;
- /**
- *
- *
- * @param Config $config Config object (felhasználó adatok, szoftver adatok, URL, stb.)
- */
- function __construct($config) {
- $this->config = $config;
- $this->connector = new Connector($config);
- }
- /**
- * manageAnnulment operáció (1.8.1 fejezet)
- *
- * A /manageAnnulment operáció a technikai érvénytelenítések beküldésére szolgáló operáció.
- * Technikai érvénytelenítés csak olyan adatszolgáltatásra küldhető, amelynek a befogadása
- * a NAV oldalon DONE státusszal megtörtént.
- *
- * Paraméterben a technikai érvénytelenítést leíró XML-t, vagy egy InvoiceOperations példányt
- * kell átadni. Utóbbi esetben az InvoiceOperations példány több XML-t is tartalmazhat.
- *
- * A metódus visszaadja a transactionId-t, mellyel lekérdezhető a tranzakció eredménye.
- *
- * @param [type] $invoiceOperationsOrXml $invoiceOperationsOrXml
- * @return [type] $transactionId
- */
- public function manageAnnulment($invoiceOperationsOrXml) {
- // Ha nem InvoiceOperations példányt adtak át, akkor azzá konvertáljuk
- if ($invoiceOperationsOrXml instanceof InvoiceOperations) {
- $invoiceOperations = $invoiceOperationsOrXml;
- } else {
- $invoiceOperations = InvoiceOperations::convertFromXml($invoiceOperationsOrXml, "ANNUL");
- }
- if (!$invoiceOperations->isTechnicalAnnulment()) {
- throw new Exception("manageAnnulment() interfészen csak technikai érvénytelenítést lehet beküldeni.");
- }
- $token = $this->tokenExchange();
- $requestXml = new ManageAnnulmentRequestXml($this->config, $invoiceOperations, $token);
- $responseXml = $this->connector->post("/manageAnnulment", $requestXml);
- return (string)$responseXml->transactionId;
- }
- /**
- * manageInvoice operáció (1.8.2 fejezet)
- *
- * A /manageInvoice a számla adatszolgáltatás beküldésére szolgáló operáció, ezen keresztül van lehetőség számla,
- * módosító vagy stornó számla adatszolgáltatást a NAV részére beküldeni.
- *
- * Paraméterben a beküldendő számla XML-t kell átadni, illetve a hozzá tartozó műveletet (ManageInvocieOperationType): CREATE, MODIFY, STORNO
- *
- * Átadható egyszerre több számla is, ilyenkor első paraméterben InvoiceOperations példányt kell átadni (második paraméternek nincs szerepe ilyenkor).
- *
- * A metódus visszaadja a transactionId-t, mellyel lekérdezhető a tranzakció eredménye.
- *
- * @param InvoiceOperations|\SimpleXMLElement $invoiceOperationsOrXml
- * @param string $operation
- * @return string $transactionId
- */
- public function manageInvoice($invoiceOperationsOrXml, $operation = "CREATE") {
- // Ha nem InvoiceOperations példányt adtak át, akkor azzá konvertáljuk
- if ($invoiceOperationsOrXml instanceof InvoiceOperations) {
- $invoiceOperations = $invoiceOperationsOrXml;
- } else {
- $invoiceOperations = InvoiceOperations::convertFromXml($invoiceOperationsOrXml, $operation);
- }
- if ($invoiceOperations->isTechnicalAnnulment()) {
- throw new Exception("Technikai érvénytelenítésre a manageAnnulment() metódust kell használni a 2.0-ás API-tól kezdődően!");
- }
- $token = $this->tokenExchange();
- $requestXml = new ManageInvoiceRequestXml($this->config, $invoiceOperations, $token);
- $responseXml = $this->connector->post("/manageInvoice", $requestXml);
- return (string)$responseXml->transactionId;
- }
- /**
- * queryInvoiceData operáció (1.8.5 fejezet)
- *
- * A /queryInvoiceData egy számlaszám alapján működő lekérdező operáció, amely a számlán szereplő kiállító és a vevő
- * oldaláról is használható. Az operáció a megadott számlaszám teljes adattartalmát adja vissza a válaszban.
- *
- * @param array $invoiceNumberQuery Az invoiceNumberQuery-nek megfelelően összeállított lekérdezési adatok
- * @param boolean [$returnDecodedInvoiceData = false] invoiceDataResult helyett a dekódolt számla XML-t adja vissza a metódus
- * @return \SimpleXMLElement $invoiceDataResultXml A válasz XML invoiceDataResult része vagy a dekódolt számla XML
- */
- public function queryInvoiceData($invoiceNumberQuery, $returnDecodedInvoiceData = false) {
- $requestXml = new QueryInvoiceDataRequestXml($this->config, $invoiceNumberQuery);
- $responseXml = $this->connector->post("/queryInvoiceData", $requestXml);
- $result = $responseXml->invoiceDataResult;
- if ($returnDecodedInvoiceData) {
- if (empty($result->invoiceData)) {
- return null;
- }
- $isCompressed = $result->compressedContentIndicator;
- return InvoiceOperations::convertToXml($result->invoiceData, $isCompressed);
- }
- return $result;
- }
- /**
- * queryInvoiceDigest operáció (1.8.6 fejezet)
- *
- * A /queryInvoiceDigest üzleti keresőparaméterek alapján működő lekérdező operáció, amely a számlán szereplő
- * kiállító és a vevő oldaláról is használható. Az operáció a megadott keresőfeltételeknek megfelelő, lapozható
- * számla listát ad vissza a válaszban. A válasz nem tartalmazza a számlák összes üzleti adatát, hanem csak egy
- * kivonatot (digest-et). Amennyiben szükség van a listában szereplő valamely számla teljes adattartalmára, úgy
- * azt a számlaszám birtokában a /queryInvoiceData operációban lehet lekérdezni.
- *
- * @param array $invoiceQueryParams Az invoiceQueryParams-nak megfelelően összeállított lekérdezési adatok
- * @param Int [$page=1] Oldalszám (1-től kezdve a számozást)
- * @param string [$direction=OUTBOUND] A keresés iránya, a keresés elvégezhető kiállítóként és vevőként is [OUTBOUND, INBOUND]
- * @return \SimpleXMLElement $queryResultsXml A válasz XML invoiceDigestResult része
- */
- public function queryInvoiceDigest($invoiceQueryParams, $page = 1, $direction = "OUTBOUND") {
- $requestXml = new QueryInvoiceDigestRequestXml($this->config, $invoiceQueryParams, $page, $direction);
- $responseXml = $this->connector->post("/queryInvoiceDigest", $requestXml);
- return $responseXml->invoiceDigestResult;
- }
- /**
- * queryTransactionStatus operáció (1.8.8 fejezet)
- *
- * A /queryTransactionStatus a számla adatszolgáltatás feldolgozás aktuális állapotának és eredményének
- * lekérdezésére szolgáló operáció
- *
- * @param string $transactionId
- * @param boolean $returnOriginalRequest
- * @return \SimpleXMLElement $responseXml A teljes visszakapott XML, melyből a 'processingResults' elem releváns
- */
- public function queryTransactionStatus($transactionId, $returnOriginalRequest = false) {
- $requestXml = new QueryTransactionStatusRequestXml($this->config, $transactionId, $returnOriginalRequest);
- $responseXml = $this->connector->post("/queryTransactionStatus", $requestXml);
- return $responseXml;
- }
- /**
- * queryTransactionList operáció
- *
- * A /queryTransactionList a kérésben megadott időintervallumban, a technikai felhasználóhoz tartozó adószámhoz
- * beküldött számlaadat-szolgáltatások listázására szolgál.
- *
- * @param array $insDate DateTimeIntervalParamType-nak megfelelő mezők (lásd example)
- * @param integer $page
- * @return \SimpleXMLElement $transactionListResult A válasz XML transactionListResult része
- */
- public function queryTransactionList($insDate, $page = 1) {
- $requestXml = new QueryTransactionListRequestXml($this->config, $insDate, $page);
- $responseXml = $this->connector->post("/queryTransactionList", $requestXml);
- return $responseXml->transactionListResult;
- }
- /**
- * queryInvoiceChainDigest operáció
- *
- * A /queryInvoiceChainDigest egy számlaszám alapján működő lekérdező operáció, amely a számlán szereplő
- * kiállító és a vevő oldaláról is használható. Az operáció a megadott keresőfeltételeknek megfelelő,
- * lapozható számlalistát ad vissza a válaszban. A lista elemei a megadott alapszámlához tartozó számlalánc elemei.
- * A válasz nem tartalmazza a számlák összes üzleti adatát, hanem csak egy kivonatot (digest-et), elsősorban a
- * módosításra és tételsorok számára vonatkozóan
- *
- * @param Array $invoiceChainQuery
- * @param integer $page Oldalszám
- * @return \SimpleXMLElement $invoiceChainDigestResult A válasz XML invoiceChainDigestResult része
- */
- public function queryInvoiceChainDigest($invoiceChainQuery, $page = 1) {
- $requestXml = new QueryInvoiceChainDigestRequestXml($this->config, $invoiceChainQuery, $page);
- $responseXml = $this->connector->post("/queryInvoiceChainDigest", $requestXml);
- return $responseXml->invoiceChainDigestResult;
- }
- /**
- * queryTaxpayer operáció (1.8.9 fejezet)
- *
- * A /queryTaxpayer belföldi adószám validáló operáció, mely a számlakiállítás folyamatába építve képes
- * a megadott adószám valódiságáról és érvényességéről a NAV adatbázisa alapján adatot szolgáltatni.
- *
- * @param string $taxNumber Adószám, pattern: [0-9]{8}
- * @return bool|\SimpleXMLElement Nem létező adószám esetén `null`, érvénytelen adószám esetén `false` a visszatérési érték, valid adószám estén
- * pedig a válasz XML taxpayerData része (SimpleXMLElement), mely a nevet és címadatokat tartalmazza.
- */
- public function queryTaxpayer($taxNumber) {
- $requestXml = new QueryTaxpayerRequestXml($this->config, $taxNumber);
- $responseXml = $this->connector->post("/queryTaxpayer", $requestXml);
- // 1.9.8.2 fejezet alapján (QueryTaxpayerResponse) a taxpayerValidity tag csak akkor kerül a válaszba, ha a lekérdezett adószám létezik.
- // Nem létező adószámra csak egy <funcCode>OK</funcCode> kerül visszaadásra (funcCode===OK megléte a Connector-ban ellenőrizve van).
- if (!isset($responseXml->taxpayerValidity)) {
- return null;
- }
- // taxpayerValidity értéke lehet false is, ha az adószám létezik, de nem érvényes
- if (empty($responseXml->taxpayerValidity) or (string)($responseXml->taxpayerValidity) === "false") {
- return false;
- }
- // Az adószám valid, adózó adatainak visszaadása
- return $responseXml->taxpayerData;
- }
- /**
- * Token kérése manageInvoice művelethez.
- *
- * Ezt a metódust lehet használni tesztelésre is, hogy a megadott felhasználói adatok helyesek-e/a NAV szervere visszatér-e valami válasszal.
- *
- * Megjegyzés: csak a token kerül visszaadásra, az érvényességi idő nem. Ennek oka, hogy a tokent csak egy kéréshez (egyszer) lehet használni
- * NAV fórumon elhangzottak alapján (megerősítés szükséges!), és ez az egyszeri felhasználás azonnal megtörténik a token lekérése után (manageInvoice hívás).
- *
- * @return string Token
- */
- public function tokenExchange() {
- $requestXml = new TokenExchangeRequestXml($this->config);
- $responseXml = $this->connector->post("/tokenExchange", $requestXml);
- $encodedToken = (string)$responseXml->encodedExchangeToken;
- $token = $this->decodeToken($encodedToken);
- return $token;
- }
- /**
- * Utolsó REST hívás adatainak lekérdezése naplózási és hibakeresési céllal.
- *
- * A visszaadott array a következő elemeket tartalmazza: requestUrl, requestBody, responseBody, requestId, responseXml
- *
- * Megjegyzés: bizonyos műveletek (manageAnnulment és manageInvoice) kettő REST hívást is indítanak,
- * a tokenExchange hívást, illetve magát az adatküldést. Sikeres hívás esetén csak a tényleges adatküldés
- * eredménye érhető el, Exception esetén pedig mindig az utolsó hívás adata.
- *
- * @return array
- */
- public function getLastRequestData() {
- return $this->connector->getLastRequestData();
- }
- /**
- * Utolsó válasz XML lekérdezése (operáció hívása után)
- *
- * @return \SimpleXMLElement $xml
- */
- public function getLastResponseXml() {
- return $this->connector->getLastResponseXml();
- }
- protected function decodeToken($encodedToken) {
- return Util::aes128_decrypt($encodedToken, $this->config->user["exchangeKey"]);
- }
- /**
- * Paraméterben átadott adat XML-t validálja az XSD-vel és hiba esetén string-ként visszaadja a hibát.
- * Ha nincs hiba, akkor visszatérési érték `null`.
- *
- * @param \SimpleXMLElement $xml Számla XML
- * @return null|string Hibaüzenet, vagy `null`, ha helyes az XML
- */
- public static function getInvoiceValidationError($xml) {
- try {
- Xsd::validate($xml->asXML(), Config::getDataXsdFilename());
- } catch(XsdValidationError $ex) {
- return $ex->getMessage();
- }
- return null;
- }
- }
|