Stammdaten: getTaetigkeiten und getAlleMaschinen

getTaetigkeiten liest alle Taetigkeiten (aktiv und inaktiv) mit Bereich
und den Flags Maschinen zuordnen, Abwesenheit und Notiz erzwingen.
getAlleMaschinen liest alle Kategorien und Seiten und fasst Maschinen,
die in mehreren Kategorien stehen, zu einem Eintrag zusammen.
Paging ueber .pagination[data-pages], Abbruch sobald eine Seite keine
neuen Zeilen bringt.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
bjoernpoettkerandClaude Opus 5.5 committed 2026-10-14 11:11:25 +02:00
1 parent d2c5db7e22
commit 6db6c5b278
10 files changed
+612 -4

No files matched your search

+101
View File
@@ -11,6 +11,7 @@ const tough_cookie_1 = require("tough-cookie");
class AgrarmonitorConnector {
options;
http;
static maxLivesearchSeiten = 500;
static s3DateienBaseUrl = 'https://s3-eu-central-1.amazonaws.com/dateien.agrarmonitor.de/07';
baseUrl;
apiBaseUrl;
@@ -324,6 +325,38 @@ class AgrarmonitorConnector {
};
});
}
async getAlleMaschinen() {
const documents = await this.loadLivesearchSeiten('/module/maschinen/livesearch.php', { suchstring: '', maschinen_aktiv: 1, maschinengruppe: 0 }, 'table.maschinen_table tbody tr[data-id]');
const maschinen = new Map();
for (const document of documents) {
for (const table of Array.from(document.querySelectorAll('table.maschinen_table'))) {
const gruppenId = this.parseNumber(table.id.replace('maschinen_table_', ''));
const gruppe = this.vorherigeUeberschrift(table)?.textContent?.trim() ?? '';
for (const row of Array.from(table.querySelectorAll('tbody tr[data-id]'))) {
const id = this.parseNumber(row.getAttribute('data-id'));
const vorhanden = maschinen.get(id);
if (vorhanden) {
if (!vorhanden.gruppenIds.includes(gruppenId)) {
vorhanden.gruppenIds.push(gruppenId);
}
continue;
}
const cells = Array.from(row.querySelectorAll('td'));
maschinen.set(id, {
id,
nummer: this.livesearchText(cells[0]),
name: this.livesearchText(cells[1]),
kennzeichen: this.livesearchText(cells[2]),
aktiv: Boolean(cells[4]?.querySelector('.fa-check, .text-green')),
gruppenId,
gruppe,
gruppenIds: [gruppenId],
});
}
}
}
return Array.from(maschinen.values());
}
async getFirmen() {
const response = await this.http.get('/einstellungen');
await this.saveSession();
@@ -412,6 +445,74 @@ class AgrarmonitorConnector {
};
});
}
async getTaetigkeiten() {
const documents = await this.loadLivesearchSeiten('/module/arbeitszeit/taetigkeiten-livesearch.php', { taetigkeiten_aktiv: 1 }, 'table.taetigkeit_table tbody tr[data-id]');
const taetigkeiten = new Map();
for (const document of documents) {
for (const table of Array.from(document.querySelectorAll('table.taetigkeit_table'))) {
const bereichElement = this.vorherigeUeberschrift(table)?.querySelector('.bereich');
for (const row of Array.from(table.querySelectorAll('tbody tr[data-id]'))) {
const id = this.parseNumber(row.getAttribute('data-id'));
const cells = Array.from(row.querySelectorAll('td'));
if (!id || taetigkeiten.has(id)) {
continue;
}
taetigkeiten.set(id, {
id,
uuid: row.getAttribute('data-activityuuid') ?? '',
nummer: cells[0]?.textContent?.trim() ?? '',
name: cells[1]?.textContent?.trim() ?? '',
aktiv: Boolean(row.querySelector('td.toggle .fa-check, td.toggle .text-green')),
bereichId: this.parseNumber(bereichElement?.getAttribute('data-id')),
bereich: bereichElement?.textContent?.trim() ?? '',
maschineZuordnen: this.parseJaNein(cells[2]?.textContent ?? ''),
abwesenheit: this.parseJaNein(cells[3]?.textContent ?? ''),
notizErzwingen: this.parseJaNein(cells[5]?.textContent ?? ''),
});
}
}
}
return Array.from(taetigkeiten.values());
}
/**
* 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).
*/
async loadLivesearchSeiten(url, params, rowSelector) {
const documents = [];
const bekannteZeilen = new Set();
for (let seite = 1; seite <= AgrarmonitorConnector.maxLivesearchSeiten; seite += 1) {
const response = await this.http.get(url, { params: { ...params, seite } });
await this.saveSession();
const document = this.parseHtmlDocument(response.data);
const neueZeilen = Array.from(document.querySelectorAll(rowSelector))
.map(row => `${row.closest('table')?.id ?? ''}:${row.getAttribute('data-id') ?? row.id}`)
.filter(key => !bekannteZeilen.has(key));
if (neueZeilen.length === 0) {
break;
}
neueZeilen.forEach(key => bekannteZeilen.add(key));
documents.push(document);
const seiten = this.parseNumber(document.querySelector('.pagination')?.getAttribute('data-pages'));
if (seite >= seiten) {
break;
}
}
return documents;
}
vorherigeUeberschrift(element) {
let sibling = element.previousElementSibling;
while (sibling && !/^H[1-6]$/.test(sibling.tagName)) {
sibling = sibling.previousElementSibling;
}
return sibling;
}
/** Agrarmonitor zeigt leere Werte in Livesearch-Tabellen als "-" an. */
livesearchText(cell) {
const text = cell?.textContent?.trim() ?? '';
return text === '-' ? '' : text;
}
createHttpClient() {
const client = (0, axios_cookiejar_support_1.wrapper)(axios_1.default.create({
baseURL: this.baseUrl,