perf: resolve correspondents via stored AgrarmonitorId instead of name lookup
Build and Push Multi-Platform Images / build-and-push (push) Successful in 30s

- getOrCreateCorrespondent first checks CorrespondentSetting by kundenId
- Falls back to name search only when no mapping exists
- Saves the mapping after creation for future polling runs

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-25 15:07:09 +02:00
parent 4046c656de
commit 7cd7b2dbf5
@@ -143,7 +143,7 @@ export class AgrarmonitorPollingService implements OnModuleInit {
(c) => Number(c['ist_lieferant']) === 1 && Number(c['ist_aktiv']) === 1, (c) => Number(c['ist_lieferant']) === 1 && Number(c['ist_aktiv']) === 1,
)) { )) {
try { try {
await this.getOrCreateCorrespondent(customer); await this.getOrCreateCorrespondent(customer, Number(customer.id));
} catch (err: unknown) { } catch (err: unknown) {
this.logger.warn(`Korrespondenten-Sync fehlgeschlagen: ${err instanceof Error ? err.message : err}`); this.logger.warn(`Korrespondenten-Sync fehlgeschlagen: ${err instanceof Error ? err.message : err}`);
} }
@@ -237,7 +237,7 @@ export class AgrarmonitorPollingService implements OnModuleInit {
let correspondentId: number | undefined; let correspondentId: number | undefined;
const customer = customers.find((c) => Number(c.id) === amDoc.kundenId); const customer = customers.find((c) => Number(c.id) === amDoc.kundenId);
if (customer) { if (customer) {
const corr = await this.getOrCreateCorrespondent(customer); const corr = await this.getOrCreateCorrespondent(customer, amDoc.kundenId);
if (corr) correspondentId = corr.id as number; if (corr) correspondentId = corr.id as number;
} }
@@ -409,7 +409,7 @@ export class AgrarmonitorPollingService implements OnModuleInit {
} }
// Korrespondent ermitteln oder anlegen // Korrespondent ermitteln oder anlegen
const corr = await this.getOrCreateCorrespondent(customer); const corr = await this.getOrCreateCorrespondent(customer, amDoc.kundenId);
// Owner aus Client-Tabelle // Owner aus Client-Tabelle
let ownerId: number | undefined; let ownerId: number | undefined;
@@ -620,7 +620,16 @@ export class AgrarmonitorPollingService implements OnModuleInit {
return { mergedDocuments }; return { mergedDocuments };
} }
private async getOrCreateCorrespondent(customer: Record<string, unknown>): Promise<any> { private async getOrCreateCorrespondent(customer: Record<string, unknown>, kundenId?: number): Promise<any> {
// Direkter Lookup über gespeicherte Agrarmonitor-ID
if (kundenId !== undefined) {
const setting = await this.corrSettingRepo.findOneBy({ AgrarmonitorId: kundenId });
if (setting) {
return { id: setting.CorrespondentId };
}
}
// Fallback: Namensuche und ggf. anlegen
const lieferantennummer = (customer['lieferantennummer'] as string) ?? ''; const lieferantennummer = (customer['lieferantennummer'] as string) ?? '';
const displayName = this.buildCustomerName(customer, lieferantennummer); const displayName = this.buildCustomerName(customer, lieferantennummer);
let corr = await this.paperlessService.getCorrespondentByName(displayName); let corr = await this.paperlessService.getCorrespondentByName(displayName);
@@ -633,6 +642,18 @@ export class AgrarmonitorPollingService implements OnModuleInit {
owner: null, owner: null,
}); });
} }
// Link für künftige Läufe speichern
if (corr && kundenId !== undefined) {
let setting = await this.corrSettingRepo.findOneBy({ CorrespondentId: corr.id as number });
if (!setting) {
setting = this.corrSettingRepo.create({ CorrespondentId: corr.id as number, AgrarmonitorId: kundenId });
} else {
setting.AgrarmonitorId = kundenId;
}
await this.corrSettingRepo.save(setting);
}
return corr; return corr;
} }