[IMPROVED] Mostrar tipo de programador usado para el cálculo de tarifas

🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Mauro Rosero P. 2025-03-12 14:12:24 -05:00
parent 20c645b06e
commit 08dfaef620
Signed by: mrosero
GPG key ID: 83BD2A5F674B7E26

View file

@ -173,7 +173,7 @@ def count_lines_of_code(project_path, extensions=None, ignore_patterns=None):
logger.info(f"Conteo completo. Procesados {files_counted} archivos, ignorados {skipped_files}.")
return total_lines
def estimate_cocomo(loc, model_type='organic', cost_per_pm=5000):
def estimate_cocomo(loc, model_type='organic', cost_per_pm=5000, programmer_type='fullstack'):
"""
Calcula las estimaciones COCOMO basadas en las líneas de código.
@ -181,6 +181,7 @@ def estimate_cocomo(loc, model_type='organic', cost_per_pm=5000):
loc: Líneas de código
model_type: Tipo de modelo COCOMO ('organic', 'semi-detached', 'embedded')
cost_per_pm: Costo por persona-mes en USD
programmer_type: Tipo de programador usado para el cálculo de costo
Returns:
Dictionary con los resultados del cálculo
@ -223,6 +224,7 @@ def estimate_cocomo(loc, model_type='organic', cost_per_pm=5000):
'avg_staff': avg_staff,
'cost_per_pm': cost_per_pm,
'hourly_rate': hourly_rate,
'programmer_type': programmer_type,
'total_cost': total_cost
}
@ -298,6 +300,7 @@ def print_results(results):
print(f"Tiempo de desarrollo: {results['dev_time']} meses")
print(f"Personal promedio: {results['avg_staff']} personas")
print("\n--- Costos ---")
print(f"Tipo de programador: {results['programmer_type']}")
print(f"Costo por hora: ${results['hourly_rate']}")
print(f"Costo por persona-mes: ${results['cost_per_pm']} ({HOURS_PER_MONTH} horas)")
print(f"Costo total estimado: ${results['total_cost']:,.2f}")
@ -346,14 +349,17 @@ if __name__ == "__main__":
logger.error(f"Error al crear el directorio de tarifas: {e}")
# Obtener costo por hora desde fullstack.rate y convertir a costo por persona-mes
programmer_type = 'fullstack' # Por defecto usamos la tarifa de fullstack
if args.cost is None:
# Obtener la tarifa por hora y multiplicar por las horas mensuales
hourly_rate = get_fullstack_rate()
cost_per_pm = hourly_rate * HOURS_PER_MONTH
logger.info(f"Costo por hora: ${hourly_rate:.2f} × {HOURS_PER_MONTH} horas = ${cost_per_pm:.2f} por persona-mes")
logger.info(f"Costo por hora ({programmer_type}): ${hourly_rate:.2f} × {HOURS_PER_MONTH} horas = ${cost_per_pm:.2f} por persona-mes")
else:
cost_per_pm = args.cost
logger.info(f"Usando costo por persona-mes especificado: ${cost_per_pm:.2f}")
programmer_type = 'personalizado' # Si se especifica manualmente
hourly_rate = cost_per_pm / HOURS_PER_MONTH
logger.info(f"Usando costo por persona-mes especificado: ${cost_per_pm:.2f} (${hourly_rate:.2f}/hora)")
# Preparar extensiones y patrones de ignorar
extensions = DEFAULT_EXTENSIONS.copy()
@ -376,7 +382,7 @@ if __name__ == "__main__":
model_type = args.model
# Calcular estimaciones COCOMO
results = estimate_cocomo(loc, model_type, cost_per_pm)
results = estimate_cocomo(loc, model_type, cost_per_pm, programmer_type)
# Añadir ruta del proyecto para la presentación
results['project_path'] = str(project_path)