# EKÁER — TODO / nyitott döntések > Companion to [`README.md`](README.md). Topic `EKAER`, prefix `MGFBANKPLUG` → entry IDs `MGFBANKPLUG-EKAER-T-`. > ID format, Status vocabulary, type codes, archival → `../../.github/TOPIC_CODES.md` (→ framework registry). Scope: a `Shipping` / `ShippingDocument` → NAV `tradeCard` leképezés (`ShippingToEkaerMapper`, `FruitBank.Common/Services/Ekaer/`) nyitott üzleti/technikai döntései. A **tisztázott** megfeleltetést lásd [`README.md`](README.md). ## Active entries ## MGFBANKPLUG-EKAER-T-K7Q2: Shipping → tradeCard mapping — nyitott döntések **Status:** Open · **Priority:** P2 · **Type:** T (mapping-tervezés) A `ShippingToEkaerMapper` megírása előtt tisztázandó pontok. Minden sor a jelenlegi (alapértelmezett) feltételezést és a nyitott kérdést rögzíti. | # | Téma | Jelenlegi feltételezés | Nyitott kérdés | |---|------|------------------------|----------------| | 1 | `tradeType` (E/I/D irány) | ✅ **Frissítve (2026-06):** a feladó és a címzett **országkódjának összevetése** dönt: egyezik → **D** (belföld); eltér → kimenőnél **E** (export), bejövőnél **I** (import). (Korábban: HU ↔ nem-HU.) | A `Customer.CountryId` → ISO-feloldás kimenőnél még TODO (#7) → addig a vevő HU, ezért a kimenő ténylegesen D marad. | | 2 | Célhely / telephely | ✅ **Megoldva:** configból (`Ekaer:Company` + `Site` al-szekció) → `IEkaerSettings.Company` + `EkaerCompanyInfo.Site` (`LocationType`, fel-/lerakodás). Nincs hardcode. | Több telephely (mint a `PartnerDepot`) — későbbi, ha kell. | | 3 | Érték (`value`, HUF) | ✅ **Megoldva:** `UnitPriceOnDocument × QuantityOnDocument × árfolyam` (`EkaerValueCalculator`). Pénznem a `Partner.Currency`-ből; EUR-HUF árfolyam configból (`Ekaer:ExchangeRate:EurHuf`, MNB középárfolyam). | Árfolyam dinamizálása (jelenleg „drót" config-érték) — későbbi. | | 4 | Tömeg (`weight`) | ✅ **Frissítve (2026-07):** `GrossWeightOnDocument` — a **szállítólevélen szereplő** bruttó (a value-hoz hasonlóan minden adat a kísérő dokumentumról; a bejelentés nem függ a későbbi mérlegeléstől). Korábban: `MeasuredGrossWeight`. | ✅ **Megoldva (2026-07):** a validátor tételenként blokkoló `weight > 0` szabályt kényszerít (0 = a doksiról hiányzó súly → ValidationError). A **kapu** tételenkénti súly-előfeltétele külön teendő: **#12**. | | 5 | Granularitás | ✅ **Frissítve (2026-06/07):** a kézi út CSOPORT-alapú — bejövő: a `(Shipping, Partner, PartnerDepot)` csoport ÖSSZES dokumentuma = **1 tradeCard** (1 `EkaerHistory` + N mapping); kimenő: 1 rendelés = 1 tradeCard. | ⚠️ A `MapShipping` (automata `SubmitShippingAsync`-út) még **dokumentumonként** gyárt tradeCard-ot — a granularitás ELTÉR a kézi úttól; az automata beadás bekötése ELŐTT a kézi (csoport-alapú) granularitásra egységesítendő. | | 6 | Eladó (`seller*`) mezők | `ShippingDocument.Partner`-ből: `Name`, `TaxId` (első 8 jegy = adószám-törzs), `CountryCode`, `City`, `Street`, `PostalCode`. | A `Partner` (`PartnerBase`) pontos mezőnevei/forrásai — megerősíteni. Továbbá: a NAV **magyar** felrakodási helynél `phone`/`email` mezőt is kér — a `Partner`/`PartnerDepot` entitásban nincs ilyen (entitás+DB bővítés kell; importnál — külföldi feladó — nem játszik). | | 7 | Kimenő irány (`Order` → EKÁER) | ✅ **Implementálva** (`ToConsignment(OrderDto)`): mi=eladó, vevő=címzett; tömeg `OrderItemDto.GrossWeight` (2026-07: a nettót summázó copy-paste bug javítva — most valós bruttó), érték nettó (UnitPriceExclTax × qty), jelenleg minden HUF (rate 1). **`carrierText` kimenőnél NEM töltve** (üres) — a vevő maga viszi el, ő már a címzett; a carrierText opcionális (2026-06). | **Nyitott:** a vonó jármű (**rendszám**) forrása — a `Customer`-hez még nincs bekötve (üres → warning, a felrakodás megkezdéséig pótolandó). Külföldi deviza + `Customer.CountryId` ISO-feloldás (export `E`): későbbi. **Nem mérendő tétel súlya 0** (a pallet-súly 0) → alul-jelentés; a megoldás (perzisztált derivált súly a termék átlagsúlyából + tárából) az **ADR-0001** (`FruitBankHybridApp/docs/adr/0001-non-measurable-item-derived-weight.md`, `Proposed`). | | 8 | `productVtsz` forrás | `ProductDto.Gtin` (átmeneti). | GTIN ≠ VTSZ — lásd [`MGFBANKPLUG-EKAER-I-T3X8`](EKAER_ISSUES.md); hosszú távon külön `Vtsz` mező. A VTSZ-**csoportosítás** + `productName` **külön** kérdés: **T-V9G3**. | | 9 | tétel `tradeReason` | ✅ **Megoldva (2026-07-10, common.xsd-ből ellenőrizve):** MINDKÉT irány **`S`**-t küld (= „Termék értékesítés / beszerzés" — egy kód). A korábbi bejövő `A` HIBÁS volt: az `A` = „Saját tulajdonú termék — törvényváltozás miatt KIVEZETVE" (nem „beszerzés"!), és belföldön (`D`) csak `S` adható. Lásd AyCode `EKAER_TRADECARD.md` → tradeReason. | — | | 10 | `value` mező | ✅ **Megoldva:** a value most töltve (lásd #3); 0 / ismeretlen ár esetén `null` marad. | ✅ **Megoldva (2026-07):** a validátor tételenként blokkoló `value > 0` szabályt kényszerít (hiányzó/0 érték → ValidationError). | | 11 | Külföldi reláció a küszöb-kapuban | ✅ **Lezárva — kimondottan az ügyfél kérése (megerősítve 2026-07-10):** az `EkaerReportability` küszöb alatt is kötelezőnek veszi a külföldi relációt; a hatályos jog ennél kevesebbet követel (13/2020 PM 4.§ i — a mentesség irány-független). | A lehetséges jövőbeni átírás (jogszabályi szabályra) követése: [`EKAER_ISSUES.md`](EKAER_ISSUES.md) **I-F5D9**. | | 12 | Kapu: tételenkénti bruttó súly-előfeltétel | ✅ **Megoldva (2026-07-10):** az `EkaerReportability.Evaluate` (0). lépése MINDEN ág előtt — bármely tétel `WeightKg <= 0` → `DataError` tételes üzenettel (a sor nem jön létre; pótlás után a következő futás felveszi). Korábban a 0 súlyú tétel (kitöltetlen `GrossWeightOnDocument` / méretlen rendelés) csendben alul-számolta a küszöb-summát → alul-jelentési kockázat volt. | — | **Affected:** - `ShippingToEkaerMapper` (`FruitBank.Common/Services/Ekaer/`) — a leképezés - `EkaerTradeCardValidator` / `EkaerSubmitService` / `EkaerManageService` (`AyCode.Services/Nav/Ekaer/`) — validáció + beküldés + HTTP (általános NAV-réteg) - `FruitBankEkaerService` (`FruitBank.Common.Server/Services/Ekaer/`) — a szerver-oldali fogyasztó (map → submit) - Forrás-entitások (`FruitBank.Common`): `Shipping`, `ShippingDocument`, `ShippingItem`, `ProductDto.Gtin` ## MGFBANKPLUG-EKAER-T-W3R8: Termék-szintű EKÁER-besorolás (kockázatos-lista tagság) + hatályos küszöb **Status:** Open · **Priority:** P2 · **Type:** T (adatmodell + mapping + config) > ⚠️ **ÚJRAÍRVA (2026-07-10, webről ellenőrizve — net.jogtar 13/2020 PM + 51/2014 NGM):** a korábban itt szereplő 3-kategóriás küszöb-tábla (200 kg/250 eFt élelmiszer · 500 kg/1 MFt egyéb · 2500 kg/5 MFt nem-kockázatos) a **2021 ELŐTTI** rezsim (5/2015 NGM) volt — **NEM hatályos**. **Hatályos szabály (2021-01-01 óta, 13/2020. (XII. 23.) PM rendelet):** - **CSAK a kockázatos (bejelentésköteles) termék** EKÁER-köteles — a lista az **51/2014. (XII. 31.) NGM rendelet 1. melléklete** (VTSZ-alapú). A listán NEM szereplő termék **egyáltalán nem** jelentendő. - **Egyetlen, egységes küszöb (4. § i):** mentes a fuvarozás, ha az **500 kg bruttó tömeget ÉS az 1 000 000 Ft adó nélküli értéket** sem haladja meg → kötelező, ha **bármelyik** átlépi (a feladó→címzett→jármű relációra aggregálva). - **Lista-módosítás — 25/2025. (VIII. 18.) NGM (2025-08-18-tól):** egyes kertészeti termékek KIKERÜLTEK a kockázatos-listából: vöröshagyma-dughagyma (07031011), friss borsó (07081000), friss bab (07082000), csemegekukorica (07099960), egyes vetőmagok (07129011, 07131010, 07133310). Ha ilyet forgalmazunk, rá bejelentés sem kell. **Jelenlegi állapot — ✅ CONFIG RENDBEN (2026-07-10, user megerősítve):** a `CreateMissingEkaerHistories` globális küszöbe a configból (`Ekaer:Thresholds`) jön, és a **hatályos 500 kg / 1 000 000 Ft van beállítva** az appsettings-ben. A kapu aggregálási/irány-szabályainak ismert nyitott pontjai: **K7Q2 #11** (külföldi küszöb nélkül — túljelent), **#12** (0-súlyú tétel), **T-H7F2** (depot-szintű summa — alul-jelenthet). **Cél (a per-termék rész):** NEM küszöb-kategória-enum kell (az a régi jogszabályhoz készült terv), hanem termék-szintű **„kockázatos-e" besorolás** — a termék rajta van-e az 51/2014-es VTSZ-listán —, DB-ben tárolva (Product oszlop / GenericAttribute), kézzel karbantartva. A kapu a NEM kockázatos terméket a küszöb-summából (és a bejelentésből) teljesen kihagyja. (Későbbi lépés: automatikus levezetés a VTSZ-listából — a lista-módosításokat, mint a 25/2025 NGM, követni kell.) **Affected:** - `FruitBank.Common/Dtos/ProductDto.cs` — küszöb-kategória mező (enum, DB-ben) - `EkaerSettings` / `EkaerValueCalculator` (`FruitBank.Common/Services/Ekaer/`) — kategória → küszöbérték leképezés - `FruitBankDataController.CreateMissingEkaerHistories` — a kapu a tételek kategóriái szerint ## MGFBANKPLUG-EKAER-T-V9G3: tradeCardItem-ek csoportosítása VTSZ szerint + `productName` Category-ből **Status:** Open · **Priority:** P2 · **Type:** T (mapping) · **2026-06** A NAV felé **egy VTSZ-re egy `tradeCardItem`** kell — több azonos-VTSZ-ű termék (pl. kajszibarack/nektarin/őszibarack, mind `08093000`) **egy** tételbe vonva, **összegzett** tömeggel/értékkel. Jelenleg a mapper terméktételenként ad egy `tradeCardItem`-et → azonos VTSZ-nél több sor (a NAV felé nem jó). A nehézség a **`productName`** (a csoport tagjainak más a neve). > **Ez NEM a VTSZ/GTIN-szétválasztás** — az **külön** nyitott kérdés: [`MGFBANKPLUG-EKAER-I-T3X8`](EKAER_ISSUES.md) (lásd #8). A T-V9G3 **csak a csoportosítást és a csoport-nevet** oldja meg, a VTSZ tárolási helyétől (jelenleg `Product.Gtin`) **függetlenül**. **Eldöntött terv (2026-06):** - **`productName` (a csoport neve):** egy nopCommerce **`Category`**-ből, ami VTSZ→név **helper**: a `Category.MetaKeywords` első 8 karaktere = a VTSZ, a `Category.Name` = a `productName`. A kategóriát a **termék VTSZ-e** (jelenleg a `Gtin`-ben — I-T3X8) **= `MetaKeywords`[0..8]** match azonosítja → a termék kategória-**tagsága lényegtelen** (több kategóriából csak az egyező számít). A kategóriák a weben is pontosak maradnak. - **`itemExternalId`:** **sorszám** (1, 2, …) a VTSZ-csoportok fölött — a séma szerint „bejelentésen belüli **tetszőleges** azonosító a **kérés↔válasz** párosításhoz" (max 50), NEM kell stabilnak / forrás-Id-nek lennie; int-parse-olható. - **Csoportosítás helye:** `BuildTradeCard` (VTSZ szerint group → Σtömeg, Σérték, név a lookupból). A **kapu** (`EvaluateObligation`) NEM érintett (csak Σ-t számol → nincs plusz query a reconciliation-nél). - **Név-feloldás:** **csak generáláskor**, szerver-oldalon — a `ProductDto`-t NEM szennyezzük EKÁER-only mezővel. A termék-query `(productId, categoryId)` tuple-t ad (a VTSZ↔`MetaKeywords` joinból), majd egy batch `Category`-load `ToDictionary`-be → `productId → categoryName`. - **Fallback:** ha egy VTSZ-hez nincs kategória → a `productName` üres marad → a **generate-validátor** jelzi (mint a `value > 0`). **Üzemeltetési feltétel:** a VTSZ-forrás (jelenleg `Gtin`) és a kategória `MetaKeywords`-VTSZ-e legyen **szinkronban** (FruitBank-felelősség; a beírásnál a VTSZ-t elöl). **Affected:** - `FruitBank.Common/Services/Ekaer/ShippingToEkaerMapper.cs` — `BuildTradeCard` VTSZ-group + `vtszNames` lookup - `FruitBank.Common.Server/Services/Ekaer/{IFruitBankEkaerService,FruitBankEkaerService}.cs` — a `vtszNames` átadása a generate-en - `FruitBankDataController.GenerateEkaerXmlDocument` (plugin) — `(productId, categoryId)` tuple + batch `Category`-load → `Dictionary` - nopCommerce `Category` (MetaKeywords = VTSZ, Name = productName) — adat/üzemeltetés ## MGFBANKPLUG-EKAER-T-D8R4: Kapu-csoportosítás (Shipping, PartnerDepot)-re; a PartnerDepotId kötelező **Status:** Closed (2026-07-10) · **Priority:** P2 · **Type:** T (kapu) · **2026-06** A `CreateMissingEkaerHistories` bejövő kapuja jelenleg `(ShippingId, PartnerId, PartnerDepotId)`-re csoportosít. Mivel a **`PartnerDepot` egyértelműen egy `Partner`-hez tartozik** (a depó implikálja a feladót), a `PartnerId` a kulcsban **redundáns** → elég a `(ShippingId, PartnerDepotId)` csoportosítás. **Cél:** - A csoportosítási kulcs `(ShippingId, PartnerDepotId)` (a `PartnerId` kivehető). - A **`PartnerDepotId` kötelező** az EKÁER-hez: ha egy szállítólevélen **nincs** `PartnerDepotId` → **hiba**, és **NE generálódjon** rá deklaráció. A kapu a hiányzó-telephelyű dokumentumokat kihagyja + üzenettel jelzi (mint a `DataError`-nál); a generate `ValidationError`-t ad (nem küldhető), nem üres/téves tradeCard-ot. **Megj.:** szigorítás a jelenlegihez képest, ahol a `null` `PartnerDepotId` még külön (null-telephelyű) csoportként kezelődik. Bevezetés előtt a meglévő szállítólevelek `PartnerDepotId`-ját pótolni kell, különben a kapu kihagyja őket. **Affected:** - `FruitBankDataController.CreateMissingEkaerHistories` (plugin) — a `GroupBy` kulcs `(ShippingId, PartnerDepotId)`-re + a hiányzó-`PartnerDepotId` hiba-ág (kihagyás + üzenet) - `FruitBankDataController.GenerateEkaerXmlDocument` / `FruitBankEkaerService` — hiányzó telephelynél `ValidationError`, nincs generálás - `ShippingToEkaerMapper` / `EkaerReportability` (`FruitBank.Common/Services/Ekaer/`) — ha a feladó-cím a `PartnerDepot`-ból jön, a hiányzó telephely validációs hiba ### Resolution (2026-07-10) Implementálva, EGY tudatos eltéréssel: a **kulcs-egyszerűsítés NEM készült el** — a csoportkulcs szándékosan `(ShippingId, PartnerId, PartnerDepotId)` maradt, mert null `PartnerDepotId`-nál a `(ShippingId, PartnerDepotId)` kulcs KÜLÖNBÖZŐ partnerek dokumentumait vonná egy csoportba (null == null), és a kötelezettség-aggregátum partnerek közt keveredne; nem-null depotnál a `PartnerId` redundáns, de ártalmatlan (ugyanazt a csoportosítást adja). - **Kapu:** kötelező bejelentésnél hiányzó `PartnerDepotId` → üzenet a popupba, sor NEM jön létre. A depot-check a kötelezettség-döntés UTÁN fut — küszöb alatti belföldi csoportra nem szól feleslegesen. - **Generate:** `LoadWith(sd => sd.PartnerDepot)` (a lazy asszociáció csak itt töltve) + `FruitBankEkaerService.TryDepotError` guard → hiányzó/betöltetlen depotnál `ValidationError`, XML nem generálódik. - **Mapper:** `LoadLocation = BuildLocation(PartnerDepot ?? partner)` — a felrakodási hely a **depot címe**; a `TaxId` Partner-passthrough (`depot.Partner ??= partner`). A kapu-útvonalon a depot nincs betöltve → partner-cím, ami ott nem számít (a kötelezettség-döntés címet nem használ). ## MGFBANKPLUG-EKAER-T-H7F2: Küszöb-aggregálás szintje: (Shipping, Partner) — a depot-bontás küszöb-rést nyit **Status:** Open (parkolva — vállalt kockázat, ügyfél-döntés 2026-07-10; az I-F5D9-cel együtt kezelendő) · **Priority:** P3 · **Type:** T (kapu) · **2026-07-10** A T-D8R4 óta a kapu `(ShippingId, PartnerId, PartnerDepotId)`-re csoportosít, és a küszöb-summa is **ezen a csoporton** fut. A jogszabályi aggregálási egység viszont a **feladó→címzett→jármű** reláció, telephelytől FÜGGETLENÜL — a 13/2020 PM **§12 (4)** szó szerint: „Egy EKAER számot **kell** megállapítani akkor is, ha egy gépjárművel **egy feladó több felrakodási címéről**, egy címzett több kirakodási címére történik a közúti fuvarozás." **A rés (alul-jelentés!):** ugyanaz a Partner két telephelyről 300–300 kg-ot ad fel ugyanarra a kamionra → a kapu két külön 300 kg-os csoportot lát → mindkettő „küszöb alatt, nem kell" — pedig jogilag 600 kg = **kötelező**. (A gyűjtőfuvar KÜLÖNBÖZŐ feladókkal viszont jogszerűen mentes relációnként — az egység nem a kamion.) **Döntés (2026-07-10, ügyfél): MARAD ÍGY — vállalt kockázat, az entry NYITVA tartva.** Indoklás: (1) nagyon ritkán fordulhat elő; (2) az érintett tételek egyenként definíció szerint küszöb alattiak, így a kitettség kicsi; (3) a `loadDate` csak **nap-pontosságú** (időpont nélküli, opcionális) — a bejelentési adatokból két azonos napi külön fuvar megkülönböztethetetlen, így a NAV felé „két külön alkalommal vitte el" magyarázat adható. **Egyben kezelendő az [`I-F5D9`](EKAER_ISSUES.md)-cel (bejövő külföldi szabály):** ha az ügyfél a hatályos jogszabályi szabályra váltat, a kapu+UI úgyis átírandó — AKKOR ezt is meg kell oldani az alábbi opciók egyikével; addig parkolva. **Döntési opciók (a jövőbeni átíráskor):** - **(a) Jogilag tiszta:** kötelezettség `(Shipping, Partner)`-szinten; **EGY** EkaerHistory/tradeCard partnerenként, a telephelyek külön **`deliveryPlan`**-ekként. **Séma-oldalról megerősítve (2026-07-10, ekaermanagement.xsd):** a `deliveryPlans` 1..N `deliveryPlan`-t enged, mindegyik saját `loadLocation`+`unloadLocation`+tételekkel; a `loadDate` viszont EGY van (fejrész-szintű, opcionális) — „több loadDate" sémaszinten nem létezik, a NAV az egész túrát egy fuvarnak modellezi (érkezés a finalize-nál). Mapper-bővítés kell — most csak 1 fel-/lerakodási helyet képezünk, deliveryPlan nélkül. - **(b) Pragmatikus:** a kötelezettség-summa `(Shipping, Partner)`-szinten fut (ha átlépi, a partner MINDEN depot-csoportja sort kap); a deklaráció marad depot-onként. A küszöb-rés eltűnik; formailag több EKÁER-szám lesz ott, ahol a §12 (4) egyet mond — kockázata tisztázandó. **Affected:** - `FruitBankDataController.CreateMissingEkaerHistories` (plugin) — a kötelezettség-kiértékelés szintje vs a csoport/EkaerHistory-képzés szétválasztása - `ShippingToEkaerMapper` (`FruitBank.Common/Services/Ekaer/`) — (a) opciónál deliveryPlan-többes leképezés - Kapcsolódik: T-D8R4 (Closed — a depot-csoportosítás bevezetése), K7Q2 #11/#12 (küszöb-szabályok) ## MGFBANKPLUG-EKAER-T-C3M8: Customer `isEkaer` mentesség a kimenő kapuban + null-szemantika **Status:** Closed (2026-07-10) · **Priority:** P2 · **Type:** T (kapu + admin-widget) · **2026-07** A vevő-oldali EKÁER-mentesség attribútum **létezik** (`GenericAttribute`: `Key="isEkaer"`, `KeyGroup="Customer"`, StoreId=0; admin CustomerCredit-widget checkbox „Ekáer köteles", `SetEkaer` endpoint menti), de a **kimenő kapu (`CreateMissingEkaerHistories`) nem nézi** — a nagybani piacos (közúti fuvar nélküli) vevők rendelései is tévesen kapnak `Pending` sort. Bejövő oldalon a `Partner.IsEkaer` mentesség működik (csendes kihagyás). **Blokkoló döntés — mi legyen a SOHA be nem állított vevővel (nincs attribútum-sora)?** A csapda: az olvasó (`GetGenericAttributeValueAsync`) hiányzó sornál `false`-t ad, így a widgetben a „be nem állított" és az „explicit mentesített" vevő megkülönböztethetetlen (mindkettő üres checkbox); a Partner-oldalon a default fordított (`IsEkaer = true`, csak explicit `false` mentesít). | Opció | Kapu-viselkedés | Kockázat | Plusz teendő | |---|---|---|---| | **A) hiányzó = KÖTELES** (Partner-konzisztens, fail-safe) | csak az explicit `false` sor mentesít | felesleges Pending az új vevőknél (látható, törölhető) | a widget default-ját igazítani (hiányzó → pipált), különben félrevezet | | **B) hiányzó = MENTES** (a mostani widget-megjelenítés) | csak explicit `true`-ra jön létre sor | **új/be-nem-állított vevő csendben kimarad → alul-jelentés** | minden köteles vevőt pipálni kell | **Implementáció (a döntés után):** a kimenő ágban csendes kihagyás (mint a `Partner.IsEkaer`), az attribútum StoreId=0-val olvasva; a rendelés-lista kicsi (dátum-szűrt), per-customer olvasás vagy batch `GenericAttribute`-query. **Affected:** - `FruitBankDataController.CreateMissingEkaerHistories` (plugin) — kimenő ág: `isEkaer`-szűrés - `CustomerCreditWidgetViewComponent` + `CustomerCreditWidget.cshtml` (plugin) — A) opciónál a hiányzó-attribútum default igazítása - `docs/EKAER/README.md` — kapu-szakasz mentesség-bullet kiegészítése a döntés után ### Resolution (2026-07-10) Az **A) szemantika** valósult meg, `bool?`-olvasással (a user javaslata — a tri-state az adatszinten explicit, a UI kétállapotú maradt): - **Kapu (kimenő ág):** az érintett vevők `isEkaer` attribútumai **EGY batch-queryvel** a ciklus előtt dictionary-be (`ctx.GenericAttributes.Table`, `KeyGroup="Customer"`, `StoreId=0`, a `CustomerId`-kra szűrve — nincs ciklusonkénti DB-hívás); a ciklusban `TryGetValue`: **hiányzó kulcs = nincs beállítva = köteles** (fail-safe, Partner-konzisztens), **explicit `false` → csendes kihagyás** (mint a `Partner.IsEkaer`). - **Widget:** az olvasó `bool?` + **`?? true`** — a soha be nem állított vevőnél a checkbox pipáltat mutat, pontosan azt, amit a kapu csinál; tri-state UI nem készült (a null a felületen nem külön állapot). - `CommonHelper.To` forrásból ellenőrizve: `NullableConverter` kezeli a `"True"/"False"` konverziót; hiányzó sor → null. ## MGFBANKPLUG-EKAER-T-R6P2: Irány-feloldás a FIZIKAI útvonal szerint (depot-ország), nem a cég-országok szerint **Status:** Open · **Priority:** P2 · **Type:** T (mapper + kapu) · **2026-07-10** Az EKÁER-irányt a rendelet a **termék fizikai útja** szerint definiálja (13/2020 PM 3. §: „Közösségen belüli beszerzés/behozatal" = más tagállamból **belföldre irányuló fuvarozás**), nem a felek bejegyzési országa szerint. Példa: **magyar cég német telephelyéről** Magyarországra hozott áru = **import (`I`)** — hiába magyar mindkét fél; fordítva: német cég **magyar** depójából = belföldi (`D`). **A kód ma két helyen a CÉG-országokat (Seller/Buyer `CountryCode`) hasonlítja:** 1. `ShippingToEkaerMapper.ResolveTradeType` — magyar cég + német depot → tévesen `D`-t adna `I` helyett (rossz tradeCard); 2. `EkaerReportability` iránydöntése (a „külföldi → mindig jelent" ügyfél-szabály, lásd [`I-F5D9`](EKAER_ISSUES.md)) — a magyar-cégű, külföldi-depós beszállító belföldinek látszana → küszöb alatt csendben kimaradna (alul-jelentés). **Cél:** irány = **felrakodási hely országa → lerakodási hely országa**. Bejövőnél a **`PartnerDepot.CountryCode`** vs. saját telephely (HU); kimenőnél a saját telephely vs. a vevő-site országa. A tradeCard `sellerCountry` mezője **változatlanul a Partneré marad** (az a feladó CÉG adata — a feladó ≠ felrakodási hely, lásd 13/2020 §12 (4)). **Implementációs megjegyzés:** a kapu jelenleg NEM tölti be a depot-ot (szándékosan lazy) — az iránydöntéshez a depot `CountryCode`-ja a kapu-queryben is kell majd (a csoportkulcsban a `PartnerDepotId` már ott van; `LoadWith` vagy projekció). **Gyakorlati kitettség (2026-07-10):** jelenleg NULLA — minden partner külföldi cég külföldi depóval, a két ország egyezik. A rés vegyes esetnél (magyar cég külföldi telephellyel vagy fordítva) nyílik ki. **Affected:** - `FruitBank.Common/Services/Ekaer/ShippingToEkaerMapper.cs` — `ResolveTradeType` a Load/UnloadLocation országára; az `EkaerConsignment` irány-forrása - `FruitBank.Common/Services/Ekaer/EkaerReportability.cs` — az iránydöntés forrása - `FruitBankDataController.CreateMissingEkaerHistories` (plugin) — depot-ország betöltése a kapu-queryben - Kapcsolódik: K7Q2 #1 (tradeType), [`I-F5D9`](EKAER_ISSUES.md) (külföldi-szabály) ## MGFBANKPLUG-EKAER-T-N4E7: EkaerHistory delete/újragenerálás végpont **Status:** Open · **Priority:** P2 · **Type:** T (folyamat) · **2026-07** A dizájn-cél a „törölhető + újragenerálható" deklaráció (az EKÁER-kapcsolat az `EkaerHistoryMapping` junctionben él, a core adatokat nem érinti), de törlő végpont NINCS — a grid delete tiltva, a hibásan/elavultan létrejött sorok (pl. a T-D8R4 szigorítás ELŐTT létrejött, null-depotos `Pending`-ek) csak kézzel, DB-ből takaríthatók. **Cél:** SignalR-endpoint az `EkaerHistory` + mapping sorok **atomikus** törlésére; a grid delete engedélyezése. Üzletileg tisztázandó: `Sent` státuszú (a NAV-nál már bejelentett) sor törölhető-e (valószínűleg csak `Pending` / `Generated*` / `ValidationError`). **Affected:** - `FruitBankDataController` (plugin) — delete endpoint (EkaerHistory + mappingek atomikusan) - EkaerHistory grid (kliens) — delete gomb engedélyezése