Saltar al contenido

Volver a proyectos

Proyecto freelance

En desarrollo, entrega prevista: diciembre 2026 Arquitectura, revisión de código, pruebas y seguridad a mi cargo; código generado con IA bajo mi dirección.

CRM para control de plagas

CRM para una empresa de control de plagas. Los técnicos escanean el QR de cada estación y llenan el reporte en sitio, la oficina agenda y cotiza, y cada cliente consulta en un portal sus reportes firmados.

Cliente
Controltec Fumigaciones
Contexto
Freelance · Proyecto individual
Periodo
julio de 2026 – actualidad
Tecnologías
  • FastAPI
  • Python
  • React
  • TypeScript
  • Material UI
  • Expo
  • React Native
  • Supabase
  • PostgreSQL
  • Render
  • WhatsApp Cloud API (Meta)
  • Google Maps

Puntos clave

  1. Cada estación de control lleva una etiqueta con código QR. El técnico la escanea y registra en sitio el hallazgo (por ejemplo, el consumo del cebo), el estado del dispositivo, las plagas encontradas y una fotografía. El reporte no se puede firmar mientras falte una estación del servicio.

  2. Cuando firman el cliente y el técnico, el sistema genera el PDF con el formato de la empresa y lo archiva sin cambios: es la evidencia que se presenta en una auditoría. Si el cliente es persona moral y se aplicaron productos, también emite el certificado de control de plagas con la firma del propietario.

  3. Integré la API de WhatsApp Cloud de Meta para enviar una plantilla al cliente cuando se firma su reporte, y Google Maps para ubicar en el mapa las direcciones de los clientes y abrir la ruta desde el teléfono del técnico.

  4. La app de campo, hecha con Expo y React Native, permite terminar el reporte completo sin señal: guarda cada paso en el teléfono y lo envía sola cuando vuelve la conexión, sin duplicar reportes ni cobros.

  5. La oficina tiene agenda por mes, semana, día y técnico, clientes con sus direcciones y estaciones, cotizaciones en PDF, servicios recurrentes, ingresos y cuentas por cobrar, y estadísticas de plagas y tendencias de estaciones.

Problema

En una auditoría sanitaria, una empresa de control de plagas tiene que demostrar qué pasó en cada visita: qué estaciones se revisaron, qué se encontró, qué producto se aplicó y quién firmó. El reporte de servicio era el formato impreso de la empresa y el certificado de control de plagas se expedía a mano. Además, los técnicos trabajan en bodegas y sótanos donde la señal se pierde.

Solución

Una sola API en FastAPI atiende a una web con tres vistas y a una app móvil. En la oficina se agenda, se lleva la cartera de clientes con sus direcciones y estaciones, se cotiza y se da seguimiento a los cobros. En campo, el técnico abre su jornada, escanea el QR de cada estación y completa el reporte en cuatro pasos: estaciones, productos aplicados, evidencias y firmas del cliente y del técnico. Al firmar, el sistema archiva el PDF, emite el certificado cuando corresponde y avisa al cliente por WhatsApp. En el portal, cada cliente consulta sus servicios, sus próximas visitas, sus estaciones y sus certificados.

Decisiones técnicas

  • FastAPI es la única puerta a los datos: ni el navegador ni la app hablan con Supabase, y las fotos, firmas y PDF se sirven a través de la API.
  • Los permisos se asignan por capacidad y no por rol. Cada endpoint declara la que exige, y un registro fuera del alcance del usuario responde 404 para no revelar qué clientes existen.
  • Un reporte firmado no se edita: el PDF se archiva al momento de firmar y no se vuelve a generar con catálogos que pudieron cambiar después.
  • Se desarrolla contra un Supabase local en Docker con datos anonimizados. El backend, la web y la app se niegan a arrancar en desarrollo si apuntan a producción.

Manejo de fallas

  • El aviso por WhatsApp corre en segundo plano después de responder: si falla, el reporte queda firmado igual. Solo reintenta, hasta tres veces, los errores transitorios.
  • En la app de campo, cada acción entra a una cola en SQLite. El cierre del reporte y la declaración de pago llevan una llave generada en el teléfono, así que reenviarlos tras perder la respuesta no crea un segundo reporte ni un segundo ingreso.
  • Si el servidor rechaza un envío, nada se borra: queda en «Requiere atención» con el motivo, y el técnico decide si lo reintenta, lo corrige o lo descarta.

Mi rol

Desarrollo el proyecto solo, de punta a punta. Diseñé la base de datos en Supabase (PostgreSQL) y la mantengo con migraciones versionadas; construí la API en FastAPI, organizada por módulos de negocio; implementé la web en React, TypeScript y Material UI a partir de un prototipo en Figma, y la app de campo con Expo y React Native. Integré WhatsApp Cloud API y Google Maps, configuré el despliegue en Render y escribí más de mil pruebas automatizadas para el backend.

Resultado

  • El cliente contrató también el mantenimiento.

Siguientes pasos

Compilar y probar la app en iOS, hacer que la cámara del teléfono abra la app al escanear una etiqueta (hoy abre la web) y construir el módulo de egresos.

Código privado por confidencialidad con los clientes; capturas, arquitectura y demostración disponibles a solicitud.