Arbeitszeit: Zeitbuchungen anlegen, aendern und loeschen

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>
This commit is contained in:
bjoernpoettkerandClaude Opus 5.5 committed 2026-10-14 11:42:57 +02:00
1 parent 6db6c5b278
commit d703e46125
21 files changed
+1920 -16

No files matched your search

+59 -1
View File
@@ -1,9 +1,10 @@
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 } from './types';
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;
@@ -44,6 +45,63 @@ export declare class AgrarmonitorConnector implements AgrarmonitorConnectorResul
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