Municipalidad de Avellaneda
Desarrollo backend en Python para sistemas del municipio, desde servicios para vecinos hasta herramientas internas de gestión: APIs en FastAPI y Flask sobre PostgreSQL y Oracle.
- Rol
- Desarrollador Backend Python
Desde
1 año y 4 mesesActualidad
Ver en LinkedIn (se abre en una pestaña nueva)
Punto de partida
El municipio desarrolla sus propios sistemas, tanto los que usan los vecinos como los que usan sus áreas. Cada uno responde a reglas y procesos distintos, y lo nuevo tiene que sumarse a sistemas que ya están en funcionamiento.
Qué hago
- Diseño y desarrollo APIs REST con FastAPI y Flask sobre PostgreSQL: modelado de datos, validación, autenticación con JWT, permisos por rol y manejo de errores centralizado.
- Llevo al código las reglas de cada área: cupos, plazos de reserva y cancelación, documentación por etapas y circuitos de firma.
- Protejo las operaciones críticas con bloqueos transaccionales, idempotencia y patrón outbox, para evitar duplicados y pérdidas de datos.
- Llevo a segundo plano lo que no debe demorar una respuesta: envíos masivos con Celery y Redis, y cargas masivas que se pueden pausar y retomar.
- Integro servicios SOAP, como el registro automotor (DNRPA), y leo correos de Outlook con Microsoft Graph para convertirlos en tareas.
- Modernizo sistemas existentes por partes: migro de Flask a FastAPI y llevo la gestión tributaria a una API nueva sobre Oracle, sin romper lo que ya usan otros equipos.
Resultado
Sistemas que se apoyan en una identidad y un esquema de permisos comunes, en lugar de que cada uno resuelva su propio acceso. Las operaciones sensibles, como reservas, inscripciones y cargas masivas, siguen siendo consistentes aunque haya pedidos simultáneos o falle un servicio del que dependen.
Decisiones técnicas
El último turno disponible
Dos personas pueden intentar reservar el mismo cupo en el mismo segundo. En el Turnero, la reserva bloquea el turno, vuelve a comprobar la disponibilidad y confirma todo en una sola transacción: nadie recibe un turno que ya no existe.
Una inscripción, una sola vez
Si una familia pierde la conexión y reenvía el formulario de Colonias, el sistema reconoce la misma inscripción por su clave de idempotencia y no la duplica. El correo de confirmación se guarda en la misma transacción y un worker lo envía después, con reintentos.
Cargas que sobreviven a un reinicio
En Consulta Dominial, una carga de CSV corre en segundo plano y guarda su estado en la base: se puede pausar, reanudar o cancelar, y al arrancar el servicio retoma los procesos que quedaron huérfanos. Si el DNRPA falla, la consulta queda pendiente para reintentarla en vez de contarse como «sin datos».
Un importador que se puede repetir
Tránsito Pesado importa empresas, choferes y depósitos en masa. Cada fila se actualiza por CUIT en vez de duplicarse, los depósitos se emparejan por dirección y se geocodifican con Nominatim respetando su límite de pedidos. Lo que falla queda en una tabla de auditoría para reintentarlo.
Modernizar sin apagar lo anterior
TRIMU lleva la gestión tributaria a una API en FastAPI sin migrar los datos: trabaja sobre la misma base Oracle que el sistema anterior, que sigue en uso, y llama a los paquetes donde ya viven las reglas en vez de reescribirlas. Así lo nuevo reemplaza a lo viejo por partes.
Correos masivos sin frenar a nadie
Las áreas programan comunicaciones masivas desde un panel. La API sólo registra el lote; Celery lo procesa en colas separadas por cuenta SMTP, con reintentos, historial por destinatario y el progreso en vivo por Server-Sent Events.
Algunos sistemas
Para vecinos
- Turnero CentralTurnos para todas las sedes de atención, con agenda por puesto y servicio y cupos protegidos ante reservas simultáneas.FastAPIPostgreSQLSOAP
- ColoniasInscripciones a colonias de verano con vacantes, documentación y autorización parental.FastAPIPostgreSQLOutbox
- Viajes de EgresadosInscripción de estudiantes, documentación sanitaria por etapas, armado de micros y empresas habilitadas.FastAPISQLAlchemyXLSX
- PiletasReservas de cupo en las piletas municipales, con reglas por vecino e ingreso con QR de un solo uso.FastAPIPostgreSQLQR
- ReclamosReclamos urbanos geolocalizados, con importador de calles y seguimiento de ubicaciones en vivo.FlaskFastAPISSE
Tributos, trámites y registros
- TRIMUGestión tributaria: contribuyentes, cuenta corriente, declaraciones juradas y boletas, sobre Oracle.FastAPIOracleSOAP
- AVEXExpedientes digitales: actuaciones, pases entre mesas, circuito de firma y PDF verificable por QR.FastAPIPostgreSQLPDF
- Consulta DominialConsultas al registro automotor por dominio y titulares, con cargas masivas que se pueden pausar.FastAPISOAPCSV
- Tránsito PesadoRegistro de transportistas, choferes y depósitos en mapa, con un importador masivo idempotente.FastAPIPostgreSQLOracle
Plataforma y herramientas internas
- Portal AvellanedaLa base de los servicios al vecino: identidad, permisos, Portal Empleos, trámites, pagos y multas.FlaskJWTOracle
- Portal DesarrolloGestor de proyectos por roles que convierte correos de Outlook en tareas.FastAPIMS GraphSSE
- MailserviceEl servicio de correos del municipio: envíos masivos y programados, colas por cuenta e historial.CeleryRedisSMTP
Stack
- Python
- Flask
- FastAPI
- pytest
- SQLAlchemy
- SOAP
- Pydantic
- Celery
- PostgreSQL
- Oracle
- Redis
- Docker
- SSE