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.
- el usuario se niega a dar datos bancarios → omite
Enumera cada brecha del Modo B en el informe bajo "para completar a mano".
1. Recopilar entradas (solo lectura)
- 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. - Perfil. Carga el nombre completo y los datos bancarios como se describe arriba (pregunta solo la primera vez).
- 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. - 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. - 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
- 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קבלות/. - Correos electrónicos sin archivo adjunto (confirmaciones de pedido) → imprimir a PDF.
- Nombra cada archivo
<qué> <proveedor> <número de documento>.pdf, en hebreo. - 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". - 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
-
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. -
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. Establecebankdesde el perfil. Dejatemplatefuera: la plantilla incluida es la predeterminada. -
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é enrates) oils; receipt= nombre(s) de archivo base enקבלות/, varios unidos con+;noteexplica 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 enbudget; 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.
-
Ejecuta:
python3 -I "${CLAUDE_PLUGIN_ROOT}/skills/conference-reimbursement/scripts/build_claim.py" spec.jsonUna ejecución escribe ambos archivos. Imprime JSON con
output(SENT),output_internal,total_ILS,total_USDywarnings. Corrige cada advertencia sobre líneas presupuestarias; traslada las advertencias del Modo B al informe.output_internalpor defecto es la ruta SENT con- פנימיantes de.xlsx; establécela en la especificación solo para poner la copia local en otro lugar. -
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.
-
Ejecuta las comprobaciones:
python3 -I "${CLAUDE_PLUGIN_ROOT}/skills/conference-reimbursement/scripts/check_claim.py" spec.jsontotal/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 atotal_ILS / tasa USD.
Informa una comprobación
not_runcomo no ejecutada, nunca como aprobada. -
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:
- Ambas rutas (SENT, para adjuntar; INTERNA, solo local), número de filas, total ₪ y ≈ USD versus el total aprobado.
- Recibos añadidos (y cuáles se encontraron buscando más allá de la lista del usuario).
- Tasas utilizadas, con fuente y fecha.
- Líneas con sobrepresupuesto, como tabla: línea, aprobado, real, diferencia.
- Discrepancias entre fuentes (correo electrónico versus documento).
- Exclusiones (artículos pertenecientes a otros viajes).
- Banderas para el administrativo (de
references/pitfalls.md). - Para completar a mano (brechas del Modo B, advertencias del script).
- 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:
- 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.
- 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).
scripts/zip_ereceipts.py spec.json→קבלות אלקטרוניות.zipde los recibos electrónicos en PDF (nombres UTF-8; nunca el comandozipde macOS). Las fotos y capturas de pantalla están en la hojaקבלותen su lugar.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.- Verifica que su
total_ILSsea igual al de la construcción; menciona cualquierrounding_diff. - Gmail
create_draftconhtmlBodyprimero. Luego adjunta la hoja de cálculo SENT y el zip a través de Claude en Chrome (file_uploaden la entrada de archivo de redacción del borrador) y confirma ambos chips — el conector toma archivos adjuntos solo como base64 en la llamada, yupdate_draftlos 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ólaresT / 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
bankde 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).