diff --git a/bin/cocomo.py b/bin/cocomo.py index 89d771b..ef48937 100755 --- a/bin/cocomo.py +++ b/bin/cocomo.py @@ -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)