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>
This commit is contained in:
1 parent
d703e46125
commit
659fdb5293
11 files changed
+373
-24
No files matched your search
@@ -105,7 +105,9 @@ The store can read both the connector format and the older Telefonbuch cookie-ar
|
|||||||
- `getMitarbeiter(suchstring?, mitarbeitergruppe?)` reads `/module/mitarbeiter/livesearch.php` and returns employee ID, number, last name, first name, and active flag.
|
- `getMitarbeiter(suchstring?, mitarbeitergruppe?)` reads `/module/mitarbeiter/livesearch.php` and returns employee ID, number, last name, first name, and active flag.
|
||||||
- `getTaetigkeiten()` reads `/module/arbeitszeit/taetigkeiten-livesearch.php` (active and inactive) and returns activity ID, UUID, number, name, active flag, area (`bereichId`, `bereich`) and the flags `maschineZuordnen`, `abwesenheit`, `notizErzwingen`.
|
- `getTaetigkeiten()` reads `/module/arbeitszeit/taetigkeiten-livesearch.php` (active and inactive) and returns activity ID, UUID, number, name, active flag, area (`bereichId`, `bereich`) and the flags `maschineZuordnen`, `abwesenheit`, `notizErzwingen`.
|
||||||
- Agrarmonitor has no cost center master data (`Kostenstelle` is only a free-text field on machines, employees and articles), so there is no `getKostenstellen()`. See `docs/zeitbuchung-analyse.md`.
|
- Agrarmonitor has no cost center master data (`Kostenstelle` is only a free-text field on machines, employees and articles), so there is no `getKostenstellen()`. See `docs/zeitbuchung-analyse.md`.
|
||||||
- `createZeitbuchung(daten)` books an activity block (`taetigkeitId`, optional `maschinenId`, `notiz`, `kostenstelle`) or a break (`art: 'pause'`) for `mitarbeiterId` from `start` to `ende` (minute precision, Europe/Berlin) and returns `{ ref }`. The first booking of a day creates the shift via `nachtragen.php`; later bookings go into the existing shift, which is extended if needed. Breaks need an existing shift. Agrarmonitor has no cost center field, so `kostenstelle` is appended to the note as `Kostenstelle: …`. Pass `datum` (YYYY-MM-DD) for blocks after midnight that belong to the previous workday.
|
- `beginneArbeitstag(mitarbeiterId, start, { datum? })` starts the workday: creates a running shift (attendance without end) for any employee and returns `{ ref }` (`schicht:<mitarbeiterId>:<YYYY-MM-DD>:<id>`). If a running shift already exists that day, its ref is returned instead. The Agrarmonitor menu link "Arbeitstag beginnen" (`bueroAnundAbmelden.php`) only works for the logged-in user, so the connector uses `module/auftraege/api/saveSchicht.php`.
|
||||||
|
- `beendeArbeitstag(ref, ende)` ends the shift, `updateArbeitstag(ref, { start, ende })` corrects it (`ende: null` keeps it running), `deleteArbeitstag(ref)` deletes the shift including all activities and breaks.
|
||||||
|
- `createZeitbuchung(daten)` books an activity block (`taetigkeitId`, optional `maschinenId`, `notiz`, `kostenstelle`) or a break (`art: 'pause'`) for `mitarbeiterId` from `start` to `ende` (minute precision, Europe/Berlin) and returns `{ ref }`. Bookings go into the shift of that day (started with `beginneArbeitstag`), which is extended if needed; a running shift stays open. Without any shift, an activity creates one via `nachtragen.php`, a break is rejected. Agrarmonitor has no cost center field, so `kostenstelle` is appended to the note as `Kostenstelle: …`. Pass `datum` (YYYY-MM-DD) for blocks after midnight that belong to the previous workday.
|
||||||
- `updateZeitbuchung(ref, daten)` changes times, activity, machine and note of a booking (the old note is replaced); changing the type (activity/break), employee or workday is rejected.
|
- `updateZeitbuchung(ref, daten)` changes times, activity, machine and note of a booking (the old note is replaced); changing the type (activity/break), employee or workday is rejected.
|
||||||
- `deleteZeitbuchung(ref)` deletes a booking; deleting the last activity of a shift also deletes the shift in Agrarmonitor.
|
- `deleteZeitbuchung(ref)` deletes a booking; deleting the last activity of a shift also deletes the shift in Agrarmonitor.
|
||||||
- Refs look like `verteilung:<mitarbeiterId>:<YYYY-MM-DD>:<id>` or `pause:…`. Rejections by Agrarmonitor (HTTP 4xx such as 422 with the reason in the body) and invalid input throw `ZeitbuchungError` (`grund`, `status`); network and 5xx errors are thrown unchanged so callers can retry.
|
- Refs look like `verteilung:<mitarbeiterId>:<YYYY-MM-DD>:<id>` or `pause:…`. Rejections by Agrarmonitor (HTTP 4xx such as 422 with the reason in the body) and invalid input throw `ZeitbuchungError` (`grund`, `status`); network and 5xx errors are thrown unchanged so callers can retry.
|
||||||
|
|||||||
Vendored
+30
-1
@@ -45,6 +45,32 @@ export declare class AgrarmonitorConnector implements AgrarmonitorConnectorResul
|
|||||||
getArtikel(artikelGruppe: number, suchstring?: string): Promise<Artikel[]>;
|
getArtikel(artikelGruppe: number, suchstring?: string): Promise<Artikel[]>;
|
||||||
getMitarbeiter(suchstring?: string, mitarbeitergruppe?: number): Promise<Mitarbeiter[]>;
|
getMitarbeiter(suchstring?: string, mitarbeitergruppe?: number): Promise<Mitarbeiter[]>;
|
||||||
getTaetigkeiten(): Promise<Taetigkeit[]>;
|
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
|
* Bucht einen Taetigkeitsblock oder eine Pause. Gibt es fuer Mitarbeiter und
|
||||||
* Arbeitstag noch keine Schicht, legt `nachtragen.php` Schicht und Verteilung
|
* Arbeitstag noch keine Schicht, legt `nachtragen.php` Schicht und Verteilung
|
||||||
@@ -68,7 +94,10 @@ export declare class AgrarmonitorConnector implements AgrarmonitorConnectorResul
|
|||||||
private ladeSchicht;
|
private ladeSchicht;
|
||||||
/** Schicht, die sich mit der Buchung ueberschneidet, sonst die letzte davor, sonst die erste. */
|
/** Schicht, die sich mit der Buchung ueberschneidet, sonst die letzte davor, sonst die erste. */
|
||||||
private passendeSchicht;
|
private passendeSchicht;
|
||||||
/** Neue Verteilungen verlaengern die Schicht in Agrarmonitor nicht von selbst. */
|
/**
|
||||||
|
* 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 schichtErweitern;
|
||||||
private schichtSetzen;
|
private schichtSetzen;
|
||||||
/**
|
/**
|
||||||
|
|||||||
Vendored
+1
-1
@@ -1 +1 @@
|
|||||||
{"version":3,"file":"AgrarmonitorConnector.d.ts","sourceRoot":"","sources":["../src/AgrarmonitorConnector.ts"],"names":[],"mappings":"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"}
|
{"version":3,"file":"AgrarmonitorConnector.d.ts","sourceRoot":"","sources":["../src/AgrarmonitorConnector.ts"],"names":[],"mappings":"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 truncated
|
||||||
Vendored
+91
-5
@@ -484,6 +484,88 @@ class AgrarmonitorConnector {
|
|||||||
}
|
}
|
||||||
return Array.from(taetigkeiten.values());
|
return Array.from(taetigkeiten.values());
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
async beginneArbeitstag(mitarbeiterId, start, options = {}) {
|
||||||
|
const beginn = this.arbeitstagZeitpunkt(mitarbeiterId, start, 'start');
|
||||||
|
const datum = this.arbeitstagDatum(options.datum, beginn);
|
||||||
|
const laufend = (await this.ladeSchichten(mitarbeiterId, datum)).find(schicht => schicht.ende === null);
|
||||||
|
if (laufend) {
|
||||||
|
this.logDebug('Arbeitstag laeuft bereits', { mitarbeiterId, datum, schichtId: laufend.id });
|
||||||
|
return { ref: this.arbeitstagRef(mitarbeiterId, datum, laufend.id) };
|
||||||
|
}
|
||||||
|
const antwort = await this.zeitbuchungPost('/module/auftraege/api/saveSchicht.php', {
|
||||||
|
vorgang_id: '-1',
|
||||||
|
mitarbeiter_id: mitarbeiterId,
|
||||||
|
formdata: { timestamp_start: beginn.formular, timestamp_ende: '' },
|
||||||
|
}, 'Arbeitstag beginnen');
|
||||||
|
const id = this.parseNumber(antwort);
|
||||||
|
if (!id) {
|
||||||
|
throw new ZeitbuchungError_1.ZeitbuchungError('Agrarmonitor hat keine Schicht angelegt', this.zeitbuchungGrund(antwort));
|
||||||
|
}
|
||||||
|
return { ref: this.arbeitstagRef(mitarbeiterId, datum, id) };
|
||||||
|
}
|
||||||
|
async beendeArbeitstag(ref, ende) {
|
||||||
|
const zielRef = this.parseArbeitstagRef(ref);
|
||||||
|
const schicht = await this.ladeArbeitstag(zielRef, ref);
|
||||||
|
await this.arbeitstagSetzen(schicht, schicht.start, this.arbeitstagZeitpunkt(zielRef.mitarbeiterId, ende, 'ende').vergleich);
|
||||||
|
}
|
||||||
|
/** Korrigiert Beginn und Ende; `ende: null` laesst den Arbeitstag weiterlaufen. */
|
||||||
|
async updateArbeitstag(ref, zeiten) {
|
||||||
|
const zielRef = this.parseArbeitstagRef(ref);
|
||||||
|
const schicht = await this.ladeArbeitstag(zielRef, ref);
|
||||||
|
const start = this.arbeitstagZeitpunkt(zielRef.mitarbeiterId, zeiten.start, 'start').vergleich;
|
||||||
|
const ende = zeiten.ende === null ? null : this.arbeitstagZeitpunkt(zielRef.mitarbeiterId, zeiten.ende, 'ende').vergleich;
|
||||||
|
await this.arbeitstagSetzen(schicht, start, ende);
|
||||||
|
}
|
||||||
|
/** Loescht die Schicht samt aller Taetigkeiten und Pausen darin. */
|
||||||
|
async deleteArbeitstag(ref) {
|
||||||
|
const zielRef = this.parseArbeitstagRef(ref);
|
||||||
|
await this.zeitbuchungPost('/module/arbeitszeit/api/deleteSchicht.php', { shiftID: zielRef.id, employeeID: zielRef.mitarbeiterId, date: zielRef.datum }, 'Arbeitstag loeschen');
|
||||||
|
}
|
||||||
|
arbeitstagZeitpunkt(mitarbeiterId, date, feld) {
|
||||||
|
if (!Number.isInteger(mitarbeiterId) || mitarbeiterId <= 0) {
|
||||||
|
throw new ZeitbuchungError_1.ZeitbuchungError('Ungueltige Mitarbeiter-ID', 'mitarbeiterId');
|
||||||
|
}
|
||||||
|
if (!(date instanceof Date) || Number.isNaN(date.getTime())) {
|
||||||
|
throw new ZeitbuchungError_1.ZeitbuchungError(feld === 'start' ? 'Ungueltiger Start' : 'Ungueltiges Ende', feld);
|
||||||
|
}
|
||||||
|
return this.zeitpunkt(date);
|
||||||
|
}
|
||||||
|
arbeitstagDatum(datum, start) {
|
||||||
|
if (datum !== undefined && !/^\d{4}-\d{2}-\d{2}$/.test(datum)) {
|
||||||
|
throw new ZeitbuchungError_1.ZeitbuchungError('Ungueltiger Arbeitstag, erwartet YYYY-MM-DD', 'datum');
|
||||||
|
}
|
||||||
|
return datum ?? start.datum;
|
||||||
|
}
|
||||||
|
arbeitstagRef(mitarbeiterId, datum, schichtId) {
|
||||||
|
return `schicht:${mitarbeiterId}:${datum}:${schichtId}`;
|
||||||
|
}
|
||||||
|
parseArbeitstagRef(ref) {
|
||||||
|
const match = /^schicht:(\d+):(\d{4}-\d{2}-\d{2}):(\d+)$/.exec(ref);
|
||||||
|
if (!match) {
|
||||||
|
throw new ZeitbuchungError_1.ZeitbuchungError(`Ungueltige Arbeitstag-Referenz: ${ref}`, 'ref');
|
||||||
|
}
|
||||||
|
return { mitarbeiterId: Number(match[1]), datum: match[2], id: Number(match[3]) };
|
||||||
|
}
|
||||||
|
async ladeArbeitstag(zielRef, ref) {
|
||||||
|
const schicht = await this.ladeSchicht(zielRef.id);
|
||||||
|
if (!schicht) {
|
||||||
|
throw new ZeitbuchungError_1.ZeitbuchungError(`Arbeitstag ${ref} nicht gefunden`, 'nicht gefunden');
|
||||||
|
}
|
||||||
|
return schicht;
|
||||||
|
}
|
||||||
|
async arbeitstagSetzen(schicht, start, ende) {
|
||||||
|
if (ende !== null && ende <= start) {
|
||||||
|
throw new ZeitbuchungError_1.ZeitbuchungError('Ende muss mindestens eine Minute nach dem Beginn liegen', 'dauer');
|
||||||
|
}
|
||||||
|
await this.schichtSetzen({ id: schicht.id, start, ende });
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* Bucht einen Taetigkeitsblock oder eine Pause. Gibt es fuer Mitarbeiter und
|
* Bucht einen Taetigkeitsblock oder eine Pause. Gibt es fuer Mitarbeiter und
|
||||||
* Arbeitstag noch keine Schicht, legt `nachtragen.php` Schicht und Verteilung
|
* Arbeitstag noch keine Schicht, legt `nachtragen.php` Schicht und Verteilung
|
||||||
@@ -685,19 +767,22 @@ class AgrarmonitorConnector {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
const start = data.timestamp_start.slice(0, 16);
|
const start = data.timestamp_start.slice(0, 16);
|
||||||
const ende = data.timestamp_ende && !data.timestamp_ende.startsWith('0000') ? data.timestamp_ende.slice(0, 16) : start;
|
const ende = data.timestamp_ende && !data.timestamp_ende.startsWith('0000') ? data.timestamp_ende.slice(0, 16) : null;
|
||||||
return { id: schichtId, start, ende };
|
return { id: schichtId, start, ende };
|
||||||
}
|
}
|
||||||
/** Schicht, die sich mit der Buchung ueberschneidet, sonst die letzte davor, sonst die erste. */
|
/** Schicht, die sich mit der Buchung ueberschneidet, sonst die letzte davor, sonst die erste. */
|
||||||
passendeSchicht(schichten, buchung) {
|
passendeSchicht(schichten, buchung) {
|
||||||
return (schichten.find(schicht => schicht.start <= buchung.ende.vergleich && buchung.start.vergleich <= schicht.ende) ??
|
return (schichten.find(schicht => schicht.start <= buchung.ende.vergleich && (schicht.ende === null || buchung.start.vergleich <= schicht.ende)) ??
|
||||||
schichten.filter(schicht => schicht.start <= buchung.start.vergleich).at(-1) ??
|
schichten.filter(schicht => schicht.start <= buchung.start.vergleich).at(-1) ??
|
||||||
schichten[0]);
|
schichten[0]);
|
||||||
}
|
}
|
||||||
/** Neue Verteilungen verlaengern die Schicht in Agrarmonitor nicht von selbst. */
|
/**
|
||||||
|
* Neue Verteilungen verlaengern die Schicht in Agrarmonitor nicht von selbst.
|
||||||
|
* Eine laufende Schicht bleibt offen - nur ihr Start wird bei Bedarf vorgezogen.
|
||||||
|
*/
|
||||||
async schichtErweitern(schicht, buchung) {
|
async schichtErweitern(schicht, buchung) {
|
||||||
const start = buchung.start.vergleich < schicht.start ? buchung.start.vergleich : schicht.start;
|
const start = buchung.start.vergleich < schicht.start ? buchung.start.vergleich : schicht.start;
|
||||||
const ende = buchung.ende.vergleich > schicht.ende ? buchung.ende.vergleich : schicht.ende;
|
const ende = schicht.ende === null || buchung.ende.vergleich <= schicht.ende ? schicht.ende : buchung.ende.vergleich;
|
||||||
if (start === schicht.start && ende === schicht.ende) {
|
if (start === schicht.start && ende === schicht.ende) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -709,7 +794,8 @@ class AgrarmonitorConnector {
|
|||||||
await this.zeitbuchungPost('/module/arbeitszeit/api/updateSchicht.php', {
|
await this.zeitbuchungPost('/module/arbeitszeit/api/updateSchicht.php', {
|
||||||
shiftID: schicht.id,
|
shiftID: schicht.id,
|
||||||
timestampStart: this.vergleichZuFormular(schicht.start),
|
timestampStart: this.vergleichZuFormular(schicht.start),
|
||||||
timestampEnd: this.vergleichZuFormular(schicht.ende),
|
// Leeres Ende laesst die Schicht laufen.
|
||||||
|
timestampEnd: schicht.ende === null ? '' : this.vergleichZuFormular(schicht.ende),
|
||||||
}, 'Schicht anpassen');
|
}, 'Schicht anpassen');
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
|
|||||||
Vendored
+1
-1
@@ -1 +1 @@
|
|||||||
{"version":3,"file":"AgrarmonitorConnector.js","sourceRoot":"","sources":["../src/AgrarmonitorConnector.ts"],"names":[],"mappings":"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 truncated
|
{"version":3,"file":"AgrarmonitorConnector.js","sourceRoot":"","sources":["../src/AgrarmonitorConnector.ts"],"names":[],"mappings":"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 truncated
|
||||||
Vendored
+11
@@ -57,6 +57,17 @@ export interface AgrarmonitorConnectorResult {
|
|||||||
getArtikel(artikelGruppe: number, suchstring?: string): Promise<Artikel[]>;
|
getArtikel(artikelGruppe: number, suchstring?: string): Promise<Artikel[]>;
|
||||||
getMitarbeiter(suchstring?: string, mitarbeitergruppe?: number): Promise<Mitarbeiter[]>;
|
getMitarbeiter(suchstring?: string, mitarbeitergruppe?: number): Promise<Mitarbeiter[]>;
|
||||||
getTaetigkeiten(): Promise<Taetigkeit[]>;
|
getTaetigkeiten(): Promise<Taetigkeit[]>;
|
||||||
|
beginneArbeitstag(mitarbeiterId: number, start: Date, options?: {
|
||||||
|
datum?: string;
|
||||||
|
}): Promise<{
|
||||||
|
ref: string;
|
||||||
|
}>;
|
||||||
|
beendeArbeitstag(ref: string, ende: Date): Promise<void>;
|
||||||
|
updateArbeitstag(ref: string, zeiten: {
|
||||||
|
start: Date;
|
||||||
|
ende: Date | null;
|
||||||
|
}): Promise<void>;
|
||||||
|
deleteArbeitstag(ref: string): Promise<void>;
|
||||||
createZeitbuchung(daten: ZeitbuchungDaten): Promise<{
|
createZeitbuchung(daten: ZeitbuchungDaten): Promise<{
|
||||||
ref: string;
|
ref: string;
|
||||||
}>;
|
}>;
|
||||||
|
|||||||
Vendored
+1
-1
@@ -1 +1 @@
|
|||||||
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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 truncated
|
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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 truncated
|
||||||
@@ -69,7 +69,9 @@ Alle `POST` mit `Content-Type: application/json`, sofern nicht anders angegeben.
|
|||||||
| Verteilung löschen | `module/arbeitszeit/api/deleteVerteilung.php` `{distributionID, employeeID, date}` | `200` `null`; war es die letzte Verteilung: `{"action":"link","target":"arbeitszeit"}` und die Schicht wird mitgelöscht (`ist_deleted: 1`) |
|
| Verteilung löschen | `module/arbeitszeit/api/deleteVerteilung.php` `{distributionID, employeeID, date}` | `200` `null`; war es die letzte Verteilung: `{"action":"link","target":"arbeitszeit"}` und die Schicht wird mitgelöscht (`ist_deleted: 1`) |
|
||||||
| Schicht lesen | `GET module/arbeitszeit/api/getSchicht.php?schicht_id=` | JSON (`timestamp_start`, `timestamp_ende` als `YYYY-MM-DD HH:MM:SS`, `ist_deleted`, …) |
|
| Schicht lesen | `GET module/arbeitszeit/api/getSchicht.php?schicht_id=` | JSON (`timestamp_start`, `timestamp_ende` als `YYYY-MM-DD HH:MM:SS`, `ist_deleted`, …) |
|
||||||
| Schicht ändern | `module/arbeitszeit/api/updateSchicht.php` `{shiftID, timestampStart, timestampEnd}` (Format `dd.mm.yy (HH:MM)`) | `200` `true` |
|
| Schicht ändern | `module/arbeitszeit/api/updateSchicht.php` `{shiftID, timestampStart, timestampEnd}` (Format `dd.mm.yy (HH:MM)`) | `200` `true` |
|
||||||
| Schicht löschen | `module/arbeitszeit/api/deleteSchicht.php` `{shiftID, employeeID, date}` | nicht getestet |
|
| Schicht löschen | `module/arbeitszeit/api/deleteSchicht.php` `{shiftID, employeeID, date}` | `{"action":"link","target":"arbeitszeit"}`; Schicht samt Inhalt gelöscht |
|
||||||
|
| **Arbeitstag beginnen** (laufende Schicht) | `module/auftraege/api/saveSchicht.php` `{vorgang_id: "-1", mitarbeiter_id, formdata: {timestamp_start, timestamp_ende: ""}}` | neue `schicht_id` als Text; Schicht läuft (`timestamp_ende` `0000-00-00 00:00:00`, `beendet: 0`) |
|
||||||
|
| Menü „Arbeitstag beginnen/beenden“ | `module/arbeitszeit/api/bueroAnundAbmelden.php` `{employeeID}` | `true` – wirkt nur für den angemeldeten Benutzer (Mitarbeiter 6); mit anderer `employeeID` passiert nichts |
|
||||||
| Plausibilität prüfen | `GET module/arbeitszeit/api/checkPlausibelInSchicht.php?timestamp_start×tamp_ende&mitarbeiterId` | `[]` oder `{timestamp_start:{code,typ,msg}, …}` – nicht getestet |
|
| Plausibilität prüfen | `GET module/arbeitszeit/api/checkPlausibelInSchicht.php?timestamp_start×tamp_ende&mitarbeiterId` | `[]` oder `{timestamp_start:{code,typ,msg}, …}` – nicht getestet |
|
||||||
|
|
||||||
Weitere vorhandene Endpunkte (nicht getestet): `updatePause.php`/`editPauseForm.php`/`deletePause.php`, `addNotiz.php` (`{verteilungId, notizfeld, verfasser_id}` → `{id,…}`), `startTaetigkeit.php`/`startPause.php`/`beendePause.php`/`beende-schicht.php` (Stempeluhr des eingeloggten Benutzers).
|
Weitere vorhandene Endpunkte (nicht getestet): `updatePause.php`/`editPauseForm.php`/`deletePause.php`, `addNotiz.php` (`{verteilungId, notizfeld, verfasser_id}` → `{id,…}`), `startTaetigkeit.php`/`startPause.php`/`beendePause.php`/`beende-schicht.php` (Stempeluhr des eingeloggten Benutzers).
|
||||||
@@ -134,10 +136,11 @@ Ablauf `createZeitbuchung`:
|
|||||||
|
|
||||||
**Fund:** Agrarmonitor speichert eine unbekannte `taetigkeit_id` (999999) ohne Fehler – es entsteht eine Verteilung ohne Tätigkeit. Der Connector prüft die Tätigkeit deshalb gegen die Auswahl im Buchungsformular (`nachtragen-form.php` bzw. `editVerteilungForm.php`) und wirft sonst `ZeitbuchungError` (`grund: 'taetigkeit nicht buchbar'`). Maschinen-IDs werden nicht geprüft, weil das Formular nur eine Teilmenge der Maschinen anbietet.
|
**Fund:** Agrarmonitor speichert eine unbekannte `taetigkeit_id` (999999) ohne Fehler – es entsteht eine Verteilung ohne Tätigkeit. Der Connector prüft die Tätigkeit deshalb gegen die Auswahl im Buchungsformular (`nachtragen-form.php` bzw. `editVerteilungForm.php`) und wirft sonst `ZeitbuchungError` (`grund: 'taetigkeit nicht buchbar'`). Maschinen-IDs werden nicht geprüft, weil das Formular nur eine Teilmenge der Maschinen anbietet.
|
||||||
|
|
||||||
|
- **Arbeitstag:** Beim Tagesbeginn legt `beginneArbeitstag` eine laufende Schicht an (`saveSchicht.php`, für beliebige Mitarbeiter). Damit kann auch eine Pause die erste Buchung sein. `updateSchicht.php` mit leerem `timestampEnd` lässt eine Schicht laufen, mit Ende wird sie beendet (`beendet: 1`); Tätigkeiten und Pausen in einer laufenden Schicht beenden sie nicht (Echttest 14.10.2026, Mitarbeiter 3309).
|
||||||
|
|
||||||
## 5. Offene Fragen
|
## 5. Offene Fragen
|
||||||
|
|
||||||
1. **Pause als erste Buchung des Tages:** Ohne Schicht kann keine Pause gebucht werden (`ZeitbuchungError`). Die App überträgt Blöcke beim Beenden; eine Pause vor dem ersten Tätigkeitsblock landet dann bei `needs_manual`.
|
1. **Über Mitternacht:** Der Connector trägt bis 23:59 nach und korrigiert Verteilung und Schicht danach auf die echten Zeiten – im Mock getestet, im echten System nicht.
|
||||||
2. **Über Mitternacht:** Der Connector trägt bis 23:59 nach und korrigiert Verteilung und Schicht danach auf die echten Zeiten – im Mock getestet, im echten System nicht.
|
2. **Maschinenpflicht:** Tätigkeiten mit „Maschinen zuordnen = Ja“ verlangen im UI eine Maschine (clientseitige Prüfung über `data-extra`). Ob der Server das ebenfalls erzwingt, ist ungetestet – die App sollte es vorher prüfen (Feld `maschineZuordnen` in `getTaetigkeiten`).
|
||||||
3. **Maschinenpflicht:** Tätigkeiten mit „Maschinen zuordnen = Ja“ verlangen im UI eine Maschine (clientseitige Prüfung über `data-extra`). Ob der Server das ebenfalls erzwingt, ist ungetestet – die App sollte es vorher prüfen (Feld `maschineZuordnen` in `getTaetigkeiten`).
|
3. **Tätigkeitsauswahl:** Das Buchungsformular bietet nur aktive Tätigkeiten an; Abwesenheiten (Bereich 900) und „800 Pause“ sollten in der App vermutlich ausgeblendet werden.
|
||||||
4. **Tätigkeitsauswahl:** Das Buchungsformular bietet nur aktive Tätigkeiten an; Abwesenheiten (Bereich 900) und „800 Pause“ sollten in der App vermutlich ausgeblendet werden.
|
4. **Verfasser der Notiz:** `verfasser_id` ist der Agrarmonitor-Benutzer des Connectors, nicht der Mitarbeiter.
|
||||||
5. **Verfasser der Notiz:** `verfasser_id` ist der Agrarmonitor-Benutzer des Connectors, nicht der Mitarbeiter.
|
|
||||||
@@ -82,7 +82,8 @@ type ZeitbuchungRef = {
|
|||||||
type Schicht = {
|
type Schicht = {
|
||||||
id: number;
|
id: number;
|
||||||
start: string;
|
start: string;
|
||||||
ende: string;
|
/** null = Schicht laeuft noch (Arbeitstag begonnen, nicht beendet) */
|
||||||
|
ende: string | null;
|
||||||
};
|
};
|
||||||
|
|
||||||
type AgrarmonitorCustomerPage = {
|
type AgrarmonitorCustomerPage = {
|
||||||
@@ -706,6 +707,121 @@ export class AgrarmonitorConnector implements AgrarmonitorConnectorResult {
|
|||||||
return Array.from(taetigkeiten.values());
|
return Array.from(taetigkeiten.values());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
async beginneArbeitstag(mitarbeiterId: number, start: Date, options: { datum?: string } = {}): Promise<{ ref: string }> {
|
||||||
|
const beginn = this.arbeitstagZeitpunkt(mitarbeiterId, start, 'start');
|
||||||
|
const datum = this.arbeitstagDatum(options.datum, beginn);
|
||||||
|
const laufend = (await this.ladeSchichten(mitarbeiterId, datum)).find(schicht => schicht.ende === null);
|
||||||
|
|
||||||
|
if (laufend) {
|
||||||
|
this.logDebug('Arbeitstag laeuft bereits', { mitarbeiterId, datum, schichtId: laufend.id });
|
||||||
|
return { ref: this.arbeitstagRef(mitarbeiterId, datum, laufend.id) };
|
||||||
|
}
|
||||||
|
|
||||||
|
const antwort = await this.zeitbuchungPost(
|
||||||
|
'/module/auftraege/api/saveSchicht.php',
|
||||||
|
{
|
||||||
|
vorgang_id: '-1',
|
||||||
|
mitarbeiter_id: mitarbeiterId,
|
||||||
|
formdata: { timestamp_start: beginn.formular, timestamp_ende: '' },
|
||||||
|
},
|
||||||
|
'Arbeitstag beginnen'
|
||||||
|
);
|
||||||
|
const id = this.parseNumber(antwort);
|
||||||
|
|
||||||
|
if (!id) {
|
||||||
|
throw new ZeitbuchungError('Agrarmonitor hat keine Schicht angelegt', this.zeitbuchungGrund(antwort));
|
||||||
|
}
|
||||||
|
|
||||||
|
return { ref: this.arbeitstagRef(mitarbeiterId, datum, id) };
|
||||||
|
}
|
||||||
|
|
||||||
|
async beendeArbeitstag(ref: string, ende: Date): Promise<void> {
|
||||||
|
const zielRef = this.parseArbeitstagRef(ref);
|
||||||
|
const schicht = await this.ladeArbeitstag(zielRef, ref);
|
||||||
|
|
||||||
|
await this.arbeitstagSetzen(schicht, schicht.start, this.arbeitstagZeitpunkt(zielRef.mitarbeiterId, ende, 'ende').vergleich);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Korrigiert Beginn und Ende; `ende: null` laesst den Arbeitstag weiterlaufen. */
|
||||||
|
async updateArbeitstag(ref: string, zeiten: { start: Date; ende: Date | null }): Promise<void> {
|
||||||
|
const zielRef = this.parseArbeitstagRef(ref);
|
||||||
|
const schicht = await this.ladeArbeitstag(zielRef, ref);
|
||||||
|
const start = this.arbeitstagZeitpunkt(zielRef.mitarbeiterId, zeiten.start, 'start').vergleich;
|
||||||
|
const ende = zeiten.ende === null ? null : this.arbeitstagZeitpunkt(zielRef.mitarbeiterId, zeiten.ende, 'ende').vergleich;
|
||||||
|
|
||||||
|
await this.arbeitstagSetzen(schicht, start, ende);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Loescht die Schicht samt aller Taetigkeiten und Pausen darin. */
|
||||||
|
async deleteArbeitstag(ref: string): Promise<void> {
|
||||||
|
const zielRef = this.parseArbeitstagRef(ref);
|
||||||
|
|
||||||
|
await this.zeitbuchungPost(
|
||||||
|
'/module/arbeitszeit/api/deleteSchicht.php',
|
||||||
|
{ shiftID: zielRef.id, employeeID: zielRef.mitarbeiterId, date: zielRef.datum },
|
||||||
|
'Arbeitstag loeschen'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private arbeitstagZeitpunkt(mitarbeiterId: number, date: Date, feld: 'start' | 'ende'): Zeitpunkt {
|
||||||
|
if (!Number.isInteger(mitarbeiterId) || mitarbeiterId <= 0) {
|
||||||
|
throw new ZeitbuchungError('Ungueltige Mitarbeiter-ID', 'mitarbeiterId');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(date instanceof Date) || Number.isNaN(date.getTime())) {
|
||||||
|
throw new ZeitbuchungError(feld === 'start' ? 'Ungueltiger Start' : 'Ungueltiges Ende', feld);
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.zeitpunkt(date);
|
||||||
|
}
|
||||||
|
|
||||||
|
private arbeitstagDatum(datum: string | undefined, start: Zeitpunkt): string {
|
||||||
|
if (datum !== undefined && !/^\d{4}-\d{2}-\d{2}$/.test(datum)) {
|
||||||
|
throw new ZeitbuchungError('Ungueltiger Arbeitstag, erwartet YYYY-MM-DD', 'datum');
|
||||||
|
}
|
||||||
|
|
||||||
|
return datum ?? start.datum;
|
||||||
|
}
|
||||||
|
|
||||||
|
private arbeitstagRef(mitarbeiterId: number, datum: string, schichtId: number): string {
|
||||||
|
return `schicht:${mitarbeiterId}:${datum}:${schichtId}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
private parseArbeitstagRef(ref: string): { mitarbeiterId: number; datum: string; id: number } {
|
||||||
|
const match = /^schicht:(\d+):(\d{4}-\d{2}-\d{2}):(\d+)$/.exec(ref);
|
||||||
|
|
||||||
|
if (!match) {
|
||||||
|
throw new ZeitbuchungError(`Ungueltige Arbeitstag-Referenz: ${ref}`, 'ref');
|
||||||
|
}
|
||||||
|
|
||||||
|
return { mitarbeiterId: Number(match[1]), datum: match[2], id: Number(match[3]) };
|
||||||
|
}
|
||||||
|
|
||||||
|
private async ladeArbeitstag(zielRef: { id: number }, ref: string): Promise<Schicht> {
|
||||||
|
const schicht = await this.ladeSchicht(zielRef.id);
|
||||||
|
|
||||||
|
if (!schicht) {
|
||||||
|
throw new ZeitbuchungError(`Arbeitstag ${ref} nicht gefunden`, 'nicht gefunden');
|
||||||
|
}
|
||||||
|
|
||||||
|
return schicht;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async arbeitstagSetzen(schicht: Schicht, start: string, ende: string | null): Promise<void> {
|
||||||
|
if (ende !== null && ende <= start) {
|
||||||
|
throw new ZeitbuchungError('Ende muss mindestens eine Minute nach dem Beginn liegen', 'dauer');
|
||||||
|
}
|
||||||
|
|
||||||
|
await this.schichtSetzen({ id: schicht.id, start, ende });
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Bucht einen Taetigkeitsblock oder eine Pause. Gibt es fuer Mitarbeiter und
|
* Bucht einen Taetigkeitsblock oder eine Pause. Gibt es fuer Mitarbeiter und
|
||||||
* Arbeitstag noch keine Schicht, legt `nachtragen.php` Schicht und Verteilung
|
* Arbeitstag noch keine Schicht, legt `nachtragen.php` Schicht und Verteilung
|
||||||
@@ -985,7 +1101,7 @@ export class AgrarmonitorConnector implements AgrarmonitorConnectorResult {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const start = data.timestamp_start.slice(0, 16);
|
const start = data.timestamp_start.slice(0, 16);
|
||||||
const ende = data.timestamp_ende && !data.timestamp_ende.startsWith('0000') ? data.timestamp_ende.slice(0, 16) : start;
|
const ende = data.timestamp_ende && !data.timestamp_ende.startsWith('0000') ? data.timestamp_ende.slice(0, 16) : null;
|
||||||
|
|
||||||
return { id: schichtId, start, ende };
|
return { id: schichtId, start, ende };
|
||||||
}
|
}
|
||||||
@@ -993,16 +1109,22 @@ export class AgrarmonitorConnector implements AgrarmonitorConnectorResult {
|
|||||||
/** Schicht, die sich mit der Buchung ueberschneidet, sonst die letzte davor, sonst die erste. */
|
/** Schicht, die sich mit der Buchung ueberschneidet, sonst die letzte davor, sonst die erste. */
|
||||||
private passendeSchicht(schichten: Schicht[], buchung: Zeitbuchung): Schicht {
|
private passendeSchicht(schichten: Schicht[], buchung: Zeitbuchung): Schicht {
|
||||||
return (
|
return (
|
||||||
schichten.find(schicht => schicht.start <= buchung.ende.vergleich && buchung.start.vergleich <= schicht.ende) ??
|
schichten.find(
|
||||||
|
schicht => schicht.start <= buchung.ende.vergleich && (schicht.ende === null || buchung.start.vergleich <= schicht.ende)
|
||||||
|
) ??
|
||||||
schichten.filter(schicht => schicht.start <= buchung.start.vergleich).at(-1) ??
|
schichten.filter(schicht => schicht.start <= buchung.start.vergleich).at(-1) ??
|
||||||
schichten[0]
|
schichten[0]
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Neue Verteilungen verlaengern die Schicht in Agrarmonitor nicht von selbst. */
|
/**
|
||||||
|
* Neue Verteilungen verlaengern die Schicht in Agrarmonitor nicht von selbst.
|
||||||
|
* Eine laufende Schicht bleibt offen - nur ihr Start wird bei Bedarf vorgezogen.
|
||||||
|
*/
|
||||||
private async schichtErweitern(schicht: Schicht, buchung: Zeitbuchung): Promise<void> {
|
private async schichtErweitern(schicht: Schicht, buchung: Zeitbuchung): Promise<void> {
|
||||||
const start = buchung.start.vergleich < schicht.start ? buchung.start.vergleich : schicht.start;
|
const start = buchung.start.vergleich < schicht.start ? buchung.start.vergleich : schicht.start;
|
||||||
const ende = buchung.ende.vergleich > schicht.ende ? buchung.ende.vergleich : schicht.ende;
|
const ende =
|
||||||
|
schicht.ende === null || buchung.ende.vergleich <= schicht.ende ? schicht.ende : buchung.ende.vergleich;
|
||||||
|
|
||||||
if (start === schicht.start && ende === schicht.ende) {
|
if (start === schicht.start && ende === schicht.ende) {
|
||||||
return;
|
return;
|
||||||
@@ -1019,7 +1141,8 @@ export class AgrarmonitorConnector implements AgrarmonitorConnectorResult {
|
|||||||
{
|
{
|
||||||
shiftID: schicht.id,
|
shiftID: schicht.id,
|
||||||
timestampStart: this.vergleichZuFormular(schicht.start),
|
timestampStart: this.vergleichZuFormular(schicht.start),
|
||||||
timestampEnd: this.vergleichZuFormular(schicht.ende),
|
// Leeres Ende laesst die Schicht laufen.
|
||||||
|
timestampEnd: schicht.ende === null ? '' : this.vergleichZuFormular(schicht.ende),
|
||||||
},
|
},
|
||||||
'Schicht anpassen'
|
'Schicht anpassen'
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -63,6 +63,10 @@ export interface AgrarmonitorConnectorResult {
|
|||||||
getArtikel(artikelGruppe: number, suchstring?: string): Promise<Artikel[]>;
|
getArtikel(artikelGruppe: number, suchstring?: string): Promise<Artikel[]>;
|
||||||
getMitarbeiter(suchstring?: string, mitarbeitergruppe?: number): Promise<Mitarbeiter[]>;
|
getMitarbeiter(suchstring?: string, mitarbeitergruppe?: number): Promise<Mitarbeiter[]>;
|
||||||
getTaetigkeiten(): Promise<Taetigkeit[]>;
|
getTaetigkeiten(): Promise<Taetigkeit[]>;
|
||||||
|
beginneArbeitstag(mitarbeiterId: number, start: Date, options?: { datum?: string }): Promise<{ ref: string }>;
|
||||||
|
beendeArbeitstag(ref: string, ende: Date): Promise<void>;
|
||||||
|
updateArbeitstag(ref: string, zeiten: { start: Date; ende: Date | null }): Promise<void>;
|
||||||
|
deleteArbeitstag(ref: string): Promise<void>;
|
||||||
createZeitbuchung(daten: ZeitbuchungDaten): Promise<{ ref: string }>;
|
createZeitbuchung(daten: ZeitbuchungDaten): Promise<{ ref: string }>;
|
||||||
updateZeitbuchung(ref: string, daten: ZeitbuchungDaten): Promise<void>;
|
updateZeitbuchung(ref: string, daten: ZeitbuchungDaten): Promise<void>;
|
||||||
deleteZeitbuchung(ref: string): Promise<void>;
|
deleteZeitbuchung(ref: string): Promise<void>;
|
||||||
|
|||||||
@@ -135,7 +135,8 @@ function createServer() {
|
|||||||
id,
|
id,
|
||||||
mitarbeiter_id: s.mitarbeiterId,
|
mitarbeiter_id: s.mitarbeiterId,
|
||||||
timestamp_start: `${s.start}:00`,
|
timestamp_start: `${s.start}:00`,
|
||||||
timestamp_ende: `${s.ende}:00`,
|
// Laufende Schicht: Agrarmonitor liefert ein Null-Datum.
|
||||||
|
timestamp_ende: s.ende === null ? '0000-00-00 00:00:00' : `${s.ende}:00`,
|
||||||
ist_deleted: s.deleted ? 1 : 0,
|
ist_deleted: s.deleted ? 1 : 0,
|
||||||
});
|
});
|
||||||
return;
|
return;
|
||||||
@@ -238,11 +239,30 @@ function createServer() {
|
|||||||
case '/module/arbeitszeit/api/updateSchicht.php': {
|
case '/module/arbeitszeit/api/updateSchicht.php': {
|
||||||
const s = state.schichten.get(daten.shiftID);
|
const s = state.schichten.get(daten.shiftID);
|
||||||
s.start = formularZuVergleich(daten.timestampStart);
|
s.start = formularZuVergleich(daten.timestampStart);
|
||||||
s.ende = formularZuVergleich(daten.timestampEnd);
|
s.ende = daten.timestampEnd === '' ? null : formularZuVergleich(daten.timestampEnd);
|
||||||
json(res, 200, true);
|
json(res, 200, true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case '/module/auftraege/api/saveSchicht.php': {
|
||||||
|
const id = neueId();
|
||||||
|
const start = formularZuVergleich(daten.formdata.timestamp_start);
|
||||||
|
state.schichten.set(id, {
|
||||||
|
mitarbeiterId: daten.mitarbeiter_id,
|
||||||
|
datum: start.slice(0, 10),
|
||||||
|
start,
|
||||||
|
ende: daten.formdata.timestamp_ende === '' ? null : formularZuVergleich(daten.formdata.timestamp_ende),
|
||||||
|
});
|
||||||
|
res.writeHead(200, { 'Content-Type': 'text/html' });
|
||||||
|
res.end(String(id));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
case '/module/arbeitszeit/api/deleteSchicht.php':
|
||||||
|
state.schichten.get(daten.shiftID).deleted = true;
|
||||||
|
json(res, 200, { action: 'link', target: 'arbeitszeit' });
|
||||||
|
return;
|
||||||
|
|
||||||
case '/module/notiz/api/delete.php':
|
case '/module/notiz/api/delete.php':
|
||||||
for (const v of state.verteilungen.values()) {
|
for (const v of state.verteilungen.values()) {
|
||||||
v.notizen = v.notizen.filter(n => n.id !== daten.noteID);
|
v.notizen = v.notizen.filter(n => n.id !== daten.noteID);
|
||||||
@@ -622,3 +642,74 @@ test('createZeitbuchung meldet sich bei abgelaufener Session neu an', async t =>
|
|||||||
assert.match(ref, /^verteilung:3309:2026-10-14:\d+$/);
|
assert.match(ref, /^verteilung:3309:2026-10-14:\d+$/);
|
||||||
assert.equal(state.verteilungen.size, 1);
|
assert.equal(state.verteilungen.size, 1);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('beginneArbeitstag legt eine laufende Schicht an und liefert die vorhandene bei Wiederholung', async t => {
|
||||||
|
const { connector, requests, state } = await startConnector(t);
|
||||||
|
|
||||||
|
const { ref } = await connector.beginneArbeitstag(3309, new Date('2026-10-14T04:58:40Z'));
|
||||||
|
|
||||||
|
assert.deepEqual(posts(requests, '/module/auftraege/api/saveSchicht.php').map(r => r.body), [
|
||||||
|
{ vorgang_id: '-1', mitarbeiter_id: 3309, formdata: { timestamp_start: '14.10.26 (06:59)', timestamp_ende: '' } },
|
||||||
|
]);
|
||||||
|
const [[schichtId, schicht]] = [...state.schichten.entries()];
|
||||||
|
assert.equal(ref, `schicht:3309:2026-10-14:${schichtId}`);
|
||||||
|
assert.equal(schicht.ende, null, 'Schicht laeuft');
|
||||||
|
|
||||||
|
const wiederholt = await connector.beginneArbeitstag(3309, new Date('2026-10-14T04:58:40Z'));
|
||||||
|
|
||||||
|
assert.equal(wiederholt.ref, ref);
|
||||||
|
assert.equal(posts(requests, '/module/auftraege/api/saveSchicht.php').length, 1);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('Pause und Taetigkeit in laufender Schicht lassen sie offen', async t => {
|
||||||
|
const { connector, requests, state } = await startConnector(t);
|
||||||
|
const { ref } = await connector.beginneArbeitstag(3309, new Date('2026-10-14T05:00:00Z'));
|
||||||
|
const schichtId = Number(ref.split(':').at(-1));
|
||||||
|
|
||||||
|
const pause = await connector.createZeitbuchung({
|
||||||
|
art: 'pause',
|
||||||
|
mitarbeiterId: 3309,
|
||||||
|
start: new Date('2026-10-14T05:00:00Z'),
|
||||||
|
ende: new Date('2026-10-14T05:15:00Z'),
|
||||||
|
});
|
||||||
|
assert.match(pause.ref, /^pause:3309:2026-10-14:\d+$/, 'Pause als erste Buchung des Tages');
|
||||||
|
|
||||||
|
// Block beginnt vor der Schicht: Start wird vorgezogen, Ende bleibt offen.
|
||||||
|
await connector.createZeitbuchung(block('2026-10-14T04:50:00Z', '2026-10-14T05:00:00Z'));
|
||||||
|
|
||||||
|
assert.equal(posts(requests, '/module/arbeitszeit/api/nachtragen.php').length, 0);
|
||||||
|
assert.deepEqual(posts(requests, '/module/arbeitszeit/api/updateSchicht.php').map(r => r.body), [
|
||||||
|
{ shiftID: schichtId, timestampStart: '14.10.26 (06:50)', timestampEnd: '' },
|
||||||
|
]);
|
||||||
|
assert.equal(state.schichten.get(schichtId).ende, null);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('beendeArbeitstag, updateArbeitstag und deleteArbeitstag', async t => {
|
||||||
|
const { connector, requests, state } = await startConnector(t);
|
||||||
|
const { ref } = await connector.beginneArbeitstag(3309, new Date('2026-10-14T05:00:00Z'));
|
||||||
|
const schichtId = Number(ref.split(':').at(-1));
|
||||||
|
|
||||||
|
await connector.beendeArbeitstag(ref, new Date('2026-10-14T15:30:00Z'));
|
||||||
|
await connector.updateArbeitstag(ref, { start: new Date('2026-10-14T04:45:00Z'), ende: null });
|
||||||
|
|
||||||
|
assert.deepEqual(posts(requests, '/module/arbeitszeit/api/updateSchicht.php').map(r => r.body), [
|
||||||
|
{ shiftID: schichtId, timestampStart: '14.10.26 (07:00)', timestampEnd: '14.10.26 (17:30)' },
|
||||||
|
{ shiftID: schichtId, timestampStart: '14.10.26 (06:45)', timestampEnd: '' },
|
||||||
|
]);
|
||||||
|
|
||||||
|
await assert.rejects(
|
||||||
|
() => connector.beendeArbeitstag(ref, new Date('2026-10-14T04:00:00Z')),
|
||||||
|
error => error instanceof ZeitbuchungError && error.grund === 'dauer'
|
||||||
|
);
|
||||||
|
await assert.rejects(() => connector.beendeArbeitstag(`verteilung:3309:2026-10-14:${schichtId}`, new Date()), /Arbeitstag-Referenz/);
|
||||||
|
|
||||||
|
await connector.deleteArbeitstag(ref);
|
||||||
|
|
||||||
|
assert.deepEqual(posts(requests, '/module/arbeitszeit/api/deleteSchicht.php')[0].body, {
|
||||||
|
shiftID: schichtId,
|
||||||
|
employeeID: 3309,
|
||||||
|
date: '2026-10-14',
|
||||||
|
});
|
||||||
|
assert.equal(state.schichten.get(schichtId).deleted, true);
|
||||||
|
await assert.rejects(() => connector.beendeArbeitstag(ref, new Date('2026-10-14T15:30:00Z')), /nicht gefunden/);
|
||||||
|
});
|
||||||
Reference in new issue
Block a user