Skip to content

Commit

Permalink
Update README for v3.0, add extra docs and update example
Browse files Browse the repository at this point in the history
  • Loading branch information
pzs committed Oct 18, 2020
1 parent 1adbf63 commit 5d6e107
Show file tree
Hide file tree
Showing 7 changed files with 273 additions and 29 deletions.
49 changes: 22 additions & 27 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,39 +12,31 @@ __Letöltés:__

NAV Online számla oldala: [onlineszamla.nav.gov.hu](https://onlineszamla.nav.gov.hu/)

## :mega: 2.0-ás API támogatás
## :fire: v3.0-ás API támogatás :fire:

A modul ezen verzió a NAV 2.0-ás API-ját támogatja.
A modul ezen verzió a NAV v3.0-ás API-ját támogatja. v2.0-ás API támogatáshoz használd a korábbi, [v2.0.4](https://github.com/pzs/nav-online-invoice/tree/v2.0.4) verziót.

## Frissítés v2.0-ás API-ra
## :information_source: Frissítés v3.0-ás API-ra

<details>
<summary>Kattints ide a leírás megjelenítéséhez!</summary>

:information_source: A NAV 2.0-ás API teszt és éles környezetben is elérhető már.

:warning: 2020. július 1-jétől kizárólag a 2.0-ás API lesz alkalmazható az éles környezetben ([forrás](https://onlineszamla.nav.gov.hu/))

A 2.0-ás `nav-online-invoice` modulra való frissítés után a következő módosításokat kell végrehajtanod:

v3.0-ás `nav-online-invoice` modulra történő frissítés után - a modult érintően - csak az URL-t kell átírnod `v3`-asra, más teendőd nincs, de ajánlott elolvasni az itt lévő változásokat:

- `NavOnlineInvoice\Config` példányosításakor:
- apiUrl a következőre változott: `https://api-test.onlineszamla.nav.gov.hu/invoiceService/v3`, illetve "-test" rész nélkül éles környezetben,
- software adatok megadása kötelező lett,
- SHA3-512-es hash algoritmust kell használni, melyhez PHP 7.1.0-ás verzió, vagy újabb szükséges. Ha ennél régebbit használsz, akkor külső könyvtárat kell betölteni, melyet _nem_ tartalmaz a `nav-online-invoice` modul:
- [n-other/php-sha3](https://github.com/n-other/php-sha3), MIT license ([packagist](https://packagist.org/packages/n-other/php-sha3)),
- vagy [desktopd/php-sha3-streamable](https://notabug.org/desktopd/php-sha3-streamable), LGPL 3+ license,
- a fenti kettő könyvtár közül elég az egyiket telepítened/behivatkoznod, s azt automatikusan használni fogja a `nav-online-invoice`.
- technikai érvényesítést mostantól nem a `manageInvoice()` hívással, hanem `manageAnnulment()` hívással kell beküldened,
- a státusz lekérdezés metódus át lett nevezve `queryInvoiceStatus()`-ról `queryTransactionStatus()`-ra,
- a `queryInvoiceData()` metódus változott: ezzel mostantól csak egy számla adatait lehet lekérni számlaszám alapján (kiállító és vevő oldalról is), keresni pedig az új `queryInvoiceDigest()` metódussal lehet,
- a `queryTaxpayer()` metódus visszatérési értékében a címadatokat más formában adja vissza a NAV, illetve kibővül más információkkal is,
- továbbá a 2.0-ás API-n új operációk is elérhetőek lettek: `queryTransactionList` és `queryInvoiceChainDigest`, lásd a leírást és példákat.
- Esetleg használhatod a beépített `NavOnlineInvoice\Config::TEST_URL` és `NavOnlineInvoice\Config::PROD_URL` változókat, így a jövőben nem kell bajlódni az URL átírásával,

- Változások:
- A boríték XML-ből a namespace-eket automatikusan törli a modul, erről (és segédletről a namespace-ekhez) itt találsz leírást: [XML namespace-ek](docs/xml_namespaces.md).
- Elektronikus számlázásról (`electronicInvoiceHash` és `completenessIndicator`) lásd a [manageInvoice_electronic_invoice.php](examples/manageInvoice_electronic_invoice.php) példafájlt és az [Elektronikus számlázás támogatása](docs/electronic_invoice.md) leírást.
- Config osztályban az `$verifySSL` értéke alapértelmezetten `true` lett, így ha bármi rosszul beállított certificate miatt nem kapcsolódna a modul a NAV-hoz, `$config->verifySSL = false;`-ra állításával ki tudod kapcsolni a `cURL`-ben az SSL ellenőrzést.
- `$reporter->getLastRequestData()`-en belül a `lastRequestId` át lett nevezve `requestId`-ra.

Új funkció a `nav-online-invoice` modulban:
- naplózást és hibakeresést segítő `$reporter->getLastRequestData()` metódus, lásd a [példafájlt](examples/log.php), illetve a [leírást](#rest-hívás-részletei).
- Új funkció a `nav-online-invoice` modulban:
- `$reporter->getLastResponseXml()` metódus, mely visszaadja az utolsó válasz XML-t (ez a namespace nélküli változat, lásd [XML namespace-ek](docs/xml_namespaces.md)).

Ha ezekkel megvagy, akkor már csak az adatsémákat kell átírnod, melyhez segítséget a NAV-os dokumentációkban, illetve fórumokon találsz, de ha megpróbálod beküldeni a régi adat XML-t, akkor az interfész is ki fogja írni a sémavalidálási hibát. NAV-os changelog: [CHANGELOG_2.0](https://github.com/nav-gov-hu/Online-Invoice/blob/master/src/schemas/nav/gov/hu/OSA/CHANGELOG_2.0.md)
Ha ezekkel megvagy, akkor már csak az adatsémákat kell átírnod, melyhez segítséget a NAV-os dokumentációkban, illetve fórumokon találsz, de ha megpróbálod beküldeni a régi adat XML-t, akkor az interfész is ki fogja írni a sémavalidálási hibát. NAV-os changelog: [CHANGELOG_3.0](https://github.com/nav-gov-hu/Online-Invoice/blob/master/src/schemas/nav/gov/hu/OSA/CHANGELOG_3.0.md)

</details>

Expand Down Expand Up @@ -161,12 +153,14 @@ Módosító vagy sztornó számlához használd a "MODIFY" és "STORNO" értéke

Több számla egyszerre való feladásához lásd a [manageInvoice_multiple.php](examples/manageInvoice_multiple.php) példát.

Elektronikus számlázásról (`electronicInvoiceHash` és `completenessIndicator`) lásd a [manageInvoice_electronic_invoice.php](examples/manageInvoice_electronic_invoice.php) példafájlt és az [Elektronikus számlázás támogatása](docs/electronic_invoice.md) leírást.

:information_source: _Oké, beküldtem a számlát, de mit csináljak Exception esetén?_ :interrobang:

- Ha `NavOnlineInvoice\XsdValidationError` Exception-t kaptál, akkor valamelyik XML-ben lesz hiba! Lehet a szakmai (számla) XML hibás (bár ezt már számlakészítéskor is célszerű ellenőrizni), de a boríték XML is lehet hibás (pl. megadtad a software adatokat, de rossz a formátuma). Fontos megjegyezni, hogy ez az Exception még a küldés előtt jön a nav-online-invoice által generálva.
- Ha `NavOnlineInvoice\CurlError` vagy `NavOnlineInvoice\HttpResponseError` Exception-t kaptál, akkor mindenképp próbáld újraküldeni a számlát pár perc múlva, mert lehet csak épp nincs interneted, vagy a NAV szervere nem elérhető/furcsaságokat válaszol.
- Ha `NavOnlineInvoice\GeneralErrorResponse` vagy `NavOnlineInvoice\GeneralExceptionResponse` az Exception, akkor a NAV válaszolt egy XML üzenettel, viszont ebben - az Exception típusának megfelelő típusú - hibaüzenet volt. Mind a kettő exception esetén az errorCode az $ex->getErrorCode() metódussal lekérhető, melyek értelmezését megtaláljuk a NAV által kiadott interfész specifikációban. Ugyan nem minden hibakód esetén, de az esetek többségében itt is érdemes próbálkozni az újraküldéssel.
- Más egyéb Exception esetén (`NavOnlineInvoice\GeneralExceptionResponse`, `NavOnlineInvoice\GeneralErrorResponse` és `\Exception`) valószínűleg felesleges az újrapróbálkozás, naplózd és ellenőrizd a hibaüzenetet (`$ex->getMessage()`)!
- Más egyéb Exception esetén (`NavOnlineInvoice\GeneralExceptionResponse`, `NavOnlineInvoice\GeneralErrorResponse` és `\Exception`) valószínűleg felesleges az újra próbálkozás, naplózd és ellenőrizd a hibaüzenetet (`$ex->getMessage()`)!


### Technikai érvénytelenítés (`manageAnnulment`)
Expand Down Expand Up @@ -360,7 +354,7 @@ $data = $reporter->getLastRequestData();
print "<br /><br />Request URL: " . htmlspecialchars($data['requestUrl']);
print "<br /><br />Request body: " . htmlspecialchars($data['requestBody']);
print "<br /><br />Response body: " . htmlspecialchars($data['responseBody']);
print "<br /><br />Request ID: " . htmlspecialchars($data['lastRequestId']);
print "<br /><br />Request ID: " . htmlspecialchars($data['requestId']);
```

A `requestBody` ezen modul által összeállított XML string-et tartalmazza, a `responseBody` pedig a NAV által visszaadott üzenetet, mely az esetek többségében egy XML string.
Expand Down Expand Up @@ -412,16 +406,17 @@ Ezen az osztályon érhetjük el a NAV interfészén biztosított szolgáltatás
- `queryInvoiceChainDigest($invoiceChainQuery [, $page = 1])`
- `queryTaxpayer(string $taxNumber)`: Belföldi adószám validáló és címadat lekérdező operáció. Visszatérési éréke lehet `null` nem létező adószám esetén, `false` érvénytelen adószám esetén, vagy TaxpayerDataType XML elem név és címadatokkal valid adószám esetén
- `tokenExchange()`: Token kérése manageInvoice művelethez (közvetlen használata nem szükséges, viszont lehet használni, mint teszt hívás). Visszatérési értékként a dekódolt tokent adja vissza string-ként.
- `getLastRequestData()`: 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 és lastRequestId. 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.
- `getLastRequestData()`: 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 és requestId. 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.
- `getLastResponseXml()`: Utolsó válasz XML lekérdezése (operáció hívása után)


### `InvoiceOperations` osztály

`manageInvoice` és `manageAnnulment` híváshoz használandó collection, melyhez a feladni kívánt számlákat lehet hozzáadni. Ez az osztály validálja is az átadott szakmai XML-t az XSD-vel.
`manageInvoice` és `manageAnnulment` híváshoz használandó collection, melyhez a feladni kívánt számlákat lehet hozzáadni. Ez az osztály validálja is az átadott szakmai XML-t az XSD-vel. Elektronikus számlázáshoz lásd [ezt a leírást](docs/electronic_invoice.md).

- `__construct($compression = false)`: compression: gzip tömörítés engedélyezése, részletek: NAV dokumentáció, 1.6.5 Tömörítés és méretkorlát
- `useDataSchemaValidation([$flag = true])`: Számla adat hozzáadásakor az XML-t (szakmai XML) validálja az XSD-vel. Alapértelmezetten be van kapcsolva a validáció.
- `add(SimpleXMLElement $xml [, $operation = "CREATE"])`: Számla XML hozzáadása a listához
- `add(SimpleXMLElement $xml [, $operation = "CREATE"][, $electronicInvoiceHash = null])`: Számla XML hozzáadása a listához
- `isTechnicalAnnulment()`
- `getInvoices()`

Expand Down
53 changes: 53 additions & 0 deletions docs/electronic_invoice.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@

# Elektronikus számlázás támogatása

_A koncepció megértéséhez lásd a NAV specifikáció, 2.6. fejezetét: Elektronikus számlázás támogatása. A lenti leírás csak a `nav-online-invoice` modul használatára terjed ki._


## Példafájl

Lásd: [manageInvoice_electronic_invoice.php](../examples/manageInvoice_electronic_invoice.php)


## completenessIndicator=false esetén

Ebben az esetben a felhasználó képezi a hash értéket az elektronikus számláról (pl. PDF fájlról) és ezt a hash értéket adja át számla beküldéskor. Használandó hash algoritmus: SHA3-512.

Példa:

```php
$invoices = new NavOnlineInvoice\InvoiceOperations();

$pdfFileContent = "...";
$electronicInvoiceHash = NavOnlineInvoice\Util::sha3_512($pdfFileContent);

$invoices->add($invoiceXmlObject, "CREATE", $electronicInvoiceHash);

$transactionId = $reporter->manageInvoice($invoices);
```

_Megjegyzés: itt a NAV API elfogadná az SHA-256 hash-t is, viszont a `nav-online-invoice` modulban fixen rögzítve van a SHA3-512-es cryptoType mező, így csak ez utóbbi használható._


## completenessIndicator=true esetén

Ebben az esetben a hash-t az adatszolgáltatásban használt XML-ről (base64 kódolás után) kell képezni. Mivel a base64-es változatot a `nav-online-invoice` modul képezi az XML-ből, így a modul a hash-t is elkészíti automatikus, ha `completenessIndicator=true` (ezt nem kell külön átadni, maga a modul ellenőrzi az átadott számla $xml-ben ezt a mezőt).

Az elkészült hash-t opcionálisan lekérhetjük.

Példa:

```php
$invoices = new NavOnlineInvoice\InvoiceOperations();

$invoices->add($invoiceXmlObject, "CREATE");

$electronicInvoiceHash = $invoices->getLastInvoiceHash();
var_dump($electronicInvoiceHash);

$transactionId = $reporter->manageInvoice($invoices);
```

Ha az átadott xml-ben a `completenessIndicator=true` és kézileg is átadnánk 3. paraméterben egy hash-t értéket, akkor a modul Exception-t fog dobni.


149 changes: 149 additions & 0 deletions docs/xml_namespaces.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,149 @@

# XML namespace-ek

Ha PHP-ban te is [SimpleXML](https://www.php.net/manual/en/book.simplexml.php)-t használsz, akkor itt találsz egy kis segítséget az XML-en belüli namespace-ekhez.


## Namespace-ek az API XML-ekben

A kérésben szereplő XML összeállítását a `nav-online-invoice` modul végzi, így az itt lévő namespace-ek nem érintenek téged.

A válaszban lévő namespace-eket pedig automatikusan eltávolítja a modul, így a válasz $xml-t továbbra is ugyan úgy használhatod, mint a 2.0-ás API-nál.

Példa XML, ami az API-n keresztül érkezik vissza _nyers_ adat (`queryTaxpayer` válasz):

```xml
<?xml version="1.0" encoding="UTF-8"?>
<ns2:QueryTaxpayerResponse xmlns:ns2="http://schemas.nav.gov.hu/OSA/3.0/api" xmlns="http://schemas.nav.gov.hu/NTCA/1.0/common" xmlns:ns3="http://schemas.nav.gov.hu/OSA/3.0/base" xmlns:ns4="http://schemas.nav.gov.hu/OSA/3.0/data">
<header>
<requestId>RID082604200000000000000000</requestId>
<timestamp>2020-10-18T15:00:00.000Z</timestamp>
<requestVersion>3.0</requestVersion>
<headerVersion>1.0</headerVersion>
</header>
<result>
<funcCode>OK</funcCode>
</result>
<ns2:software>
<ns2:softwareId>123456789123456789</ns2:softwareId>
<ns2:softwareName>string</ns2:softwareName>
<ns2:softwareOperation>ONLINE_SERVICE</ns2:softwareOperation>
<ns2:softwareMainVersion>string</ns2:softwareMainVersion>
<ns2:softwareDevName>string</ns2:softwareDevName>
<ns2:softwareDevContact>string</ns2:softwareDevContact>
<ns2:softwareDevCountryCode>HU</ns2:softwareDevCountryCode>
<ns2:softwareDevTaxNumber>string</ns2:softwareDevTaxNumber>
</ns2:software>
<ns2:infoDate>2010-12-31T23:00:00.000Z</ns2:infoDate>
<ns2:taxpayerValidity>true</ns2:taxpayerValidity>
<ns2:taxpayerData>
<ns2:taxpayerName>NEMZETI ADÓ- ÉS VÁMHIVATAL</ns2:taxpayerName>
<ns2:taxNumberDetail>
<ns3:taxpayerId>15789934</ns3:taxpayerId>
<ns3:vatCode>2</ns3:vatCode>
</ns2:taxNumberDetail>
<ns2:incorporation>ORGANIZATION</ns2:incorporation>
<ns2:taxpayerAddressList>
<ns2:taxpayerAddressItem>
<ns2:taxpayerAddressType>HQ</ns2:taxpayerAddressType>
<ns2:taxpayerAddress>
<ns3:countryCode>HU</ns3:countryCode>
<ns3:postalCode>1054</ns3:postalCode>
<ns3:city>BUDAPEST</ns3:city>
<ns3:streetName>SZÉCHENYI</ns3:streetName>
<ns3:publicPlaceCategory>UTCA</ns3:publicPlaceCategory>
<ns3:number>2</ns3:number>
</ns2:taxpayerAddress>
</ns2:taxpayerAddressItem>
</ns2:taxpayerAddressList>
</ns2:taxpayerData>
</ns2:QueryTaxpayerResponse>
```

És az XML, amit a modul ad vissza namespace-ek eltávolítása után:

```xml
<?xml version="1.0" encoding="UTF-8"?>
<QueryTaxpayerResponse xmlns="http://schemas.nav.gov.hu/NTCA/1.0/common" xmlns:ns2="http://schemas.nav.gov.hu/OSA/3.0/api" xmlns:ns3="http://schemas.nav.gov.hu/OSA/3.0/base" xmlns:ns4="http://schemas.nav.gov.hu/OSA/3.0/data">
<header>
<requestId>RID038495400000000000000000</requestId>
<timestamp>2020-10-18T15:00:00.000Z</timestamp>
<requestVersion>3.0</requestVersion>
<headerVersion>1.0</headerVersion>
</header>
<result>
<funcCode>OK</funcCode>
</result>
<software>
<softwareId>123456789123456789</softwareId>
<softwareName>string</softwareName>
<softwareOperation>ONLINE_SERVICE</softwareOperation>
<softwareMainVersion>string</softwareMainVersion>
<softwareDevName>string</softwareDevName>
<softwareDevContact>string</softwareDevContact>
<softwareDevCountryCode>HU</softwareDevCountryCode>
<softwareDevTaxNumber>string</softwareDevTaxNumber>
</software>
<infoDate>2010-12-31T23:00:00.000Z</infoDate>
<taxpayerValidity>true</taxpayerValidity>
<taxpayerData>
<taxpayerName>NEMZETI ADÓ- ÉS VÁMHIVATAL</taxpayerName>
<taxNumberDetail>
<taxpayerId>15789934</taxpayerId>
<vatCode>2</vatCode>
</taxNumberDetail>
<incorporation>ORGANIZATION</incorporation>
<taxpayerAddressList>
<taxpayerAddressItem>
<taxpayerAddressType>HQ</taxpayerAddressType>
<taxpayerAddress>
<countryCode>HU</countryCode>
<postalCode>1054</postalCode>
<city>BUDAPEST</city>
<streetName>SZÉCHENYI</streetName>
<publicPlaceCategory>UTCA</publicPlaceCategory>
<number>2</number>
</taxpayerAddress>
</taxpayerAddressItem>
</taxpayerAddressList>
</taxpayerData>
</QueryTaxpayerResponse>
```

Amennyiben mégis a nyers XML-lel szeretnél dolgozni, úgy azt lekérhetek a művelet meghívása után a következő metódussal:

```php
$reporter->queryTaxpayer("12345678");
$xmlString = $reporter->getLastRequestData()['responseBody'];
```

A namespace-ek nélküli, teljes XML válasz pedig így kérdezhető le:
```php
$reporter->queryTaxpayer("12345678");
$xml = $reporter->getLastResponseXml();
```

Megjegyezném, hogy a legtöbb metódus a `Reporter` osztályon belül már csak a "lényeget" adja vissza, pl. közvetlen a `transactionId`-t, vagy a válasz XML releváns részét.


## Namespace-ek az adat (számla) XML-ben

A számla XML-hez a modul nem nyúl hozzá, így ezt neked kell helyesen összeállítanod, illetve visszakapott számla XML-t (pl. `queryInvoiceData()` hívás esetén) feldolgoznod.

Pl. `supplierAddress`-en belül `detailedAddress` hozzáadása, ami a `http://schemas.nav.gov.hu/OSA/3.0/base`-en belül van:


```php

$addressElement = $supplierAddress->addChild("user", null, "http://schemas.nav.gov.hu/OSA/3.0/base");

$addressElement->addChild("countryCode", "HU");
$addressElement->addChild("region", "...");
// ...
```

A számla beküldése előtt a modul automatikusan ellenőrzi az XML-t a XSD sémákkal.



_Ez a leírás itt a jövőben még bővülhet, illetve ha van bármi észrevételed, írd meg egy issue vagy pull request alatt._
2 changes: 1 addition & 1 deletion examples/config.sample.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
// include_once(__DIR__ . "/../sha3-lib/desktopdSHA3.php");


$apiUrl = "https://api-test.onlineszamla.nav.gov.hu/invoiceService/v3";
$apiUrl = NavOnlineInvoice\Config::TEST_URL; // https://api-test.onlineszamla.nav.gov.hu/invoiceService/v3

$userData = array(
"login" => "username",
Expand Down
2 changes: 1 addition & 1 deletion examples/log.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

include("config.php");

$config = new NavOnlineInvoice\Config(NavOnlineInvoice\Config::TEST_URL, $userData, $softwareData);
$config = new NavOnlineInvoice\Config($apiUrl, $userData, $softwareData);
$reporter = new NavOnlineInvoice\Reporter($config);


Expand Down
Loading

0 comments on commit 5d6e107

Please sign in to comment.