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