Control Horario · Registro de Jornada · Vibecoding

FichaApp

App de registro diario de jornada laboral para un solo usuario. Offline, local, exportable. Primera fase de un sistema full-stack con panel web de administración.

React Native Expo TypeScript AsyncStorage expo-sharing CSV + JSON Supabase (fase 2) Next.js (fase 3)
F1 Este manual App offline · entrada/salida · historial · CSV/JSON
F2 Iteraciones Notas · estadísticas · GPS · Supabase + login
F3 Panel web Next.js · dashboard admin · equipos · Vercel
Pantalla · Inicio

🟢 Pantalla de Fichaje

Reloj en tiempo real · Botón ENTRADA y SALIDA · Resumen del día

Mockup de la pantalla

FichajeApp
LUNES 29 JUNIO 2026
--:--:--
Sin fichar entrada hoy
▶ ENTRADA
— Ficha para empezar a contar —
Entrada08:32
Salida
Trabajando…4h 12min
■ SALIDA

Lógica de estados

Sin fichar hoyReloj en tiempo real. Botón verde ENTRADA grande. Estado: "Sin fichar entrada hoy".

Entrada fichadaMuestra hora de entrada, contador de tiempo transcurrido en tiempo real. Botón rojo SALIDA.

Jornada completaResumen con entrada, salida y total de horas calculado. Mensaje de cierre del día.

DATO EN ASYNCSTORAGE
{
  "id": "2026-06-29",
  "horaEntrada": "08:32",
  "horaSalida": null,
  "totalMinutos": null
}
Pantalla · Historial

📋 Historial de Jornadas

Lista cronológica · Horas totales · Swipe para eliminar

Mockup de la pantalla

Historial
23 registros↑ más reciente primero
Hoy, 29 jun
08:32
en curso
Vie, 28 jun
09:0018:00
9h 00m
Jue, 27 jun
08:4517:30
8h 45m
Mié, 26 jun
08:0016:00
8h 00m
Mar, 25 jun
09:1518:45
9h 30m
Lun, 24 jun
08:3017:30
9h 00m
← desliza para eliminar →

Funcionalidad

Lista completa ordenadaTodos los registros de AsyncStorage ordenados por fecha descendente. Más reciente arriba.

Estado visual por filaTotal en cian si completo. Naranja "en curso" si sin salida. Guión "—" si falta la salida.

Eliminar con swipeSwipe a la izquierda sobre una fila muestra botón rojo de eliminar. Confirmación antes de borrar.

Días sin salidaSi solo hay entrada (sin salida), la fila se muestra en naranja como recordatorio.

Pantalla · Exportar

📤 Exportación de Datos

CSV · JSON · expo-sharing · WhatsApp · Email · Files

Mockup de la pantalla

Exportar
Registros disponibles: 23 jornadas
📄
Exportar CSVfichajes_2026-06-29.csv · compatible con Excel
{ }
Exportar JSONfichajes_2026-06-29.json · todos los campos
PREVISUALIZACIÓN CSV
fecha,entrada,salida,total_horas
2026-06-28,09:00,18:00,9h 00min
2026-06-27,08:45,17:30,8h 45min
2026-06-26,08:00,16:00,8h 00min

Cómo funciona la exportación

Lee AsyncStorageLee todos los registros guardados y los ordena por fecha para generar el archivo.

Genera el archivo en memoriaConstruye el string CSV o el objeto JSON con todos los campos y lo escribe en un archivo temporal.

expo-sharing abre el panel nativoEl sistema operativo muestra el selector de apps: WhatsApp, email, Archivos, Drive, etc.

Nombre de archivo con fechaEl archivo se nombra automáticamente con la fecha de exportación para facilitar el archivado.

⚠ Nota legal

El RDL 8/2019 obliga a las empresas a registrar la jornada de sus trabajadores. Este CSV es válido como soporte documental básico.

Prompt de arranque · OpenCode / IA
Genera FichajeApp desde cero
Copia este prompt en OpenCode con la carpeta 'fichaje' abierta en VS Code
PROMPT COMPLETO · OpenCode
Crea una app de control horario en React Native con Expo y TypeScript. La app se llama FichajeApp. // PANTALLA 1 — INICIO - Reloj en tiempo real (useEffect + setInterval) - Estado: sin fichar / entrada fichada / completo - Botón verde ENTRADA → guarda horaEntrada - Botón rojo SALIDA → guarda horaSalida + calcula total - Resumen del día al completar la jornada // PANTALLA 2 — HISTORIAL - Lista de registros de AsyncStorage, fecha desc - Columnas: fecha, entrada, salida, total horas - Swipe-to-delete con confirmación - Naranja si falta la salida // PANTALLA 3 — EXPORTAR - Botón exportar CSV con expo-sharing - Botón exportar JSON con expo-sharing - Nombre de archivo: fichajes_YYYY-MM-DD // DATOS en AsyncStorage clave 'fichajes': // { id, fecha, horaEntrada, horaSalida, totalMinutos } React Navigation tabs 3 pantallas. Fondo #0f172a, cian #0891B2, verde #16A34A, rojo #DC2626. Reloj: font monoespaciada, fontSize 64. Empieza por la estructura de carpetas y App.tsx.

Antes de ejecutar

1

Crea la carpeta del proyectoCrea una carpeta llamada fichaje en tu ordenador y ábrela en VS Code.

2

Abre OpenCode en el terminalCon la carpeta abierta en VS Code, abre un terminal y ejecuta opencode.

3

Pega el prompt y pulsa EnterCopia el prompt completo de la izquierda y pégalo en OpenCode.

CONSEJO DE VIBECODING

Si algo no funciona como esperas, no edites el código. Escribe un prompt de corrección describiendo exactamente qué está mal y qué quieres que cambie. La iteración es el aprendizaje.

Mejoras iterativas · Aplica en orden

Evolución de FichajeApp

5 mejoras que llevan la app de local a full-stack con panel web

Fase 2 · App mejorada

+1

Notas y tipo de jornadaModal post-fichaje para añadir nota libre y tipo: Normal, Teletrabajo, Guardia, Desplazamiento, Festivo.

+2

Resumen semanal y mensualNueva pantalla con KPIs: días trabajados, horas totales, media diaria, barra de progreso 40h semanales.

+3

Geolocalización con mapaGPS automático al fichar con expo-location. Mapa en el detalle del registro con pins de entrada y salida.

+4

Supabase + login + multi-dispositivoMigra AsyncStorage a Supabase. Login con email. Sync automático. Modo offline con cola de sincronización.

Fase 3 · Panel web

+5

Panel web Next.js + VercelDashboard de administración con tabla de usuarios, filtros, gráfico de horas semanales por usuario y gestión de equipos. Desplegado gratis en Vercel.

VISIÓN DEL SISTEMA COMPLETO
App móvilRegistro individual de jornada
SupabaseBase de datos centralizada en la nube
Panel webAdministración de usuarios y equipos
VercelDespliegue gratuito del panel
Hoja de ruta · Sistema completo
De app local a plataforma de empresa
FASE 1
App germinal · Offline · Un usuario

App móvil completa con las 3 pantallas. Registro local en AsyncStorage. Exportación CSV y JSON. Funciona sin internet, sin cuenta, sin servidor.

React NativeExpoAsyncStorageexpo-sharingCSV + JSONOffline 100%
FASE 2
App enriquecida · Cloud · Multi-dispositivo

Añade notas, tipos de jornada, estadísticas semanales, geolocalización con mapa, autenticación con Supabase y sincronización multi-dispositivo con modo offline.

expo-locationreact-native-mapsSupabase AuthSupabase DBSync offlinePush notifications
FASE 3
Panel web · Administración · Equipos y empresas

Dashboard web con Next.js para administradores: tabla de usuarios, historial por empleado, gráficos semanales, gestión de equipos y exportación masiva. Desplegado en Vercel.

Next.jsTailwind CSSVercelchart.jsRoles adminExport CSV por usuario