Eigenleistungsplanung (EL) aus BPLUS-NG abrufen und mit Fremdleistung kombinieren. Analysefragen laufen ueber report_el.py auf Basis der lokalen SQLite-DB. Bestehende EL-Monate aendern, auf 0 setzen oder Rebalancing durchfuehren ueber el_change.py (Schreibzugriff auf BPLUS-NG). Monate koennen nur ab dem aktuellen Monat geaendert werden, nicht rueckwirkend. Nutze diesen Skill fuer Fragen wie "Auf welche EAs bucht ein Mitarbeiter seine Stunden?", "Welche geplanten EAs sind noch mit Buchungssperren?", "Jahressicht Eigenleistung pro EA", "EL vs. Fremdleistung Gesamtuebersicht", "EL auf 0 setzen", "EL aendern" oder "EL in BPLUS schreiben".
--jahr setzen)0 setzenEL, Eigenleistung, auf welche EA, Buchungssperren, gesperrt, Planung"Auf welche EA bucht X?" hat zwei Interpretationen:
skill-budget-bplus-export (BTL-Daten, Feld company)Bei Unsicherheit: User fragen, ob Mitarbeiterbuchung (EL) oder Firmenbuchung (Fremdleistung/BTL) gemeint ist.
WICHTIG: Bei EL-Analysefragen IMMER
report_el.pyverwenden. Das Script muss bei JEDER Anfrage neu ausgefuehrt werden. Es synchronisiertel_planningbei Bedarf selbst, fuergesamt-uebersichtzusaetzlichbtl.Workflow:
python .agents/skills/skill-budget-eigenleistung-el/report_el.py --usecase ...- Das Script schreibt IMMER eine Ergebnis-Datei nach
userdata/sessions/.- Das Script gibt NUR den Pfad zur Ergebnis-Datei auf stdout aus.
- NUR folgenden Satz im Chat an den User ausgeben:
Den Ergebnisbericht habe ich erstellt und hier fuer Dich abgelegt:gefolgt von einem klickbaren Markdown-Link.- Im Chat NICHTS weiter ausgeben — keine Tabellen, keine Zahlen, keine Zusammenfassung.
- Bei Sync-/Timeout-Problemen nutzt es vorhandene DB-Daten weiter und schreibt Warnhinweise in den Bericht.
- Logs liegen unter
userdata/tmp/logs/.
WICHTIG: Bei EL-Aenderungen an einer bestehenden EA-Zeile IMMER
el_change.pyverwenden.Standardverhalten:
- Default ist dry-run
- Ein echter Write passiert nur mit
--apply- Das Script schreibt IMMER einen Markdown-Bericht nach
userdata/sessions/. Der Dateiname endet auf_dryrun.mdbzw._apply.md, sodass beide Laeufe nebeneinander existieren.- stdout enthaelt zwei Zeilen: Zeile 1 ist die Tab-separierte STATUS-Zeile, Zeile 2 der absolute Pfad zum Markdown-Bericht.
- Nach
--applyerfolgt immer ein Readback gegen BPLUSstdout-Format (Zeile 1):
STATUS\tMODE=dryrun|apply\tREADBACK=ok|failed|n/a\tCHANGES=<int>\tBLOCKED=<int>\tRUN_ID=<hex>\tPATH=<abs>Bei Fehlern schreibt das Script stattdessen eine
STATUS-Zeile mitREADBACK=failedundERROR=<kurzmsg>auf stderr (plus die vollstaendige Fehlermeldung) und beendet sich mit Exit 1.Agent-Workflow:
- STATUS-Zeile parsen und pruefen.
- Dry-Run (MODE=dryrun): Den Markdown-Bericht lesen und die Aenderungstabelle(n) im Chat anzeigen, damit der User die geplanten Aenderungen sofort sieht. Danach fragen, ob mit
--applygeschrieben werden soll.- Apply (MODE=apply, READBACK=ok): Den Satz
Den Ergebnisbericht habe ich erstellt und hier fuer Dich abgelegt:mit klickbarem Markdown-Link zum Pfad ausgeben. Zusaetzlich eine kurze Zusammenfassung (Anzahl Aenderungen, betroffene EAs) im Chat zeigen.- Bei
READBACK=faileddenERROR-Wert und ggf. die erste Section des Berichts ("Status") im Chat zeigen und nicht einfach weiterlaufen.- Wenn der User im EKEK/1-Workspace keinen Mitarbeiternamen nennt, zuerst
$skill-orga-ekek1lesen und den Default-Mitarbeiter ausorga.mdim AbschnittEigene Rolleableiten.v2-Scope:
set-months: ausgewaehlte Monate einer bestehenden EA-Zeile setzenreset-ea: alle Monate einer bestehenden EA-Zeile auf0setzenplan-changes: mehrere EA-Aenderungen und optionales Rebalancing in einem LaufBuchungsrecht-Sperren:
- Gesperrte Monate duerfen auf
0gesetzt werden, wenn der resultierende Gesamt-Payload konsistent bleibt.- Das gilt fuer
reset-ea,plan-changes --zero-eaundset-months --value 0.- Andere Zielwerte auf gesperrten Monaten bleiben blockiert.
Nicht in v1 enthalten:
- EA-Zuordnung hinzufuegen
- EA-Zuordnung loeschen
- Person zuweisen / Planungsposition / Transfer
python .agents/skills/skill-budget-eigenleistung-el/report_el.py --usecase ma-planung --mitarbeiter "Bachmann, Armin"
Output: Tabelle pro Mitarbeiter mit EA-Nummer, EA-Titel, Projektfamilie, Avg %, Sperrungen, Jahresstunden, Stundensatz.
python .agents/skills/skill-budget-eigenleistung-el/report_el.py --usecase buchungssperren
Output: Alle MA mit Buchungssperren, EA-Zuordnung und gesperrte Monate.
python .agents/skills/skill-budget-eigenleistung-el/report_el.py --usecase jahressicht
Output: Aggregation pro EA ueber alle MA. Formel: Summe(Prozente x Jahresstunden x Stundensatz).
python .agents/skills/skill-budget-eigenleistung-el/report_el.py --usecase gesamt-uebersicht
Output: Join EL-Planungsdaten + BTL-Abrufe (Fremdleistung) auf EA-Nummer. Mermaid Pie-Chart EL vs. Fremdleistung.
python .agents/skills/skill-budget-eigenleistung-el/el_change.py --year 2026 set-months --mitarbeiter "Mueller, Tobias Carsten" --ea 0048207 --months apr,may,jun,jul --value 0
Dry-run mit Delta-Vorschau und Write-Endpoint im Bericht.
python .agents/skills/skill-budget-eigenleistung-el/el_change.py --year 2026 --apply set-months --mitarbeiter "Mueller, Tobias Carsten" --ea 0048207 --months apr,may,jun,jul --value 0
Fuehrt den Write aus und verifiziert danach die Zielmonate per Readback.
python .agents/skills/skill-budget-eigenleistung-el/el_change.py --year 2026 reset-ea --mitarbeiter "Mueller, Tobias Carsten" --ea 0048207
Setzt in dry-run alle Monate auf 0.
Gesperrte Monate duerfen dabei ebenfalls auf 0 gesetzt werden; die Monatssummen muessen danach trotzdem konsistent bleiben.
python .agents/skills/skill-budget-eigenleistung-el/el_change.py --year 2026 --apply reset-ea --mitarbeiter "Mueller, Tobias Carsten" --ea 0048207
python .agents/skills/skill-budget-eigenleistung-el/el_change.py --year 2026 plan-changes --mitarbeiter "Mueller, Tobias Carsten" --zero-ea 0000170
Default:
devorder aktive EAs bevorzugen--zero-ea auf 0 gesetzt werden--rebalance ist bei --zero-ea automatisch aktiv; mit --no-rebalance kann es explizit abgeschaltet werdenbtl_all_ekpython .agents/skills/skill-budget-eigenleistung-el/el_change.py --year 2026 plan-changes --mitarbeiter "Mueller, Tobias Carsten" --increase-ea 0043898=1 --decrease-ea 0000163=1
python .agents/skills/skill-budget-eigenleistung-el/el_change.py --year 2026 --apply plan-changes --mitarbeiter "Mueller, Tobias Carsten" --mitarbeiter "Bachmann, Armin" --zero-ea 0000170
EL ... auf null setzen plus eine EA ueber die ganze Zeile:
reset-eaEL ... auf null setzen plus mehrere EAs:
plan-changes --zero-ea ...in BPlus schreiben, wirklich schreiben, speichern:
immer --apply$skill-orga-ekek1 lesen und aus .agents/skills/skill-orga-ekek1/orga.md den aktuellen User aus Eigene Rolle aufloesen; in diesem Workspace ist das Mueller, Tobias Carstenplan-changes:
aktueller Monat bis DezemberUser-Formulierung:
Bitte die EL 0000170, 0000237, 0000268, 0000505, 0000506, 0087795 auf null setzen und in BPlus schreiben.
Agent-Ableitung:
plan-changes --zero-eain BPlus schreiben -> --applyMueller, Tobias Carsten aus $skill-orga-ekek1python .agents/skills/skill-budget-eigenleistung-el/el_change.py --year 2026 --apply plan-changes --mitarbeiter "Mueller, Tobias Carsten" --zero-ea 0000170 --zero-ea 0000237 --zero-ea 0000268 --zero-ea 0000505 --zero-ea 0000506 --zero-ea 0087795
--apply wird nie geschrieben100 fuehrt, bricht das Script mit Fehlermeldung ab und schreibt nicht0 ist100scripts/hooks/notify.ps1 mit dem Ergebnis aufgerufenPOST /ek/api/PlanningException/UpdatePlanningExceptionsGetPlanningExceptionsForUser-Payloads und aendert nur die Zielmonate der gematchten EA-Zeile| Endpunkt | URL | Beschreibung |
|---|---|---|
| EmployeeHours | GET /ek/api/EmployeeHours?orgUnitId=161&year={year} | Alle MA + Wochenstunden |
| PlanningException | GET /ek/api/PlanningException/GetPlanningExceptionsForUser?userId={id}&year={year}&orgUnitId=161 | EA-Zuordnungen + Monats-Prozente pro MA |
| PlanningException Update | POST /ek/api/PlanningException/UpdatePlanningExceptions | Schreibt geaenderte Monatswerte fuer bestehende EA-Zeilen |
Basis-URL: https://bplus-ng-mig.r02.vwgroup.com