Proyectos
Construyo herramientas de trabajo: automatización, papeles de trabajo y procesos que convierten datos dispersos en información ordenada, revisable y utilizable.
No son ejercicios de práctica. Cada uno salió de un problema real: horas de captura manual, archivos que no cuadran, procesos que solo una persona sabía hacer.
La mayoría nacen del terreno contable y fiscal, pero el criterio es siempre el mismo: Excel cuando el usuario final tiene que poder abrir, entender y auditar el resultado; Python cuando el volumen o la repetición hacen que hacerlo a mano deje de tener sentido.
Buena parte de estas herramientas conectan con el SAT (Servicio de Administración Tributaria) del lado de los datos —CFDI, DIOT— y con sistemas contables como CONTPAQi del lado de la carga y el registro.
Automatizador SAT → sistema contable
El problema
Cada mes, capturar los CFDI de un despacho significa abrir XML por XML, decidir la cuenta de gasto de cada uno, armar la póliza y capturar la DIOT por separado. Es lento, y un error no se nota hasta que la póliza no cuadra.
Qué hace
Lee la carpeta de XML (sueltos o en ZIP) y extrae todo del CFDI 4.0: emisor, receptor, IVA 16/8, IEPS, retenciones, UUID, método de pago PUE/PPD, REP y documentos relacionados. Consulta el estatus de cada UUID contra el SAT (vigente o cancelado) y genera las pólizas listas para importar a CONTPAQi 18.5.2, más el TXT de la DIOT en formato batch del SAT.
Lo que lo hace distinto
La cuenta de gasto la predice un modelo de machine learning entrenado por empresa. Cada vez que corriges una cuenta en el Excel de revisión, el modelo aprende y el mes siguiente clasifica mejor. Antes de escribir cualquier archivo valida que Debe = Haber en cada póliza y reporta las cuentas sin asignar.
Herramientas Python, scikit-learn, SQLite
Anonimizador de CFDI
El problema
Para enseñar con casos reales hace falta información real. Pero un CFDI trae RFC, nombres y denominaciones sociales de clientes que no se pueden exponer en un curso, una captura o un archivo de ejemplo.
Qué hace
Convierte CFDI reales en copias anonimizadas: sustituye RFC, nombres y razones sociales por datos falsos consistentes —el mismo proveedor recibe siempre el mismo alias— y conserva importes, impuestos, conceptos y fechas, para que los ejercicios sigan cuadrando. El mapeo se guarda en SQLite, así que el proceso es reversible.
Nota honesta
Los archivos anonimizados no son válidos ante el SAT (el sello ya no coincide); sirven para demos, cursos y pruebas, no para timbrar.
Herramientas Python, lxml, SQLite
Procesador de CFDI
El problema
Un cliente manda una carpeta con cientos de XML mezclados: facturas, nóminas, complementos de pago, versiones 3.3 y 4.0 revueltas. Antes de poder revisar nada, hay que ordenarlos —y una vez ordenados, sigue el trabajo manual de armar el papel de trabajo fiscal encima.
Qué hace
Detecta automáticamente la versión y el tipo de cada comprobante (CFDI 3.3 y 4.0, Nómina 1.2, Pagos 2.0) y exporta todo a un Excel con una hoja por tipo de documento, XML sueltos o comprimidos. Un visor con filtro por pestaña permite revisar antes de exportar, y una exportación filtrada replica exactamente lo que se ve en pantalla —lo filtrado sale filtrado, lo completo sale completo, nunca al revés. También exporta a CSV con catálogos del SAT normalizados (código y descripción, nunca uno solo), pensado para alimentar una IA sin que tenga que adivinar el catálogo.
Lo que lo hace distinto
Genera, dentro del mismo Excel, un papel de trabajo fiscal de IVA por flujo: reconoce cada CFDI PUE en el mes en que se emite y cada PPD en el mes en que su REP lo paga —un PPD sin REP en el lote queda marcado como "provisionado", no como deducible o acreditable todavía—, con fundamento legal citado (LIVA 5-III y 1o.-B) en su propia hoja.
Nota honesta
Es la herramienta que uso a diario en mi propio despacho, no una demo. Sigue en construcción activa: una bóveda con historial multi-periodo y la validación directa de estatus ante el SAT (vigente/cancelado) todavía no están construidas.
Herramientas Python, PySide6, pandas, openpyxl
Papeles de trabajo contable-fiscal
El problema
Los papeles de trabajo se rehacen cada ejercicio, y cuando el formato vive solo en la cabeza de quien lo armó, nadie más puede mantenerlo.
Qué hace
Sistema de papeles de trabajo en Excel generado desde código: fórmulas, consultas y macros versionadas por separado, y el libro final se ensambla con un script de construcción en vez de editarse a mano cada año.
Herramientas Excel (macros), Power Query, Python
Automatizador SISUB / ICSOE
El problema
Cada cuatrimestre, presentar el SISUB y el ICSOE significa cruzar a mano dos layouts de Excel, escribir fórmulas entre archivos para las percepciones fijas, editar el CSV anterior cambiando cuatrimestre y año, y capturar contrato por contrato en un wizard web de 6 pasos —la carga masiva solo se habilita arriba de 20 trabajadores por contrato, y la mayoría tiene de 2 a 4.
Qué hace
Construye una tabla maestra única (trabajador × contrato × rango de fechas) a partir del XML de nómina y los archivos del SUA, con una jerarquía de fuentes definida para cada dato —por ejemplo, el salario diario integrado sale primero del XML y solo cae al SUA o a un cálculo si no está—. De esa tabla proyecta los 3 CSV del SISUB, el CSV/Excel del ICSOE y el libro de control del despacho, sin las macros de VBA que usaba antes. Antes de generar cualquier archivo corre un catálogo de reglas de validación que señala el contrato, el NSS y la fila exactos del error.
Lo que lo hace distinto
La automatización del wizard del ICSOE (vía Playwright) nunca firma sola: por default deja la informativa capturada y en la pantalla de firma electrónica, validada y lista, pero el clic de "Firmar" siempre es de una persona. Los dos únicos pasos sin marcha atrás de todo el flujo están bloqueados por un permiso explícito en el código, no por buena voluntad.
Herramientas Python, SQLAlchemy, Playwright
Automatizador de trámites fiscales (SAT/IMSS/INFONAVIT)
El problema
Cada mes, obtener las constancias de cumplimiento de toda una cartera de clientes significa entrar portal por portal y RFC por RFC, resolver CAPTCHAs a mano y guardar cada PDF manualmente.
Qué hace
Diseñada para entrar, una vez al mes y para varios RFC, a los portales del SAT, IMSS e INFONAVIT y descargar la Constancia de Situación Fiscal y la Opinión de Cumplimiento del SAT, más sus equivalentes del IMSS e INFONAVIT para los clientes con empleados, con una bitácora que pausa y pide ayuda humana solo cuando de verdad no puede seguir.
Lo que lo hace distinto
Un núcleo pequeño que no sabe nada de portales específicos (credenciales, secretos, CAPTCHA, pausa humana, bitácora) más un adaptador chico por portal que sí sabe. Dos de los tres dominios corren detrás de un bot manager comercial (Imperva/Incapsula, Akamai), así que el navegador siempre corre visible, con perfil persistente y ritmo humano, y el login nunca se reintenta en bucle. El solver de CAPTCHA del SAT —antes una extensión de Chrome con un modelo ONNX local— se portó a Python para reutilizar el mismo núcleo aquí.
Nota honesta
En construcción activa: por ahora solo el login con e.firma contra el portal real del IMSS (ICSOE) está terminado. La descarga de constancias en sí —el objetivo final— es la siguiente fase, todavía sin construir.
Herramientas Python, Playwright, ONNX Runtime
Otras herramientas
- Cargador masivo de REP
Carga complementos de pago al sistema contable a través de su SDK, en lote en vez de uno por uno.
.NET
- Renombrador de CFDI
Renombra lotes completos de XML con el criterio que necesites, en vez de archivo por archivo.
Python
- Reporteador
Reportes operativos desde la base del sistema contable; actualmente, plantilla de trabajadores activos.
Python
- Generador de DIOT
Arma la DIOT del periodo a partir de los CFDI recibidos, en el formato batch que pide el SAT.
Python
Proyectos web
- Este blog (Excel SolutionsV)
El sitio que estás viendo ahora mismo. React + Vite en el frontend, Express + MongoDB en el backend, con un middleware propio de renderizado en servidor para que Google indexe el contenido sin depender de JavaScript.
React, Express, MongoDB, GSAP
- Portafolio personal
Portafolio construido con React y TypeScript, desplegado por separado del blog.
React, TypeScript
- Crónicas del Vejerete
Blog personal construido con Next.js.
Next.js, TypeScript
- Pura Vida Vallarta
Sitio de marketing para un operador de tours en Puerto Vallarta, con Next.js y Sanity como CMS headless.
Next.js, Sanity
¿Necesitas ayuda con tu flujo de trabajo en Excel?
Depuración de fórmulas, automatización, tableros a medida o consultoría general: cuéntame en qué estás atorado y te respondo en un plazo de dos días hábiles.
Solicitar ayuda con Excel