Ugrás a tartalomra
kassza

Hibakezelés, hibakódok

Ha egy Számla Agent kérés nem sikerül, az ok szinte mindig a kérés adataiban vagy a fiók beállításaiban van. Ugyanazt a kérést újra elküldeni ilyenkor nem segít, sőt, a Számlázz.hu ki is tilthatja a fiókot. Ezért a kassza minden hibát egyetlen típusba, a SzamlazzError-ba gyűjt, és megmondja, milyen kategóriába esik, és mit érdemes tenni.

A SzamlazzError#

Minden kassza metódus SzamlazzError-t dob. A isSzamlazzError() típusőrrel biztonságosan szűkítheted a catch ágban kapott értéket:

import { isSzamlazzError } from 'kassza'

try {
  await kassza.invoices.create(szamla)
} catch (error) {
  if (!isSzamlazzError(error)) throw error

  switch (error.category) {
    case 'validation':
      return { hiba: error.message, tipp: error.hint }
    case 'auth':
    case 'account':
      riasztas(`Számlázz.hu fiókhiba: ${error.message}`)
      throw error
    default:
      throw error
  }
}
MezőTípusLeírás
messagestringMagyar hibaüzenet. A Számlázz.hu kódját [57] alakban az elejére teszi.
codenumber | undefinedA Számlázz.hu hibakódja. Kliensoldali hibánál nincs.
categorySzamlazzErrorCategoryA hiba kategóriája, lásd lent.
retryablebooleantrue karbantartásnál, hálózati hibánál és időtúllépésnél.
hintstring | undefinedMagyar javítási tipp, ha ismert.
actionAgentAction | undefinedA művelet, például createInvoice.
httpStatusnumber | undefinedA válasz HTTP státusza.
rawResponsestring | undefinedA nyers válasz első 2000 karaktere. PDF-nél nincs.
isDuplicate, isNotFoundbooleanRövidítés a duplicate és a not_found kategóriára.

Amit a kassza újrapróbál#

A kassza csak ott próbálkozik újra, ahol ez nem okozhat dupla bizonylatot: lekérdezéseknél, a befizetések felülírásánál, és a callId-val védett nyugtáknál. Csak a retryable hibáknál teszi ezt (maintenance, network, timeout), alapból háromszor, 1, majd 2 másodperc várakozással. A számlakészítést soha nem küldi újra.

kassza metódusAgent form mezőAutomatikus újrapróbálás
invoices.create(), invoices.preview()action-xmlagentxmlfilesoha
invoices.reverse()action-szamla_agent_stsoha
invoices.registerPayment(), invoices.clearPayments()action-szamla_agent_kifizcsak felülíró (additive: false) hívásnál
invoices.getPdf(), verifyCredentials()action-szamla_agent_pdfigen
invoices.get(), invoices.find()action-szamla_agent_xmligen
invoices.deleteProforma()action-szamla_agent_dijbekero_torlesesoha
receipts.create()action-szamla_agent_nyugta_createcsak callId megadásával
receipts.reverse()action-szamla_agent_nyugta_stornocsak callId megadásával
receipts.get(), receipts.find()action-szamla_agent_nyugta_getigen
receipts.send()action-szamla_agent_nyugta_sendsoha
taxpayer.query()action-szamla_agent_taxpayerigen

A próbálkozások számát a maxAttempts, a várakozást a retryDelayMs opcióval állíthatod. A maxAttempts értéke 5 fölé nem mehet, mert a Számlázz.hu ennyit enged egy kérésre.

Bizonytalan kimenet: számla készült vagy nem?#

Hálózati hiba vagy időtúllépés után nem tudhatod, hogy a Számlázz.hu megkapta-e a kérést. Az 56-os hibánál (partial_success) a számla biztosan elkészült, csak az értesítő e-mail nem ment ki. A 71-es és 152-es hibánál (duplicate) a rendelésszámmal már készült számla.

Mindegyik esetben ugyanaz a helyes lépés: kérdezd le a számlát a rendelésszám alapján, mielőtt újra kiállítanád. Ehhez minden számlánál adj meg orderNumber-t.

import { type CreateInvoiceInput, isSzamlazzError } from 'kassza'

const BIZONYTALAN = ['network', 'timeout', 'partial_success', 'duplicate']

async function szamlaz(orderNumber: string, adatok: CreateInvoiceInput) {
  const meglevo = await kassza.invoices.find({ orderNumber })
  if (meglevo) return meglevo.header.number

  try {
    const szamla = await kassza.invoices.create({ ...adatok, orderNumber })
    return szamla.number
  } catch (error) {
    if (isSzamlazzError(error) && BIZONYTALAN.includes(error.category)) {
      const letrejott = await kassza.invoices.find({ orderNumber })
      if (letrejott) return letrejott.header.number
    }
    throw error
  }
}

Idempotens számlázás hiba után

Részleges siker (56) után a find megtalálja a számlát, dupla számla nem készül.

Futtatás a sandboxban
hibakezeles-idempotens.ts
import { ,  } from 'kassza'
import {  } from 'kassza-sandbox'

const  = ()

interface Rendeles {
  readonly : number
  readonly : string
  readonly : string
  readonly : number
}

async function (: Rendeles): <string> {
  const  = `REND-${.}`

  const  = await ..({  })
  if () return `${..} (már létezett)`

  try {
    const  = await ..({
      ,
      : true,
      : 'bankkártya',
      : {
        : .,
        : '1111',
        : 'Budapest',
        : 'Fő utca 1.',
        : .,
      },
      : [{ : 'Rendelés', : ., : 27 }],
    })
    return `${.} (új)`
  } catch () {
    const  = ['network', 'timeout', 'partial_success', 'duplicate']
    if (() && .(.)) {
      .(`Bizonytalan kimenet (${.}), ellenőrzés rendelésszám alapján…`)
      const  = await ..({  })
      if () return `${..} (a hiba ellenére elkészült)`
    }
    throw 
  }
}

const : Rendeles = {
  : 5001,
  : 'Nagy Péter',
  : 'peter@example.hu',
  : 12_700,
}

.failNext('createInvoice', 56)
.('Első próbálkozás:', await ())
.('A webhook újraküldése:', await ())
.('Számlák a fiókban:', .account().invoices.length)

Hol jelez hibát a Számlázz.hu?#

A Számla Agent műveletenként és válaszverziónként máshogy jelez hibát. A kassza mindet ugyanúgy kezeli:

  • Fejlécben: a szlahu_error és a szlahu_error_code fejléc URL-kódolt üzenetet és kódot tartalmaz.
  • Szöveges válaszban: a törzs [ERR] jelöléssel kezdődik, utána jön az üzenet és egy Java stack trace. A kassza csak az üzenetet és a kódot tartja meg.
  • XML-ben: a <sikeres>false</sikeres> mellett <hibakod> és <hibauzenet> elem van.
  • HTTP státusszal: az 5xx válaszból network, minden más ismeretlen formátumból unexpected_response kategóriájú hiba lesz.

Kliensoldali validáció#

Sok hibát a kassza már a kérés előtt észrevesz: hiányzó egységár, ismeretlen áfakulcs, kisbetűs nyugta előtag, túl sok vagy túl nagy melléklet. Ilyenkor validation kategóriájú hibát kapsz code nélkül, és kérés sem megy a Számlázz.hu-hoz.

Validációs hibák

Kliensoldali és szerveroldali hibák kategóriával, kóddal és javítási tippel.

Futtatás a sandboxban
hibakezeles-validacio.ts
import { ,  } from 'kassza'

const  = ()

const  = { : 'Vevő Kft.', : '1111', : 'Budapest', : 'Fő utca 1.' }

async function (: string, : () => <unknown>): <void> {
  try {
    await ()
    .(`${}: sikerült`)
  } catch () {
    if (!()) throw 
    .(, {
      : .,
      : .,
      : .,
      : .,
    })
  }
}

await ('Hiányzó egységár', () =>
  ..({ : , : [{ : 'Termék', : 27 }] }),
)

await ('Ismeretlen áfakulcs', () =>
  ..({
    : ,
    : [{ : 'Termék', : 1_000, : 28 }],
  }),
)

await ('Nem regisztrált számlaszám előtag', () =>
  ..({
    : 'XYZ',
    : ,
    : [{ : 'Termék', : 1_000, : 27 }],
  }),
)

await ('Kisbetűs nyugta előtag', () =>
  ..({
    : 'nygt',
    : 'készpénz',
    : [{ : 'Kávé', : 890, : 27 }],
  }),
)

Tesztfiók#

Fejlesztéshez használj Számlázz.hu tesztfiókot. A tesztfiókban 10 percenként legfeljebb 500 számla készíthető, ezért automata tesztekhez inkább a mock klienst használd, az nem hív hálózatot.

Hibakategóriák#

error.categoryJelentésÉrdemes újrapróbálni?
validationHibás adat: a kassza a kérés előtt utasította el, vagy a Számlázz.hu nem fogadta el.Nem. Javítsd a bemenetet.
duplicateA rendelésszám vagy a hívásazonosító már foglalt, a bizonylat valószínűleg létezik.Nem. Kérdezd le a meglévőt.
partial_successA bizonylat elkészült, csak egy mellékhatás (az e-mail) hiúsult meg.Soha. Ne állítsd ki újra.
not_foundNincs ilyen bizonylat.Nem.
authHibás Agent kulcs, vagy böngészős bejelentkezés zavarja az Agentet.Nem. Javítsd a hitelesítést.
accountElőfizetés, e-számla vagy fiókbeállítás miatti hiba, embernek kell beavatkoznia.Nem.
maintenanceA Számlázz.hu karbantart (1-es kód).Lekérdezésnél a kassza magától újrapróbál.
networkHálózati hiba vagy 5xx válasz. Írásnál a kimenet bizonytalan.Lekérdezésnél igen. Írásnál előbb keress rendelésszámra.
timeoutNem jött válasz az időkorláton belül. Írásnál a kimenet bizonytalan.Mint a network.
configurationHiányzó vagy hibás kliensbeállítás, például nincs Agent kulcs.Nem. Javítsd a konfigurációt.
unexpected_responseA Számlázz.hu ismeretlen formátumban válaszolt.Nem. Jelentsd a hibát.
unknownKód nélküli vagy ismeretlen kódú hiba a Számlázz.hu-tól.Nem.

Hibakódok#

Az alábbi táblázat a kassza által ismert Számlázz.hu hibakódokat mutatja. Az ismeretlen kódú hiba unknown kategóriát kap, de a Számlázz.hu eredeti üzenete ilyenkor is megmarad a message mezőben.

KódKategóriaJelentésMit tegyél?
1maintenanceRendszerkarbantartás, kérem próbálja meg pár perc múlva.A Számlázz.hu oldalán van karbantartás, néhány perc múlva próbáld újra.
3authSikertelen bejelentkezés.Ellenőrizd az Agent kulcsot. Csak kisbetűs kulcsot fogad el a rendszer.
7not_foundHiányzó adat: ismeretlen számlaszám, rendelésszám vagy külső azonosító.
49accountA tanúsítvány használatához jelszó szükséges.Az e-számla tanúsítványához tartozó jelszót a Számlázz.hu felületén kell beállítani.
52validationAz áfakulcs nem értelmezhető.Használd a VatRate típusban felsorolt áfakulcsok egyikét.
53validationHiányzó XML fájl.Az XML-t fájlként kell elküldeni multipart/form-data kérésben.
54accountE-számla készítés nincs engedélyezve.Az előfizetési csomag nem tartalmazza az e-számlát, vagy nincs tanúsítvány. Próbáld eInvoice: false beállítással.
55accountE-számla aláírása sikertelen.A tanúsítvány lejárt, vagy az időbélyeg szerver nem érhető el.
56partial_successA bizonylat elkészült, de az értesítő e-mail kiküldése sikertelen.NE állítsd ki újra a bizonylatot. Kérdezd le rendelésszám vagy külső azonosító alapján, és küldd ki az e-mailt később.
57validationXML beolvasási hiba.A küldött XML nem felel meg az XSD-nek. A részleteket a hibaüzenet tartalmazza.
71duplicateMár létező rendelésszám.A fiókban be van kapcsolva a rendelésszám ismétlődés tiltása. Ez a bizonylat valószínűleg már elkészült.
135authSzámla Agent futtatásához lépj ki a Számlázz.hu rendszerből a böngészőben.
136accountBejelentkezési hiba, lépj be a Számlázz.hu rendszerébe böngészőn keresztül.Lejárt előfizetés vagy rendezetlen díj. Ellenőrizd a Szolgáltatáscsomagom menüpontot.
152duplicateMár létező rendelésszám.A fiókban be van kapcsolva a rendelésszám ismétlődés tiltása. Ez a bizonylat valószínűleg már elkészült.
164authA funkciót csak egyetlen fiókhoz hozzáférő felhasználó használhatja.Használj Agent kulcsot felhasználónév és jelszó helyett.
202validationA megadott számlaszám előtag nem megfelelő.Csak a Beállítások / Előtagok menüpontban rögzített előtag használható.
250accountA meghatalmazás nincs elfogadva.A könyvelői vagy aggregátor meghatalmazást a Számlázz.hu felületén kell elfogadni.
259validationA tétel nettó értéke nem megfelelő.Használd a tételeknél a netUnitPrice vagy grossUnitPrice mezőt, és hagyd, hogy a csomag számolja ki az összegeket.
260validationA tétel áfa értéke nem megfelelő.Használd a tételeknél a netUnitPrice vagy grossUnitPrice mezőt, és hagyd, hogy a csomag számolja ki az összegeket.
261validationA tétel bruttó értéke nem megfelelő.Használd a tételeknél a netUnitPrice vagy grossUnitPrice mezőt, és hagyd, hogy a csomag számolja ki az összegeket.
262validationA tétel nettó értéke nem megfelelő.Használd a tételeknél a netUnitPrice vagy grossUnitPrice mezőt, és hagyd, hogy a csomag számolja ki az összegeket.
263validationA tétel áfa értéke nem megfelelő.Használd a tételeknél a netUnitPrice vagy grossUnitPrice mezőt, és hagyd, hogy a csomag számolja ki az összegeket.
264validationA tétel bruttó értéke nem megfelelő.Használd a tételeknél a netUnitPrice vagy grossUnitPrice mezőt, és hagyd, hogy a csomag számolja ki az összegeket.
335not_foundA hivatkozott díjbekérő nem található.
336validationA nyugta előtag már számlákhoz használatban van.Nyugtához olyan előtag kell, amit számlán még nem használtál.
337validationA nyugta előtag formátuma hibás.Az előtag csak nagybetűt és számot tartalmazhat.
338duplicateA hívásazonosító már létezik.Ezzel a callId-val már készült nyugta, kérdezd le a meglévőt.
339not_foundA nyugtaszám nem létezik.
340validationA kifizetett összeg eltér a bruttó végösszegtől.
352validationA számla kelte csak a mai nap lehet.A dátumot magyar idő (Europe/Budapest) szerint kell megadni, nem UTC szerint.
363validationA tétel bruttó értékének egész számnak kell lennie.Forintos nyugtán a bruttó egész szám, a nettó és az áfa legfeljebb 2 tizedes, és a nettó + áfa pontosan a bruttó.
364validationA tétel nettó értéke maximum 2 tizedes jegyet tartalmazhat.Forintos nyugtán a bruttó egész szám, a nettó és az áfa legfeljebb 2 tizedes, és a nettó + áfa pontosan a bruttó.
365validationA tétel áfa értéke maximum 2 tizedes jegyet tartalmazhat.Forintos nyugtán a bruttó egész szám, a nettó és az áfa legfeljebb 2 tizedes, és a nettó + áfa pontosan a bruttó.
395validationÉrvénytelen áfakulcs.Használd a VatRate típusban felsorolt áfakulcsok egyikét.
396validationA megadott dátum túl korai.A kelte és a teljesítés dátuma nem lehet a lezárt időszakban.
537validationEgy tételhez legfeljebb 400 adattörlő kód adható.
538accountAdattörlő kód demo- és tesztfiókban nem használható.
539accountNincs bekapcsolva az adattörlő kód használata.A számlázási beállításokban kapcsold be az adattörlő kódot.
551validationEgyszerűsített számlakép OSS vagy nem magyar adószám mellett nem használható.Az egyszerűsített számlakép (simpleItems) szabályait lásd a docs utazásszervezőknek szóló oldalán.
552validationEgyszerűsített számlaképen legfeljebb két tétel adható meg.Az egyszerűsített számlakép (simpleItems) szabályait lásd a docs utazásszervezőknek szóló oldalán.
553validationEgyszerűsített számlakép esetén érvénytelen adókulcs.Az egyszerűsített számlakép (simpleItems) szabályait lásd a docs utazásszervezőknek szóló oldalán.
554validationEgyszerűsített számlaképű számla nem helyesbíthető.Az egyszerűsített számlakép (simpleItems) szabályait lásd a docs utazásszervezőknek szóló oldalán.
555validationEgyszerűsített számlaképen a tételek áfakulcsai nem különbözhetnek.Az egyszerűsített számlakép (simpleItems) szabályait lásd a docs utazásszervezőknek szóló oldalán.
556validationEgyszerűsített számlakép szállítólevélen és helyesbítő számlán nem használható.Az egyszerűsített számlakép (simpleItems) szabályait lásd a docs utazásszervezőknek szóló oldalán.

Következő lépések#

Oldal szerkesztéseUtoljára frissítve: