Saltar al contenido

Control horario de una auditora

Control de horas de proyectos y personal para una auditora · Desarrollo desde cero, en solitario

Actualizado

Antes

Clientes, proyectos y horas estaban en un único lugar donde cualquiera de la firma podía verlo y cambiarlo todo.

Después

87

casillas de permisos comprobadas contra la base de datos antes de cada despliegue; las 30 que no hacían nada se ocultaron.

Cómo funciona
  1. 1Persona:Propietario

    Crea roles con casillas por área (clientes, proyectos, horas, informes) para ver, crear, editar y eliminar.

  2. 2Persona:Miembro del personal

    Imputa horas a un cliente, proyecto y tarea, o registra una ausencia.

    Sistema:Aplicación web

    Avisa a quien tenga el parte de horas vacío antes de la fecha límite.

  3. 3Persona:Administrador de proyecto

    Aprueba o rechaza el parte semanal de horas de su propio equipo de proyecto.

  4. 4Sistema:Base de datos

    Muestra a cada persona solo lo que su rol permite: el personal ve sus propias horas, los administradores de proyecto a su equipo y los propietarios todos los clientes.

  5. 5Persona:Propietario

    Consulta las horas por cliente, proyecto y persona en los dashboards e informes.

Siempre activo

  • Antes, cualquiera de la firma podía abrir todos los clientes y las horas de todos. Ahora la base de datos rechaza todo lo que un rol no permite, aunque una pantalla lo pida.
  • Antes de cada push, se prueba cada rol contra una copia aislada de la base de datos.

Problema

Una auditora gestionaba sus clientes, proyectos y horas del personal en una herramienta donde cualquier persona podía abrir todos los clientes y las horas de todos.

Diagnóstico

El control de acceso falla en silencio cuando vive en la pantalla, así que cada regla debía vivir en la base de datos y demostrarse con pruebas.

Opciones que valoré

  1. Cada rol ve datos distintos. ¿Dónde viven las reglas de acceso?

    Elegida

    En la propia base de datos, probadas para cada rol antes de cada despliegue

    La pantalla no puede filtrar lo que la base de datos rechaza. Coste: una ejecución de pruebas sobre una copia aislada antes de cada push.

    • Descartada

      Solo en las pantallas

      Una persona podía ver o cambiar datos que la pantalla pretendía ocultar.

  2. Un registro ya no hace falta. ¿Se borra o se conserva?

    Elegida

    Archivarlo y anonimizarlo

    El historial de partes de horas se mantiene intacto.

    • Descartada

      Borrarlo

      Al borrar, el historial de partes de horas desaparece en cascada.

Solución

Una aplicación web de una sola página sobre Postgres gestionado. Cada regla de acceso vive en la base de datos y se demuestra con una matriz automática de roles antes de cada despliegue.

Aplicación
  • React
  • Vite
  • TanStack Router
  • TanStack Query
  • shadcn/ui
  • Chart.js
Datos y seguridad
  • Supabase
  • PostgreSQL row-level security
  • Edge Functions (Deno)
Alojamiento
  • Cloudflare
Calidad
  • GitHub Actions
  • Role-matrix tests
  • Vitest
  • Property-based tests
  • Accessibility tests

Cifras: Comprobación automática de roles, 2026-09-25