diff --git a/AyCode.Services/Nav/docs/EKAER_INTERFACE.md b/AyCode.Services/Nav/docs/EKAER_INTERFACE.md index ed1b6e4..e8859db 100644 --- a/AyCode.Services/Nav/docs/EKAER_INTERFACE.md +++ b/AyCode.Services/Nav/docs/EKAER_INTERFACE.md @@ -82,6 +82,15 @@ A fenti `user` / `passwordHash` / `signingKey` az **ADÓZÓé** (a bejelentésre > **Másik interfész (2024–25): a „NAV M2M általános gépi interfész"** — ÚJ, általánosabb beküldő-csatorna, ahol **a fejlesztő a kliensprogramot regisztrálja** a NAV-nál (a végfelhasználók is regisztrálnak + NAV-tól kapott titkos kódokat írnak be). Ez **NEM** a fenti klasszikus EKÁER 2.2 XML-interfész. Ha a NAV oda terel, ott VAN fejlesztői regisztráció — production előtt érdemes tisztázni, melyik a hatályos. +### Teszt-környezet — külön belépés + technikai felhasználó (2026-07, gyakorlatból) + +A **TESZT-rendszer credentialjai NEM a saját portál-belépési adatok** (a személyes Ügyfélkapu/EKÁER login a teszt-API-hoz `InvalidUserOrPassword`-öt ad). A menet: +1. **Teszt-hozzáférés igénylése** a NAV-nál (Kapcsolatfelvétel → „EKÁER, Informatikai problémák"; a levélben: cégnév, adószám, cím/telefon, e-mail) → a NAV e-mailben küld **kifejezetten generált teszt-belépést**. +2. A teszt-felületen a profilban **technikai felhasználó + kulcsok** generálása: `username` (technikai user, NEM a személyes login), `password`, **XML aláírókulcs** (`signingKey`). +3. A `taxNumber` a **teszthez regisztrált cég** adószámának első 8 jegye. + +Ezek kerülnek az `INavCredentials`-be (a fogyasztónál: `Ekaer:Credentials`). A `BaseUrl` a teszt-hoszt (pl. `https://import-test.ekaer.nav.gov.hu`). **Endpoint:** `{BaseUrl}/TradeCardManagementService/customer/{művelet}` — a művelet-utat a kód fűzi. + ## Műveletek (`tradeCardOperations` → `operation`) | Operation | Jelentés | diff --git a/AyCode.Services/SignalRs/AcBinaryHubProtocol.cs b/AyCode.Services/SignalRs/AcBinaryHubProtocol.cs index a8a8fcd..6574ff4 100644 --- a/AyCode.Services/SignalRs/AcBinaryHubProtocol.cs +++ b/AyCode.Services/SignalRs/AcBinaryHubProtocol.cs @@ -164,8 +164,7 @@ public class AcBinaryHubProtocol : IHubProtocol _chunkStates = new ConditionalWeakTable(); - _logger?.LogInformation( - "AcBinaryHubProtocol initialized name={Name} mode={ProtocolMode} isBrowser={IsBrowser} chunkSize={ChunkSize} initCap={InitCap} flushPolicy={FlushPolicy} flushTimeoutMs={FlushTimeoutMs} useGen={UseGen} wireMode={WireMode} interning={Interning} compression={Compression}", + _logger?.LogInformation("AcBinaryHubProtocol initialized name={Name} mode={ProtocolMode} isBrowser={IsBrowser} chunkSize={ChunkSize} initCap={InitCap} flushPolicy={FlushPolicy} flushTimeoutMs={FlushTimeoutMs} useGen={UseGen} wireMode={WireMode} interning={Interning} compression={Compression}", Name, _protocolMode, IsBrowser, _options.BufferWriterChunkSize, _options.InitialBufferCapacity, _flushPolicy, _flushTimeout.TotalMilliseconds, _options.UseGeneratedCode, _options.WireMode, _options.UseStringInterning, _options.UseCompression); diff --git a/AyCode.Services/SignalRs/AcSignalRClientBase.cs b/AyCode.Services/SignalRs/AcSignalRClientBase.cs index 6c2610e..22a103a 100644 --- a/AyCode.Services/SignalRs/AcSignalRClientBase.cs +++ b/AyCode.Services/SignalRs/AcSignalRClientBase.cs @@ -100,13 +100,28 @@ namespace AyCode.Services.SignalRs public async Task StartConnection() { + var wasConnected = IsConnected(); + if (GetConnectionState() == HubConnectionState.Disconnected) await StartConnectionInternal(); if (!IsConnected()) await TaskHelper.WaitToAsync(IsConnected, ConnectionTimeout, 10, 25); + + // Átmenet-hook: csak TÉNYLEGES felépüléskor tüzel (a StartConnection minden küldés előtt lefut, + // már-kapcsolt állapotban nem hívjuk). Párhuzamos felépülésnél ritkán kétszer is tüzelhet — + // az override legyen idempotens. + if (!wasConnected && IsConnected()) + await OnConnectionEstablished(); } + /// + /// Kapcsolat-felépüléskor fut (első connect ÉS reconnectek után). A küldő-út várja meg — + /// hosszú munkát fire-and-forget taskként indítson, ne blokkolja az adatforgalmat. + /// Idempotensnek kell lennie (párhuzamos felépülésnél kétszer is tüzelhet). + /// + protected virtual Task OnConnectionEstablished() => Task.CompletedTask; + public async Task StopConnection() { await StopConnectionInternal();