Ir al contenido

Cumplimiento (`compliance/`)

Ruta: /owner/hr/compliance

Sistema visual de monitorización del cumplimiento normativo.

🟢 Verde - Cumplimiento Total:

  • 90-100% de horas contractuales cumplidas
  • Todos los fichajes completos
  • Descansos obligatorios respetados
  • Documentación al día

🟡 Amarillo - Atención Necesaria:

  • 80-90% de horas contractuales
  • 100-110% de horas (posible exceso)
  • Algún fichaje incompleto
  • Documentación pendiente

🔴 Rojo - Incumplimiento:

  • menos de 80% de horas contractuales
  • más de 110% de horas (exceso)
  • Múltiples fichajes sin corregir
  • Documentación faltante
Directorio con semáforo por empleado:
┌─────────────────┬────────┬─────────┐
│ Empleado │ Estado │ Horas │
├─────────────────┼────────┼─────────┤
│ Juan Pérez │ 🟢 │ 160/160 │
│ María García │ 🟡 │ 145/160 │
│ Pedro López │ 🔴 │ 120/160 │
│ Ana Martínez │ 🟢 │ 158/160 │
└─────────────────┴────────┴─────────┘
Detalles Técnicos

Componente: ComplianceSemaphore.tsx

type ComplianceLevel = 'green' | 'yellow' | 'red';
export function ComplianceSemaphore({
level,
size = 'md',
showLabel = true,
}: ComplianceSemaphoreProps) {
const config = {
green: {
bg: 'bg-green-100',
text: 'text-green-600',
icon: CheckCircle2,
label: 'Correcto',
},
yellow: {
bg: 'bg-amber-100',
text: 'text-amber-600',
icon: AlertTriangle,
label: 'Atención',
},
red: {
bg: 'bg-red-100',
text: 'text-red-600',
icon: AlertCircle,
label: 'Riesgo',
},
};
// ...
}
// Cálculo del nivel de cumplimiento
function calculateComplianceLevel(
workedHours: number,
contractualHours: number
): ComplianceLevel {
const percentage = (workedHours / contractualHours) * 100;
if (percentage < 80) return 'red';
if (percentage < 90) return 'yellow';
if (percentage > 110) return 'red';
if (percentage > 100) return 'yellow';
return 'green';
}

Hook: useComplianceData.ts

Calcula métricas de cumplimiento por empleado:

export function useComplianceData(businessId: string) {
return useQuery({
queryKey: ['compliance-data', businessId],
queryFn: async () => {
// 1. Obtener empleados activos
const employees = await fetchActiveEmployees(businessId);
// 2. Calcular horas trabajadas del mes
const monthStart = startOfMonth(new Date());
const monthEnd = endOfMonth(new Date());
const timeEntries = await fetchTimeEntries(businessId, monthStart, monthEnd);
// 3. Calcular horas contractuales esperadas
const workingDays = calculateWorkingDays(monthStart, monthEnd);
// 4. Por cada empleado, calcular nivel de cumplimiento
return employees.map(employee => {
const worked = sumHours(timeEntries, employee.id);
const expected = employee.daily_hours * workingDays;
const level = calculateComplianceLevel(worked, expected);
return {
employeeId: employee.id,
employeeName: `${employee.first_name} ${employee.last_name}`,
workedHours: worked,
expectedHours: expected,
complianceLevel: level,
};
});
},
});
}

Lista de verificación de cumplimiento legal.

  • Registro diario de jornada implementado
  • Firma digital mensual de empleados
  • Audit logs inmutables
  • Correcciones de fichajes trazables
  • Documentación lista para inspección
  • Consentimientos firmados por empleados
  • Cifrado de datos sensibles
  • Logs de acceso a datos personales
  • Política de privacidad actualizada
  • DPO designado (si procede)
  • Descansos obligatorios validados
  • Jornada máxima controlada
  • Horas extras registradas
  • Vacaciones según convenio
  • Contratos temporales controlados