Devizás számla EU-s cégnek Egy magyar fejlesztőcég egy német ügyfélnek dolgozik, és havonta euróban számlázza a ledolgozott órákat. A számla angol nyelvű, a vevő közösségi adószámmal szerepel rajta, az áfát pedig a vevő fizeti meg a saját országában. Az árfolyamot a Számlázz.hu az MNB-től veszi, ha nem adsz meg mást.
A recept a Fizetett rendelés számlája recept egyszerSzamlaz() függvényét használja, így a havi számla egy megbízáshoz csak egyszer készül el.
A számlázó függvény#
lib/eu-szamla.ts import type { InvoiceLanguage , Kassza } from 'kassza'
import { isValidEuVatNumber , normalizeEuVatNumber } from 'kassza/validators'
import { kassza as alapKliens } from '@/lib/kassza'
import { egyszerSzamlaz } from '@/lib/szamlazas'
export interface EuMegbizas {
readonly id : string
readonly cegnev : string
readonly orszag : string
readonly iranyitoszam : string
readonly varos : string
readonly cim : string
readonly kozossegiAdoszam : string
readonly email : string
readonly nyelv : InvoiceLanguage
readonly szolgaltatas : string
readonly orak : number
readonly oradijEur : number
}
export async function euSzolgaltatasSzamla (
megbizas : EuMegbizas ,
kliens : Kassza = alapKliens ,
) : Promise < string > {
const euTaxNumber = normalizeEuVatNumber ( megbizas .kozossegiAdoszam)
if ( ! isValidEuVatNumber (euTaxNumber)) {
throw new Error ( `Érvénytelen közösségi adószám: ${ megbizas .kozossegiAdoszam } ` )
}
if ( euTaxNumber .startsWith ( 'HU' )) {
throw new Error ( 'Magyar vevőre ez a recept nem vonatkozik.' )
}
return egyszerSzamlaz (
{
orderNumber : `EU- ${ megbizas .id } ` ,
currency : 'EUR' ,
language : megbizas .nyelv ,
paymentDueInDays : 15 ,
seller : {
emailSubject : 'Your invoice' ,
emailText : 'Please find your invoice attached. Thank you for your business.' ,
} ,
buyer : {
name : megbizas .cegnev ,
country : megbizas .orszag ,
zip : megbizas .iranyitoszam ,
city : megbizas .varos ,
address : megbizas .cim ,
email : megbizas .email ,
euTaxNumber ,
taxpayerType : 'euBusiness' ,
} ,
items : [
{
name : megbizas .szolgaltatas ,
quantity : megbizas .orak ,
unit : 'hour' ,
netUnitPrice : megbizas .oradijEur ,
vat : 'EUFAD37' ,
} ,
] ,
} ,
kliens ,
)
}
A hívás így néz ki egy havi elszámolásból:
scripts/havi-szamlak.ts import { euSzolgaltatasSzamla } from '@/lib/eu-szamla'
const szamlaszam = await euSzolgaltatasSzamla ({
id : '2026-09-HAFENBLICK' ,
cegnev : 'Hafenblick Software GmbH' ,
orszag : 'Germany' ,
iranyitoszam : '20457' ,
varos : 'Hamburg' ,
cim : 'Am Sandtorkai 12' ,
kozossegiAdoszam : 'DE 123 456 789' ,
email : 'billing@example.de' ,
nyelv : 'en' ,
szolgaltatas : 'Software development, September 2026' ,
orak : 42.5 ,
oradijEur : 95 ,
})
console .log ( `Kiállítva: ${ szamlaszam } ` )
A nettó egységárból a kassza számolja ki a tételösszegeket, devizában két tizedesjegyre kerekítve. Az EUFAD37 kódos áfakulcs áfája 0, így a bruttó összeg megegyezik a nettóval.
Devizás számla EU-s vevőnek
Euróban kiállított angol nyelvű számla, közösségi adószámmal és MNB árfolyammal.
Futtatás a sandboxbanKód Elküldött XML Válasz Konzol
devizas-szamla.ts import { createKassza } from 'kassza'
const kassza = createKassza ()
const szamla = await kassza . invoices . create ({
currency : 'EUR' ,
language : 'en' ,
orderNumber : 'EU-2026-3' ,
paymentDueInDays : 30 ,
buyer : {
name : 'Hafenblick Software GmbH' ,
country : 'Germany' ,
zip : '20457' ,
city : 'Hamburg' ,
address : 'Am Sandtorkai 12' ,
euTaxNumber : 'DE123456789' ,
taxpayerType : 'euBusiness' ,
email : 'billing@example.de' ,
} ,
items : [{ name : 'Consulting' , quantity : 8 , unit : 'hour' , netUnitPrice : 95 , vat : 'EUFAD37' }] ,
})
console . log ( szamla . number , szamla . netTotal , szamla . grossTotal )
console . log ( szamla . items [ 0 ]) Számla létrehozás · action-xmlagentxmlfile <? xml version = "1.0" encoding = "UTF-8" ?>
< xmlszamla xmlns = "http://www.szamlazz.hu/xmlszamla" xmlns : xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi : schemaLocation = "http://www.szamlazz.hu/xmlszamla https://www.szamlazz.hu/szamla/docs/xsds/agent/xmlszamla.xsd" >
< beallitasok >
< szamlaagentkulcs >••••••••</ szamlaagentkulcs >
< eszamla >false</ eszamla >
< szamlaLetoltes >true</ szamlaLetoltes >
< valaszVerzio >2</ valaszVerzio >
</ beallitasok >
< fejlec >
< keltDatum >2026-09-19</ keltDatum >
< teljesitesDatum >2026-09-19</ teljesitesDatum >
< fizetesiHataridoDatum >2026-10-19</ fizetesiHataridoDatum >
< fizmod >Átutalás</ fizmod >
< penznem >EUR</ penznem >
< szamlaNyelve >en</ szamlaNyelve >
< arfolyamBank >MNB</ arfolyamBank >
< rendelesSzam >EU-2026-3</ rendelesSzam >
</ fejlec >
< elado ></ elado >
< vevo >
< nev >Hafenblick Software GmbH</ nev >
< orszag >Germany</ orszag >
< irsz >20457</ irsz >
< telepules >Hamburg</ telepules >
< cim >Am Sandtorkai 12</ cim >
< email >billing@example.de</ email >
< sendEmail >true</ sendEmail >
< adoalany >6</ adoalany >
< adoszamEU >DE123456789</ adoszamEU >
</ vevo >
< tetelek >
< tetel >
< megnevezes >Consulting</ megnevezes >
< mennyiseg >8</ mennyiseg >
< mennyisegiEgyseg >hour</ mennyisegiEgyseg >
< nettoEgysegar >95</ nettoEgysegar >
< afakulcs >EUFAD37</ afakulcs >
< nettoErtek >760</ nettoErtek >
< afaErtek >0</ afaErtek >
< bruttoErtek >760</ bruttoErtek >
</ tetel >
</ tetelek >
</ xmlszamla >
Számla létrehozás · válasz, HTTP 200 content-type: application/xml; charset=UTF-8
szlahu_szamlaszam: KASSZA-2026-1
szlahu_nettovegosszeg: 760
szlahu_bruttovegosszeg: 760
szlahu_kintlevoseg: 760
set-cookie: JSESSIONID=6F3EFD2292C33105CCB7E936; Path=/szamla; Secure; HttpOnly
<? xml version = "1.0" encoding = "UTF-8" ?>
< xmlszamlavalasz xmlns = "http://www.szamlazz.hu/xmlszamlavalasz" >
< sikeres >true</ sikeres >
< szamlaszam >KASSZA-2026-1</ szamlaszam >
< szamlanetto >760</ szamlanetto >
< szamlabrutto >760</ szamlabrutto >
< kintlevoseg >760</ kintlevoseg >
< pdf >JVBERi0xLjQKJeLjz9MKMSAwIG9iago8PCAvVHlwZSAvQ2F0YWxvZyAvUGFnZXMgMiAwIFIgPj4KZW5k… (base64 PDF, rövidítve)</ pdf >
</ xmlszamlavalasz >
Konzol KASSZA-2026-1 760 760
{
name: 'Consulting',
quantity: 8,
vat: 'EUFAD37',
netUnitPrice: 95,
netAmount: 760,
vatAmount: 0,
grossAmount: 760
}
Árfolyam#
Ha az exchangeRate mezőt elhagyod, az árfolyamot jegyző bank MNB lesz, és a Számlázz.hu az aznapi MNB árfolyamot használja. Ha a szerződésed más bank árfolyamát írja elő, az egyszerSzamlaz() hívásban add meg az exchangeBank mezőt (például 'OTP') és az exchangeRate mezőt is. Árfolyam nélkül a kassza más bankot nem fogad el, és a kérés elküldése előtt validation hibát ad.
Buktatók#
Az áfakódot a könyvelőd válassza ki
Az EUFAD37 az Áfa tv. 37. §-a alapján másik tagállamban teljesített, fordítottan adózó
ügyletet jelöli, ez jellemzően szolgáltatás. Termékértékesítésnél más kód kell, például EUT, magánszemély vevőnél
pedig egészen más szabályok érvényesek. A kassza ebben nem dönthet helyetted.
A formátum még nem jelent érvényes adószámot
Az isValidEuVatNumber() csak az országkódot és a számformátumot ellenőrzi. Azt, hogy az
adószám él-e, az EU VIES rendszerében kell megnézned, a kassza ezt nem végzi el.
Az értesítő e-mail nyelve
A language: 'en' a számlakép feliratait fordítja le, a tételek nevét és az e-mail szövegét
nem. Ha a Közös kliens alapbeállításaiban magyar e-mail tárgy van,
azt a hívás seller mezőjében írd felül, ahogy a recept teszi.
Árfolyam csak devizás számlán
Forintos számlán az exchangeRate és az exchangeBank nem adható meg, a kassza ilyenkor
validation hibát ad. Devizás számlán az MNB-n kívüli bankhoz az árfolyam kötelező.
Az ország neve szövegként
A country mező szabad szöveg, így kerül a számlára. Írd ki az ország nevét, például
Germany, ne csak az ISO kódját.
Kapcsolódó#