Communitygithub.com

OrrZwebner/confi-dienstreise-rueckerstattung

Erstellt einen Reisekostenabrechnungsantrag (החזר הוצאות נסיעה) für eine israelische Universität nach einer Konferenzreise ins Ausland: Sammelt Belege aus dem Reisebelegordner und aus E-Mails (Flug und Zusatzleistungen, Reiseversicherung, Hotel, Anmeldung, Konferenzdinner, Poster-Druck, Bodentransport), speichert diese als benannte PDFs und erstellt aus der integrierten Vorlage die hebräische, rechts-nach-links-Ausgabentabelle, umgerechnet in Schekel zum repräsentativen Wechselkurs der Bank von Israel (שער יציג).

Was ist confi-dienstreise-rueckerstattung?

Diese Fertigkeit für KI-Agenten automatisiert die Erstellung eines vollständigen Reisekostenabrechnungsantrags (החזר הוצאות נסיעה) für israelische Universitäten nach einer Konferenzreise ins Ausland. Sie unterstützt Claude Code und ähnliche Code-orientierte Agenten. Der Agent sammelt Belege aus einem lokalen Belegordner (`קבלות/`) und aus E-Mail-Postfächern, konvertiert sie in benannte PDFs (und Miniaturansichten für das Tabellenblatt), ruft die aktuellen repräsentativen Wechselkurse der Bank von Israel ab und erstellt zwei Tabellenkalkulationen: eine offizielle „SENT“-Datei für die Finanzabteilung und eine interne „INTERNAL“-Datei für den Benutzer. Beide sind hebräisch und rechts-nach-links formatiert. Die Fertigkeit enthält auch ein Profil für Bankdaten, verarbeitet mehrere Währungen, behandelt Entscheidungen wie gemeinsame Ausgaben und prüft die Tabelle auf Konsistenz. Sie erstellt abschließend einen E-Mail-Entwurf an den Finanzkontakt mit den richtigen Anhängen. Die Fertigkeit ist so konzipiert, dass sie ohne manuelle Eingaben durch wiederholte Fragen an den Benutzer arbeitet und alle Lücken in einem Bericht dokumentiert.

Funktioniert mit✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/OrrZwebner/conference-reimbursement/tree/HEAD/skills/conference-reimbursement

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

Rückerstattung von Konferenzkosten

Erstelle zwei Tabellenkalkulationen aus denselben Zeilen, mit denselben Summen, und speichere jeden darin zitierten Beleg in <Konferenzordner>/החזרים/קבלות/:

  • SENT-Datei <Konferenzordner>/החזרים/<Vollständiger Name> הוצאות.xlsx – die einzige Datei, die zur Finanzabteilung geht. Spalte B סעיף = Budgetposten-Kategorie; Belegblatt; Bankblock; Wechselkurse. Kein Soll-Ist-Vergleich.
  • INTERNE Datei <Konferenzordner>/החזרים/<Vollständiger Name> הוצאות - פנימי.xlsx – die lokale Kopie des Benutzers, niemals angehängt oder versendet. Spalte B השירות = was der Posten war (z. B. "קפה", "רכבת שדה–עיר"), eine סעיף-Kategoriespalte nach הערות und die Budgetvergleichstabelle.

Beide sind hebräisch und rechts-nach-links; sprich mit dem Benutzer auf Englisch. Das Layout stammt aus der gebündelten assets/claim-template.xlsx (nur Beschriftungen); der Benutzer liefert nie eine Tabelle.

Profil (vollständiger Name und Bankdaten). Lies ~/.config/conference-reimbursement/profile.json ({"full_name": "...", "bank": {"בנק": "...", "סניף": "...", "מספר חשבון": "..."}}). Wenn es fehlt oder unvollständig ist, frage mit dem AskUserQuestion-Tool nach den fehlenden Feldern (der Benutzer gibt die Werte als eigene Antwort ein) und speichere die Datei dann mit Berechtigungen 600. Behalte sie nur dort – außerhalb jedes Repositorys und Projektordners. Committe sie niemals, gib die Bankdaten niemals im Chat oder im Bericht aus (sage "Bankdaten: aus Profil") und kopiere sie nur in den bank-Schlüssel des Scratchpad-Spezifikationsobjekts.

Stelle jede Frage an den Benutzer über das AskUserQuestion-Tool – niemals in Prosa – eine Entscheidung pro Frage, zuerst die empfohlene Option.

Wähle den Modus

  • Modus A – vollständige Abrechnung. Das genehmigte Budgetformular-PDF, die Bankdaten (Profil), der Belegordner und der Postfachzugriff sind alle verfügbar. Führe Schritte 1–7 aus.
  • Modus B – unvollständige Eingaben. Eines oder mehrere davon fehlen. Führe dieselben Schritte aus und lasse den fehlenden Teil weg, erfinde ihn niemals:
    • Benutzer lehnt Angabe von Bankdaten ab → bank weglassen; das Skript schreibt leere beschriftete Zellen und warnt "Bankdaten fehlen – von Hand ausfüllen"; melde es;
    • kein Postfachzugriff → verwende nur die Dateien, die der Benutzer in קבלות/ ablegt; melde, dass E-Mails nicht durchsucht wurden; gib in Schritt 7 den E-Mail-Text anstelle des Entwurfs aus;
    • kein Budgetformular → budget weglassen; die INTERNE Datei wird ohne die Budgettabelle und ohne Vergleich mit genehmigten Beträgen erstellt.

Liste jede Modus-B-Lücke im Bericht unter "von Hand zu erledigen" auf.

1. Eingaben sammeln (schreibgeschützt)

  1. Genehmigtes Budget. Öffne das PDF des Reisekostenformulars im Konferenzordner (*טופס נסיעות*). Lies es selbst; Formulare unterscheiden sich je nach Einrichtung. Notiere jede genehmigte Zeile in USD (Tagegeld אש״ל, Flug טיסה, Hotel, Versicherung, Anmeldung, Sonstiges) und die Reisedaten.
  2. Profil. Lade den vollständigen Namen und die Bankdaten wie oben beschrieben (frage nur beim ersten Mal).
  3. Physische Belege. Liste קבלות/ auf und lies jedes Bild (konvertiere HEIC zuerst, Schritt 3). Notiere Datum, Anbieter, Betrag, Währung, letzte Kartenziffern und Anzahl der Teilnehmer.
  4. E-Mail-Belege. Durchsuche das Postfach im Zeitraum Buchungsdatum → Rückreisedatum plus etwa zwei Wochen sowie das Reiselabel oder den Ordner des Benutzers. Führe die Abfragen pro Kategorie gemeinsam in einem Durchgang aus – lies zuerst references/email-sources.md. Schaue über die vom Benutzer aufgelisteten hinaus: Unentdeckte Ausgaben zu finden ist Teil der Aufgabe; schlage jeden gefundenen vor.
  5. Andere Reisen ausschließen. Öffne jede Finanzüberweisung und jede Flugbuchung im Zeitfenster und gleiche Konferenz, Route und Daten ab. Notiere jeden Ausschluss für den Bericht.

2. Frage die Richtlinienentscheidungen

Frage nur die zutreffenden, eine Entscheidung pro Frage, zuerst die empfohlene Option. Diese Standardeinstellungen stammen von einem früheren Antrag; sie sind Vorschläge, keine institutionellen Regeln.

  • Gemeinsame Hotelbuchung → nur eigenes Zimmer (Empfohlen) / gesamte Buchung.
  • Gemeinsame Mahlzeiten → gesamte Rechnung / nur eigener Anteil. Markiere die gewählte Option für den Sachbearbeiter.
  • Wechselkurs → Repräsentativer Wechselkurs der Bank von Israel am Rückreisetag, ein Kurs pro Währung (Empfohlen) / der Kurs jedes Belegdatums.
  • Gemeinsame Posten (eine Poster-Rechnung, die zwei Personen abdeckt) → den Anteil des Benutzers geltend machen, mit einem Hinweis.
  • Mit dem Flug gekaufte Zusatzleistungen (Sitzplatz, Gepäck, Versicherung) → innerhalb der Flugzeile (Empfohlen).

3. Belege als PDFs speichern

  1. E-Mail-Anhänge. Wenn der E-Mail-Connector Nachrichtentext, aber keine Anhänge zurückgibt, prüfe zuerst erneut, ob er sie jetzt abrufen kann; wenn nicht, lade sie über Browser-Automatisierung herunter (öffne die Nachricht, klicke das Download-Symbol des Anhangs, verschiebe die Datei dann aus ~/Downloads). Ohne Browser-Automatisierung bitte den Benutzer, sie herunterzuladen oder in קבלות/ abzulegen.
  2. E-Mails ohne Anhang (Auftragsbestätigungen) → als PDF drucken.
  3. Benenne jede Datei <was> <Anbieter> <Belegnummer>.pdf, auf Hebräisch.
  4. HEIC-Fotos → füge neben dem Original eine PDF-Kopie hinzu, verändere niemals das Original. macOS: sips -s format pdf IN.heic --out IN.pdf. Sonst verwende Pillow mit pillow-heif, falls installiert, andernfalls bitte den Benutzer, das Foto als PDF oder JPEG zu exportieren. Für das Belegblatt der Tabelle konvertiere auch jedes Foto und jeden Screenshot in ein JPEG, benannt nach dem Basisnamen des Belegs, im Scratchpad (niemals über dem Original): sips -s format jpeg -s formatOptions 70 -Z 1400 IN --out "<Beleg-Basisname>.jpg".
  5. Lies jedes gespeicherte PDF. Nimm den Betrag aus dem Dokument, nicht aus dem E-Mail-Text. Wenn sie abweichen, verwende das Dokument und markiere die Abweichung.

4. Erstelle die Tabelle

  1. Rufe die repräsentativen Wechselkurse der Bank von Israel (boi.org.il) für das gewählte Datum für jede verwendete Fremdwährung ab. Setze das Datum in rates.label: שער יציג בנק ישראל, <dd.mm.yyyy>. Verwende niemals einen Kurs aus dem Gedächtnis oder von einem früheren Antrag.

  2. Schreibe das Spezifikations-JSON in das Scratchpad. Schema, Layout und Modus-B-Verhalten: references/spec-format.md; synthetisches Arbeitsbeispiel: references/example-spec.json. Setze bank aus dem Profil. Lasse template weg: Die gebündelte Vorlage ist die Standardvorlage.

  3. Zeilenregeln:

    • eine Zeile pro Beleg, sortiert nach Datum;
    • der Betrag in genau einem Schlüssel: seiner Ursprungswährung (usd, eur oder einem zusätzlichen Code, der auch in rates ist) oder ils;
    • receipt = Dateibasisname(n) in קבלות/, mehrere mit + verbunden;
    • note erklärt alles, was ein Sachbearbeiter in Frage stellen könnte (gemeinsame Rechnung, halbe Rechnung, aus einer Hotelrechnung herausgelöster Posten);
    • line = ein Budgetposten-Name, genau wie in budget geschrieben; Spalte B der SENT-Datei zeigt ihn (nur Kategorie, niemals "Kaffee" oder "Abendessen" – Sachbearbeiter sehen Genehmigungskategorien), und die סעיף-Spalte und die Budgettabelle der INTERNEN Datei verwenden ihn;
    • service = eine kurze hebräische Beschreibung des Postens ("קפה", "ארוחת ערב", "רכבת שדה–עיר"); wird nur in Spalte B der INTERNEN Datei angezeigt (weggelassen → die Kategorie wird angezeigt);
    • Mahlzeiten, einschließlich des Konferenzdinners → die Tagegeld-Zeile;
    • Restaurantgebühren auf einer Hotelrechnung → ihre eigene Mahlzeitenzeile, Hotelzeile reduziert.
    • receipt_images = die JPEGs aus Schritt 3 (nur Fotos und Screenshots dieser Reise). Sie kommen auf das Blatt קבלות, 5 pro Zeile, jeweils mit einer Beschriftungszelle, die den Basisnamen der Datei enthält. E-Mail-PDFs werden nicht eingebettet; sie kommen in den ZIP-Ordner in Schritt 7.
  4. Führe aus:

    python3 -I "${CLAUDE_PLUGIN_ROOT}/skills/conference-reimbursement/scripts/build_claim.py" spec.json
    

    Ein Durchlauf schreibt beide Dateien. Es gibt JSON mit output (SENT), output_internal, total_ILS, total_USD und warnings aus. Behebe jede Warnung zu Budgetposten; übernimm die Modus-B-Warnungen in den Bericht. output_internal wird standardmäßig auf den SENT-Pfad mit - פנימי vor .xlsx gesetzt; setze es in der Spezifikation nur, um die lokale Kopie woandershin zu legen.

  5. Das Skript weigert sich, eine der Ausgabedateien zu überschreiben, es sei denn, "overwrite": true ist gesetzt. Setze es niemals auf eine Datei, die der Benutzer von Hand bearbeitet hat; schreibe einen neuen Namen oder frage.

5. Überprüfen

Erledigt bedeutet ausgeführt und geprüft. Lies zuerst references/pitfalls.md.

  1. Führe die Prüfungen aus:

    python3 -I "${CLAUDE_PLUGIN_ROOT}/skills/conference-reimbursement/scripts/check_claim.py" spec.json
    
    • total / total_internal: Die Python-Summe des Skripts entspricht der סה״כ בש״ח-Zelle jeder Datei nach LibreOffice-Neuberechnung (auf 0,01 ₪), sodass beide Dateien dieselbe Summe tragen;
    • sent_no_budget: Die SENT-Datei enthält keine Budgetvergleichstabelle;
    • receipts: Jede zitierte Datei existiert in קבלות/;
    • budget: Jede Zeile hat einen Budgetposten und der tatsächliche Gesamtbetrag der Budgettabelle der INTERNEN Datei entspricht total_ILS / USD-Kurs.

    Melde eine not_run-Prüfung als nicht ausgeführt, niemals als bestanden.

  2. Unabhängige Prüfung: Starte einen Unteragenten nur mit der SENT-Tabelle und dem Belegordner – nicht mit deinen Schlussfolgerungen. Bitte ihn, jede Zeile auf Betrag, Währung, Datum und Datei anhand des Belegs zu prüfen und aufzulisten, was ein Finanzsachbearbeiter in Frage stellen könnte. Behebe echte Fehler; melde den Rest.

6. Bericht

In dieser Reihenfolge:

  1. Beide Pfade (SENT, zum Anhängen; INTERN, nur lokal), Zeilenanzahl, Gesamtbetrag ₪ und ≈ USD im Vergleich zum genehmigten Gesamtbetrag.
  2. Hinzugefügte Belege (und welche durch Suche über die Liste des Benutzers hinaus gefunden wurden).
  3. Verwendete Wechselkurse mit Quelle und Datum.
  4. Über dem Budget liegende Posten, als Tabelle: Posten, genehmigt, tatsächlich, Differenz.
  5. Abweichungen zwischen Quellen (E-Mail vs. Dokument).
  6. Ausschlüsse (Posten, die zu anderen Reisen gehören).
  7. Hinweise für den Sachbearbeiter (aus references/pitfalls.md).
  8. Von Hand zu erledigen (Modus-B-Lücken, Skriptwarnungen).
  9. Getroffene Entscheidungen ohne Nachfrage.

7. E-Mail an den Finanzkontakt entwerfen

Lies zuerst references/email-draft.md; folge ihr der Reihe nach. Verwende und hänge nur die SENT-Datei an (output, <Vollständiger Name> הוצאות.xlsx); hänge niemals die INTERNE - פנימי-Datei an, lade sie hoch oder zitiere sie – email_summary.py lehnt sie ab. Kurz:

  1. Lies den vorherigen Antragsthread des Benutzers mit dem Finanzkontakt (Gesendete E-Mails, etwa zwei Jahre zurück, einschließlich Antworten) und kopiere dessen Stil und Betreffmuster.
  2. Frage: Bankdaten enthalten oder nicht; Budget- oder Kurszeilen (Standard: keine); BCC an einen Mitreisenden (Standard: nein; erfinde niemals eine Adresse).
  3. scripts/zip_ereceipts.py spec.json → קבלות אלקטרוניות.zip der E-Beleg-PDFs (UTF-8-Namen; niemals den zip-Befehl von macOS). Fotos und Screenshots sind stattdessen im Blatt קבלות.
  4. scripts/email_summary.py spec.json … → den RTL-HTML-Text ("היי ," / "מה שלומך? :)" … "תודה רבה!"), die Zusammenfassungstabelle mit einer קבלה-Spalte, die angibt, wo sich jeder Beleg befindet, und die aus der Tabelle gelesenen Bankdaten.
  5. Überprüfe, ob dessen total_ILS dem der Erstellung entspricht; erwähne jede rounding_diff.
  6. Gmail create_draft mit htmlBody zuerst. Hänge dann die SENT-Tabelle und den ZIP-Ordner über Claude in Chrome an (file_upload auf dem Datei-Eingabefeld des Entwurfs) und bestätige beide Chips – der Connector akzeptiert Anhänge nur als base64 im Aufruf, und update_draft verwirft sie. Sende niemals ab. Gib dem Benutzer den Entwurfslink.

Formeln

  • Zeile: ILS_i = Betrag_i × Kurs[cur_i] oder der ₪-Betrag selbst.
  • Summe: T = Σ ILS_i; in Dollar T / Kurs[USD].
  • Pro Budgetposten ℓ (INTERNE Datei): ist_ℓ = Σ_{line_i = ℓ} ILS_i / Kurs[USD]; diff_ℓ = genehmigt_ℓ − ist_ℓ, negativ bedeutet über Budget. Σ_ℓ ist_ℓ = T / Kurs[USD], wenn jede Zeile einen Budgetposten hat.

Beispiel: Kurse USD 4,00, EUR 4,50; Anmeldung $500, Hotel €600, Taxi ₪200 → 2000 + 2700 + 200 = 4900 ₪ = $1225.

Ermessensentscheidungen

  • Die eigene Rechnung des Hotels schlägt die Buchungsseitenbestätigung (sie ist das Steuerdokument).
  • Bankdaten stammen aus dem lokalen Profil in den bank-Schlüssel der Spezifikation; das Skript schreibt sie nach Beschriftung. Frage nur über AskUserQuestion, niemals in Prosa, und gib sie niemals wieder.
  • Eine frühere Teilrückerstattung, die zu dieser Reise gehört → markiere diese Zeilen als bereits beansprucht.
  • Die Regeln der Einrichtung des Benutzers entscheiden über Richtlinienfragen; frage, anstatt eine Regel zu behaupten.

Referenzen

  • references/email-sources.md – Postfachabfragen pro Kategorie und worauf zu achten ist (Schritt 1.4).
  • references/spec-format.md – Spezifikationsschlüssel, Layouts beider Dateien, Skriptausgabe, Modus-B-Verhalten (Schritt 4).
  • references/example-spec.json – synthetische vollständige Spezifikation (Schritt 4).
  • references/pitfalls.md – bereits gesehene Fehler und die Checkliste für Sachbearbeiter (Schritte 5–6).
  • references/email-draft.md – der E-Mail-Entwurf: vorheriger Thread, Wortlaut, Anhänge (Schritt 7).

Verwandte Skills