erp-construccion/docs/02-definicion-modulos/MAI-007-rrhh-asistencias/requerimientos/RF-HR-003-costeo-mano-obra.md

402 lines
13 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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