Korábban már volt erről szól (https://github.com/nav-gov-hu/Online-Invoice/issues/78) , akkor az alapján le is fejlesztettem, tesztelve működik is, de élesben a gyakorlatban rendszeresen előjön. Hogy lehetne ezt megszüntetni?
Tehát a felállás a következő:
Ha ilyet tapasztalok, akkor Ăgy járok el jelenleg:
A fenti esemĂ©nyt Ăşgy tudom tesztelni, hogy a teszt rendszerben a manageinvoice-ot hagyom lefutni, de utána megszakĂtom a program futását, hogy az ne tudja letárolni a tranzakciĂłazonosĂtĂłt, ezzel elĹ‘idĂ©zve/szimulálva egy esetleges NAV ĂĽzemszĂĽnetet. Viszont valahogy mĂ©gse 100% ez a tesztelĂ©si mĂłdszer,mert ilyen esetben már a 4-es pont is mindig sikerrel jár, igaz azt is felĂĽl tudom bĂrálni teszt jelleggel, hogy sikertelen legyen, viszont ebben az esetben is sikeresen lesz az 5-ös pont.
Látszólag tehát tökéletesen megoldottam az INVOICE_NUMBER_NOT_UNIQUE elkerülését a gyakorlatban azonban mind a saját számlázásunkban, mind az ügyfeleknél tömegesen fordul elő ilyen üzenet egy NAV üzemszünet esetén? Hogy fordulhat ez elő? Mi lehet a gond? Hogy tudom elkerülni?
Egy olyan megoldást kĂ©rnĂ©nk szĂ©pen a problĂ©mára, ami ELKERĂśLI ezt a problĂ©mát Ă©s nem utĂłlag orvosolja. CĂ©lzok itt arra, hogy a legtöbben Ăşgy oldották meg ezt a kĂ©rdĂ©st, hogy utĂłlag az Ăgy kapott hibát megprĂłbálják elsikálni, Ă©n viszont be sem szeretnĂ©m kĂĽldeni Ăşjra a számlát, hogy ne is kapjak ilyen ĂĽzenetet Ă©s akkor az ĂĽgyfĂ©l sem kap rĂłla e-mailt.
Egy kis tapasztalat-megosztás: Mi is pontosan a te általad felvázolt lĂ©pĂ©sekkel keresĂĽnk tranzakciĂłazonosĂtĂłt, mivel arra jutottunk, hogy ez a legjobb megoldás. A manageinvoice bekĂĽldĂ©s idĹ‘bĂ©lyege utáni 1 perces intervallumra kĂ©rtĂĽk le a tranzakciĂł azonosĂtĂłkat Ă©s kerestĂĽnk benne, de a legutĂłbbi NAV szolgáltatáskiesĂ©s kapcsán jöttĂĽnk rá arra, hogy a bekĂĽldĂ©s után elĹ‘fordul, hogy több perccel kĂ©pzĹ‘dik meg a tĂ©nyleges beszĂşrás, Ăgy pl. nem volt találatunk Ă©s ABORTED lett az Ăşjra bekĂĽldĂ©s. Ezt az intervallumot felemeltĂĽk 10 percre, meglátjuk mi sĂĽl ki belĹ‘le.
Köszi, én +/- 4 perces időablakot nézek, már én is gondoltam rá, hogy lehet esetleg ezt kellene feljebb venni...
Nálunk ugyanez a megoldás.
Viszont!
Mi úgy értelmezzük a jogszabályt, hogy az adatszolgáltatás akkor tekinthető sikeresnek és befejezettnek, ha visszakapjuk a DONE státuszt a feldolgozásról. Értelemszerűen, ha a számla a megadott értékhatáron felüli, akkor ennek _aznap_ meg kellene történnie. Ez, tapasztalatunk szerint sem -mindig- jön össze.
EzĂ©rt, szeretnĂ©nk, ha ez stabilan, az adĂłzĂł oldalárĂłl kĂ©zi beavatkozás nĂ©lkĂĽl, kiszámĂthatĂł mĂłdon törtĂ©nne meg. PĂ©ldául, szerver oldali hiba esetĂ©n, ha nem tudja a rendszer visszaigazolni az adatszolgáltatást, akkor be se fogadja.
Jelenleg egy rendszerhiba esetén az adózó (vele pedig a szoftverfejlesztő) nyakába varrható az egész azzal, hogy nem kérdezte le a státuszt.
TekintsĂĽnk el attĂłl, hogy a felĂĽleten kĂ©zzel lekĂ©rhetĹ‘ a státusz, elsĹ‘dlegesen azĂ©rt, mert a lekĂ©rdezĂ©st nem ugyanaz a (technikai) felhasználĂł vĂ©gzi, mint aki az adatszolgáltatást teljesĂtette.
Abba pedig már ne menjĂĽnk bele, hogy mivel igazolja az adĂłzĂł, hogy a kötelezettsĂ©gĂ©t rendszerhiba miatt nem tudta teljesĂteni vagy abba, hogy a jogszabály nem tiltja, hogy egy számlárĂłl többször törtĂ©njen adatszolgáltatás.
A lényeg: a klienshibákat kliensoldalon, a szerverhibákat szerveroldalon kell orvosolni.
Korábban már volt erről szól (#78) , akkor az alapján le is fejlesztettem, tesztelve működik is, de élesben a gyakorlatban rendszeresen előjön. Hogy lehetne ezt megszüntetni?
Tehát a felállás a következő:
- Elkészül a számla
- Beküldésre kerül a NAV-hoz
- A NAV ezt be is fogadja, de válasz már nem Ă©rkezik a manageinvoice operáciĂłra, Ăgy tranzakciĂł azonosĂtĂł sincs.
Ha ilyet tapasztalok, akkor Ăgy járok el jelenleg:
- queryIncoiceData-val megprĂłbálom megállapĂtani a korábbi bekĂĽldĂ©s tranzakciĂł azonosĂtĂłját számlaszám alapján
- Ha ez sem hozott eredmĂ©nyt, akkor a queryTransactionList operáciĂłval listázom a tranzakciĂłkat, majd a queryTransactionStatus ReturnOriginalRequest használatával megállapĂtom, hogy tĂ©nyleg a megadott számlához tartozik-e a tranzakciĂł azonosĂtĂł.
- Ha a 4-es vagy 5-ös pont sikerrel jár, akkor meg van a tranzakciĂł azonosĂtĂł Ă©s minden szĂ©p, ha nem járt sikerrel, akkor a manageInvoice operáciĂłt megismĂ©tlem.
A fenti esemĂ©nyt Ăşgy tudom tesztelni, hogy a teszt rendszerben a manageinvoice-ot hagyom lefutni, de utána megszakĂtom a program futását, hogy az ne tudja letárolni a tranzakciĂłazonosĂtĂłt, ezzel elĹ‘idĂ©zve/szimulálva egy esetleges NAV ĂĽzemszĂĽnetet. Viszont valahogy mĂ©gse 100% ez a tesztelĂ©si mĂłdszer,mert ilyen esetben már a 4-es pont is mindig sikerrel jár, igaz azt is felĂĽl tudom bĂrálni teszt jelleggel, hogy sikertelen legyen, viszont ebben az esetben is sikeresen lesz az 5-ös pont.
Látszólag tehát tökéletesen megoldottam az INVOICE_NUMBER_NOT_UNIQUE elkerülését a gyakorlatban azonban mind a saját számlázásunkban, mind az ügyfeleknél tömegesen fordul elő ilyen üzenet egy NAV üzemszünet esetén? Hogy fordulhat ez elő? Mi lehet a gond? Hogy tudom elkerülni?
A #378-as Issue-ban tapasztalt kommunikáciĂł alapján sosem fog megvalĂłsulni, de milyen egyszerű lenne, ha a INVOICE_NUMBER_NOT_UNIQUE hiba mellĂ© odatennĂ©k a TranzakciĂłs ID-t, amin korábban fel lett töltve ez a számla Ă©s ez a kĂ©t lĂ©pĂ©s, ami vagy megy, -vagy mint mĂşlt hĂ©ten is láttuk- vagy nem, feleslegessĂ© válna. De valĂłszĂnűleg ennek a tagnek a beszĂşrása (ami az egyedisĂ©g megállapĂtásakor rendelkezĂ©sre áll) hatalmas performancia gondokba ĂĽtközne. :-)
Az a gond, hogy a 2. pont többször fut le, mert nem kap választ és mire a 3.-hoz érsz már legalább 2-szer elküldted.
A jĂł megoldás az lehetne, hogy ha már egyszer prĂłbáltad elkĂĽldeni, akkor a következĹ‘t addig nem kezded el, amĂg vagy nem kapsz választ, vagy le nem csekkoltad, hogy van-e már adatszolgáltatás bekĂĽldve.
Ez utĂłbbi ellenĹ‘rzĂ©st a queryInvoiceCheck operáciĂłval lehet a legegyszerűbben megtenni. Mert ez annyit ad vissza, hogy igen vagy nem, Ă©s ez Ăgy nem terheli a rendszert adatokkal. Eddig nem sok Ă©rtelmĂ©t láttam ennek az operáciĂłnak, de Ăgy ebben a helyzetben ez a legideálisabb.
Egyébként ha a queryInvoiceData nem ad eredményt, akkor milyen tranzakciót tudsz találni a queryTransactionList-tel?
Nálunk egyelĹ‘re marad a NOT UNIQUE hiba kezelĂ©se, mert egyelĹ‘re nincs idĹ‘ átĂrni a megelĹ‘zĹ‘ mĂłdszerre.
A jĂł megoldás az lehetne, hogy ha már egyszer prĂłbáltad elkĂĽldeni, akkor a következĹ‘t addig nem kezded el, amĂg vagy nem kapsz választ, vagy le nem csekkoltad, hogy van-e már adatszolgáltatás bekĂĽldve.
Ez utĂłbbi ellenĹ‘rzĂ©st a queryInvoiceCheck operáciĂłval lehet a legegyszerűbben megtenni. Mert ez annyit ad vissza, hogy igen vagy nem, Ă©s ez Ăgy nem terheli a rendszert adatokkal. Eddig nem sok Ă©rtelmĂ©t láttam ennek az operáciĂłnak, de Ăgy ebben a helyzetben ez a legideálisabb.EgyĂ©bkĂ©nt ha a queryInvoiceData nem ad eredmĂ©nyt, akkor milyen tranzakciĂłt tudsz találni a queryTransactionList-tel?
Nálunk egyelĹ‘re marad a NOT UNIQUE hiba kezelĂ©se, mert egyelĹ‘re nincs idĹ‘ átĂrni a megelĹ‘zĹ‘ mĂłdszerre.
MĂşlt hĂ©ten Ăşgy tűnt, hogy a queryInvoiceData egy darabig le volt állĂtva, ez esetben volt megoldás szerintem a queryTransactionList, már ha az működött.
Ha a queryInvoice* hĂvások nem adnak vissza számlaszámot, akkor honnan tudod, hogy azĂ©rt, mert:
a, nem jutott el a kérés a NAV-ig vagy ABORTED lett
b, még feldolgozás alatt van náluk és később fog bekerülni DONE státusszal?
Szerintem a queryInvoiceCheck operáciĂłt kĂ©ne Ăşgy bĹ‘vĂteni, hogy ne csak true vagy false Ă©rtĂ©ket adjon vissza, hanem azt is lehessen látni, ha már bent van a számla, de mĂ©g nem kerĂĽlt feldolgozásra. Ezzel a mĂłdszerrel el lehetne kerĂĽlni a dupla kĂĽldĂ©st, mert akkor csak ezt a hĂvást kell addig ismĂ©telnem, amĂg "valĂłdi" false vagy true Ă©rtĂ©ket nem kapok vissza.
Ezzel szerintem az a gond, hogy a NAV oldalán nem tudják a beküldéshez (TransationId+Index) tartozó számlaszámot, csak egy bizonyos pont után.
A #378-as Issue-ban tapasztalt kommunikáció alapján sosem fog megvalósulni, de milyen egyszerű lenne, ha a INVOICE_NUMBER_NOT_UNIQUE hiba mellé odatennék a Tranzakciós ID-t, amin korábban fel lett töltve ez a számla és ez a két lépés, ami vagy megy, -vagy mint múlt héten is láttuk- vagy nem, feleslegessé válna.
Ez egĂ©sz jĂł ötlet! @NTCA-developer: megvizsgáljátok, hogy ez megvalĂłsĂthatĂł-e? Vagy volt már errĹ‘l szĂł?
@NTCA-supporter @NTCA-tax
A queryInvoiceCheck/Data operációk melyik státusztól kezdve látják az adatszolgáltatást?
Ha e kettő nem ad vissza választ, akkor van-e értelme a queryTransactionList operációt használni?
Sziasztok!
Engedjétek meg, hogy röviden válaszoljak.
Az ötletet, hogy valahogyan visszadjuk azt, hogy az ismételten beküldött számla melyik tranzakcióban lett befogadva, megnézzük és jelzek majd.
A számlalekĂ©rdezĹ‘ operáciĂłk a SAVED státusz után tudják csak visszaadni a lĂ©tezĹ‘sĂ©g jelzĂ©st/az adatokat, Ăgy valĂłban "csak egy bizonyos pont után" kapod vissza.
Ăśdv
A számlalekĂ©rdezĹ‘ operáciĂłk a SAVED státusz után tudják csak visszaadni a lĂ©tezĹ‘sĂ©g jelzĂ©st/az adatokat, Ăgy valĂłban "csak egy bizonyos pont után" kapod vissza.
Ez rendben is van, de pont ezĂ©rt lett volna elĹ‘nyösebb, ha a számlaszám is átkerĂĽlt volna magasabb szintre, hiszen kliens oldalon ez kulcs adat. Mindenesetre köszönjĂĽk, ha visszaadjátok a transactionid-t, mert ez mindenkĂ©ppen segĂtsĂ©g. Bár ez is csak a tĂĽnetek kezelĂ©sĂ©re szolgál, a gyökĂ©rok nem lesz megszĂĽntetve ezáltal.
@NTCA-developer @NTCA-supporter ,
Nem lenne értelme a 3.0-ban a számlaszámot is belefoglalni a requestSignature-be? Így azonnal megjelenne a NAV oldalán a számlaszám, amit aztán a queryInvoiceCheck-kel le lehetne kérdezni, hogy beküldtem-e már egyszer.
Szia @lvitya586!
Egy requestben nem csak 1 számlát tudsz beküldeni, hanem max. 100-at. Az hogy a requestSignature számolásába még azt is belevegyük, semmi értelme.
Az, hogy egy számlát beküldesz, még nem garantál semmit, nem véletlenül csak a SAVED után adunk vissza információt egy számláról, hiszen akkor futott meg az összes blokkoló üzleti és technikai validáció.
Ahogy ĂgĂ©rtem, utánajárunk a dolognak.
Ăśdv
Szia @lvitya586!
Egy requestben nem csak 1 számlát tudsz beküldeni, hanem max. 100-at. Az hogy a requestSignature számolásába még azt is belevegyük, semmi értelme.
Az, hogy egy számlát beküldesz, még nem garantál semmit, nem véletlenül csak a SAVED után adunk vissza információt egy számláról, hiszen akkor futott meg az összes blokkoló üzleti és technikai validáció.
Ahogy ĂgĂ©rtem, utánajárunk a dolognak.
Ăśdv
Köszönöm, hogy utánajártok ennek.
A requestSignature-nél nyilván lehetne 100 db számlaszám, mint ahogy jelenleg is lehet 100 db invoiceOperation, csak ez utóbbi kliens oldalról érdektelen és csak a NAV oldaláról jelent valamit, ugyanakkor a számlaszám meg a kliensek részére lenne fontos.
Mivel legalább egyszer úgyis vissza kell kérdezni a számla állapotára, hiszen csak akkor teljesült az adatszolgáltatás, ha DONE státuszom van, ezért a mi oldalunkról teljesen mindegy, hogy a NAV oldalán éppen milyen egyéb státuszban van és milyen validáció fut rá, ill. garantálni sem kell semmit. Csak annyit kell tudnom először, hogy adott számlaszámmal már elkezdtem az adatszolgáltatást vagy nem, és a válasz(ok) függvényében újra kell-e küldenem vagy nem.
@HWKF > Az a gond, hogy a 2. pont többször fut le, mert nem kap választ és mire a 3.-hoz érsz már legalább 2-szer elküldted.
Nem ez a gond. A számla kĂĽldĂ©s hiba miatt nem ment be (vagy nincs hozzá letárolva nálam tranzakciĂłs azonosĂtĂł, akkor a queryIncoiceData Ă©s a queryTransactionList lĂ©p Ă©letben (eredeti tĂ©maindĂtĂł 4-es, 5-ös pontja). Tehát nem kĂĽldöm be Ăşjra a számlát csak akkor, ha a fenti kĂ©t operáciĂł alapján is az jön ki eredmĂ©nyĂĽl, hogy nincs bent a számla...
EzĂ©rt is Ărtam, hogy elmĂ©leti szinten Ă©n megoldottam ezt az INVOICE_NUMBER_NOT_UNIQUE kĂ©rdĂ©st, ami a tesztrendszerbe, a kiritikus pontban megszakĂtva a program futását tökĂ©letesen szimulálhatĂłan tök kĂłl működik, de Ă©les környezetben egy ĂĽzemszĂĽnetnĂ©l/bizonytalan működĂ©snĂ©l egyszerűen valamiĂ©rt nem segĂti ezt a hiba kiszűrĂ©sĂ©t Ă©s a problĂ©ma továbbra is jelentkezik...
Közben megvizsgáltam hátha a queryTransactionList-et tĂşl szűk idĹ‘ablakra kĂ©rdezem le, de kiderĂĽlt, hogy nem, mert az idĹ‘ablak nyitĂł idĹ‘pontja a számla kĂ©szĂtĂ©sĂ©nek kelte (mĂnusz 2 perc, ha esetleg a kliens Ăłrája valamiĂ©rt máskĂ©pp járna) Ă©s a zárĂł idĹ‘pontja, az utolsĂł kĂĽldĂ©si kĂsĂ©rlet idĹ‘pontja + 2 perc. A saját számlázási rendszerĂĽnkben is keletkezett 7 ilyen számla Ă©s az online NAV rendszerben belĂ©pve pontosan látom, hogy melyik bekĂĽldĂ©s lett a sikeres mondjuk abbĂłl a pĂ©ldául 12 prĂłbálkozásnál, ami egy rövidebb ĂĽzemszĂĽnet során keletkezett. Az eredmĂ©ny teljesen vĂ©letlenszerű. Volt, amikor már az elsĹ‘ bekĂĽldĂ©s sikeres volt, volt amikor csak az 5. vagy a 10., Ă©ppen, amikor a rendszer elĂ©rhetĹ‘ volt. Mindegyik esetben válasz már nem jött, tehát nem volt tranzakciĂł azonosĂtĂł Ă©s a következĹ‘ kĂĽldĂ©skor a rendszer queryIncoiceData operáciĂłja azt adta vissza, hogy mĂ©g NINCS BENT a számla, illetve a queryTransactionList is hatástalan volt...
Továbbra is egy olyan mĂłdszer rĂ©szletes ismertetĂ©sĂ©t várom a NAV-tĂłl válaszkĂ©nt, ami a hibaĂĽzenetet ELKERĂśLI Ă©s nem kezelni prĂłbálja, Ăgy nem Ă©rtek egyet azzal, hogy az lenne a megoldás, hogy a INVOICE_NUMBER_NOT_UNIQUE ĂĽzenetbe tegyĂĽk bele az eredeti tranzakciĂłsID-t, mivel ez esĹ‘ után köpönyeg megoldás, ráadásul a felhasználĂł is fog rĂłla kapni egy e-mailt, mint tudjuk...
@nbeeps2
Az a gond, hogy az adatszolgáltatás lekĂ©rdezĂ©s csak a SAVED státusztĂłl láthatod. Tehát, amĂg a queryInvoiceData operáciĂłval lekĂ©rdezed, de mĂ©g nem jutott el a SAVE státuszba, akkor azt fogod kapni, hogy nincs. EzĂ©rt prĂłbálod elkĂĽldeni, de közben az eredeti kĂĽldĂ©s eljut a SAVED státuszba, sĹ‘t tovább. Azaz hamarabb megy be, mint amit másodjára kĂĽldtĂ©l.
És ezen nem segĂt a queryTransactionList sem, mert hiába látod a tranzakciĂłkat az ellenĹ‘rzĂ©s pillanatában. Mert a tranzakciĂłkban nincs benne a számlaszám. A tranzakciĂłknak max az állapotát tudod megszerezni, de ezt mĂ©g Ăgy nem tudod számlához kötni.
Tehát még meg kell szerezned a számlaadatot. Ezt max a queryInvoiceDigest operáció tudja megadni, mert az tud tranzakció ID alapján számlaadatot visszaadni. De ha túl gyors vagy vagy a NAV éppen belassult, akkor ez az ellenőrzés még mindig a SAVED státuszba kerülés előtt fog megtörténni. Így megint azt fogod hinni, hogy nem ment be.
@NTCA-supporter @NTCA-tax Szerintetek jól látom a folyamatot?
ĂŤgy van, a queryInvoiceData - val nem fogom látni egy adott pontig, itt jött be a kĂ©pbe a queryTransactionList, amiben visszakapom egy megadott idĹ‘ablakban a tranzakciĂłazonosĂtĂłkat. Ezeken vĂ©gig megyek Ă©s megnĂ©zem, hogy van-e közte olyan azonosĂtĂł, ami nincs benne a számlázĂł programban, mert akkor az tartozik az eredeti bekĂĽldĂ©shez. A queryTransactionStatus RETURNORIGINALREQUEST-el pedig kinyerem a számla adatokat Ă©s összevetem a számlával, hogy valĂłjában hozzá tartozik-e.
Pontosan Ăşgy, ahogy itt (https://github.com/nav-gov-hu/Online-Invoice/issues/78) NTCA-developer Ărta 2019, oktĂłber 30-án.
Bocs. A RETURNORIGINALREQUEST beállĂtásrĂłl lemaradtam valahogy. Anno mĂ©g januárban elkezdtĂĽnk foglalkozni a queryTransactionList operáciĂłval, de vĂ©gĂĽl idĹ‘hiányában le kellett állĂtani a megvalĂłsĂtást. Igaz akkor mĂ©g a Technikai Ă©rvĂ©nytelenĂtĂ©sek kapcsán merĂĽlt fel a használata.
De Ăgy látva a problĂ©mákat az OSZ v3 megvalĂłsĂtása kapcsán ezt is meg kell valĂłsĂtani.
Akkor elsiklottunk a RETURNORIGINALREQUEST beállĂtáson. És enĂ©lkĂĽl nagyon bonyolultnak tűnt a számlainformáciĂł levadászása, de ez "jĂłval egyszerűbbĂ©" teszi a használatát.
Szerintem a fő gond az lehet, hogy ilyen durva leállásnál, mint ami legutóbb volt, annyira a feje tetejére áll a rendszer, hogy ezek az operációk SEM működnek megfelelően és ebből eredhet a hiba.
Akkor nem marad más, mint amit egy a másik rendszernél ajánlanak, ha hibára futsz várj egy órát, ha megint hibára futsz, akkor várj valamivel többet, ha megint....
Továbbra is egy olyan mĂłdszer rĂ©szletes ismertetĂ©sĂ©t várom a NAV-tĂłl válaszkĂ©nt, ami a hibaĂĽzenetet ELKERĂśLI Ă©s nem kezelni prĂłbálja, Ăgy nem Ă©rtek egyet azzal, hogy az lenne a megoldás, hogy a INVOICE_NUMBER_NOT_UNIQUE ĂĽzenetbe tegyĂĽk bele az eredeti tranzakciĂłsID-t, mivel ez esĹ‘ után köpönyeg megoldás, ráadásul a felhasználĂł is fog rĂłla kapni egy e-mailt, mint tudjuk...
Pont ezĂ©rt javasoltam, hogy a számlaszám kerĂĽljön feltĂĽntetve magasabb szinten is (ha nem is a requestSignature-ben, de legalább a borĂtĂ©k XML-ben), továbbá a NAV oldali feldolgozás során az egyik legkorábbi lĂ©pĂ©s legyen a számlaszám tárolása az XML validáciĂł után, ill. a queryInvoiceCheck funkciĂł legyen kibĹ‘vĂtve, hogy magárĂłl a számlárĂłl (nem a tranzakciĂłrĂłl) adjon vissza státuszt Ă©s ne csak annyi legyen, hogy true vagy false.
Ezekkel a mĂłdosĂtásokkal szerintem el lehetne kerĂĽlni a not unique hibát, hiszen ha nincs transactionId-m a manageInvoice hĂváskor, akkor nem kĂĽldenĂ©m Ăşjra az egĂ©sz tranzakciĂłt, hanem lekĂ©rdeznĂ©m a sikertelen tranzakciĂłban lĂ©vĹ‘ számla(k) státuszát.
@nbeeps2, @lvitya586: sokat beszéltünk erről tegnap a kollégákkal és alapvetően elhibázottnak tartjuk, hogy a beküldött adatszolgáltatás státusza számlaszám alapján nem kérdezhető le adózói oldalról.
A számlaszámmal szemben támasztott követelmĂ©ny jogszabályi szinten jelenik meg ("kihagyás Ă©s ismĂ©tlĂ©s nĂ©lkĂĽli, folyamatos sorszámozást biztosĂtson"), a számla egyedisĂ©gĂ©t biztosĂtja, ezen feltĂ©tel teljesĂtĂ©se nĂ©lkĂĽl a számlázĂłprogram alkalmatlan a használatra.
Ezzel szemben a transactionId egy belsĹ‘ azonosĂtĂł. Értem Ă©s megĂ©rtem a transactionId szĂĽksĂ©gessĂ©gĂ©t a feldolgozás során (hiszen globális szinten akármennyi 1/2020-as sorszámĂş számla lehet), de adĂłzĂłi oldalon semmilyen beszĂ©des informáciĂłt sem hordoz, ellentĂ©tben a számla egyedi sorszámával.
Nehéz-nehéz...
A probléma gyökere valahol itt lakik:
https://github.com/nav-gov-hu/Online-Invoice/issues/78#issuecomment-547816486
Az INVOICE_NUMBER_NOT_UNIQUE hiba az idézett eseményt, tehát hogy valójában két számla kapta ugyanazt a sorszámot, hivatott jelezni.
Ennek a beküldő oldali ellenőrzésére gyakorlatilag nincs megfelelő eszköz a protokol alapján.
A requestId, illetve a requestSignature-ban használt timestamp érdemben alacsonyabb layeren van, a token sem releváns és visszakérdezhető. A token alapján beküldött tranzakcióhoz a tranzakcióID el tud veszni.
A számlához a saját belsĹ‘ rendszerben (elvileg könnyedĂ©n generálhatĂł Ă©s ) elĂ©rhetĹ‘ számla lĂ©trehozás timestamp csak a helyesbĂtĹ‘/storno esetĂ©n releváns adat.
A hibaüzenet képzésére a számlaszám egyediségének ellenőrzése elegendő, de egy számlaszám alapján annak eldöntése, hogy ezt most mi küldtük-e be vagy sem (feltéve egy adózónál több számlázóprogram, netán hibás működés, konfigurálás esetét), sajnos nem elegendő.
A számla xml tartalmának ellenĹ‘rzĂ©se 2.0-ig bezárĂłlag az esetenkĂ©nti nagybetűsĂtĂ©s (meg talán whitespacetelenĂtĂ©s) miatt szintĂ©n nemtriviális feladat. A számla adattartalmába betenni olyan adatot ami a számlán nem szerepel (tehát valami metaadat) szintĂ©n gyanĂşs, hogy nem támogatott/engedett. (Ha ezen a ponton tĂ©vedek Ă©s belefĂ©r, akkor ez megoldást Ă©s választ adhat)
Az összes valamire esetleg használható releváns audit adat ebből a szempontból a insCurUser lehetne. Ha azt sikerül garantálni, hogy egy Technikai usert csak egy számlázó program használ.
A insDate itt sem használható ilyen célból.
Ha valahol, akkor itt az audit adatok között kellene lennie egy lekĂ©rdezhetĹ‘ mezĹ‘nek, amit a bekĂĽldĹ‘ ad meg, elĂ©ggĂ© egyedi (vĂ©letlenszerű, alacsony valĂłszinűsĂ©ggel elĹ‘fordulĂł, timestamp, vagy hash stb...) adat, ami alapján be tudja azonosĂtani, hogy a számlaszám alapján a számla ehhez a bekĂĽldĹ‘ programhoz vagy egy másikhoz kötĹ‘dik-e. És persze a lekĂ©rdezhetĹ‘ mezĹ‘t valahol meg is kellene/lehetne adni a számlabekĂĽldĹ‘ tranzakciĂłban, amit aztán boldogan használhatnánk.
AzĂ©rt csak a számla alapadatait felhasználva, majd amikor nĂ©vtelen magánszemĂ©lyek tucatjai 1 mosoly=5 Ft egyenszámlákat kapnak, nem lehet majd beazonosĂtani.
@bcdel > A számla adattartalmába betenni olyan adatot ami a számlán nem szerepel (tehát valami metaadat) szintén gyanús, hogy nem támogatott/engedett. (Ha ezen a ponton tévedek és belefér, akkor ez megoldást és választ adhat)
Az additionalInvoiceData taggal ez megvalĂłsĂthatĂł. ;)
Sziasztok!
Az eredeti kérdésre a válasz: timeout után csak 5 perc múlva kérdezd le a tranzakciók listáját. A DB-ben 5 perc van a kommitra, ezért a 4 perces időtartam még adhat fals eredményt.
Az @nbeeps2 által használt módszerben a 4-es kvázi felesleges, az 5-ös lesz a nyerő akkor, ha kellően későn (a /,manageInvoice-hoz képest legalább 5 perc múlva) történik a kérés.
Sziasztok!
Az eredeti kérdésre a válasz: timeout után csak 5 perc múlva kérdezd le a tranzakciók listáját. A DB-ben 5 perc van a kommitra, ezért a 4 perces időtartam még adhat fals eredményt.
Az @nbeeps2 által használt módszerben a 4-es kvázi felesleges, az 5-ös lesz a nyerő akkor, ha kellően későn (a /,manageInvoice-hoz képest legalább 5 perc múlva) történik a kérés.
Szia,
A legnagyobb jĂłindulattal kĂ©rdezem: sokadszorra kerĂĽlnek elĹ‘ ilyen aknák, mint ez az 5 perces feldolgozás. Az országban rengeteg fejlesztĹ‘, ĂĽzemeltetĹ‘ kĂnlĂłdik nap, mint nap ezekkel a problĂ©mákkal, prĂłbál sokadik nekifutásra leprogramozni valamilyen megoldást, hiszen ahogy pl.: a #378 -as issuet zártátok,
"Az INVOICE_NUMBER_NOT_UNIQUE hiba kapcsán azt szögezzĂĽk le, hogy nekĂĽnk kötelessĂ©gĂĽnk az egyedisĂ©get ellenĹ‘rizni minden esetben, akkor is ha ugyanattĂłl a technikai felhasználĂłtĂłl jön a bekĂĽldĂ©s, akkor is ha lassulás van, mindig. A vevĹ‘ oldali lekĂ©rdezĂ©sek kapcsán Ă©ppen a kliens oldal kampányol a 100%-os, garantált egyedisĂ©g mellett. (ezt egyĂ©bkĂ©nt a következĹ‘ telepĂtĂ©s meg is valĂłsĂtja, felfutĂł jelleggel) Nem fogadjuk el azt kritikakĂ©nt, hogy a duplikált adatbekĂĽldĂ©s a mi hibánk lenne. (már a nevĂ©ben is benne van, hogy bekĂĽldĂ©s, mi pedig nem kĂĽldĂĽnk magunknak adatot) A hibakezelĂ©s minden aszinkron folyamat rĂ©sze kell hogy legyen, akkor is ha a szerver leterhelt. AttĂłl mĂ©g hogy nem kaptál idĹ‘ben választ a bekĂĽldĂ©sre, nem feltĂ©tlen jelenti azt hogy a bekĂĽldĂ©s sikertelen, ezt már többször, több helyen tárgyaltuk. Ha ettĹ‘l fĂĽggetlenĂĽl valaki Ăgy működik, az viselje annak a következmĂ©nyeit. A 2.0 Ăłta van lehetĹ‘sĂ©g ennek az esetek a szĂ©p kezelĂ©sĂ©re, ez pedig a tranzakciĂł listázás. Ugyan ezen okbĂłl kifolyĂłlag visszautasĂtjuk azokat a megjegyzĂ©seket is, amik azt implikálják hogy ezzel mi plusz költsĂ©get generálunk bárkinĂ©l is."
ennek kezelĂ©se a mi dolgunk, de ha ilyen meglepetĂ©sek jönnek fĂ©l, egy Ă©v után, ez nem megvalĂłsĂthatĂł.
Valahol le vannak kommunikálva ezek a "specialistások", vagy Ăgy morzsákban kapjuk Ĺ‘ket?
@NTCA-developer "Az eredeti kérdésre a válasz: timeout után csak 5 perc múlva kérdezd le a tranzakciók listáját."
Az 5 perc kapcsán nekem nem egyértelmű, hogy
Például: Ha a ManageInvoice 11:25-kor történt, akkor mi lenne a javasolt időablak, amire le kéne kérnem a tranzakciók listáját?
11:25-11:30?
@NTCA-developer
Az eredeti kérdésre a válasz: timeout után csak 5 perc múlva kérdezd le a tranzakciók listáját. A DB-ben 5 perc van a kommitra, ezért a 4 perces időtartam még adhat fals eredményt.
Ennek figyelembe vételével kérem az _1.6.6 Válaszidő, timeout_ fejezetet átfogalmazni érthetőre.
A szerver jellemzĹ‘en 200ms alatti válaszidĹ‘kkel szolgál ki. A szinkronhĂvások blokkolĂł timeout Ă©rtĂ©ke 5000 ms. KĂ©rjĂĽk, hogy kliens oldalon a fenti Ă©rtĂ©ket meghaladĂł válaszidĹ‘t kezeljĂ©k csak idĹ‘tĂşllĂ©pĂ©skĂ©nt!
Az abszolút timeout értéke 60 sec. Ha egy adatszolgáltatásra nem érkezik válasz a 60 másodperces timeout miatt, még nem jelenti a beküldés sikertelenségét.
Sziasztok!
@nbeeps2 Az elsĹ‘ opciĂłt mondom. Tehát Ăşgy nĂ©z ki a folyamat, hogy hĂvtál a /manageInvoice vĂ©gpontra, már vársz 1 perce, amikor a határvĂ©delem elterminálja a TCP kapcsolatod. A szolgáltatásnak innentĹ‘l mĂ©g 4 perce van (mivel a tranzakciĂł timeout 5 perces) elmenteni a beĂ©rkezĹ‘ számla adatot ami ott vár a memĂłriában, hogy aztán majd elindulhasson a feldolgozása. Ha ez sikeres, akkor a szerver válaszol ugyan, de ezt te már sosem kapod meg, mivel a kapcsolatod amin figyeltĂ©l korábban bezárult. Ekkor, tehát a /manageInvoice hĂvás kezdemĂ©nyezĂ©sĂ©tĹ‘l számĂtott 5 perc vĂ©geztĂ©vel már hĂvhatod a /queryTransactionStatus lekĂ©rdezĂ©st. Hogy ebben mi legyen a lekĂ©rdezĂ©si intervallum, tĹ‘led fĂĽgg. Én ökölszabálykĂ©nt ráhagynám a dupláját, tehát az elmĂşlt 10 percet nĂ©znĂ©m.
@jozanesz A blocking timeout Ă©rtĂ©knek a szinkron hĂvásban van jelentĹ‘sĂ©ge. Azt az intervallumot jelöli, amennyi idĹ‘ az adott szálnak rendelkezĂ©sre áll, hogy a JDBC poolbĂłl kivegyen egy használhatĂł kapcsolatot. Ha már tele van a pool Ă©s senki sem enged el egyetlen kapcsolatot sem 5000 ms-ig, akkor lĂ©p fel a blocking timeout. (eddig ilyen az Ă©les működĂ©sben nem is volt egyĂ©bkĂ©nt, a pool már volt telĂtett de mindig szabadult fel elĂ©g erĹ‘forrás hogy megkezdĹ‘dhessen a DB művelet) A második kĂ©rdĂ©sedre igyekeztem a fenti rĂ©szben válaszolni. KĂ©rlek jelezd ha nem sikerĂĽlt.
@gajzi kritikájával a legteljesebb mĂ©rtĂ©kben egyetĂ©rtek. Ennek szerintem is abszolĂşt az interfĂ©sz dokumentáciĂłban volna a helye, feketĂ©n-fehĂ©ren, csakhogy. (mert csakhogy mindig van, Ă©s már vagy tizedjĂ©re prĂłbálom megfogalmazni, hogy PC maradjak) SzĂłval ez ingoványos terep, ugyanis ennek az IF doksiban törtĂ©nĹ‘ leĂrásához meg kellene találni azt a jogszabályi Ă©rtelmezĂ©st, amivel mindenki egyetĂ©rt. Historikusan ez az oka, hogy ezt mĂ©g mind a mai napig nem ugrottuk meg. Neki fogok futni ĂşjbĂłl, csak adjatok egy kis idĹ‘t.
@NTCA-developer : rendben Ăgy mĂłdosĂtottam a kĂłdot, remĂ©lem a következĹ‘ ĂĽzemszĂĽnet esetĂ©n már nem lesz ilyen ĂĽzenetem vagy jĂłval kevesebb, meglátjuk. Köszönöm. RĂ©szemrĹ‘l (mint indĂtĂł) zárhatĂł a topik.
Most helpful comment
Továbbra is egy olyan mĂłdszer rĂ©szletes ismertetĂ©sĂ©t várom a NAV-tĂłl válaszkĂ©nt, ami a hibaĂĽzenetet ELKERĂśLI Ă©s nem kezelni prĂłbálja, Ăgy nem Ă©rtek egyet azzal, hogy az lenne a megoldás, hogy a INVOICE_NUMBER_NOT_UNIQUE ĂĽzenetbe tegyĂĽk bele az eredeti tranzakciĂłsID-t, mivel ez esĹ‘ után köpönyeg megoldás, ráadásul a felhasználĂł is fog rĂłla kapni egy e-mailt, mint tudjuk...