Add normalized kunden2 lookup

This commit is contained in:
2026-06-07 14:11:57 +02:00
parent 020d36a0a1
commit 2b5481f7e2
9 changed files with 188 additions and 4 deletions
+82
View File
@@ -11,6 +11,7 @@ import type {
AgrarmonitorFetchCustomersOptions,
AgrarmonitorFreischaltungStatus,
AgrarmonitorLoginStrategy,
AgrarmonitorKunde2,
AgrarmonitorRegistrierungStatus,
EingangsrechnungLivesearchResult,
Logger,
@@ -23,6 +24,14 @@ type RetryableAxiosRequestConfig = AxiosRequestConfig & {
_agrarmonitorRetry?: boolean;
};
type AgrarmonitorCustomerPage = {
data?: unknown;
meta?: {
current_page?: number;
last_page?: number;
};
};
export class AgrarmonitorConnector implements AgrarmonitorConnectorResult {
public http!: AxiosInstance;
@@ -197,6 +206,11 @@ export class AgrarmonitorConnector implements AgrarmonitorConnectorResult {
return responseData.data as AgrarmonitorApiCustomer[];
}
async getKunden2(options: AgrarmonitorFetchCustomersOptions = {}): Promise<AgrarmonitorKunde2[]> {
const customers = await this.fetchAllCustomers(options);
return customers.map(customer => this.mapKunde2(customer));
}
async eingangsrechnungenLivesearch(suchstring: string): Promise<EingangsrechnungLivesearchResult[]> {
const response = await this.http.get('/module/dateien/livesearch.php', {
params: this.createDateienLivesearchParams(suchstring),
@@ -469,6 +483,52 @@ export class AgrarmonitorConnector implements AgrarmonitorConnectorResult {
return client.get<TData>(url, axiosConfig);
}
private async fetchAllCustomers(options: AgrarmonitorFetchCustomersOptions): Promise<AgrarmonitorApiCustomer[]> {
const customers: AgrarmonitorApiCustomer[] = [];
let page = 1;
let lastPage = 1;
do {
const response = await this.apiRequest<AgrarmonitorCustomerPage>('/kunden', {
params: {
per_page: options.perPage ?? 99999,
page,
},
apiToken: options.apiToken,
});
if (!response.data || !Array.isArray(response.data.data)) {
throw new Error('Ungueltige Agrarmonitor API-Antwort');
}
customers.push(...(response.data.data as AgrarmonitorApiCustomer[]));
lastPage = this.parsePositiveNumber(response.data.meta?.last_page, page);
page++;
} while (page <= lastPage);
return customers;
}
private mapKunde2(customer: AgrarmonitorApiCustomer): AgrarmonitorKunde2 {
return {
ID: this.parseNumber(customer.id),
ist_Kunde: this.toBoolean(customer.ist_kunde),
Kundennummer: this.toStringValue(customer.kundennummer),
ist_Lieferant: this.toBoolean(customer.ist_lieferant),
Lieferantennummer: this.toStringValue(customer.lieferantennummer),
Firma: this.toStringValue(customer.firma),
Anrede: this.toStringValue(customer.anrede),
Vorname: this.toStringValue(customer.vorname),
Nachname: this.toStringValue(customer.nachname),
Strasse: this.toStringValue(customer.strasse),
Plz: this.toStringValue(customer.plz),
Ort: this.toStringValue(customer.ort),
Land: this.toStringValue(customer.land_iso_3166),
ist_aktiv: this.toBoolean(customer.ist_aktiv),
};
}
private async performLogin(): Promise<void> {
if (!this.options.username || !this.options.password) {
throw new Error('Agrarmonitor-Credentials nicht konfiguriert');
@@ -646,6 +706,28 @@ export class AgrarmonitorConnector implements AgrarmonitorConnectorResult {
return Number.isFinite(numberValue) ? numberValue : 0;
}
private parsePositiveNumber(value: unknown, fallback: number): number {
const numberValue = this.parseNumber(value);
return numberValue > 0 ? numberValue : fallback;
}
private toStringValue(value: unknown): string {
return value === null || typeof value === 'undefined' ? '' : String(value);
}
private toBoolean(value: unknown): boolean {
if (typeof value === 'boolean') {
return value;
}
if (typeof value === 'number') {
return value === 1;
}
const normalized = String(value ?? '').trim().toLowerCase();
return normalized === '1' || normalized === 'true' || normalized === 'ja';
}
private parseJaNein(value: string): boolean {
return value.trim().toLowerCase() === 'ja';
}
+18
View File
@@ -45,6 +45,7 @@ export interface AgrarmonitorConnectorResult {
checkRegistriert(): Promise<AgrarmonitorRegistrierungStatus>;
registerDevice(options: AgrarmonitorDeviceRegistrationOptions): Promise<AgrarmonitorDeviceRegistrationResult>;
fetchCustomers(options?: AgrarmonitorFetchCustomersOptions): Promise<AgrarmonitorApiCustomer[]>;
getKunden2(options?: AgrarmonitorFetchCustomersOptions): Promise<AgrarmonitorKunde2[]>;
eingangsrechnungenLivesearch(suchstring: string): Promise<EingangsrechnungLivesearchResult[]>;
eingangsrechnungVorhanden(suchstring: string): Promise<boolean>;
eingangsrechnungImDateieingangVorhanden(suchstring: string): Promise<boolean>;
@@ -107,6 +108,23 @@ export interface AgrarmonitorApiCustomer {
[key: string]: unknown;
}
export interface AgrarmonitorKunde2 {
ID: number;
ist_Kunde: boolean;
Kundennummer: string;
ist_Lieferant: boolean;
Lieferantennummer: string;
Firma: string;
Anrede: string;
Vorname: string;
Nachname: string;
Strasse: string;
Plz: string;
Ort: string;
Land: string;
ist_aktiv: boolean;
}
export interface EingangsrechnungLivesearchResult {
dokumentId: number;
vorschauUrl: string;