qtx-nav-m2m 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- qtx_nav_m2m-0.1.0/.gitignore +12 -0
- qtx_nav_m2m-0.1.0/AGENTS.md +32 -0
- qtx_nav_m2m-0.1.0/PKG-INFO +223 -0
- qtx_nav_m2m-0.1.0/README.md +208 -0
- qtx_nav_m2m-0.1.0/docs/specifications/M2M ad/303/263z/303/263i adatok lek/303/251rdez/303/251se interf/303/251sz specifik/303/241ci/303/263 1.2.docx +0 -0
- qtx_nav_m2m-0.1.0/docs/specifications/M2M /303/201NYK bizonylat interf/303/251sz specifik/303/241ci/303/263 0.7.docx +0 -0
- qtx_nav_m2m-0.1.0/docs/specifications/M2M /303/241ltal/303/241nos interf/303/251sz specifik/303/241ci/303/263 0.4.docx +0 -0
- qtx_nav_m2m-0.1.0/docs/specifications/M2M /303/272j bizonylat interf/303/251sz specifik/303/241ci/303/263 1.0.docx +0 -0
- qtx_nav_m2m-0.1.0/docs/specifications/README.md +4 -0
- qtx_nav_m2m-0.1.0/main.py +36 -0
- qtx_nav_m2m-0.1.0/openapi/NAVGOVHU-m2m_adozo-1.0.yaml +1688 -0
- qtx_nav_m2m-0.1.0/openapi/NAVGOVHU-m2m_bizonylat-1.0.yaml +752 -0
- qtx_nav_m2m-0.1.0/openapi/NAVGOVHU-m2m_common-1.1.yaml +420 -0
- qtx_nav_m2m-0.1.0/openapi/NAVGOVHU-m2m_document-1.2.yaml +338 -0
- qtx_nav_m2m-0.1.0/openapi/README.md +9 -0
- qtx_nav_m2m-0.1.0/pyproject.toml +43 -0
- qtx_nav_m2m-0.1.0/requirements.txt +3 -0
- qtx_nav_m2m-0.1.0/src/qtx_nav_m2m/__init__.py +187 -0
- qtx_nav_m2m-0.1.0/src/qtx_nav_m2m/client.py +126 -0
- qtx_nav_m2m-0.1.0/src/qtx_nav_m2m/config.py +20 -0
- qtx_nav_m2m-0.1.0/src/qtx_nav_m2m/core/__init__.py +1 -0
- qtx_nav_m2m-0.1.0/src/qtx_nav_m2m/core/authentication.py +11 -0
- qtx_nav_m2m-0.1.0/src/qtx_nav_m2m/core/exceptions.py +39 -0
- qtx_nav_m2m-0.1.0/src/qtx_nav_m2m/core/http_client.py +124 -0
- qtx_nav_m2m-0.1.0/src/qtx_nav_m2m/core/message.py +9 -0
- qtx_nav_m2m-0.1.0/src/qtx_nav_m2m/core/signature.py +18 -0
- qtx_nav_m2m-0.1.0/src/qtx_nav_m2m/services/__init__.py +2 -0
- qtx_nav_m2m-0.1.0/src/qtx_nav_m2m/services/adozo/__init__.py +109 -0
- qtx_nav_m2m-0.1.0/src/qtx_nav_m2m/services/adozo/_base.py +52 -0
- qtx_nav_m2m-0.1.0/src/qtx_nav_m2m/services/adozo/employment.py +36 -0
- qtx_nav_m2m-0.1.0/src/qtx_nav_m2m/services/adozo/legal_relationship.py +40 -0
- qtx_nav_m2m-0.1.0/src/qtx_nav_m2m/services/adozo/models/__init__.py +115 -0
- qtx_nav_m2m-0.1.0/src/qtx_nav_m2m/services/adozo/models/foglalkoztatas.py +175 -0
- qtx_nav_m2m-0.1.0/src/qtx_nav_m2m/services/adozo/models/jogviszony.py +245 -0
- qtx_nav_m2m-0.1.0/src/qtx_nav_m2m/services/adozo/models/koztartozas.py +91 -0
- qtx_nav_m2m-0.1.0/src/qtx_nav_m2m/services/adozo/models/simple.py +157 -0
- qtx_nav_m2m-0.1.0/src/qtx_nav_m2m/services/adozo/models/teteles.py +297 -0
- qtx_nav_m2m-0.1.0/src/qtx_nav_m2m/services/adozo/public_debt.py +24 -0
- qtx_nav_m2m-0.1.0/src/qtx_nav_m2m/services/adozo/returns.py +15 -0
- qtx_nav_m2m-0.1.0/src/qtx_nav_m2m/services/adozo/service.py +73 -0
- qtx_nav_m2m-0.1.0/src/qtx_nav_m2m/services/adozo/tax_account.py +36 -0
- qtx_nav_m2m-0.1.0/src/qtx_nav_m2m/services/bizonylat/__init__.py +47 -0
- qtx_nav_m2m-0.1.0/src/qtx_nav_m2m/services/bizonylat/models.py +280 -0
- qtx_nav_m2m-0.1.0/src/qtx_nav_m2m/services/bizonylat/service.py +302 -0
- qtx_nav_m2m-0.1.0/src/qtx_nav_m2m/services/common/__init__.py +59 -0
- qtx_nav_m2m-0.1.0/src/qtx_nav_m2m/services/common/filestore.py +77 -0
- qtx_nav_m2m-0.1.0/src/qtx_nav_m2m/services/common/models/__init__.py +24 -0
- qtx_nav_m2m-0.1.0/src/qtx_nav_m2m/services/common/models/filestore.py +67 -0
- qtx_nav_m2m-0.1.0/src/qtx_nav_m2m/services/common/models/registration.py +69 -0
- qtx_nav_m2m-0.1.0/src/qtx_nav_m2m/services/common/models/token.py +33 -0
- qtx_nav_m2m-0.1.0/src/qtx_nav_m2m/services/common/registration.py +73 -0
- qtx_nav_m2m-0.1.0/src/qtx_nav_m2m/services/common/token.py +41 -0
- qtx_nav_m2m-0.1.0/src/qtx_nav_m2m/services/document/__init__.py +2 -0
- qtx_nav_m2m-0.1.0/tests/__init__.py +2 -0
- qtx_nav_m2m-0.1.0/tests/test_package.py +738 -0
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# AGENTS.md
|
|
2
|
+
|
|
3
|
+
## Projekt célja
|
|
4
|
+
|
|
5
|
+
A NAV M2M REST/JSON API Python wrapperének elkészítése. A publikus API Python
|
|
6
|
+
függvényeket és típusos Python válaszmodelleket biztosítson; a hívónak ne kelljen
|
|
7
|
+
ismernie a HTTP útvonalakat, headereket, query paramétereket vagy a nyers JSON-t.
|
|
8
|
+
|
|
9
|
+
## Alapelvek
|
|
10
|
+
|
|
11
|
+
- A NAV specifikációk és az OpenAPI fájlok az elsődleges források.
|
|
12
|
+
- A közös kommunikációs, token- és aláíráskezelés ne kerüljön a service-ekbe.
|
|
13
|
+
- Az üzleti végpontokat a `services` alatti modulok különítsék el.
|
|
14
|
+
- A NAV mezőnevei csak a szerializációs rétegben jelenjenek meg.
|
|
15
|
+
- A publikus Python API snake_case elnevezést használjon.
|
|
16
|
+
- A visszaadott értékek nyers `dict` helyett típusos modellek legyenek.
|
|
17
|
+
- Titkokat, tokent, aláírókulcsot és teljes kérésadatot tilos naplózni.
|
|
18
|
+
- A régi `qtx-nav-core` csomaggal ne jöjjön létre függőség.
|
|
19
|
+
|
|
20
|
+
## Projektállapot
|
|
21
|
+
|
|
22
|
+
- A `common` végpontok elkészültek és rendben vannak: token létrehozása,
|
|
23
|
+
nonce beváltása, regisztráció aktiválása, fájl feltöltése és
|
|
24
|
+
vírusellenőrzési állapot lekérdezése.
|
|
25
|
+
- A common végpontok leképezését unit tesztek ellenőrzik; módosításuk esetén
|
|
26
|
+
a meglévő regressziós teszteket is futtatni kell.
|
|
27
|
+
|
|
28
|
+
## Ellenőrzés
|
|
29
|
+
|
|
30
|
+
- Új végpont implementálásakor készüljön unit teszt.
|
|
31
|
+
- A request mappinget az OpenAPI definícióval kell összevetni.
|
|
32
|
+
- A Word és OpenAPI eltéréseit dokumentálni kell, nem szabad találgatással elfedni.
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: qtx-nav-m2m
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Python client library for the NAV M2M REST API
|
|
5
|
+
Author: Pongracz Istvan
|
|
6
|
+
License: MIT
|
|
7
|
+
Requires-Python: >=3.11
|
|
8
|
+
Requires-Dist: httpx<1.0,>=0.28
|
|
9
|
+
Requires-Dist: pydantic<3.0,>=2.11
|
|
10
|
+
Provides-Extra: dev
|
|
11
|
+
Requires-Dist: pytest-asyncio<2.0,>=1.1; extra == 'dev'
|
|
12
|
+
Requires-Dist: pytest<9.0,>=8.4; extra == 'dev'
|
|
13
|
+
Requires-Dist: ruff<1.0,>=0.12; extra == 'dev'
|
|
14
|
+
Description-Content-Type: text/markdown
|
|
15
|
+
|
|
16
|
+
# qtx-nav-m2m
|
|
17
|
+
|
|
18
|
+
Python klienskönyvtár a NAV M2M REST API szolgáltatásaihoz.
|
|
19
|
+
|
|
20
|
+
## Cél
|
|
21
|
+
|
|
22
|
+
Az API-végpontok technikai részleteinek elfedése Python függvényekkel, valamint
|
|
23
|
+
a JSON válaszok típusos Python modellekké alakítása.
|
|
24
|
+
|
|
25
|
+
## Támogatott területek
|
|
26
|
+
|
|
27
|
+
- `common`: tokenkezelés, nonce beváltás, regisztráció aktiválása, NAV közös fájltár
|
|
28
|
+
- `bizonylat`: új formátumú bizonylatok kalkulációja, validációja és beküldése
|
|
29
|
+
- `adozo`: adózói adatok lekérdezése
|
|
30
|
+
- `document`: régi ÁNYK-formátumú bizonylatok kezelése, későbbre hagyva
|
|
31
|
+
|
|
32
|
+
## Megvalósítási állapot
|
|
33
|
+
|
|
34
|
+
A `common` végpontok elkészültek és unit tesztekkel ellenőrzöttek:
|
|
35
|
+
|
|
36
|
+
- token létrehozása
|
|
37
|
+
- nonce beváltása és regisztráció aktiválása
|
|
38
|
+
- fájl feltöltése a NAV közös fájltárába, majd a vírusellenőrzési állapot lekérdezése
|
|
39
|
+
|
|
40
|
+
A kliens futás közben is használható új tokennel és a regisztráció után összeálló
|
|
41
|
+
végleges aláírókulccsal. A `set_config()` új HTTP-klienst hoz létre, és eldobja a
|
|
42
|
+
régi tokeneket és a hozzájuk tartozó runtime állapotot.
|
|
43
|
+
|
|
44
|
+
## Egylépéses regisztráció
|
|
45
|
+
|
|
46
|
+
A teljes NAV-regisztrációt a kliens `register()` metódusa vezényli le. A `nonce`
|
|
47
|
+
továbbra is bemenő adat, mert ezt a NAV ideiglenes jelszóként kéri a nonce
|
|
48
|
+
végponton; a második kulcsrész már a NAV válaszából érkezik.
|
|
49
|
+
|
|
50
|
+
```python
|
|
51
|
+
result = client.register(
|
|
52
|
+
key_first_part="...",
|
|
53
|
+
nonce="...",
|
|
54
|
+
activation_message_id="...",
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
signature_key = result.signature_key
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Az aktiválás után a kliens automatikusan új access tokent kér, így a
|
|
61
|
+
`register()` visszatérésekor a kliens már közvetlenül használható.
|
|
62
|
+
|
|
63
|
+
## Adózó service
|
|
64
|
+
|
|
65
|
+
Az adózói adatlekérdezések a `client.adozo` szolgáltatáson keresztül érhetők el.
|
|
66
|
+
A kliens automatikusan generálja a `messageId` értéket, valamint a NAV
|
|
67
|
+
specifikáció szerinti signature-t.
|
|
68
|
+
|
|
69
|
+
Támogatott végpontok:
|
|
70
|
+
|
|
71
|
+
- összesített és tételes adószámla
|
|
72
|
+
- köztartozás-egyenleg
|
|
73
|
+
- hiányzó bevallások
|
|
74
|
+
- biztosítotti jogviszony és a lekérdezés státusza
|
|
75
|
+
- egyszerűsített foglalkoztatás egy foglalkoztatottra vagy foglalkoztatói listára
|
|
76
|
+
- köztartozásmentesség (KOMA)
|
|
77
|
+
|
|
78
|
+
Példa köztartozás-egyenleg lekérdezésére:
|
|
79
|
+
|
|
80
|
+
```python
|
|
81
|
+
from qtx_nav_m2m import M2mClient
|
|
82
|
+
|
|
83
|
+
with M2mClient(config) as client:
|
|
84
|
+
response = client.adozo.get_koztartozas_egyenleg(
|
|
85
|
+
adoalany_azonosito="12345678",
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
if response.koztartozas_egyenleg is not None:
|
|
89
|
+
print(response.koztartozas_egyenleg.osszes_eloiras)
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## Bizonylat service
|
|
93
|
+
|
|
94
|
+
Az új formátumú bizonylatok végpontjai a `client.bizonylat` szolgáltatáson
|
|
95
|
+
keresztül érhetők el:
|
|
96
|
+
|
|
97
|
+
- `create_kalkulacio` és `get_kalkulacio`
|
|
98
|
+
- `create_validacio` és `get_validacio`
|
|
99
|
+
- `create_bizonylat` és `get_bizonylat`
|
|
100
|
+
|
|
101
|
+
A létrehozó műveletek `bytes` típusú XML-t fogadnak. A kliens elvégzi az
|
|
102
|
+
opcionális GZIP tömörítést, a SHA-256 hash képzését, a NAV signature
|
|
103
|
+
előállítását és a Base64 kódolást. A státuszlekérdezésekhez az indító művelet
|
|
104
|
+
által visszaadott `ugy_azonosito` szükséges.
|
|
105
|
+
|
|
106
|
+
```python
|
|
107
|
+
with M2mClient(config) as client:
|
|
108
|
+
response = client.bizonylat.create_validacio(
|
|
109
|
+
bizonylat_tipus="T1042E",
|
|
110
|
+
bizonylat_verzio="1.0",
|
|
111
|
+
bizonylat_xml=b"<Bizonylat />",
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
if response.ugy_azonosito is not None:
|
|
115
|
+
status = client.bizonylat.get_validacio(response.ugy_azonosito)
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
A `*_from_path()` kényelmi metódusok csak beolvassák a fájlt, majd továbbadják
|
|
119
|
+
a meglévő `bytes`-os API-nak. Ez hasznos a fájlválasztós felhasználói flow-nál,
|
|
120
|
+
de a core logikát nem duplikálja.
|
|
121
|
+
|
|
122
|
+
## Dokumentált specifikációs eltérés: bizonylat
|
|
123
|
+
|
|
124
|
+
A bizonylat specifikációk között két eltérés található:
|
|
125
|
+
|
|
126
|
+
- az OpenAPI leírás 30 másodperces, a DOCX specifikáció 60 másodperces
|
|
127
|
+
szinkron válaszidőt említ;
|
|
128
|
+
- a signature műveletfüggő adata a bizonylat XML SHA-256 hash-e. A hash
|
|
129
|
+
reprezentációját az OpenAPI nem részletezi, ezért a NAV általános
|
|
130
|
+
interfészpéldáját követve a hexadecimális SHA-256 értéket használjuk.
|
|
131
|
+
|
|
132
|
+
Ezeket az eltéréseket nem fedjük el találgatással; az implementáció és a
|
|
133
|
+
tesztek ezt a döntést követik.
|
|
134
|
+
|
|
135
|
+
## HTTP-kliens és API-verziók
|
|
136
|
+
|
|
137
|
+
A `M2mClient` egy közös `M2mHttpClient` példányt használ, amelyet az összes
|
|
138
|
+
service megoszt. A token és a közös HTTP-beállítások így minden service számára
|
|
139
|
+
elérhetők.
|
|
140
|
+
|
|
141
|
+
A `common.filestore` nem ugyanaz, mint a `bizonylat` service:
|
|
142
|
+
|
|
143
|
+
- a `common.filestore` a NAV közös fájltárába tölt fel egy nyers fájlt, majd a
|
|
144
|
+
fájlazonosító alapján a feldolgozási állapotot lehet lekérdezni;
|
|
145
|
+
- a `bizonylat` service XML-alapú NAV dokumentumküldést kezel, saját signature-
|
|
146
|
+
és payload-szabályokkal.
|
|
147
|
+
|
|
148
|
+
Az API-verzió nem a klienshez kötött, hanem az egyes kéréseknél adható meg. Ez
|
|
149
|
+
lehetővé teszi, hogy a common végpontok a `/rest-api/1.1`, míg például az adozo
|
|
150
|
+
végpontok a saját specifikációjuk szerinti `/rest-api/1.0` útvonalon működjenek
|
|
151
|
+
ugyanazzal a HTTP-klienssel és tokennel.
|
|
152
|
+
|
|
153
|
+
## Projekt-előkészítés
|
|
154
|
+
|
|
155
|
+
```bash
|
|
156
|
+
python -m venv .venv
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
Windows PowerShell:
|
|
160
|
+
|
|
161
|
+
```powershell
|
|
162
|
+
.venv\Scripts\Activate.ps1
|
|
163
|
+
python -m pip install -U pip
|
|
164
|
+
python -m pip install -e ".[dev]"
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
## Dokumentációk elhelyezése
|
|
168
|
+
|
|
169
|
+
- A NAV DOCX specifikációk helye: `docs/specifications/`
|
|
170
|
+
- A Swagger/OpenAPI YAML fájlok helye: `openapi/`
|
|
171
|
+
|
|
172
|
+
Ezek a forrásanyagok nincsenek a kezdőcsomagba bemásolva.
|
|
173
|
+
|
|
174
|
+
## Forráskód és aktuális mappastruktúra
|
|
175
|
+
|
|
176
|
+
```text
|
|
177
|
+
qtx_nav_m2m/
|
|
178
|
+
├── main.py
|
|
179
|
+
├── openapi/
|
|
180
|
+
├── docs/
|
|
181
|
+
├── README.md
|
|
182
|
+
├── src/
|
|
183
|
+
│ └── qtx_nav_m2m/
|
|
184
|
+
│ ├── __init__.py
|
|
185
|
+
│ ├── client.py
|
|
186
|
+
│ ├── config.py
|
|
187
|
+
│ ├── core/
|
|
188
|
+
│ │ ├── authentication.py
|
|
189
|
+
│ │ ├── exceptions.py
|
|
190
|
+
│ │ ├── http_client.py
|
|
191
|
+
│ │ ├── message.py
|
|
192
|
+
│ │ └── signature.py
|
|
193
|
+
│ └── services/
|
|
194
|
+
│ ├── adozo/
|
|
195
|
+
│ │ ├── _base.py
|
|
196
|
+
│ │ ├── employment.py
|
|
197
|
+
│ │ ├── legal_relationship.py
|
|
198
|
+
│ │ ├── models/
|
|
199
|
+
│ │ ├── public_debt.py
|
|
200
|
+
│ │ ├── returns.py
|
|
201
|
+
│ │ ├── service.py
|
|
202
|
+
│ │ └── tax_account.py
|
|
203
|
+
│ ├── bizonylat/
|
|
204
|
+
│ │ ├── models/
|
|
205
|
+
│ │ └── service.py
|
|
206
|
+
│ └── common/
|
|
207
|
+
│ ├── __init__.py
|
|
208
|
+
│ ├── filestore.py
|
|
209
|
+
│ ├── models/
|
|
210
|
+
│ ├── registration.py
|
|
211
|
+
│ └── token.py
|
|
212
|
+
└── tests/
|
|
213
|
+
└── test_package.py
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
## Smoke test
|
|
217
|
+
|
|
218
|
+
A gyökérben található `main.py` placeholder hitelesítési adatokkal meghívja a
|
|
219
|
+
token végpontot. Ezzel ellenőrizhető, hogy a NAV szerver elérhető-e:
|
|
220
|
+
|
|
221
|
+
```powershell
|
|
222
|
+
.venv\Scripts\python.exe main.py
|
|
223
|
+
```
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
# qtx-nav-m2m
|
|
2
|
+
|
|
3
|
+
Python klienskönyvtár a NAV M2M REST API szolgáltatásaihoz.
|
|
4
|
+
|
|
5
|
+
## Cél
|
|
6
|
+
|
|
7
|
+
Az API-végpontok technikai részleteinek elfedése Python függvényekkel, valamint
|
|
8
|
+
a JSON válaszok típusos Python modellekké alakítása.
|
|
9
|
+
|
|
10
|
+
## Támogatott területek
|
|
11
|
+
|
|
12
|
+
- `common`: tokenkezelés, nonce beváltás, regisztráció aktiválása, NAV közös fájltár
|
|
13
|
+
- `bizonylat`: új formátumú bizonylatok kalkulációja, validációja és beküldése
|
|
14
|
+
- `adozo`: adózói adatok lekérdezése
|
|
15
|
+
- `document`: régi ÁNYK-formátumú bizonylatok kezelése, későbbre hagyva
|
|
16
|
+
|
|
17
|
+
## Megvalósítási állapot
|
|
18
|
+
|
|
19
|
+
A `common` végpontok elkészültek és unit tesztekkel ellenőrzöttek:
|
|
20
|
+
|
|
21
|
+
- token létrehozása
|
|
22
|
+
- nonce beváltása és regisztráció aktiválása
|
|
23
|
+
- fájl feltöltése a NAV közös fájltárába, majd a vírusellenőrzési állapot lekérdezése
|
|
24
|
+
|
|
25
|
+
A kliens futás közben is használható új tokennel és a regisztráció után összeálló
|
|
26
|
+
végleges aláírókulccsal. A `set_config()` új HTTP-klienst hoz létre, és eldobja a
|
|
27
|
+
régi tokeneket és a hozzájuk tartozó runtime állapotot.
|
|
28
|
+
|
|
29
|
+
## Egylépéses regisztráció
|
|
30
|
+
|
|
31
|
+
A teljes NAV-regisztrációt a kliens `register()` metódusa vezényli le. A `nonce`
|
|
32
|
+
továbbra is bemenő adat, mert ezt a NAV ideiglenes jelszóként kéri a nonce
|
|
33
|
+
végponton; a második kulcsrész már a NAV válaszából érkezik.
|
|
34
|
+
|
|
35
|
+
```python
|
|
36
|
+
result = client.register(
|
|
37
|
+
key_first_part="...",
|
|
38
|
+
nonce="...",
|
|
39
|
+
activation_message_id="...",
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
signature_key = result.signature_key
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
Az aktiválás után a kliens automatikusan új access tokent kér, így a
|
|
46
|
+
`register()` visszatérésekor a kliens már közvetlenül használható.
|
|
47
|
+
|
|
48
|
+
## Adózó service
|
|
49
|
+
|
|
50
|
+
Az adózói adatlekérdezések a `client.adozo` szolgáltatáson keresztül érhetők el.
|
|
51
|
+
A kliens automatikusan generálja a `messageId` értéket, valamint a NAV
|
|
52
|
+
specifikáció szerinti signature-t.
|
|
53
|
+
|
|
54
|
+
Támogatott végpontok:
|
|
55
|
+
|
|
56
|
+
- összesített és tételes adószámla
|
|
57
|
+
- köztartozás-egyenleg
|
|
58
|
+
- hiányzó bevallások
|
|
59
|
+
- biztosítotti jogviszony és a lekérdezés státusza
|
|
60
|
+
- egyszerűsített foglalkoztatás egy foglalkoztatottra vagy foglalkoztatói listára
|
|
61
|
+
- köztartozásmentesség (KOMA)
|
|
62
|
+
|
|
63
|
+
Példa köztartozás-egyenleg lekérdezésére:
|
|
64
|
+
|
|
65
|
+
```python
|
|
66
|
+
from qtx_nav_m2m import M2mClient
|
|
67
|
+
|
|
68
|
+
with M2mClient(config) as client:
|
|
69
|
+
response = client.adozo.get_koztartozas_egyenleg(
|
|
70
|
+
adoalany_azonosito="12345678",
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
if response.koztartozas_egyenleg is not None:
|
|
74
|
+
print(response.koztartozas_egyenleg.osszes_eloiras)
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## Bizonylat service
|
|
78
|
+
|
|
79
|
+
Az új formátumú bizonylatok végpontjai a `client.bizonylat` szolgáltatáson
|
|
80
|
+
keresztül érhetők el:
|
|
81
|
+
|
|
82
|
+
- `create_kalkulacio` és `get_kalkulacio`
|
|
83
|
+
- `create_validacio` és `get_validacio`
|
|
84
|
+
- `create_bizonylat` és `get_bizonylat`
|
|
85
|
+
|
|
86
|
+
A létrehozó műveletek `bytes` típusú XML-t fogadnak. A kliens elvégzi az
|
|
87
|
+
opcionális GZIP tömörítést, a SHA-256 hash képzését, a NAV signature
|
|
88
|
+
előállítását és a Base64 kódolást. A státuszlekérdezésekhez az indító művelet
|
|
89
|
+
által visszaadott `ugy_azonosito` szükséges.
|
|
90
|
+
|
|
91
|
+
```python
|
|
92
|
+
with M2mClient(config) as client:
|
|
93
|
+
response = client.bizonylat.create_validacio(
|
|
94
|
+
bizonylat_tipus="T1042E",
|
|
95
|
+
bizonylat_verzio="1.0",
|
|
96
|
+
bizonylat_xml=b"<Bizonylat />",
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
if response.ugy_azonosito is not None:
|
|
100
|
+
status = client.bizonylat.get_validacio(response.ugy_azonosito)
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
A `*_from_path()` kényelmi metódusok csak beolvassák a fájlt, majd továbbadják
|
|
104
|
+
a meglévő `bytes`-os API-nak. Ez hasznos a fájlválasztós felhasználói flow-nál,
|
|
105
|
+
de a core logikát nem duplikálja.
|
|
106
|
+
|
|
107
|
+
## Dokumentált specifikációs eltérés: bizonylat
|
|
108
|
+
|
|
109
|
+
A bizonylat specifikációk között két eltérés található:
|
|
110
|
+
|
|
111
|
+
- az OpenAPI leírás 30 másodperces, a DOCX specifikáció 60 másodperces
|
|
112
|
+
szinkron válaszidőt említ;
|
|
113
|
+
- a signature műveletfüggő adata a bizonylat XML SHA-256 hash-e. A hash
|
|
114
|
+
reprezentációját az OpenAPI nem részletezi, ezért a NAV általános
|
|
115
|
+
interfészpéldáját követve a hexadecimális SHA-256 értéket használjuk.
|
|
116
|
+
|
|
117
|
+
Ezeket az eltéréseket nem fedjük el találgatással; az implementáció és a
|
|
118
|
+
tesztek ezt a döntést követik.
|
|
119
|
+
|
|
120
|
+
## HTTP-kliens és API-verziók
|
|
121
|
+
|
|
122
|
+
A `M2mClient` egy közös `M2mHttpClient` példányt használ, amelyet az összes
|
|
123
|
+
service megoszt. A token és a közös HTTP-beállítások így minden service számára
|
|
124
|
+
elérhetők.
|
|
125
|
+
|
|
126
|
+
A `common.filestore` nem ugyanaz, mint a `bizonylat` service:
|
|
127
|
+
|
|
128
|
+
- a `common.filestore` a NAV közös fájltárába tölt fel egy nyers fájlt, majd a
|
|
129
|
+
fájlazonosító alapján a feldolgozási állapotot lehet lekérdezni;
|
|
130
|
+
- a `bizonylat` service XML-alapú NAV dokumentumküldést kezel, saját signature-
|
|
131
|
+
és payload-szabályokkal.
|
|
132
|
+
|
|
133
|
+
Az API-verzió nem a klienshez kötött, hanem az egyes kéréseknél adható meg. Ez
|
|
134
|
+
lehetővé teszi, hogy a common végpontok a `/rest-api/1.1`, míg például az adozo
|
|
135
|
+
végpontok a saját specifikációjuk szerinti `/rest-api/1.0` útvonalon működjenek
|
|
136
|
+
ugyanazzal a HTTP-klienssel és tokennel.
|
|
137
|
+
|
|
138
|
+
## Projekt-előkészítés
|
|
139
|
+
|
|
140
|
+
```bash
|
|
141
|
+
python -m venv .venv
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
Windows PowerShell:
|
|
145
|
+
|
|
146
|
+
```powershell
|
|
147
|
+
.venv\Scripts\Activate.ps1
|
|
148
|
+
python -m pip install -U pip
|
|
149
|
+
python -m pip install -e ".[dev]"
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
## Dokumentációk elhelyezése
|
|
153
|
+
|
|
154
|
+
- A NAV DOCX specifikációk helye: `docs/specifications/`
|
|
155
|
+
- A Swagger/OpenAPI YAML fájlok helye: `openapi/`
|
|
156
|
+
|
|
157
|
+
Ezek a forrásanyagok nincsenek a kezdőcsomagba bemásolva.
|
|
158
|
+
|
|
159
|
+
## Forráskód és aktuális mappastruktúra
|
|
160
|
+
|
|
161
|
+
```text
|
|
162
|
+
qtx_nav_m2m/
|
|
163
|
+
├── main.py
|
|
164
|
+
├── openapi/
|
|
165
|
+
├── docs/
|
|
166
|
+
├── README.md
|
|
167
|
+
├── src/
|
|
168
|
+
│ └── qtx_nav_m2m/
|
|
169
|
+
│ ├── __init__.py
|
|
170
|
+
│ ├── client.py
|
|
171
|
+
│ ├── config.py
|
|
172
|
+
│ ├── core/
|
|
173
|
+
│ │ ├── authentication.py
|
|
174
|
+
│ │ ├── exceptions.py
|
|
175
|
+
│ │ ├── http_client.py
|
|
176
|
+
│ │ ├── message.py
|
|
177
|
+
│ │ └── signature.py
|
|
178
|
+
│ └── services/
|
|
179
|
+
│ ├── adozo/
|
|
180
|
+
│ │ ├── _base.py
|
|
181
|
+
│ │ ├── employment.py
|
|
182
|
+
│ │ ├── legal_relationship.py
|
|
183
|
+
│ │ ├── models/
|
|
184
|
+
│ │ ├── public_debt.py
|
|
185
|
+
│ │ ├── returns.py
|
|
186
|
+
│ │ ├── service.py
|
|
187
|
+
│ │ └── tax_account.py
|
|
188
|
+
│ ├── bizonylat/
|
|
189
|
+
│ │ ├── models/
|
|
190
|
+
│ │ └── service.py
|
|
191
|
+
│ └── common/
|
|
192
|
+
│ ├── __init__.py
|
|
193
|
+
│ ├── filestore.py
|
|
194
|
+
│ ├── models/
|
|
195
|
+
│ ├── registration.py
|
|
196
|
+
│ └── token.py
|
|
197
|
+
└── tests/
|
|
198
|
+
└── test_package.py
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
## Smoke test
|
|
202
|
+
|
|
203
|
+
A gyökérben található `main.py` placeholder hitelesítési adatokkal meghívja a
|
|
204
|
+
token végpontot. Ezzel ellenőrizhető, hogy a NAV szerver elérhető-e:
|
|
205
|
+
|
|
206
|
+
```powershell
|
|
207
|
+
.venv\Scripts\python.exe main.py
|
|
208
|
+
```
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"""Minimal NAV M2M connectivity smoke test."""
|
|
2
|
+
|
|
3
|
+
from qtx_nav_m2m import M2mClient, M2mConfig
|
|
4
|
+
from qtx_nav_m2m.core.exceptions import (
|
|
5
|
+
M2mConnectionError,
|
|
6
|
+
M2mError,
|
|
7
|
+
M2mHttpError,
|
|
8
|
+
M2mTimeoutError,
|
|
9
|
+
)
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def main() -> None:
|
|
13
|
+
config = M2mConfig(
|
|
14
|
+
client_id="smoke-test-client",
|
|
15
|
+
client_secret="smoke-test-secret",
|
|
16
|
+
username="smoke-test-user",
|
|
17
|
+
password="smoke-test-password",
|
|
18
|
+
signature_key="smoke-test-signature-key",
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
try:
|
|
22
|
+
with M2mClient(config) as client:
|
|
23
|
+
response = client.common.create_token(message_id="smoke-test-message")
|
|
24
|
+
print(f"NAV server response: {response.result_code.value}")
|
|
25
|
+
except M2mHttpError as exc:
|
|
26
|
+
print(f"NAV server reached; HTTP error: {exc.status_code}")
|
|
27
|
+
except M2mTimeoutError:
|
|
28
|
+
print("NAV server could not be reached: request timed out")
|
|
29
|
+
except M2mConnectionError:
|
|
30
|
+
print("NAV server could not be reached: connection error")
|
|
31
|
+
except M2mError as exc:
|
|
32
|
+
print(f"NAV M2M client error: {exc}")
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
if __name__ == "__main__":
|
|
36
|
+
main()
|