From 74cd2477f10b7fde2821f8ac0c98333b187a0976 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20P=C3=B6ttker?= Date: Sat, 23 May 2026 16:25:47 +0200 Subject: [PATCH] =?UTF-8?q?fix:=20two=20polling=20bugs=20=E2=80=94=20corre?= =?UTF-8?q?spondent=20400=20and=20Agrarmonitor=20403?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 400 on Korrespondenten-Sync: getCorrespondentByName was called with searchName "(12345)" but checked exact match against full displayName "Firma (12345)". Always returned null → duplicate addCorrespondent on every run → Paperless 400. Fix: search by displayName directly. - 403 on Livesearch: cached Agrarmonitor session expired. Fix: detect 401/403 from connector, call clearClient() to invalidate cache, break out of the polling loop so next cron run re-authenticates. Co-Authored-By: Claude Sonnet 4.6 --- .../src/agrarmonitor/agrarmonitor-polling.service.ts | 11 +++++++++-- .../src/agrarmonitor/agrarmonitor.service.ts | 4 ++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/paperless-backend/src/agrarmonitor/agrarmonitor-polling.service.ts b/paperless-backend/src/agrarmonitor/agrarmonitor-polling.service.ts index 890f00f..1859bbb 100644 --- a/paperless-backend/src/agrarmonitor/agrarmonitor-polling.service.ts +++ b/paperless-backend/src/agrarmonitor/agrarmonitor-polling.service.ts @@ -105,9 +105,8 @@ export class AgrarmonitorPollingService implements OnModuleInit { )) { try { const lieferantennummer = (customer['lieferantennummer'] as string) ?? ''; - const searchName = `(${lieferantennummer})`; const displayName = this.buildCustomerName(customer, lieferantennummer); - const existing = await this.paperlessService.getCorrespondentByName(searchName); + const existing = await this.paperlessService.getCorrespondentByName(displayName); if (!existing) { await this.paperlessService.addCorrespondent({ name: displayName, @@ -153,6 +152,14 @@ export class AgrarmonitorPollingService implements OnModuleInit { try { amResults = await amClient.eingangsrechnungenLivesearch(interneBelegnummer); } catch (err: unknown) { + const status = (err as any)?.response?.status; + if (status === 401 || status === 403) { + this.agrarmonitorService.clearClient(); + const msg = `Session abgelaufen (${status}) — Polling abgebrochen, nächster Lauf meldet sich neu an`; + this.logger.warn(msg); + result.errors.push(msg); + break; + } const msg = `${interneBelegnummer}: Livesearch-Fehler`; this.logger.error(`${msg}: ${err instanceof Error ? err.message : err}`); result.errors.push(msg); diff --git a/paperless-backend/src/agrarmonitor/agrarmonitor.service.ts b/paperless-backend/src/agrarmonitor/agrarmonitor.service.ts index bff9a17..1fdb49c 100644 --- a/paperless-backend/src/agrarmonitor/agrarmonitor.service.ts +++ b/paperless-backend/src/agrarmonitor/agrarmonitor.service.ts @@ -56,6 +56,10 @@ export class AgrarmonitorService { return this.client; } + clearClient(): void { + this.client = null; + } + async getStatus(): Promise { try { const client = await this.getClient();