# RF-HR-003: Costeo de Mano de Obra **Epic:** MAI-007 - RRHH, Asistencias y Nómina **Tipo:** Requerimiento Funcional **Prioridad:** Alta **Estado:** 🚧 En Definición **Última actualización:** 2025-11-17 --- ## 📋 Descripción El sistema debe calcular el costo real de mano de obra por obra y por partida presupuestal, considerando salarios, prestaciones legales, cargas sociales (IMSS, INFONAVIT), y factor de salario real. Debe permitir comparar costo real vs presupuestado y generar alertas de desviación. --- ## 🎯 Objetivo de Negocio 1. **Control de Costos:** - Conocer costo real de mano de obra en tiempo real - Detectar desviaciones presupuestales tempranamente - Optimizar asignación de cuadrillas 2. **Toma de Decisiones:** - Proyectar costo al finalizar la obra - Comparar productividad entre cuadrillas - Identificar partidas con sobrecosto 3. **Rentabilidad:** - Calcular margen real por obra - Proyectar flujo de caja - Mejorar cotizaciones futuras --- ## 👥 Actores - **Director:** Consulta costeo general de obras - **Finance:** Analiza costos, genera reportes financieros - **Residente:** Consulta costeo de su obra - **HR:** Valida datos de nómina --- ## 🧮 Conceptos Clave ### Factor de Salario Real (FSR) El FSR es el multiplicador que convierte el salario nominal en costo real, considerando todas las prestaciones y cargas sociales. **Fórmula:** ``` FSR = 1 + (Prestaciones + Cargas Sociales + Imprevistos) ``` **Componentes típicos en México (2025):** | Concepto | % sobre Salario | Comentario | |----------|-----------------|------------| | **Cargas Sociales** | | | | IMSS (cuota patronal) | 20.4% - 25.9% | Varía según riesgo de trabajo | | INFONAVIT | 5% | Fijo | | FONACOT | 0% - 3% | Solo si hay crédito | | **Prestaciones de Ley** | | | | Aguinaldo | 4.17% | 15 días/año (15/360) | | Vacaciones | 1.67% | 6 días/año (6/360) | | Prima vacacional | 0.42% | 25% de vacaciones | | **Días no laborados** | | | | Domingos | 14.28% | (52/365) | | Días festivos | 2.19% | (8/365) | | **Imprevistos** | | | | Ausentismo | 5% | Estimado | | Rotación y capacitación | 3% | Estimado | | **TOTAL FSR** | **1.56 - 1.60** | Promedio industria construcción | **Ejemplo de Cálculo:** ``` Salario nominal (SDI): $350/día FSR: 1.58 Costo real = $350 × 1.58 = $553/día ``` --- ## ✅ Casos de Uso ### UC-HR-008: Calcular Costo Real de Empleado **Actor:** Sistema (automático) **Trigger:** Registro de asistencia aprobado **Flujo principal:** 1. Sistema obtiene asistencia aprobada 2. Obtiene salario diario del empleado (específico de obra o base) 3. Calcula días trabajados (día completo = 1.0, medio día = 0.5) 4. Aplica FSR configurado para la constructora 5. Calcula costo real: ``` Costo Real = Salario Diario × Días Trabajados × FSR ``` 6. Obtiene partida presupuestal asignada (si aplica) 7. Guarda registro en `labor_costs` 8. Actualiza acumulados de obra y partida **Resultado:** Costo de mano de obra registrado y acumulado --- ### UC-HR-009: Asignar Cuadrilla a Partida Presupuestal **Actor:** Residente o Engineer **Flujo principal:** 1. Usuario accede a obra → Presupuesto → Partida específica 2. Selecciona "Asignar Cuadrilla" 3. Selecciona cuadrilla de las disponibles en la obra 4. Define período de asignación (fecha inicio - fecha fin) 5. Define % de tiempo dedicado (100% = tiempo completo, 50% = medio tiempo) 6. Sistema valida: - Cuadrilla debe estar asignada a la obra - No sobrepasar 100% de tiempo del empleado 7. Sistema crea registro en `crew_budget_assignments` 8. A partir de ahora, asistencias de empleados de la cuadrilla se contabilizan en esta partida **Resultado:** Cuadrilla asignada, costos se imputan a partida **Excepciones:** - E1: Cuadrilla ya asignada 100% a otra partida → Bloquear o permitir split --- ### UC-HR-010: Comparar Costo Real vs Presupuestado **Actor:** Director, Finance, Residente **Flujo principal:** 1. Usuario accede a Obra → Análisis de Costos 2. Visualiza dashboard con: - **Presupuesto total de MO:** $X MXN - **Gastado a la fecha:** $Y MXN - **% de avance presupuestal:** Y/X × 100 - **% de avance físico:** (de control de obra) - **Proyección al 100%:** Y / (% avance físico) × 100 - **Desviación:** Proyección - Presupuesto 3. Visualiza tabla por partida: | Partida | Presupuesto MO | Real | Avance | Desviación | |---------|----------------|------|--------|------------| | Cimientos | $100K | $85K | 90% | -$5.5K (5.5%) | | Estructura | $250K | $180K | 60% | +$50K (20%) ⚠️ | 4. Si desviación > 15%, muestra alerta roja **Resultado:** Visibilidad de desviaciones presupuestales --- ### UC-HR-011: Generar Reporte de Productividad **Actor:** Director, Engineer **Flujo principal:** 1. Usuario accede a Reportes → Productividad de Cuadrillas 2. Selecciona período (última semana, último mes, personalizado) 3. Selecciona obra (o todas) 4. Sistema calcula métricas por cuadrilla: - **Días-hombre trabajados** - **Costo total** - **Costo promedio por día-hombre** - **Partidas asignadas** - **Rendimiento** (si se tiene datos de producción): - Ejemplo: m³ de concreto / día-hombre 5. Muestra tabla comparativa de cuadrillas 6. Permite exportar a Excel/PDF **Resultado:** Reporte de productividad generado --- ## 📊 Modelo de Datos ### Costos de Mano de Obra (labor_costs) ```sql CREATE TABLE hr.labor_costs ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), attendance_id UUID UNIQUE NOT NULL REFERENCES attendance.attendance_records(id), employee_id UUID NOT NULL REFERENCES hr.employees(id), work_id UUID NOT NULL REFERENCES projects.projects(id), budget_item_id UUID REFERENCES budgets.budget_items(id), -- Partida presupuestal -- Cálculo de costo work_date DATE NOT NULL, days_worked DECIMAL(3, 2) NOT NULL, -- 1.0 = día completo, 0.5 = medio día daily_salary DECIMAL(10, 2) NOT NULL, -- Salario del día (puede variar) fsr DECIMAL(4, 2) NOT NULL, -- Factor de Salario Real (ej: 1.58) real_cost DECIMAL(10, 2) GENERATED ALWAYS AS ( daily_salary * days_worked * fsr ) STORED, -- Metadata created_at TIMESTAMPTZ DEFAULT NOW(), CONSTRAINT valid_days_worked CHECK (days_worked >= 0 AND days_worked <= 1) ); CREATE INDEX idx_labor_costs_work ON hr.labor_costs(work_id, work_date); CREATE INDEX idx_labor_costs_employee ON hr.labor_costs(employee_id); CREATE INDEX idx_labor_costs_budget_item ON hr.labor_costs(budget_item_id); ``` --- ### Asignación de Cuadrilla a Partida (crew_budget_assignments) ```sql CREATE TABLE hr.crew_budget_assignments ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), crew_id UUID NOT NULL REFERENCES hr.crews(id), budget_item_id UUID NOT NULL REFERENCES budgets.budget_items(id), work_id UUID NOT NULL REFERENCES projects.projects(id), start_date DATE NOT NULL, end_date DATE, time_percentage DECIMAL(5, 2) DEFAULT 100.00, -- % de tiempo dedicado (100% = tiempo completo) created_at TIMESTAMPTZ DEFAULT NOW(), updated_at TIMESTAMPTZ DEFAULT NOW(), CONSTRAINT valid_time_percentage CHECK (time_percentage > 0 AND time_percentage <= 100) ); CREATE INDEX idx_crew_budget_work ON hr.crew_budget_assignments(work_id); CREATE INDEX idx_crew_budget_crew ON hr.crew_budget_assignments(crew_id); CREATE INDEX idx_crew_budget_item ON hr.crew_budget_assignments(budget_item_id); ``` --- ### Configuración de FSR por Constructora ```sql CREATE TABLE hr.fsr_configuration ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), constructora_id UUID UNIQUE NOT NULL REFERENCES auth_management.constructoras(id), -- Componentes del FSR imss_percentage DECIMAL(5, 2) DEFAULT 23.00, -- Cuota patronal IMSS infonavit_percentage DECIMAL(5, 2) DEFAULT 5.00, -- Aportación INFONAVIT aguinaldo_percentage DECIMAL(5, 2) DEFAULT 4.17, -- 15 días/año vacaciones_percentage DECIMAL(5, 2) DEFAULT 1.67, -- 6 días/año prima_vacacional_percentage DECIMAL(5, 2) DEFAULT 0.42, -- 25% de vacaciones domingos_percentage DECIMAL(5, 2) DEFAULT 14.28, -- 52/365 festivos_percentage DECIMAL(5, 2) DEFAULT 2.19, -- 8/365 ausentismo_percentage DECIMAL(5, 2) DEFAULT 5.00, -- Estimado otros_percentage DECIMAL(5, 2) DEFAULT 3.00, -- Rotación, capacitación -- FSR calculado total_fsr DECIMAL(4, 2) GENERATED ALWAYS AS ( 1 + ( imss_percentage + infonavit_percentage + aguinaldo_percentage + vacaciones_percentage + prima_vacacional_percentage + domingos_percentage + festivos_percentage + ausentismo_percentage + otros_percentage ) / 100 ) STORED, effective_date DATE DEFAULT CURRENT_DATE, created_at TIMESTAMPTZ DEFAULT NOW(), updated_at TIMESTAMPTZ DEFAULT NOW() ); -- Trigger para crear configuración por defecto al crear constructora CREATE OR REPLACE FUNCTION hr.create_default_fsr_config() RETURNS TRIGGER AS $$ BEGIN INSERT INTO hr.fsr_configuration (constructora_id) VALUES (NEW.id); RETURN NEW; END; $$ LANGUAGE plpgsql; CREATE TRIGGER trigger_create_default_fsr_config AFTER INSERT ON auth_management.constructoras FOR EACH ROW EXECUTE FUNCTION hr.create_default_fsr_config(); ``` --- ## 🔐 Reglas de Negocio ### RN-HR-011: Cálculo de FSR - FSR debe estar entre 1.4 y 1.8 (rango típico en México) - FSR se aplica sobre salario diario integrado (SDI) - FSR puede variar por constructora pero no por empleado ### RN-HR-012: Asignación a Partida - Suma de % de tiempo de todas las cuadrillas/empleados no puede exceder 100% - Asignación sin partida → se imputa a "Indirecto" o "General de Obra" - Cambio de asignación solo afecta asistencias futuras (no retroactivo) ### RN-HR-013: Cálculo de Días Trabajados - Día completo (8+ horas) = 1.0 día - Medio día (4-8 horas) = 0.5 días - < 4 horas = 0.25 días (opcional, depende de política) - Horas extras se calculan aparte (no incluidas en FSR base) ### RN-HR-014: Desviación Presupuestal - Desviación < 10% = Verde (normal) - Desviación 10-20% = Amarillo (advertencia) - Desviación > 20% = Rojo (crítico, requiere acción) ### RN-HR-015: Proyección de Costo - Proyección al 100% = Costo Real / (% Avance Físico) × 100 - Solo calcular si avance físico > 10% (evitar proyecciones erróneas) - Proyección se actualiza diariamente --- ## 🧪 Criterios de Aceptación ### CA-HR-007: Cálculo de FSR - ✅ Permite configurar componentes del FSR por constructora - ✅ Calcula FSR total automáticamente - ✅ FSR por defecto = 1.58 (valor estándar) - ✅ Permite modificar FSR (requiere permiso de Director/Finance) - ✅ Cambios de FSR no son retroactivos ### CA-HR-008: Registro de Costos - ✅ Al aprobar asistencia, crea registro en labor_costs - ✅ Aplica salario correcto (específico de obra o base) - ✅ Aplica FSR vigente de la constructora - ✅ Imputa a partida si cuadrilla/empleado está asignado - ✅ Acumula correctamente por obra y partida ### CA-HR-009: Asignación a Partida - ✅ Permite asignar cuadrilla completa a partida - ✅ Permite asignar empleado individual a partida - ✅ Valida que no se exceda 100% de tiempo - ✅ Permite splits (50% en partida A, 50% en partida B) ### CA-HR-010: Comparación Real vs Presupuestado - ✅ Dashboard muestra presupuesto, real, avance, desviación - ✅ Cálculo de desviación es correcto - ✅ Proyección al 100% es correcta - ✅ Alertas visuales por nivel de desviación (verde, amarillo, rojo) - ✅ Datos se actualizan diariamente ### CA-HR-011: Reportes de Productividad - ✅ Genera reporte por cuadrilla - ✅ Calcula días-hombre y costo total correctamente - ✅ Permite comparar cuadrillas - ✅ Permite exportar a Excel/PDF - ✅ Datos pueden filtrarse por período y obra --- ## 📐 Dependencias ### Upstream (depende de): - ✅ RF-HR-001: Empleados y Cuadrillas (requiere salarios) - ✅ RF-HR-002: Asistencia Biométrica (requiere asistencias aprobadas) - 🔜 RF-BUDGET-001: Presupuesto de Obra (requiere partidas presupuestales) ### Downstream (otros dependen de esto): - 🔜 RF-FIN-001: Flujo de Caja (usa costos de MO) - 🔜 RF-REP-001: Reportes Ejecutivos (usa datos de costeo) --- ## 🎯 KPIs - **Desviación promedio de MO:** < 10% - **Proyección de costo vs presupuesto:** ± 5% - **Obras con desviación crítica (>20%):** 0 obras - **Tiempo de cálculo de costos:** < 1 segundo (tiempo real) --- ## 📝 Notas Adicionales ### Cálculo de Horas Extras No incluido en FSR base. Requiere módulo adicional: - HE normales: +25% del salario por hora - HE dobles: +100% del salario por hora - HE domingos/festivos: +200% del salario por hora ### Actualización de FSR - Revisar FSR anualmente (enero) - Actualizar si cambian leyes laborales (IMSS, INFONAVIT) - Considerar inflación y aumentos de salario mínimo ### Integración con Nómina - Costos de MO NO incluyen ISR ni deducciones personales - Son costos para la constructora, no salario neto del empleado - Nómina debe calcularse aparte (RF-HR-004) --- **Fecha de creación:** 2025-11-17 **Última actualización:** 2025-11-17 **Versión:** 1.0