Producción comercialReact · DjangoCoordenadas.co para Bikans · app.bikans.com

Bikans: SaaS de nómina y retención

Los clientes de una firma de asesoría contable y de nómina llevaban la nómina y la retención en la fuente en dos herramientas, y digitaban dos veces los mismos datos de la empresa y de los empleados.

Qué hace: Una sola plataforma donde los datos de los empleados se cargan una vez y alimentan la nómina y la retención en la fuente, con segundo factor obligatorio y acceso por herramienta.

Resumen

Bikans reúne en una sola plataforma la nómina y la retención en la fuente de los clientes de Bikans Asesores. Antes eran dos herramientas y los mismos datos se digitaban en las dos: un dato cargado dos veces puede no coincidir, y los dos cálculos dependen de él.

Hoy el registro de empleados es uno solo, la nómina de un período se importa desde Excel y la retención se calcula con los catálogos de la DIAN. Hice el sistema completo, backend y frontend, y está en producción en app.bikans.com.

La necesidad

Los clientes de la firma llevaban la nómina en una herramienta y la retención en la fuente en otra, y digitaban dos veces los mismos datos de la empresa y de los empleados. Un dato cargado dos veces puede no coincidir, y de él dependen los dos cálculos.

Restricciones

  • Son datos de nómina y tributarios de terceros: cada cuenta ve solo lo suyo, y una contraseña sola no basta para entrar.
  • Cada cliente usa solo las herramientas que tiene contratadas, y quien las asigna es la firma, no el usuario.
  • Los valores en pesos y los porcentajes vienen de normas de la DIAN y no pueden perder precisión por redondeo.
  • Las nóminas ya existían en Excel: había que traerlas sin volver a digitarlas.

La solución

Un solo registro de empleados, identificados por cédula, que comparten los dos módulos. La nómina de cada período se importa desde Excel o se registra con sus novedades, y la retención se calcula con los catálogos de la DIAN: conceptos con su base mínima en UVT y su porcentaje, y actividades económicas con su tarifa de ICA. Se entra con contraseña y un código TOTP, y la firma decide desde el panel de administración qué herramientas ve cada cuenta.

Cómo funciona

Aplicación de una sola página en React y TypeScript sobre una API REST en Django REST Framework, con PostgreSQL como base de datos única. Cada herramienta es una app de Django, y cada vista revisa la herramienta y el dueño de los datos.

Flujo de datos
  1. Inicio de sesión: la contraseña devuelve un token de reto firmado que vence en 5 minutos, no una sesión
  2. Segundo factor TOTP obligatorio: quien no lo tiene lo configura antes de entrar; el secreto se guarda cifrado con Fernet
  3. Sesión con JWT en cookies httpOnly, no en localStorage
  4. Cada vista exige acceso a la herramienta (HasProductAccess) y filtra por el dueño de los datos
  5. Nómina: períodos, detalle por empleado, novedades e importación desde Excel
  6. Retención en la fuente con los catálogos de conceptos y de actividades económicas de la DIAN
  7. PostgreSQL: un solo registro de empleados para los dos módulos

Decisiones técnicas

  • Un empleado se identifica por su cédula dentro de cada cuenta: reimportar una nómina actualiza al empleado en lugar de duplicarlo (update_or_create).
  • Los tokens viajan en cookies httpOnly para que un script inyectado en la página no pueda leerlos.
  • Dinero y porcentajes en Decimal, nunca en float.
  • Los registros no se borran, se desactivan: el historial de las nóminas ya calculadas no se pierde.
  • Las cuentas que crea la firma nacen sin contraseña: la persona recibe un correo de activación y define la suya.

Cómo se valida

  • 105 pruebas automatizadas en el backend (runner de Django): inicio de sesión, segundo factor, permisos por herramienta, nómina, importación y retenciones.
  • Tras cinco intentos fallidos, django-axes bloquea el inicio de sesión durante una hora.
  • El reto del segundo factor vence a los 5 minutos y no guarda estado en el servidor.

Resultado

  • En producción en app.bikans.com: los dos módulos trabajan sobre los mismos datos, detrás de un solo inicio de sesión.

Límites y próximos pasos

  • Es un producto privado de un cliente: el código no es público y no publico datos de uso ni de clientes.

Mi parte

Hice el sistema completo como Full Stack Developer en Coordenadas.co para Bikans, una firma de asesoría contable y de nómina: el backend en Django, el frontend en React, la autenticación de dos factores y el panel de administración.

¿Te interesa este tipo de trabajo?

Busco trabajo remoto como Full Stack Engineer. Si quieres hablar de este proyecto o de tu equipo, escríbeme.

Otros proyectos