Communitygithub.com

conference-reimbursement

Prepara una solicitud de reembolso de gastos de viaje (החזר הוצאות נסיעה) para una universidad israelí después de un viaje de conferencia al extranjero: recopila recibos de la carpeta de recibos del viaje y del correo electrónico (vuelo y complementos, seguro de viaje, hotel, inscripción, cena de conferencia, impresión de póster, transporte terrestre), los guarda como PDF con nombre y genera la hoja de cálculo de gastos en hebreo de derecha a izquierda a partir de su plantilla de reclamación incluida, convirtiendo a séquels según los tipos representativos del Banco de Israel (שער יציג) y completando.

¿Qué es conference-reimbursement?

Esta habilidad automatiza la tediosa tarea de preparar una solicitud de reembolso de gastos de viaje para una universidad israelí después de asistir a una conferencia en el extranjero. Para un desarrollador o usuario de agentes de IA, esta herramienta ahorra horas de trabajo manual al recopilar recibos de múltiples fuentes (carpeta local y correo electrónico), extraer automáticamente la información relevante (fecha, proveedor, importe, moneda) y construir una hoja de cálculo de gastos profesional en hebreo (derecha a izquierda) que cumple con el formato requerido por el departamento de finanzas de la universidad. La habilidad está diseñada para integrarse con agentes como Claude Code o Cursor, utilizando herramientas como AskUserQuestion para interactuar con el usuario y scripts de Python para la generación de documentos. Funciona leyendo un perfil local del usuario, descargando los tipos de cambio representativos del Banco de Israel, y generando dos archivos de Excel: uno para enviar a finanzas (SENT) y otro para uso interno del usuario (INTERNAL), ambos con los mismos totales pero diferente nivel de detalle. Además, incluye pasos de verificación, generación de un informe completo y la redacción de un borrador de correo electrónico para enviar al contacto de finanzas, todo ello siguiendo las políticas institucionales y evitando la invención de datos faltantes.

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

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

Reembolso de gastos de conferencia

Producir dos hojas de cálculo a partir de las mismas filas, con los mismos totales, y guardar cada recibo que citan en <carpeta de conferencia>/החזרים/קבלות/:

  • Archivo SENT <carpeta de conferencia>/החזרים/<nombre completo> הוצאות.xlsx — el único archivo que se envía a finanzas. Columna B סעיף = categoría del formulario presupuestario; hoja de recibos; bloque bancario; tasas. Sin comparación presupuesto-real.
  • Archivo INTERNO <carpeta de conferencia>/החזרים/<nombre completo> הוצאות - פנימי.xlsx — la copia local del usuario, nunca adjunta ni enviada. Columna B השירות = qué fue cada artículo (ej. "קפה", "רכבת שדה–עיר"), una columna de categoría סעיף después de הערות, y la tabla de comparación presupuestaria.

Ambos están en hebreo y son de derecha a izquierda; habla con el usuario en inglés. El diseño proviene de la plantilla incluida assets/claim-template.xlsx (solo etiquetas); el usuario nunca proporciona una hoja de cálculo.

Perfil (nombre completo y datos bancarios). Lee ~/.config/conference-reimbursement/profile.json ({"full_name": "...", "bank": {"בנק": "...", "סניף": "...", "מספר חשבון": "..."}}). Si falta o está incompleto, solicita los campos faltantes con la herramienta AskUserQuestion (el usuario escribe los valores como su propia respuesta), luego guarda el archivo con permisos 600. Mantenlo solo allí — fuera de todo repositorio y carpeta de proyecto. Nunca lo confirmes, nunca imprimas los datos bancarios en el chat o en el informe (di "datos bancarios: desde el perfil"), y cópialos solo en la clave bank de la especificación del bloc de notas.

Haz cada pregunta al usuario a través de la herramienta AskUserQuestion — nunca en prosa — una decisión por pregunta, opción recomendada primero.

Elegir el modo

  • Modo A — reclamación completa. El formulario de presupuesto aprobado en PDF, los datos bancarios (perfil), la carpeta de recibos y el acceso al correo están disponibles. Ejecuta los pasos 1–7.
  • Modo B — entradas parciales. Falta uno o más de esos. Ejecuta los mismos pasos y omite la parte faltante, nunca la inventes:
    • el usuario se niega a dar datos bancarios → omite bank; el script escribe celdas etiquetadas vacías y advierte "faltan datos bancarios — completar a mano"; repórtalo;
    • sin acceso al correo → usa solo los archivos que el usuario coloca en קבלות/; informa que no se buscó en el correo electrónico; en el paso 7 imprime el cuerpo del correo en lugar de redactarlo;
    • sin formulario de presupuesto → omite budget; el archivo INTERNO se construye sin la tabla de presupuesto y no hay comparación con los montos aprobados.

Enumera cada brecha del Modo B en el informe bajo "para completar a mano".

1. Recopilar entradas (solo lectura)

  1. Presupuesto aprobado. Abre el formulario de presupuesto de viaje en PDF en la carpeta de la conferencia (*טופס נסיעות*). Léeslo tú mismo; los formularios varían según la institución. Registra cada línea aprobada en USD (dieta אש״ל, vuelo טיסה, hotel, seguro, inscripción, otros) y las fechas del viaje.
  2. Perfil. Carga el nombre completo y los datos bancarios como se describe arriba (pregunta solo la primera vez).
  3. Recibos físicos. Lista קבלות/ y lee cada imagen (convierte HEIC primero, paso 3). Registra fecha, proveedor, monto, moneda, últimos dígitos de la tarjeta y número de comensales.
  4. Recibos por correo electrónico. Busca en el buzón desde la fecha de reserva hasta la fecha de regreso más unas dos semanas, y la etiqueta o carpeta de viaje del usuario. Ejecuta las consultas por categoría juntas en una sola vuelta — lee primero references/email-sources.md. Mira más allá de lo que el usuario listó: encontrar gastos no notados es parte del trabajo; propón cada uno encontrado.
  5. Excluir otros viajes. Abre cada transferencia financiera y cada reserva de vuelo en la ventana y verifica la conferencia, ruta y fechas. Registra cada exclusión para el informe.

2. Preguntar las decisiones de política

Pregunta solo las que apliquen, una decisión por pregunta, opción recomendada primero. Estos valores predeterminados provienen de una reclamación pasada; son sugerencias, no reglas institucionales.

  • Reserva de hotel compartida → solo mi propia habitación (Recomendado) / toda la reserva.
  • Comidas compartidas → cuenta completa / solo mi parte. Marca la opción elegida para el administrativo.
  • Tipo de cambio → tipo representativo del Banco de Israel del día de regreso, un tipo por moneda (Recomendado) / el tipo de la fecha de cada recibo.
  • Artículos compartidos (una factura de póster que cubre a dos personas) → reclamar la parte del usuario, con una nota.
  • Complementos comprados con el vuelo (asiento, equipaje, seguro) → dentro de la línea de vuelo (Recomendado).

3. Guardar recibos como PDF

  1. Archivos adjuntos de correo electrónico. Si el conector de correo devuelve el texto del mensaje pero no los adjuntos, primero vuelve a verificar si ahora puede obtenerlos; si no, descárgalos mediante automatización del navegador (abre el mensaje, haz clic en el icono de descarga del adjunto, luego mueve el archivo de ~/Downloads). Sin automatización del navegador, pide al usuario que los descargue o los coloque en קבלות/.
  2. Correos electrónicos sin archivo adjunto (confirmaciones de pedido) → imprimir a PDF.
  3. Nombra cada archivo <qué> <proveedor> <número de documento>.pdf, en hebreo.
  4. Fotos HEIC → agrega una copia PDF junto al original, nunca modifiques el original. macOS: sips -s format pdf IN.heic --out IN.pdf. En otros sistemas usa Pillow con pillow-heif si está instalado, de lo contrario pide al usuario que exporte la foto como PDF o JPEG. Para la hoja de recibos de la hoja de cálculo, convierte también cada foto y captura de pantalla a JPEG con el nombre de su recibo base, en el bloc de notas (nunca sobre el original): sips -s format jpeg -s formatOptions 70 -Z 1400 IN --out "<nombre base del recibo>.jpg".
  5. Lee cada PDF guardado. Toma el monto del documento, no del texto del correo electrónico. Si difieren, usa el documento y marca la diferencia.

4. Construir la hoja de cálculo

  1. Obtén los tipos representativos del Banco de Israel (boi.org.il) para la fecha elegida para cada moneda extranjera utilizada. Pon la fecha en rates.label: שער יציג בנק ישראל, <dd.mm.yyyy>. Nunca reutilices un tipo de memoria o de una reclamación anterior.

  2. Escribe la especificación JSON en el bloc de notas. Esquema, diseño y comportamiento del Modo B: references/spec-format.md; ejemplo sintético trabajado: references/example-spec.json. Establece bank desde el perfil. Deja template fuera: la plantilla incluida es la predeterminada.

  3. Reglas de filas:

    • una fila por recibo, ordenado por fecha;
    • el monto exactamente en una clave: su moneda original (usd, eur, o un código extra que también esté en rates) o ils;
    • receipt = nombre(s) de archivo base en קבלות/, varios unidos con +;
    • note explica cualquier cosa que un administrativo pueda cuestionar (factura compartida, media factura, artículo separado de una factura de hotel);
    • line = un nombre de línea presupuestaria escrito exactamente como en budget; la columna B del archivo SENT lo muestra (solo categoría, nunca "café" ni "cena" — los administrativos ven categorías de aprobación), y la columna סעיף del archivo INTERNO y la tabla de presupuesto lo usan;
    • service = una breve descripción en hebreo del artículo ("קפה", "ארוחת ערב", "רכבת שדה–עיר"); se muestra solo en la columna B del archivo INTERNO (omitido → se muestra la categoría);
    • las comidas, incluida la cena de conferencia → la línea de dieta;
    • los cargos de restaurante en una factura de hotel → su propia fila de comida, fila de hotel reducida.
    • receipt_images = los JPEG del paso 3 (solo fotos y capturas de pantalla de este viaje). Van en la hoja קבלות, 5 por fila, cada una con una celda de leyenda que contiene su nombre de archivo base. Los PDF enviados por correo electrónico no se incrustan; van en el zip en el paso 7.
  4. Ejecuta:

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

    Una ejecución escribe ambos archivos. Imprime JSON con output (SENT), output_internal, total_ILS, total_USD y warnings. Corrige cada advertencia sobre líneas presupuestarias; traslada las advertencias del Modo B al informe. output_internal por defecto es la ruta SENT con - פנימי antes de .xlsx; establécela en la especificación solo para poner la copia local en otro lugar.

  5. El script se niega a sobrescribir cualquiera de las salidas a menos que "overwrite": true. Nunca lo establezcas en un archivo que el usuario haya editado a mano; escribe un nuevo nombre o pregunta.

5. Verificar

Hecho significa ejecutado y verificado. Lee references/pitfalls.md primero.

  1. Ejecuta las comprobaciones:

    python3 -I "${CLAUDE_PLUGIN_ROOT}/skills/conference-reimbursement/scripts/check_claim.py" spec.json
    
    • total / total_internal: el total de Python del script es igual a la celda סה״כ בש״ח de cada archivo después del recálculo de LibreOffice (hasta 0.01 ₪), por lo que ambos archivos llevan el mismo total;
    • sent_no_budget: el archivo SENT no contiene tabla de comparación presupuestaria;
    • receipts: cada archivo citado existe en קבלות/;
    • budget: cada fila tiene una línea presupuestaria y el total real de la tabla de presupuesto del archivo INTERNO es igual a total_ILS / tasa USD.

    Informa una comprobación not_run como no ejecutada, nunca como aprobada.

  2. Auditoría independiente: inicia un subagente con solo la hoja de cálculo SENT y la carpeta de recibos — no tus conclusiones. Pídele que verifique el monto, la moneda, la fecha y el archivo de cada fila contra el recibo y que enumere cualquier cosa que un administrativo de finanzas pueda cuestionar. Corrige errores reales; informa el resto.

6. Informe

En este orden:

  1. Ambas rutas (SENT, para adjuntar; INTERNA, solo local), número de filas, total ₪ y ≈ USD versus el total aprobado.
  2. Recibos añadidos (y cuáles se encontraron buscando más allá de la lista del usuario).
  3. Tasas utilizadas, con fuente y fecha.
  4. Líneas con sobrepresupuesto, como tabla: línea, aprobado, real, diferencia.
  5. Discrepancias entre fuentes (correo electrónico versus documento).
  6. Exclusiones (artículos pertenecientes a otros viajes).
  7. Banderas para el administrativo (de references/pitfalls.md).
  8. Para completar a mano (brechas del Modo B, advertencias del script).
  9. Decisiones tomadas sin preguntar.

7. Redactar el correo electrónico al contacto de finanzas

Lee references/email-draft.md primero; síguelo en orden. Usa y adjunta solo el archivo SENT (output, <nombre completo> הוצאות.xlsx); nunca adjuntes, subas ni cites el archivo INTERNO - פנימי — email_summary.py lo rechaza. En resumen:

  1. Lee el hilo de reclamación anterior del usuario con el contacto de finanzas (Correo enviado, aproximadamente dos años atrás, respuestas incluidas) y copia su estilo y patrón de asunto.
  2. Pregunta: datos bancarios incluidos o no; líneas de presupuesto o tasas (por defecto: ninguna); CCO a un compañero de viaje (por defecto: no; nunca inventes una dirección).
  3. scripts/zip_ereceipts.py spec.json → קבלות אלקטרוניות.zip de los recibos electrónicos en PDF (nombres UTF-8; nunca el comando zip de macOS). Las fotos y capturas de pantalla están en la hoja קבלות en su lugar.
  4. scripts/email_summary.py spec.json … → el cuerpo HTML RTL ("היי ," / "מה שלומך? :)" … "תודה רבה!"), la tabla de resumen con una columna קבלה que dice dónde está cada recibo, y los datos bancarios leídos de la hoja de cálculo.
  5. Verifica que su total_ILS sea igual al de la construcción; menciona cualquier rounding_diff.
  6. Gmail create_draft con htmlBody primero. Luego adjunta la hoja de cálculo SENT y el zip a través de Claude en Chrome (file_upload en la entrada de archivo de redacción del borrador) y confirma ambos chips — el conector toma archivos adjuntos solo como base64 en la llamada, y update_draft los elimina. Nunca envíes. Dale al usuario el enlace al borrador.

Fórmulas

  • Fila: ILS_i = monto_i × tasa[cur_i], o el propio monto ₪.
  • Total: T = Σ ILS_i; en dólares T / tasa[USD].
  • Por línea presupuestaria ℓ (archivo INTERNO): real_ℓ = Σ_{line_i = ℓ} ILS_i / tasa[USD]; diff_ℓ = aprobado_ℓ − real_ℓ, negativo significa sobrepresupuesto. Σ_ℓ real_ℓ = T / tasa[USD] cuando cada fila tiene línea en el presupuesto.

Ejemplo: tasas USD 4.00, EUR 4.50; inscripción $500, hotel €600, taxi ₪200 → 2.000 + 2.700 + 200 = 4.900 ₪ = $1.225.

Decisiones de criterio

  • La factura propia del hotel supera la confirmación del sitio de reserva (es el documento fiscal).
  • Los datos bancarios provienen del perfil local a la clave bank de la especificación; el script los escribe por etiqueta. Solicítalos solo a través de AskUserQuestion, nunca en prosa, y nunca los repitas.
  • Un reembolso parcial anterior que pertenece a este viaje → marca esas filas como ya reclamadas.
  • Las reglas de la institución del usuario deciden las preguntas de política; pregunta en lugar de afirmar una regla.

Referencias

  • references/email-sources.md — consultas de buzón por categoría y qué verificar (paso 1.4).
  • references/spec-format.md — claves de especificación, diseños de ambos archivos, salida del script, comportamiento del Modo B (paso 4).
  • references/example-spec.json — especificación completa sintética (paso 4).
  • references/pitfalls.md — fallos vistos antes y la lista de verificación de banderas para el administrativo (pasos 5–6).
  • references/email-draft.md — el borrador del correo electrónico: hilo anterior, redacción, archivos adjuntos (paso 7).

Skills relacionados