createZeitbuchung, updateZeitbuchung und deleteZeitbuchung buchen Taetigkeitsbloecke und Pausen ueber module/arbeitszeit/api/. Die erste Buchung eines Tages legt per nachtragen.php die Schicht an, weitere Buchungen kommen in die vorhandene Schicht, die bei Bedarf verlaengert wird. Die Kostenstelle wird an die Notiz gehaengt. Unbekannte Taetigkeiten werden vorher abgelehnt, weil Agrarmonitor sie ohne Fehler speichert. Ablehnungen kommen als ZeitbuchungError mit Grund. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
189 lines
8.4 KiB
TypeScript
189 lines
8.4 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[]>;
|
|
/**
|
|
* 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. */
|
|
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
|