Add normalized kunden2 lookup
This commit is contained in:
@@ -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';
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user