Files
AgrarmonitorConnector/dist/AgrarmonitorConnector.d.ts
T
bjoernpoettkerandClaude Opus 5.5 659fdb5293 Arbeitszeit: Arbeitstag beginnen, beenden, aendern und loeschen
beginneArbeitstag legt per saveSchicht.php eine laufende Schicht fuer
beliebige Mitarbeiter an (der Menuepunkt "Arbeitstag beginnen" wirkt nur
fuer den angemeldeten Benutzer). Damit kann auch eine Pause die erste
Buchung des Tages sein. Zeitbuchungen lassen laufende Schichten offen
und ziehen nur den Beginn bei Bedarf vor.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 11:54:58 +02:00

218 lines
9.6 KiB
TypeScript

import { type AxiosInstance } from 'axios';
import type { AgrarmonitorApiCustomer, AgrarmonitorConnectorOptions, AgrarmonitorConnectorResult, AgrarmonitorDeviceRegistrationOptions, AgrarmonitorDeviceRegistrationResult, AgrarmonitorFetchCustomersOptions, AgrarmonitorFreischaltungStatus, AgrarmonitorKunde2, AgrarmonitorRegistrierungStatus, Artikel, ArtikelEinheit, ArtikelKategorie, EingangsrechnungLivesearchResult, Firma, Maschine, MaschineMitGruppe, MaschinenKategorie, Mitarbeiter, Rechnungsdaten, Taetigkeit, ZeitbuchungDaten } from './types';
export declare class AgrarmonitorConnector implements AgrarmonitorConnectorResult {
private readonly options;
http: AxiosInstance;
private static readonly maxLivesearchSeiten;
private static readonly berlinFormat;
private static readonly s3DateienBaseUrl;
private readonly baseUrl;
private readonly apiBaseUrl;
private readonly timeoutMs;
private readonly autoLogin;
private readonly autoRetry;
private readonly loginStrategy;
private readonly logger?;
private cookieJar;
private apiHttp;
private loginInProgress;
constructor(options: AgrarmonitorConnectorOptions);
init(): Promise<this>;
login(): Promise<void>;
clearSession(): Promise<void>;
saveSession(): Promise<void>;
getCookieCount(url?: string): Promise<number>;
checkFreigeschaltet(): Promise<AgrarmonitorFreischaltungStatus>;
checkRegistriert(): Promise<AgrarmonitorRegistrierungStatus>;
registerDevice(registration: 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>;
getRechnungsdaten(rechnungId: number): Promise<Rechnungsdaten>;
private rechnungsdatenAusFormular;
setRechnungsdaten(rechnungId: number, daten: Rechnungsdaten): Promise<boolean>;
setLieferscheinNummer(rechnungId: number, nummer: string): Promise<void>;
setEingangsdatum(rechnungId: number, datum: Date): Promise<boolean>;
getCustomerById(id: number): Promise<AgrarmonitorApiCustomer>;
getMaschinenKategorien(): Promise<MaschinenKategorie[]>;
getMaschinen(gruppenId: number, suchstring?: string): Promise<Maschine[]>;
getAlleMaschinen(): Promise<MaschineMitGruppe[]>;
getFirmen(): Promise<Firma[]>;
getArtikelEinheiten(): Promise<ArtikelEinheit[]>;
getArtikelKategorien(): Promise<ArtikelKategorie[]>;
getArtikel(artikelGruppe: number, suchstring?: string): Promise<Artikel[]>;
getMitarbeiter(suchstring?: string, mitarbeitergruppe?: number): Promise<Mitarbeiter[]>;
getTaetigkeiten(): Promise<Taetigkeit[]>;
/**
* Beginnt den Arbeitstag: legt eine laufende Schicht (Anwesenheit ohne Ende)
* an, wie es das Agrarmonitor-Menue "Arbeitstag beginnen" tut - aber fuer
* beliebige Mitarbeiter (saveSchicht.php statt bueroAnundAbmelden.php, das nur
* fuer den angemeldeten Benutzer wirkt). Laeuft am Tag schon eine Schicht,
* wird deren Referenz geliefert, damit Wiederholungen nichts doppelt anlegen.
*/
beginneArbeitstag(mitarbeiterId: number, start: Date, options?: {
datum?: string;
}): Promise<{
ref: string;
}>;
beendeArbeitstag(ref: string, ende: Date): Promise<void>;
/** Korrigiert Beginn und Ende; `ende: null` laesst den Arbeitstag weiterlaufen. */
updateArbeitstag(ref: string, zeiten: {
start: Date;
ende: Date | null;
}): Promise<void>;
/** Loescht die Schicht samt aller Taetigkeiten und Pausen darin. */
deleteArbeitstag(ref: string): Promise<void>;
private arbeitstagZeitpunkt;
private arbeitstagDatum;
private arbeitstagRef;
private parseArbeitstagRef;
private ladeArbeitstag;
private arbeitstagSetzen;
/**
* Bucht einen Taetigkeitsblock oder eine Pause. Gibt es fuer Mitarbeiter und
* Arbeitstag noch keine Schicht, legt `nachtragen.php` Schicht und Verteilung
* an (Pausen brauchen eine vorhandene Schicht). Sonst kommt die Buchung in die
* passende Schicht, die bei Bedarf verlaengert wird.
*/
createZeitbuchung(daten: ZeitbuchungDaten): Promise<{
ref: string;
}>;
updateZeitbuchung(ref: string, daten: ZeitbuchungDaten): Promise<void>;
deleteZeitbuchung(ref: string): Promise<void>;
private zeitbuchungAufbereiten;
/** Rundet auf die volle Minute - Agrarmonitor speichert keine Sekunden. */
private zeitpunkt;
/** YYYY-MM-DD HH:MM -> dd.mm.yy (HH:MM) */
private vergleichZuFormular;
private zeitbuchungRef;
private parseZeitbuchungRef;
private ladeTagesansicht;
private ladeSchichten;
private ladeSchicht;
/** Schicht, die sich mit der Buchung ueberschneidet, sonst die letzte davor, sonst die erste. */
private passendeSchicht;
/**
* Neue Verteilungen verlaengern die Schicht in Agrarmonitor nicht von selbst.
* Eine laufende Schicht bleibt offen - nur ihr Start wird bei Bedarf vorgezogen.
*/
private schichtErweitern;
private schichtSetzen;
/**
* Erste Buchung des Tages: nachtragen.php legt Schicht und Verteilung an,
* liefert aber keine ID. Die Verteilung wird danach in der Tagesansicht gesucht.
*/
private taetigkeitNachtragen;
/**
* editVerteilungForm.php mit shiftID legt sofort eine leere Verteilung an
* (das Agrarmonitor-UI loescht sie bei "Abbrechen"). Schlaegt das Speichern
* fehl, wird dieser Platzhalter wieder entfernt.
*/
private verteilungAnlegen;
private ladeVerteilungFormular;
private verteilungSpeichern;
/** Wie bei Verteilungen legt editPauseForm.php mit shiftID sofort eine Pause an. */
private pauseAnlegen;
private pauseSpeichern;
/**
* JSON-POST an die Arbeitszeit-API. 4xx (z. B. 422 mit Grund im Body) wird
* als ZeitbuchungError geworfen; Netzwerk- und 5xx-Fehler bleiben Axios-Fehler.
*/
private zeitbuchungPost;
private zeitbuchungAntwortPruefen;
/** 422-Antworten sehen so aus: {"verteilungForm":"ganzertag must be present"} */
private zeitbuchungGrund;
/**
* Agrarmonitor speichert auch unbekannte oder inaktive Taetigkeits-IDs (dann
* ohne Taetigkeit). Deshalb gegen die Auswahl im Buchungsformular pruefen.
*/
private taetigkeitPruefen;
private selectedValue;
private normalisiereText;
/**
* Laedt eine Livesearch-Liste Seite fuer Seite. Die Seitenzahl steht in
* `.pagination[data-pages]`; zusaetzlich bricht die Schleife ab, sobald eine
* Seite keine neuen Zeilen bringt (Agrarmonitor ignoriert `seite` teils).
*/
private loadLivesearchSeiten;
private vorherigeUeberschrift;
/** Agrarmonitor zeigt leere Werte in Livesearch-Tabellen als "-" an. */
private livesearchText;
private createHttpClient;
private createApiHttpClient;
private apiRequest;
private fetchAllCustomers;
private mapKunde2;
private performLogin;
private performRedirectLogin;
private isSessionValid;
private loginRequestConfig;
private isLoginRequiredResponse;
/**
* Liefert das Kriterium, an dem eine abgelaufene Session erkannt wurde,
* oder null fuer eine gueltige Session.
*/
private loginRequiredReason;
private retryAfterLogin;
private createDateienLivesearchParams;
private getEingangsrechnungEditMeta;
private loadEingangsrechnungEditForm;
/** Flaches Objekt aus allen Formularfeldern, wie es das Agrarmonitor-Frontend an update.php schickt. */
private serializeForm;
private getEingangsrechnungDetailMeta;
private formPostConfig;
private parseHtmlDocument;
private hasTableRows;
private inputValue;
private selectedNumberValue;
private parseNumber;
private parsePositiveNumber;
private toStringValue;
private toBoolean;
private parseJaNein;
private parseGermanShortDate;
private requireDate;
private formatGermanShortDate;
private lastPathSegment;
private fileBasename;
private normalizeApiBaseUrl;
private isWrappedApiCustomer;
private isApiCustomer;
private parseGermanShortDateFromText;
private logDebug;
private getResponseUrl;
private getHeader;
private isFreischaltungUrl;
private isLoginPageText;
private extractNonce;
private maskNonce;
private get debugLogging();
/**
* Detail-Logging des Login-Flows. Anders als logDebug faellt das bewusst
* NICHT auf info zurueck - ohne debug-Logger bleiben die Details still.
*/
private logLoginDetail;
private maskValue;
/**
* Liest die Cookies des Jars fuer eine URL aus. Liefert eine leere Liste,
* solange kein debug-Logger haengt - dann wird gar nicht erst serialisiert.
*/
private snapshotCookies;
/**
* Maskiert die Werte im rohen Set-Cookie-Header - sonst stuende die neue
* Session-ID im Klartext im Log, obwohl der Jar-Snapshot sie maskiert.
*/
private formatSetCookieHeader;
/** Wie snapshotCookies, aber mit maskierten Werten - nur das geht ins Log. */
private formatCookies;
private diffCookies;
/**
* Klammert einen Request mit je einem Cookie-Snapshot davor und danach.
* Der Snapshot davor wird vor dem Absenden geloggt, damit er auch dann
* im Log steht, wenn der Request haengt oder wirft.
*/
private loggedRequest;
}
//# sourceMappingURL=AgrarmonitorConnector.d.ts.map