Ugrás a tartalomra
kassza

Rendelésszám és duplikáció-ellenőrzés

Az orderNumber (XML-ben rendelesSzam) a saját rendszered rendelésazonosítója. Opcionális, de mindig add meg: ezzel kérdezheted le később a számlát, és ez véd a dupla számla ellen.

await kassza.invoices.create({ orderNumber: `WEB-${rendeles.id}`, buyer, items })

const szamla = await kassza.invoices.find({ orderNumber: `WEB-${rendeles.id}` })

Rendelésszám ismétlődés tiltása#

A Számlázz.hu fiókban, a Beállítások → Fiók beállításai → Számlázás beállítások menüben a „Rendelésszám ismétlődés tiltása” kapcsolóval tilthatod, hogy ugyanaz a rendelésszám több számlán szerepeljen. Nyugtára külön kapcsoló vonatkozik.

Bekapcsolt tiltásnál:

  • egy bizonylattípuson belül egy rendelésszám csak egyszer használható, az ismételt kérés 71-es vagy 152-es hibát (duplicate) kap,
  • az ellenőrzés típusonként történik, így egy számlán és egy nyugtán szerepelhet ugyanaz a rendelésszám,
  • a sztornó és a helyesbítő számla kivétel, és sztornózás után a rendelésszám újra felhasználható.

Véletlen dupla beküldés#

Bekapcsolt tiltás mellett a Számlázz.hu nem hibát ad, hanem a korábbi számlát adja vissza sikeres válaszként, ha az ismételt kérésben minden egyezik:

  • a vevő neve,
  • a bruttó végösszeg,
  • a kelte, a teljesítés dátuma és a fizetési határidő,
  • és a korábbi számla az elmúlt 2 napban készült.

Ha bármelyik eltér, 71-es vagy 152-es hiba jön.

A kassza ajánlott mintája#

A fiók beállításától függetlenül működik, ha a számlakészítés előtt és bizonytalan hiba után is rákeresel a rendelésszámra:

import { isSzamlazzError } from 'kassza'

async function szamlaz(rendeles: Rendeles) {
  const orderNumber = `WEB-${rendeles.id}`
  const meglevo = await kassza.invoices.find({ orderNumber })
  if (meglevo) return meglevo.header.number

  try {
    return (await kassza.invoices.create({ orderNumber, buyer: rendeles.vevo, items: rendeles.tetelek })).number
  } catch (error) {
    if (isSzamlazzError(error) && ['network', 'timeout', 'partial_success', 'duplicate'].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)

Ha több számla tartozik ugyanahhoz a rendelésszámhoz, a find() és a get() a legutóbbit adja vissza.

Oldal szerkesztéseUtoljára frissítve: