fix: harden AgrarmonitorWebService error handling and date parsing

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-23 14:41:01 +02:00
parent 433b3be7fa
commit 79874bf54f
@@ -32,7 +32,11 @@ export class AgrarmonitorWebService {
async eingangsrechnungenLivesearch(suchstring: string): Promise<EingangsrechnungEntry[]> {
const client = await this.agrarmonitorService.getClient();
try {
await client.http.get('/');
} catch (err: any) {
this.logger.warn(`Session-Refresh fehlgeschlagen: ${err?.message}`);
}
const searchUrl =
`/module/dateien/livesearch.php?suchstring=${encodeURIComponent(suchstring)}` +
`&stammdatum_typ=-1&mobil=-1&sensibel=-1&firma=0&itemsperpage=100000&seite=1`;
@@ -94,16 +98,12 @@ export class AgrarmonitorWebService {
if (receivedEl) {
const eingangsText = receivedEl.text.trim();
if (eingangsText !== 'Nicht empfangen' && eingangsText.length > 13) {
eingangsDatum = this.parseGermanDate(eingangsText.substring(13));
}
const eingangsMatch = eingangsText.match(/Empfangen am (\d{2}\.\d{2}\.\d{2,4})/);
if (eingangsMatch) eingangsDatum = this.parseGermanDate(eingangsMatch[1]);
const parentText = receivedEl.parentNode?.text ?? '';
const dashIdx = parentText.lastIndexOf('-');
const buchenText = dashIdx >= 0 ? parentText.substring(dashIdx + 1).trim() : '';
if (buchenText !== 'Nicht gebucht' && buchenText.length > 11) {
buchungsDatum = this.parseGermanDate(buchenText.substring(11));
}
const buchenMatch = parentText.match(/Gebucht am (\d{2}\.\d{2}\.\d{2,4})/);
if (buchenMatch) buchungsDatum = this.parseGermanDate(buchenMatch[1]);
}
results.push({ eingangId, belegNummer, interneBelegNummer, kundenId, betriebId, buchungsDatum, eingangsDatum });
@@ -112,7 +112,7 @@ export class AgrarmonitorWebService {
return results;
}
async setEingangsdatum(eingangId: number, _belegNummer: string, datum: Date): Promise<boolean> {
async setEingangsdatum(eingangId: number, datum: Date): Promise<boolean> {
const client = await this.agrarmonitorService.getClient();
const params = new URLSearchParams();
params.append('datum', this.formatGermanDate(datum));
@@ -138,6 +138,7 @@ export class AgrarmonitorWebService {
async setLieferscheinNummer(eingangId: number, lieferscheinNummer: string): Promise<boolean> {
const client = await this.agrarmonitorService.getClient();
try {
const { data: editHtml } = await client.http.get<string>(
`/module/eingangsrechnungen/api/eingangsrechnungen.php?id=edit&rechnungId=${eingangId}`,
{ responseType: 'text' },
@@ -155,6 +156,11 @@ export class AgrarmonitorWebService {
const addressName =
editRoot.querySelector('input[name="addressName"]')?.getAttribute('value') ?? '';
if (!rgempf) {
this.logger.warn(`setLieferscheinNummer(${eingangId}): kein Empfänger im Formular, übersprungen`);
return false;
}
const params = new URLSearchParams();
params.append('lieferscheinnummer', lieferscheinNummer);
params.append('rechnungsnummer', rechnungsnummer);
@@ -162,7 +168,6 @@ export class AgrarmonitorWebService {
params.append('rgempf', rgempf);
params.append('adresstext', addressName);
try {
const res = await client.http.post(
`/module/eingangsrechnungen/api/eingangsrechnungen.php?id=update&rechnungId=${eingangId}`,
params.toString(),
@@ -185,7 +190,10 @@ export class AgrarmonitorWebService {
const parts = str.trim().split('.');
if (parts.length !== 3) return null;
const [dd, mm, yy] = parts;
const year = parseInt(yy, 10) < 50 ? 2000 + parseInt(yy, 10) : 1900 + parseInt(yy, 10);
const yearRaw = parseInt(yy, 10);
const year = yy.length === 2
? (yearRaw < 50 ? 2000 + yearRaw : 1900 + yearRaw)
: yearRaw;
const d = new Date(year, parseInt(mm, 10) - 1, parseInt(dd, 10));
return isNaN(d.getTime()) ? null : d;
}