[{"data":1,"prerenderedAt":727},["ShallowReactive",2],{"blog-b2b-order-sync-erp-hu":3},{"slug":4,"published":5,"minutes":6,"category":7,"tags":8,"keywords":14,"about":25,"sources":35,"cover":71,"og":72,"expertise":73,"locales":74,"lang":77,"title":78,"description":79,"coverAlt":80,"metaTitle":81,"takeaways":82,"faq":88,"toc":104,"blocks":132,"others":454},"b2b-order-sync-erp","2026-10-08",8,"web",[9,10,11,12,13],"ERP integration","SAP","Idempotency","Outbox pattern","Reconciliation",[15,16,17,18,19,20,21,22,23,24],"order sync between shop and ERP","sap sales order api","odata sales order s\u002F4hana","idoc orders05","transactional outbox pattern","idempotency key","erp reconciliation report","sap event mesh sales order created","bapi_salesorder_createfromdat2","shop erp order integration",[26,29,32],{"name":27,"url":28},"Enterprise resource planning","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FEnterprise_resource_planning",{"name":30,"url":31},"Idempotence","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FIdempotence",{"name":33,"url":34},"Transactional outbox pattern","https:\u002F\u002Fmicroservices.io\u002Fpatterns\u002Fdata\u002Ftransactional-outbox.html",[36,39,42,45,48,51,54,57,59,62,65,68],{"title":37,"url":38},"SAP Community: posting sales orders into S\u002F4HANA Cloud via API (2018)","https:\u002F\u002Fcommunity.sap.com\u002Ft5\u002Fenterprise-resource-planning-blog-posts-by-sap\u002Fposting-sales-orders-into-s-4hana-cloud-api-part-1\u002Fba-p\u002F13350199",{"title":40,"url":41},"SAP Community: S\u002F4HANA OData V4 APIs quick reference (15 Feb 2026)","https:\u002F\u002Fcommunity.sap.com\u002Ft5\u002Ffinancial-management-blog-posts-by-sap\u002Fsap-s-4-hana-odata-v4-apis-available-quick-reference-and-available-in-sap\u002Fba-p\u002F14328827",{"title":43,"url":44},"SAP Help: EDI inbound processing, sales order","https:\u002F\u002Fhelp.sap.com\u002Fdoc\u002Fsaphelp_nw70\u002F7.0.12\u002Fja-JP\u002Fdc\u002F6b7cac43d711d1893e0000e8323c4f\u002Fcontent.htm",{"title":46,"url":47},"SAP Help: ALE inbound processing","https:\u002F\u002Fhelp.sap.com\u002Fdoc\u002Fsaphelp_nw75\u002F7.5.5\u002Fen-US\u002F4d\u002F51189400071c86e10000000a42189b\u002Fcontent.htm",{"title":49,"url":50},"SAP Community: custom fields in sales document BAPIs (2024)","https:\u002F\u002Fcommunity.sap.com\u002Ft5\u002Fenterprise-resource-planning-blog-posts-by-sap\u002Fhow-to-use-custom-fields-in-sales-document-bapis\u002Fba-p\u002F13721645",{"title":52,"url":53},"Microsoft Learn: Business Central API v2.0, create salesOrders","https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fdynamics365\u002Fbusiness-central\u002Fdev-itpro\u002Fapi-reference\u002Fv2.0\u002Fapi\u002Fdynamics_salesorder_create",{"title":55,"url":56},"Infor Developer Portal: get all sales orders","https:\u002F\u002Fdeveloper.infor.com\u002Fbusiness-obj-v1\u002Fsales-order\u002Fget-all-sales-orders",{"title":58,"url":34},"microservices.io: transactional outbox",{"title":60,"url":61},"Stripe API reference: idempotent requests","https:\u002F\u002Fdocs.stripe.com\u002Fapi\u002Fidempotent_requests",{"title":63,"url":64},"Confluent: Kafka message delivery guarantees","https:\u002F\u002Fdocs.confluent.io\u002Fkafka\u002Fdesign\u002Fdelivery-semantics.html",{"title":66,"url":67},"Mercari Engineering: payment reconciliation (2021)","https:\u002F\u002Fengineering.mercari.com\u002Fen\u002Fblog\u002Fentry\u002F20211222-1df9e3a553\u002F",{"title":69,"url":70},"OpenTelemetry: messaging spans semantic conventions","https:\u002F\u002Fopentelemetry.io\u002Fdocs\u002Fspecs\u002Fsemconv\u002Fmessaging\u002Fmessaging-spans\u002F","\u002Fimages\u002Fblog\u002Fb2b-order-sync-erp\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fb2b-order-sync-erp\u002Fog.jpg","b2b-ecommerce-developer",[75,76,77],"en","de","hu","Rendelésszinkron a webshop és az ERP között: SAP API-k, idempotencia és egyeztetés","Rendelések szinkronizálása B2B webshop és ERP között: SAP OData, IDoc és BAPI, az outbox minta, idempotenciakulcsok és rendszeres egyeztetés.","Két doboz nyílkörrel összekötve, rajta egy boríték és egy bizonylat.","Rendelésszinkron webshop és ERP között · Balázs Csorba",[83,84,85,86,87],"A rendelésszinkron tranzakciós bizonylatok köre: a webshop rendeléséből ERP vevői rendelés lesz, a visszaigazolások, szállítások és számlák visszafelé áramlanak; a sztornók és visszáruk új bizonylatok, nem törlések.","Az SAP-ban a fő útvonalak a vevői rendelés OData API-ja, az ORDERS üzenettípusú és ORDERS05 alaptípusú IDocok, valamint a BAPI_SALESORDER_CREATEFROMDAT2, amelyhez kifejezett BAPI_TRANSACTION_COMMIT kell.","A rendelést és egy outbox-sort egyetlen adatbázis-tranzakcióban írja, fogadja el, hogy a továbbító kétszer is közzéteheti, és tegye az ERP-írót idempotenssé a webshop rendelési hivatkozására.","A pontosan egyszeri kézbesítés ritkán éli túl az ERP határát; a Kafka alapértelmezésben legalább egyszer kézbesít, ezért a duplikátumokra tervezzen, ne azok elkerülésében bízzon.","Az egyeztetés rutinmunka: rendszeresen vesse össze a webshop és az ERP állapotát, sorolja be az eltéréseket, és ugyanazzal az íróval javítson, amely a normál rendeléseket kezeli.",[89,92,95,98,101],{"q":90,"a":91},"Hogyan szinkronizálhatók a rendelések egy webshop és az SAP között?","Gyakori útvonalak a vevői rendelés OData API-ja, az ORDERS üzenettípusú és ORDERS05 alaptípusú bejövő IDocok, vagy a BAPI_SALESORDER_CREATEFROMDAT2 RFC-n keresztül. A csatolás és a késleltetés igénye szerint válasszon, majd adjon hozzá outboxot a webshopban, a webshop rendelési hivatkozására kulcsolt idempotens írót és ütemezett egyeztetést.",{"q":93,"a":94},"Hogyan előzhetők meg a duplikált vevői rendelések az ERP-ben?","Vigye át a webshop rendelési hivatkozását egy olyan mezőbe, amelyet az ERP ellenőrizni tud, például az SAP vevői rendelés vevői megrendelésszámába vagy a Business Central externalDocumentNumber mezőjébe, ellenőrizze létrehozás előtt, és a fogyasztóban tartson feldolgozottüzenet-táblát. Az újrapróbálások így a meglévő rendelést találják meg, nem hoznak létre másodikat.",{"q":96,"a":97},"Mi a tranzakciós outbox minta?","A webshop a rendelést és egy üzenetsort ugyanabban a tranzakcióban írja a saját adatbázisába. Egy külön továbbító később teszi közzé az üzenetet, és akár többször is, ezért a fogyasztónak idempotensnek kell lennie. A minta megszünteti azt a rést, amikor a rendelés elmentődik, de az üzenete elvész, vagy fordítva.",{"q":99,"a":100},"Lehetséges a pontosan egyszeri kézbesítés webshop és ERP között?","A gyakorlatban nem. A Kafka tranzakciós pontosan egyszeri garanciája csak akkor érvényes, ha a teljes folyamat Kafkán belül marad, egy ERP-hívás pedig ezen kívül esik. Tervezzen legalább egyszeri kézbesítésre idempotens fogyasztókkal és természetes kulcsokkal az ERP-ben, és egyeztessen, hogy megtalálja, ami így is átcsúszik.",{"q":102,"a":103},"Mit ellenőrizzen egy rendelés-egyeztető feladat?","Azokat a rendeléseket, amelyek a webshopban léteznek, de az ERP-ben nem, azokat az ERP-ben lévő rendeléseket, amelyeket a webshop nem ismer, és a mindkét helyen meglévő, de eltérő részletű rendeléseket, például mennyiség, ár vagy állapot szerint. Rögzítsen minden eltérést, ütemezzen javító parancsot, és ugyanazon a hiteles írón futtassa a javítást, mint a normál rendeléseket.",[105,108,111,114,117,120,123,126,129],{"id":106,"title":107},"what-order-sync-covers","Mit fed le a rendelésszinkron?",{"id":109,"title":110},"the-order-lifecycle-between-shop-and-erp","Melyik rendelési állapot kié?",{"id":112,"title":113},"sap-integration-options","Milyen SAP integrációs lehetőségek vannak a rendelésekhez?",{"id":115,"title":116},"beyond-sap","Mi a helyzet a Dynamics 365-tel, az Inforral és más ERP-kkel?",{"id":118,"title":119},"delivery-guarantees-batch-event-queue","Milyen kézbesítési garanciák érhetők el valójában?",{"id":121,"title":122},"idempotency-and-the-outbox","Hogyan működik együtt az outbox és az idempotencia?",{"id":124,"title":125},"failure-modes-and-reconciliation","Milyen hibák fordulnak elő, és hogyan fogja meg őket az egyeztetés?",{"id":127,"title":128},"testing-observability-and-checklist","Tesztelés, megfigyelhetőség és élesítési ellenőrzőlista",{"id":130,"title":131},"sources","Források",[133,142,151,154,157,163,164,167,175,178,179,182,218,221,278,279,302,308,309,316,319,322,323,329,333,335,337,347,354,355,358,365,378,379,385,403,415,416],{"type":134,"content":135},"paragraph",[136,137,141],"A ",{"tag":138,"children":139},"strong",[140],"webshop és az ERP közötti rendelésszinkron"," az a tranzakciós bizonylatkör, amely a webshop rendeléséből ERP vevői rendelést csinál, és visszahozza a visszaigazolásokat, a szállítási állapotot és a számlákat. A termékadat-szinkronnal ellentétben itt a hiba nem egy rossz ár egy oldalon, hanem egy duplikált vevői rendelés, egy elveszett rendelés vagy egy nem egyező számla, vagyis pénzügyi incidens.",{"type":134,"content":143},[144,145,150],"Ez a cikk sorra veszi, melyik állapot kié, az SAP integrációs lehetőségeit és megfelelőiket a Dynamics 365 Business Centralban és az Inforban, a kézbesítési garanciákat, az outbox mintát idempotens fogyasztókkal, a hibamódokat és az egyeztetést, valamint a tesztelést és a megfigyelhetőséget. A termék-törzsadatok szinkronja külön téma, ezt a ",{"tag":146,"to":147,"children":148},"link","\u002Fblog\u002Fpimcore-erp-delta-sync",[149],"Pimcore ERP delta szinkron"," című cikk tárgyalja.",{"type":152,"level":153,"id":106,"text":107},"heading",2,{"type":134,"content":155},[156],"A két rendszer közötti minden tranzakciós bizonylatot lefed: a kimenő rendelést, valamint a visszaérkező rendelés-visszaigazolást, elérhetőségi és árkorrekciókat, szállítási állapotot és számlákat. A sztornók és visszáruk nem törlések, hanem új, kiegyenlítő bizonylatok, amelyek ugyanazon a körön haladnak át.",{"type":158,"src":159,"alt":160,"wide":161,"caption":162},"image","\u002Fimages\u002Fblog\u002Fb2b-order-sync-erp\u002Fdiagram-4.webp","Bizonylatkör a webshop és az ERP között Öt bizonylat balról jobbra: a webshop rendelése a webshopból az ERP-be megy; az ERP vevői rendelése a hiteles rekord; a rendelés-visszaigazolás, a szállítási állapot és a számla az ERP-ből a webshopba áramlik vissza. A sztornók és visszáruk új, kiegyenlítő bizonylatok ugyanebben a körben, nem törlések.",true,"A rendelési kör: egy bizonylat megy ki, több jön vissza, és a javítások új bizonylatok, nem a régiek módosításai.",{"type":152,"level":153,"id":109,"text":110},{"type":134,"content":165},[166],"A webshop a belépési pontért és az ügyfél nézetéért felel; az ERP az árazásért, a készletallokációért, a hitelellenőrzésért, a szállításért és a számlázásért. A „szinkronban van” ezért mezőnként mást jelent: a webshop rendelésszáma a webshopé, és változatlanul kell az ERP-be érkeznie, a visszaigazolt szállítási dátum viszont az ERP-é, a webshop csak megjelenítheti.",{"type":134,"content":168},[169,170,174],"Ezt a felelősséget mezőnként írja le, mielőtt kódot írna. Ez dönti el, melyik oldal nyer ütközéskor, melyik javíthat egy értéket, és mit mondhat őszintén egy ügyfélszolgálati asszisztens; egy ügyfeleknek szóló asszisztens csak akkor tud válaszolni a „hol a rendelésem” kérdésre, ha ez a kör megbízható, lásd ",{"tag":146,"to":171,"children":172},"\u002Fblog\u002Fai-assistant-b2b-shop-customer-support",[173],"AI ügyfélszolgálat B2B webshopoknak",". Több mint tízévnyi Spryker és Pimcore projekt alatt azt láttam, hogy a termékszinkron hibái rossz árként jelennek meg egy oldalon, a rendelésszinkron hibái pedig a pénzügyi osztályon, ezért foglalkozik ez a cikk a legtöbbet az idempotenciával és az egyeztetéssel.",{"type":134,"content":176},[177],"A részleges eredmények a B2B-ben a szokásosak, nem kivételek. Az ERP most 100-ból 80 darabot igazolhat vissza, a többit jövő héten, lecserélhet egy kifutott cikket, vagy módosíthat egy árat, mert változott a szerződés. A webshopnak ezeket a változásokat úgy kell megmutatnia, ahogy vannak, vagyis az állapotmodellnek tételszintű állapotok kellenek, a visszaigazoló üzenetnek pedig tételeket kell frissítenie, nem a teljes rendelést felülírnia.",{"type":152,"level":153,"id":112,"text":113},{"type":134,"content":180},[181],"Három család: a vevői rendelés OData API-ja, az ALE-n keresztüli IDocok és az RFC-n keresztüli BAPI-k. Mindegyik más környezetben nyer, és sok rendszerkörnyezet egynél többet is futtat.",{"type":183,"ordered":184,"items":185},"list",false,[186,199,210],[187,190,191,195,196,198],{"tag":138,"children":188},[189],"OData API:"," az API_SALES_ORDER_SRV vevőirendelés-szolgáltatás támogatja a létrehozást, olvasást, módosítást és törlést; egy 2018-as SAP Community bejegyzés szerint a tételek csak a fej és a tételek együttes, mély beszúrásával könyvelhetők (",{"tag":192,"href":38,"children":193},"a",[194],"SAP Community","), ezért ellenőrizze a viselkedést a saját kiadásán. Az irány az OData V4: az SAP 2026. február 15-én 363 V4 API-t listázott az on-premise S\u002F4HANA-hoz (",{"tag":192,"href":41,"children":197},[194],").",[200,203,204,207,208,198],{"tag":138,"children":201},[202],"IDoc és ALE:"," a klasszikus EDI-útvonal az ORDERS üzenettípust, az ORDERS05 alaptípust, az ORDE feldolgozási kódot és az IDOC_INPUT_ORDERS bejövő függvényt használja, vevőnkénti partnerprofilban beállítva; a hibák munkafolyamat-tételt hoznak létre, a feldolgozás azonnali vagy háttérben futó lehet (",{"tag":192,"href":44,"children":205},[206],"SAP Help","). Az ALE szerializálást is támogat, hogy az egymásra épülő üzenetek sorrendben könyvelődjenek (",{"tag":192,"href":47,"children":209},[206],[211,214,215,217],{"tag":138,"children":212},[213],"BAPI RFC-n:"," a BAPI_SALESORDER_CREATEFROMDAT2 fej-, partner- és tételtáblákból hozza létre a rendelést, a bizonylatszámot a SALESDOCUMENT, az üzeneteket a RETURN paraméterben adja vissza, és nem véglegesít; a hívónak kell lefuttatnia a BAPI_TRANSACTION_COMMIT-ot (",{"tag":192,"href":50,"children":216},[194],"). Az elfelejtett commit a klasszikus „az API azt mondta, rendben, de semmi sincs ott” incidens.",{"type":134,"content":219},[220],"Hogyan válasszon: ha a webshop felhőben fut, és a pénztárban választ vár, az OData API a természetes választás. Ha az ügyfél már EDI-rendeléseket küld, és az SAP-csapat IDoc-felügyeletet üzemeltet, az ORDERS05 újrahasznosítása egyetlen üzemeltetési modellt tart fenn. A BAPI-k olyan köztes réteghez illenek, amely már RFC-hozzáféréssel ül az SAP mellett. Bármit választ, a deduplikációs kulcs és az egyeztető feladat ugyanaz marad, ezért kezelje cserélhetőként az átvitelt.",{"type":222,"head":223,"rows":234},"table",[224,226,228,230,232],[225],"Lehetőség",[227],"Késleltetés",[229],"Csatolás",[231],"Kézbesítési szemantika",[233],"Tipikus alkalmazás",[235,246,257,267],[236,238,240,242,244],[237],"OData API (V2 vagy V4)",[239],"szinkron, másodpercek",[241],"közvetlen HTTP-hívás",[243],"a hívó próbál újra; dedup természetes kulccsal",[245],"webshopok, felhős ERP",[247,249,251,253,255],[248],"IDoc ALE-n",[250],"sorban, percek",[252],"aszinkron, partnerprofilok",[254],"állapotrekordok, újrafeldolgozás",[256],"EDI, nagy volumen, on-premise",[258,260,261,263,265],[259],"BAPI RFC-n",[239],[262],"szoros, RFC-kapcsolat kell",[264],"kifejezett commit; a hívó kezeli az újrapróbálást",[266],"SAP-hoz közeli köztes réteg",[268,270,272,274,276],[269],"Kötegelt fájl",[271],"ütemezett, órák",[273],"laza",[275],"újrafuttatás, fájlszintű dedup",[277],"kis volumen, régi rendszerek",{"type":152,"level":153,"id":115,"text":116},{"type":134,"content":280},[281,282,286,287,290,291,294,295,298,299,198],"A formák hasonlók, és elsőként a deduplikációs horgonyt érdemes keresni. A Business Central ",{"tag":283,"children":284},"code",[285],"POST \u002Fapi\u002Fv2.0\u002Fcompanies({id})\u002FsalesOrders"," hívással hoz létre vevői rendelést, és 201 Created választ ad; az ",{"tag":283,"children":288},[289],"externalDocumentNumber"," mező a webshop rendelési hivatkozásának természetes helye (",{"tag":192,"href":53,"children":292},[293],"Microsoft Learn","). Az Infor az ION API Gateway-en keresztül, OAuth 2.0-val teszi elérhetővé a vevői rendeléseket; az üzleti objektum API alapértelmezett lapmérete 100, a maximum 20 000, a hibaválaszok pedig ",{"tag":283,"children":296},[297],"retryable"," jelzőt hordoznak (",{"tag":192,"href":56,"children":300},[301],"Infor",{"type":134,"content":303},[304,305,307],"Az ERP-k közötti hordozhatóság olcsóbb, ha a webshop egyetlen belső rendelési porttal beszél, és minden ERP vékony adaptert kap. A port határozza meg a kanonikus rendelést, a deduplikációs kulcsot és az állapotszótárat; az adapter képezi le a mezőket és a hibákat. Itt tud egy olyan jelző, mint az Infor ",{"tag":283,"children":306},[297]," mezője, közvetlenül az újrapróbálási szabályba kerülni.",{"type":152,"level":153,"id":118,"text":119},{"type":134,"content":310},[311,312,315],"Legalább egyszeri kézbesítés, idempotenciával biztonságossá téve. A Kafka alapértelmezése a legalább egyszeri kézbesítés; a 0.11.0.0 verzió óta az idempotens producer termelőazonosítóval és sorszámokkal szűri ki a saját újrapróbálásaiból eredő duplikátumokat, a tranzakciós pontosan egyszeri garancia pedig csak akkor érvényes, ha a teljes folyamat Kafkán belül marad (",{"tag":192,"href":64,"children":313},[314],"Confluent","). Egy ERP-hívás ezen a határon kívül esik, így a pontosan egyszeri garancia nem éli túl.",{"type":134,"content":317},[318],"Ez határozza meg a választást egy egyszerű újrapróbáló ciklus és egy üzenetbusz között. Egy webshophoz és egy ERP-hez mérsékelt forgalommal elég egy outbox-táblát olvasó worker szinkron API-hívása. A busz akkor éri meg, ha több fogyasztónak kellenek ugyanazok a rendelési események, például egy raktárrendszernek és az elemzésnek, vagy ha az ERP saját üzleti eseményeket küld; az S\u002F4HANA például vevőirendelés-eseményeket tud közzétenni az SAP Event Meshben. A fogyasztónak mindkét esetben tűrnie kell a duplikátumokat.",{"type":134,"content":320},[321],"Az újrapróbálási szabályt hibaosztályonként határozza meg, ne hívásonként. Az időtúllépések és 5xx válaszok korlátozott számú újrapróbálást kapnak exponenciális visszalépéssel és jitterrel; a validációs hibák, például ismeretlen ügyfél vagy zárolt anyag, közvetlenül emberhez kerülnek, mert az ismétlés csak zajt termel. Az utolsó próbálkozás után az üzenet a hibájával együtt dead letter tárolóba kerül, hogy javítás után ugyanazon az írón keresztül újra lefuttatható legyen, ne kézzel kelljen újra rögzíteni.",{"type":152,"level":153,"id":121,"text":122},{"type":134,"content":324},[325,326,198],"Az outbox biztosítja, hogy egyetlen rendelés se mentődjön az üzenete nélkül, az idempotencia pedig azt, hogy egy kétszer kézbesített üzenet ne hozzon létre két rendelést. A tranzakciós outbox mintában az üzleti írás és az outbox-sor egy adatbázis-tranzakcióban véglegesül, a továbbító pedig később tesz közzé; a továbbító egy üzenetet többször is közzétehet, ezért a fogyasztóknak idempotensnek kell lenniük, például a feldolgozott üzenetazonosítók nyilvántartásával (",{"tag":192,"href":34,"children":327},[328],"microservices.io",{"type":158,"src":330,"alt":331,"wide":161,"caption":332},"\u002Fimages\u002Fblog\u002Fb2b-order-sync-erp\u002Fdiagram-23.webp","Outbox, idempotens író és egyeztető A webshop adatbázisa egy tranzakcióban írja a rendelést és az outbox-sort. Egy továbbító közzéteszi az üzenetet, akár kétszer is. Az ERP-író idempotenciakulccsal hozza létre a vevői rendelést, az ERP pedig a webshop rendelési hivatkozása alapján szűri a duplikátumokat. Egy egyeztető ütemezetten összeveti a webshop és az ERP állapotát, és ugyanazon az ERP-írón keresztül küld javító parancsokat.","Outbox, idempotens író és egyeztető: a duplikátumokra számítunk és elnyeljük őket, a javítások pedig ugyanazt az írási utat használják, mint a normál rendelések.",{"type":283,"code":334},"-- One transaction: the order and the message that announces it\nBEGIN;\nINSERT INTO orders (id, customer_id, total, status)\n  VALUES ('SO-2026-104233', 'C-40017', 1840.00, 'placed');\nINSERT INTO outbox (id, aggregate_id, type, payload)\n  VALUES (gen_random_uuid(), 'SO-2026-104233', 'OrderPlaced', '{\"lines\": 7}');\nCOMMIT;",{"type":283,"code":336},"\u002F\u002F Idempotent consumer (sketch): the shop order id is the dedupe key all the way into the ERP\nasync function handleOrderPlaced(msg: OutboxMessage) {\n  if (await processed.has(msg.id)) return                    \u002F\u002F the relay may deliver twice\n  await withLock(`order:${msg.aggregateId}`, async () => {    \u002F\u002F one writer per order at a time\n    const existing = await erp.findSalesOrder({ customerReference: msg.aggregateId })\n    if (!existing) await erp.createSalesOrder(toErpPayload(msg)) \u002F\u002F header and items in one call\n  })\n  await processed.add(msg.id)\n}",{"type":134,"content":338},[339,340,342,343,346],"A webshop rendelésazonosítóját használja végig kulcsként, és tegye olyan mezőbe, amelyben az ERP keresni tud, például az SAP vevői rendelés vevői megrendelésszámába vagy a Business Central ",{"tag":283,"children":341},[289]," mezőjébe. Az Ön által kezelt HTTP API-khoz a Stripe idempotencia-megoldása jó referencia: a kliens kulcsot küld, az újrapróbálások a mentett választ kapják, a paramétereket összevetik az eredeti kéréssel, a kulcsok pedig legalább 24 óra után törölhetők (",{"tag":192,"href":61,"children":344},[345],"Stripe","). A keres-majd-létrehoz megközelítésben versenyhelyzet van, ezért tart a fenti vázlat rendelésenkénti zárat; ahol elérhető, az ERP-ben a hivatkozásra tett egyediségi megkötés erősebb.",{"type":348,"variant":349,"title":350,"body":351},"callout","warn","Javításhoz soha ne töröljön",[352],[353],"Ha egy rendelés elromlott, egyik rendszerben se törölje az „újraszinkronizálás” kedvéért. Sztornózza kiegyenlítő bizonylattal, és ugyanazzal az íróval hozzon létre újat. A törlés megtöri az audit nyomvonalat, összezavarja az egyeztetést, és az ERP-ben ütközhet olyan szállításokkal vagy számlákkal, amelyek már a rendelésre hivatkoznak.",{"type":152,"level":153,"id":124,"text":125},{"type":134,"content":356},[357],"Duplikált vevői rendelések, elveszett nyugták, elveszett rendelések, részleges hibák, például fej tételek nélkül, ár- vagy mértékegység-eltérés, valamint állapoteltérés egy visszaállítás vagy egy kézi ERP-módosítás után. Az egyeztetés az a rutinfeladat, amely ezeket megtalálja, nem vészhelyzeti eszköz.",{"type":134,"content":359},[360,361,364],"A Mercari mérnökcsapata három gyakorlati kategóriát ír le a fizetési egyeztetéshez, amelyek közvetlenül átvihetők a rendelésekre: helyben sikeres, de a függő rendszerben nem, a függő rendszerben sikeres, de helyben nem, valamint mindkettőben sikeres, de eltérő részletekkel, ami általában esetenkénti kezelést igényel (",{"tag":192,"href":67,"children":362},[363],"Mercari Engineering","). Én rendelésenként háromféle állapotot tartanék: amit a webshop akar, amit alkalmazottként ismer az utolsó egyeztetés időbélyegével, és amit az ERP mond, az egyeztető pedig felismer, besorol, rögzít és javító parancsot ütemez. Maga a javítás ugyanazon a hiteles írón fut, mint a normál rendelések, így minden idempotencia-szabály érvényes marad. Mérje a legrégebbi egyeztetetlen rendelés korát; ha nő, valami megállt a folyamat elején.",{"type":134,"content":366},[367,368,372,373,377],"Ha a hibák felhalmozódnak, valakinek olvasnia kell az IDoc-állapotrekordokat, az OData-hibákat és a dead letter sorokat, és döntenie kell, mit próbál újra; ebben egy ágens segíthet, ahogy az ",{"tag":146,"to":369,"children":370},"\u002Fblog\u002Ferp-integration-error-agent",[371],"ágens ERP-integrációs hibákhoz"," című cikk leírja. Az e-mailben, nem a webshopon át érkező rendelésekre a létrehozó hívásnál ugyanazok az idempotencia-szabályok érvényesek, lásd ",{"tag":146,"to":374,"children":375},"\u002Fblog\u002Fb2b-email-order-entry-llm",[376],"e-mailes rendelésrögzítés automatizálása",".",{"type":152,"level":153,"id":127,"text":128},{"type":134,"content":380},[381,382,198],"ERP homokozó- vagy QA-kliensen teszteljen tesztvállalati kódokkal, és tegye egy elakadt rendelést visszakövethetővé a webshop commitjától az ERP nyugtájáig. Az OpenTelemetry üzenetkezelési konvenciói publish, receive, process és settle spaneket határoznak meg a producer és a consumer nyomkövetései közötti linkekkel, és ez pontosan ennek a folyamatnak a formája (",{"tag":192,"href":70,"children":383},[384],"OpenTelemetry",{"type":183,"ordered":161,"items":386},[387,389,391,393,395,397,399,401],[388],"Írja le a mezők gazdáját: melyik rendszer melyik rendelési mezőért és állapotért felel.",[390],"A rendelést és az outbox-sort egy tranzakcióban írja.",[392],"Vigye a webshop rendelésazonosítóját egy kereshető ERP-mezőbe, és erre deduplikáljon.",[394],"Véglegesítsen kifejezetten, ahol az API megköveteli, például BAPI_TRANSACTION_COMMIT-tal.",[396],"Küldje el kétszer ugyanazt a rendelést a homokozóban, és pontosan egy vevői rendelést várjon; én ezt a valódi webshop-felületről Playwright MCP-vel szkriptelem.",[398],"Futtasson ütemezett, kétirányú egyeztetést, és rögzítsen minden eltérést.",[400],"Kövesse minden rendelés útját a publish, receive és process lépéseken át, és riasszon a sor korára és a legrégebbi egyeztetetlen rendelésre.",[402],"Kiegyenlítő bizonylatokkal javítson, soha ne törléssel.",{"type":134,"content":404},[405,406,410,411,377],"Ha egy B2B webshopot köt SAP-hoz, Business Centralhoz vagy Inforhoz, és azt szeretné, hogy a rendelési kör unalmas maradjon, nézze meg a ",{"tag":146,"to":407,"children":408},"\u002Fexpertise\u002Fb2b-ecommerce-developer",[409],"B2B e-kereskedelmi munkámat",". A konfigurált termékek saját adattartalom-szabályokat hoznak; lásd ",{"tag":146,"to":412,"children":413},"\u002Fblog\u002Fheadless-product-configurator-b2b",[414],"headless termékkonfigurátorok B2B-ben",{"type":152,"level":153,"id":130,"text":131},{"type":183,"ordered":161,"items":417},[418,421,424,427,430,433,436,439,442,445,448,451],[419],{"tag":192,"href":38,"children":420},[37],[422],{"tag":192,"href":41,"children":423},[40],[425],{"tag":192,"href":44,"children":426},[43],[428],{"tag":192,"href":47,"children":429},[46],[431],{"tag":192,"href":50,"children":432},[49],[434],{"tag":192,"href":53,"children":435},[52],[437],{"tag":192,"href":56,"children":438},[55],[440],{"tag":192,"href":34,"children":441},[58],[443],{"tag":192,"href":61,"children":444},[60],[446],{"tag":192,"href":64,"children":447},[63],[449],{"tag":192,"href":67,"children":450},[66],[452],{"tag":192,"href":70,"children":453},[69],[455,529,585,659],{"slug":456,"published":457,"minutes":458,"category":7,"tags":459,"keywords":465,"about":477,"sources":486,"cover":523,"og":524,"expertise":73,"locales":525,"lang":77,"title":526,"description":527,"coverAlt":528},"schema-org-structured-data-b2b-shop","2026-10-17",10,[460,461,462,463,464],"Schema.org","Structured data","B2B e-commerce","Technical SEO","Nuxt",[466,467,468,469,470,471,472,473,474,475,476],"schema.org b2b shop","product structured data b2b","merchant listing structured data","product snippet vs merchant listing","unitpricespecification referencequantity","productgroup variants structured data","organization schema vatid","b2b prices behind login seo","json-ld nuxt schema org","merchant return policy structured data","mpn gtin structured data",[478,480,483],{"name":460,"url":479},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FSchema.org",{"name":481,"url":482},"JSON-LD","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FJSON-LD",{"name":484,"url":485},"Business-to-business","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FBusiness-to-business",[487,490,493,496,499,502,505,508,511,514,517,520],{"title":488,"url":489},"Google Search Central: Introduction to Product structured data","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Fproduct",{"title":491,"url":492},"Google Search Central: Merchant listing (Product, Offer) structured data","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Fmerchant-listing",{"title":494,"url":495},"Google Search Central: Product snippet structured data","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Fproduct-snippet",{"title":497,"url":498},"Google Search Central: Product variant structured data","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Fproduct-variants",{"title":500,"url":501},"Google Search Central: Organization structured data","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Forganization",{"title":503,"url":504},"Google Search Central: Merchant return policy structured data","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Freturn-policy",{"title":506,"url":507},"Google Search Central: General structured data guidelines","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Fsd-policies",{"title":509,"url":510},"Google Search Central: Generate structured data with JavaScript","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Fgenerate-structured-data-with-javascript",{"title":512,"url":513},"Schema.org: Offer","https:\u002F\u002Fschema.org\u002FOffer",{"title":515,"url":516},"Schema.org: UnitPriceSpecification","https:\u002F\u002Fschema.org\u002FUnitPriceSpecification",{"title":518,"url":519},"Unhead: Product schema (defineProduct)","https:\u002F\u002Funhead.unjs.io\u002Fdocs\u002Fschema-org\u002Fapi\u002Fschema\u002Fproduct",{"title":521,"url":522},"Nuxt SEO: Schema.org identity setup","https:\u002F\u002Fnuxtseo.com\u002Fdocs\u002Fschema-org\u002Fguides\u002Fsetup-identity","\u002Fimages\u002Fblog\u002Fschema-org-structured-data-b2b-shop\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fschema-org-structured-data-b2b-shop\u002Fog.jpg",[75,76,77],"Schema.org strukturált adatok B2B webshopokhoz: bejelentkezés mögötti árak, egységek és változatok","Termék-markup B2B shopokhoz: snippet vagy kereskedői lista, melyik ár, cikkszámok, egységárak, változatok, Organization és SSR Nuxtban.","Terméktéglalap vékony kerettel, alsó kis mezőjét alacsony fal takarja el.",{"slug":530,"published":457,"minutes":531,"category":7,"tags":532,"keywords":537,"about":549,"sources":557,"cover":579,"og":580,"expertise":73,"locales":581,"lang":77,"title":582,"description":583,"coverAlt":584},"ai-assistant-b2b-shop-customer-support",9,[462,533,534,535,536],"AI assistant","Customer support","LLM agents","EU AI Act",[538,539,540,541,542,543,544,545,546,547,548],"ai assistant b2b shop","ai customer support b2b ecommerce","llm chatbot order status","ai agent customer service tools","chatbot liability air canada","klarna ai assistant results","human handoff chatbot design","eu ai act chatbot disclosure","owasp excessive agency","ai support resolution rate","b2b customer portal chatbot",[550,553,556],{"name":551,"url":552},"Customer service","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FCustomer_service",{"name":554,"url":555},"Chatbot","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FChatbot",{"name":484,"url":485},[558,561,564,567,570,573,576],{"title":559,"url":560},"Klarna: AI assistant handles two-thirds of customer service chats in its first month (press release, 2024)","https:\u002F\u002Fwww.klarna.com\u002Finternational\u002Fpress\u002Fklarna-ai-assistant-handles-two-thirds-of-customer-service-chats-in-its-first-month\u002F",{"title":562,"url":563},"Entrepreneur: Klarna is hiring customer service agents again, according to its CEO (May 2025)","https:\u002F\u002Fwww.entrepreneur.com\u002Fbusiness-news\u002Fklarna-ceo-reverses-course-by-hiring-more-humans-not-ai\u002F491396",{"title":565,"url":566},"ABA Business Law Today: BC tribunal confirms companies remain liable for information provided by AI chatbot","https:\u002F\u002Fwww.americanbar.org\u002Fgroups\u002Fbusiness_law\u002Fresources\u002Fbusiness-law-today\u002F2024-february\u002Fbc-tribunal-confirms-companies-remain-liable-information-provided-ai-chatbot\u002F",{"title":568,"url":569},"OWASP GenAI Security Project: LLM06:2025 Excessive Agency","https:\u002F\u002Fgenai.owasp.org\u002Fllmrisk\u002Fllm062025-excessive-agency\u002F",{"title":571,"url":572},"OWASP GenAI Security Project: LLM05:2025 Improper Output Handling","https:\u002F\u002Fgenai.owasp.org\u002Fllmrisk\u002Fllm052025-improper-output-handling\u002F",{"title":574,"url":575},"EU AI Act, Article 50: Transparency obligations","https:\u002F\u002Fartificialintelligenceact.eu\u002Farticle\u002F50\u002F",{"title":577,"url":578},"Intercom: Fin pricing and billable outcomes","https:\u002F\u002Ffin.ai\u002Fpricing","\u002Fimages\u002Fblog\u002Fai-assistant-b2b-shop-customer-support\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fai-assistant-b2b-shop-customer-support\u002Fog.jpg",[75,76,77],"AI-asszisztens a B2B webshop ügyfélszolgálatához: eszközök, jogosultságok és átadás embernek","Hogyan építs AI ügyfélszolgálati asszisztenst B2B shophoz: mit automatizálj, eszközök ügyfélkontextusban, átadás embernek, AI Act és mérőszámok.","Magas fal keskeny réssel: nyíl halad át rajta a három négyzetből álló bekerített mezőbe, egy másik lefelé, egy tálca felé mutat.",{"slug":586,"published":457,"minutes":587,"category":7,"tags":588,"keywords":593,"about":605,"sources":615,"cover":652,"og":653,"expertise":654,"locales":655,"lang":77,"title":656,"description":657,"coverAlt":658},"vue-ai-chat-ui-streaming-accessibility",11,[589,464,590,591,592],"Vue","Accessibility","Streaming","AI chat",[594,595,596,597,598,599,600,601,602,603,604],"vue ai chat ui","nuxt llm streaming","sse vs fetch streaming","aria-live streaming text","accessible chat interface","abort fetch stream vue","dompurify markdown llm","role log chat","reduced motion chat ui","wcag 2.2 chat","screen reader streaming",[606,609,612],{"name":607,"url":608},"Web accessibility","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FWeb_accessibility",{"name":610,"url":611},"Server-sent events","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FServer-sent_events",{"name":613,"url":614},"Vue.js","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FVue.js",[616,619,622,625,628,631,634,637,640,643,646,649],{"title":617,"url":618},"MDN: Using server-sent events","https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FAPI\u002FServer-sent_events\u002FUsing_server-sent_events",{"title":620,"url":621},"MDN: AbortController","https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FAPI\u002FAbortController",{"title":623,"url":624},"MDN: ReadableStream","https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FAPI\u002FReadableStream",{"title":626,"url":627},"MDN: TextDecoderStream","https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FAPI\u002FTextDecoderStream",{"title":629,"url":630},"MDN: ARIA log role","https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FAccessibility\u002FARIA\u002FReference\u002FRoles\u002Flog_role",{"title":632,"url":633},"W3C: Understanding SC 4.1.3 Status Messages","https:\u002F\u002Fwww.w3.org\u002FWAI\u002FWCAG22\u002FUnderstanding\u002Fstatus-messages.html",{"title":635,"url":636},"W3C WAI: What's new in WCAG 2.2","https:\u002F\u002Fwww.w3.org\u002FWAI\u002Fstandards-guidelines\u002Fwcag\u002Fnew-in-22\u002F",{"title":638,"url":639},"MDN: prefers-reduced-motion","https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FCSS\u002F@media\u002Fprefers-reduced-motion",{"title":641,"url":642},"DOMPurify README","https:\u002F\u002Fgithub.com\u002Fcure53\u002FDOMPurify",{"title":644,"url":645},"markdown-it README","https:\u002F\u002Fgithub.com\u002Fmarkdown-it\u002Fmarkdown-it",{"title":647,"url":648},"AI SDK docs: useChat","https:\u002F\u002Fai-sdk.dev\u002Fdocs\u002Fai-sdk-ui\u002Fchatbot",{"title":650,"url":651},"Vue docs: nextTick","https:\u002F\u002Fvuejs.org\u002Fapi\u002Fgeneral.html#nexttick","\u002Fimages\u002Fblog\u002Fvue-ai-chat-ui-streaming-accessibility\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fvue-ai-chat-ui-streaming-accessibility\u002Fog.jpg","vue-nuxt-developer",[75,76,77],"AI-csevegő UI Vue-ban és Nuxtban: akadálymentes streaming","AI-csevegő Vue-ban vagy Nuxtban: fetch-stream, megszakítás és újrapróbálás, biztonságos markdown, aria-live bejelentések, billentyűzet és reduced motion.","Üzenetkártya villogó kurzorral, pontozott vonal hullámokká nyílik, mellette pipa.",{"slug":660,"published":457,"minutes":531,"category":7,"tags":661,"keywords":666,"about":678,"sources":688,"cover":721,"og":722,"expertise":654,"locales":723,"lang":77,"title":724,"description":725,"coverAlt":726},"llm-translation-pipeline-i18n",[662,663,664,589,665],"Translation","i18n","LLM","Localization",[667,668,669,670,671,672,673,674,675,676,677],"llm translation pipeline","icu messageformat placeholders","vue i18n llm translation","translation memory llm","glossary enforcement translation","german informal sie du","hungarian translation quality llm","structured output json translation","machine translation post-editing","locale file validation","cldr plural categories",[679,682,685],{"name":680,"url":681},"Internationalization and localization","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FInternationalization_and_localization",{"name":683,"url":684},"ICU MessageFormat","https:\u002F\u002Funicode-org.github.io\u002Ficu\u002Fuserguide\u002Fformat_parse\u002Fmessages\u002F",{"name":686,"url":687},"Vue I18n","https:\u002F\u002Fvue-i18n.intlify.dev\u002F",[689,691,694,697,700,703,706,709,712,715,718],{"title":690,"url":684},"Unicode ICU User Guide: Formatting Messages",{"title":692,"url":693},"Vue I18n: Message Format Syntax","https:\u002F\u002Fvue-i18n.intlify.dev\u002Fguide\u002Fessentials\u002Fsyntax",{"title":695,"url":696},"Nuxt i18n: Getting started","https:\u002F\u002Fi18n.nuxtjs.org\u002Fdocs\u002Fgetting-started",{"title":698,"url":699},"Unicode CLDR: Plural rules","https:\u002F\u002Fcldr.unicode.org\u002Findex\u002Fcldr-spec\u002Fplural-rules",{"title":701,"url":702},"OpenAI: Structured outputs","https:\u002F\u002Fplatform.openai.com\u002Fdocs\u002Fguides\u002Fstructured-outputs",{"title":704,"url":705},"DeepL API: Glossaries","https:\u002F\u002Fdevelopers.deepl.com\u002Fdocs\u002Fapi-reference\u002Fglossaries",{"title":707,"url":708},"W3C: Localization vs. internationalization","https:\u002F\u002Fwww.w3.org\u002FInternational\u002Fquestions\u002Fqa-i18n",{"title":710,"url":711},"GNU gettext manual","https:\u002F\u002Fwww.gnu.org\u002Fsoftware\u002Fgettext\u002Fmanual\u002Fgettext.html",{"title":713,"url":714},"RFC 5646: Tags for Identifying Languages","https:\u002F\u002Fwww.rfc-editor.org\u002Frfc\u002Frfc5646",{"title":716,"url":717},"Rat für deutsche Rechtschreibung","https:\u002F\u002Fwww.rechtschreibrat.com\u002F",{"title":719,"url":720},"Microsoft Writing Style Guide","https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fstyle-guide\u002Fwelcome\u002F","\u002Fimages\u002Fblog\u002Fllm-translation-pipeline-i18n\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fllm-translation-pipeline-i18n\u002Fog.jpg",[75,76,77],"LLM-fordítási pipeline i18n-hez: glosszárium, helyőrzők és review","Termék- és weboldalszövegek fordítása LLM-mel úgy, hogy a helyőrzők, a többes szám és a hangnem épen maradjon: glosszárium, ICU üzenetek, QA-ellenőrzések.","Három forráskártya, egy lefordított kártya glosszárium-szalaggal, majd ellenőrzött tábla.",1792337025467]